【GD32】05 - PWM 脉冲宽度调制
PWM
PWM (Pulse Width Modulation) 是一种模拟信号电平的方法,它通过使用数字信号(通常是方波)来近似地表示模拟信号。在PWM中,信号的占空比(即高电平时间占整个周期的比例)被用来控制平均输出电压或电流。
PWM在许多应用中都非常重要,特别是那些需要精确控制模拟信号的应用,如电机控制、LED亮度调节、音频放大器等。以下是PWM的一些关键特点和优势:
- 高效能:PWM允许在开关电源中精确控制能量传输,从而提高效率。
- 简单实现:PWM可以通过数字电路或微控制器轻松实现。
- 减少功耗:在需要调节功率的应用中,PWM可以确保只有必要的能量被传输,从而减少了不必要的功耗。
- 降低噪声:与模拟控制相比,PWM可以减少由模拟电路引起的噪声。
- 精确控制:通过改变PWM信号的占空比,可以非常精确地控制输出电压或电流。
在电机控制中,PWM通常用于控制电机的速度和方向。通过改变PWM信号的占空比,可以精确地控制电机的平均电压,从而控制电机的速度和扭矩。
在LED亮度调节中,PWM也被广泛使用。通过改变PWM信号的占空比,可以控制LED的平均电流,从而控制LED的亮度。这种方法比使用模拟电阻来调节亮度更加高效和精确。
总之,PWM是一种非常有用的技术,它允许我们使用数字信号来精确控制模拟信号的电平。
以上介绍来自文心一言。
简而言之,PWM就是我们把定时器的计数器的值拿来和一个数做比较,计数器的值比较大的时候我们就输出高(低)电平,反之输出低(高)电平。
因此PWM离不开定时器,所以一写完上一篇定时器我就写了这PWM。
GD32E230中的PWM
因为我们上一篇是用的通用L4类型的定时器15,因此我们主要来看看这个类型的定时器的PWM。

我们这个类型的定时器是有PWM的,不过只有一个通道。
根据数据手册可以看到定时器15的唯一一个通道是GPIOB的8号引脚。

知道这个之后就够了,接下来可以看看相关的固件库函数了。
固件库函数
在固件库使用指南中,没有单独的PWM章节,是和定时器在一起的,我这边就挑我们用的到的说说。
我们可以拿上一篇定时器的代码接着用,配置定时器什么的都可以留着,把中断部分删掉就行,剩下就是配置一个PWM通道输出的就行。
timer_channel_output_config

配置定时器的通道输出,传入的参数有定时器,还有待配置通道,我们通用L4的没得选,只能用通道0,高级定时器的话是有四个通道可以用的。
最后一个参数是结构体变量的指针。
我们来看看这个结构体是怎么样的。

一共六个成员,首先第一个通道输出状态,那必然是要使能的,TIMER_CCX_ENABLE。
第二个互补通道输出状态,一样给个使能,TIMER_CCXN_ENABLE。
第三第四,通道输出极性和互补通道输出极性,我们都给个高电平,TIMER_OC_POLARITY_HIGH,TIMER_OCN_POLARITY_HIGH。表示当输出比较生效的时候我们通道输出高电平。
第五第六个,空闲状态下通道输出,我们和上面非空闲状态来个不一样的低电平,TIMER_OC_IDLE_STATE_LOW,TIMER_OCN_IDLE_STATE_LOW。表示当输出比较不生效的时候我们通道输出低电平。
具体这个输出比较的方法,我们后面会再配置。
在我们配置结构体成员之前我们需要先调用一个函数。
timer_channel_output_struct_para_init

就是这个函数,在配置之前先用这个函数进行初始化。
timer_channel_output_mode_config


设置输出比较模式。
我们主要看看模式0和模式1,一般都选模式0。

简单来说模式0是当我们计数器的值小于我们设置的值时,通道输出我们之前设置好的极性(我们上面选了高电平),反之输出空闲状态下的电平(我们上面选了低电平)。
模式1和模式0相反。
timer_primary_output_config

上面的配置完之后(记得还有之前的定时器也要先配置好),我们调用这个函数就可以使能通道输出了。
timer_channel_output_pulse_value_config

设置通道输出的比较值,要注意的是它需要和计数器的值做比较,因此它不要大于计数器的最大值(就是我们配置定时器时的周期值),否则永远都无法触发。
呼吸灯示例代码
因为我们设置的定时器周期值就是计数器达到的最大值,并且是需要和输出比较值做比较的,因此我们最好是选择10的倍数,这样好计算占空比。
#include "gd32e23x.h"
#include "systick.h"int main(void){systick_config();rcu_periph_clock_enable(RCU_TIMER15); //开启定时器时钟 rcu_periph_clock_enable(RCU_GPIOB); gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE,GPIO_PIN_8); gpio_output_options_set(GPIOB,GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_8); gpio_af_set(GPIOB,GPIO_AF_2,GPIO_PIN_8);timer_parameter_struct timer_initpara; timer_initpara.prescaler = 72 - 1; //预分频timer_initpara.alignedmode = TIMER_COUNTER_EDGE; //边缘对齐timer_initpara.counterdirection = TIMER_COUNTER_UP; //向上计数timer_initpara.period = 1000 - 1; //周期 最好是10的倍数,这样好计算占空比timer_init(TIMER15,&timer_initpara); //初始化定时器timer_prescaler_config(TIMER15, 1, TIMER_PSC_RELOAD_NOW);//设置预分频器为立即加载模式timer_enable(TIMER15); //使能定时器timer_oc_parameter_struct timer_ocinitpara;timer_channel_output_struct_para_init(&timer_ocinitpara); //先初始化一下配置结构体timer_ocinitpara.outputstate = TIMER_CCX_ENABLE; //使能timer_ocinitpara.outputnstate = TIMER_CCXN_ENABLE;timer_ocinitpara.ocpolarity = TIMER_OC_POLARITY_HIGH; //高电平timer_ocinitpara.ocnpolarity = TIMER_OCN_POLARITY_HIGH;timer_ocinitpara.ocidlestate = TIMER_OC_IDLE_STATE_LOW; //低电平timer_ocinitpara.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW;timer_channel_output_config(TIMER15,TIMER_CH_0, &timer_ocinitpara); //配置通道输出timer_channel_output_mode_config(TIMER15, TIMER_CH_0, TIMER_OC_MODE_PWM0);// 配置定时器通道输出比较模式timer_primary_output_config(TIMER15, ENABLE); //使能输出比较while(1){for(uint16_t i=0;i<1000;++i){timer_channel_output_pulse_value_config(TIMER15,TIMER_CH_0,i);delay_ms(1);}}
}

相关文章:
【GD32】05 - PWM 脉冲宽度调制
PWM PWM (Pulse Width Modulation) 是一种模拟信号电平的方法,它通过使用数字信号(通常是方波)来近似地表示模拟信号。在PWM中,信号的占空比(即高电平时间占整个周期的比例)被用来控制平均输出电压或电流。…...
JVM思维导图
帮助我们快速整理和总结JVM相关知识,有结构化认识和整体的思维模型 JVM相关详细知识和面试题...
Ollama+OpenWebUI+Phi3本地大模型入门
文章目录 Ollama+OpenWebUI+Phi3本地大模型入门一、基础环境二、Ollama三、OpenWebUI + Phi3Ollama+OpenWebUI+Phi3本地大模型入门 完全不懂大模型的请绕道,相信我李一舟的课程比较适合 Ollama提供大模型运行环境,OpenWebUI提供UI,Phi3就是那个大模型。 当然,Ollama支持超级…...
实战15:bert 命名实体识别、地址解析、人名电话地址抽取系统-完整代码数据
直接看项目视频演示: bert 命名实体识别、关系抽取、人物抽取、地址解析、人名电话地址提取系统-完整代码数据_哔哩哔哩_bilibili 项目演示: 代码: import re from transformers import BertTokenizer, BertForTokenClassification, pipeline import os import torch im…...
js 表格添加|删除一行交互
一、需求 二、实现 <div style"margin-bottom: 55px"><form action"" method"post" enctype"multipart/form-data" id"reportForm" name"sjf" style"margin-left: 25px;margin-bottom: 50px;&quo…...
如何选择合适的服务器硬件和配置?
业务需求 了解您的业务需求和负载。这将帮助您确定需要哪种类型的服务器(如文件服务器、数据库服务器、Web服务器等)以及所需的处理能力、内存、存储和网络性能。...
Prometheus + Grafana + Alertmanager 系统监控
PrometheusGrafana 系统监控 1. 简介1.1 Prometheus 普罗 米修斯1.2 Grafana 2. 快速试用2.1 Prometheus 普罗 米修斯2.2 Prometheus 配置文件2.3 Grafana 2. 使用 Docker-Compose脚本部署监控服务3. Grafana 配置3.1 配置数据源 Prometheus3.2 使用模板ID 配置监控模板3.3 使用…...
5.23R语言-参数假设检验
理论 方差分析(ANOVA, Analysis of Variance)是统计学中用来比较多个样本均值之间差异的一种方法。它通过将总变异分解为不同来源的变异来检测因子对响应变量的影响。方差分析广泛应用于实验设计、质量控制、医学研究等领域。 方差分析的基本模型 方差…...
rnn 和lstm源码学习笔记
目录 rnn学习笔记 lstm学习笔记 rnn学习笔记 import torchdef rnn(inputs, state, params):# inputs的形状: (时间步数量, 批次大小, 词表大小)W_xh, W_hh, b_h, W_hq, b_q paramsH stateoutputs []# 遍历每个时间步for X in inputs:# 计算隐藏状态 HH torch.tanh(torch.…...
解析Java中1000个常用类:CharSequence类,你学会了吗?
在 Java 编程中,字符串操作是最常见的任务之一。为了提供一种灵活且统一的方式来处理不同类型的字符序列,Java 引入了 CharSequence 接口。 通过实现 CharSequence 接口,各种字符序列类可以提供一致的 API,增强了代码的灵活性和可扩展性。 本文将深入探讨 CharSequence 接…...
微服务远程调用之拦截器实战
微服务远程调用之拦截器实战 前言: 在我们开发过程中,很可能是项目是从0到1开发,或者在原有基础上做二次开发,这次是根据已有代码做二次开发,需要在我们微服务一【这里方便举例,我们后面叫模版微服务】调用…...
德人合科技——天锐绿盾内网安全管理软件 | -文档透明加密模块
天锐绿盾文档加密功能能够为各种模式的电子文档提供高强度加密保护,丰富的权限控制以及灵活的应用管理,帮助企业构建更严密的立体保密体系。 PC地址: https://isite.baidu.com/site/wjz012xr/2eae091d-1b97-4276-90bc-6757c5dfedee ————…...
超融合架构下,虚拟机高可用机制如何构建?
作者:SmartX 产品部 钟锦锌 虚拟机高可用(High Availability,简称 HA)是虚拟化/超融合平台最常用、关键的功能之一,可在服务器发生故障时通过重建业务虚拟机以降低故障对业务带来的影响。因此,为了充分保障…...
工厂模式详情
一.介绍工厂模式的用途与特点 工厂方法模式是一种创建型设计模式, 其在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型。定义工厂方法模式(Fatory Method Pattern)是指定义一个创建对象的接口,但让实现这个接口的类来决定实例…...
【Word】调整列表符号与后续文本的间距
1. 默认的列表格式: 2. 修改间距: ************************************************** 分割线 ************************************************************ 3. 效果...
匠心独运,B 端系统 UI 演绎华章之美
匠心独运,B 端系统 UI 演绎华章之美...
Java电商平台-开放API接口签名验证(小程序/APP)
说明:在实际的生鲜业务中,不可避免的需要对外提供api接口给外部进行调用. 这里就有一个接口安全的问题需要沟通了。下面是干货: 接口安全问题 请求身份是否合法? 请求参数是否被篡改? 请求是否唯一? AccessKey&am…...
Tale全局函数对象base
目录 1、 Tale全局函数对象base 1.1、 * tale alert删除 1.2、 * 成功弹框 1.3、 * 弹出成功,并在500毫秒后刷新页面 1.4、 * 警告弹框 1.5、 * 询问确认弹框,这里会传入then函数进来...
【启程Golang之旅】掌握Go语言数组基础概念与实际应用
欢迎来到Golang的世界!在当今快节奏的软件开发领域,选择一种高效、简洁的编程语言至关重要。而在这方面,Golang(又称Go)无疑是一个备受瞩目的选择。在本文中,带领您探索Golang的世界,一步步地了…...
COMSOL中液晶材料光学特性模拟
前面我们根据FDTD官方文档设置了液晶指向的模型。COMSOL也可以根据相似的方法设置各项异性的周期性变化的材料。 该方法参考了luneburg_lens的COMSOL文档 在给出的文件中,可以发现定义-变量中可以使用默认坐标作为变量,即xyz。因此,折射率也可…...
RAG 系列(十七):Agentic RAG——让 Agent 主导检索过程
Pipeline RAG 的沉默失败 前面十几篇一直在优化一件事:怎么让检索结果更好。更好的分块、更精准的排序、更聪明的问法、CRAG 纠偏、Graph RAG 关系遍历…… 但有一件事始终没变:无论检索结果好不好,都会被传给 LLM 生成答案。 Pipeline RAG 的流程是线性的、固定的: 问…...
低温预警!固化慢、易开裂……密封胶冬季施工手册
低温预警!固化慢、易开裂……密封胶冬季施工手册 硅酮耐候密封胶主要作用是保障幕墙的气密性、水密性。其出现问题,可能会导致耐候密封失效,从而造成幕墙漏水漏气,影响幕墙的正常使用。耐候密封胶由于考虑到现场施工,几乎都是单组分硅酮密封胶产品。进入冬季,气候变化明…...
从零构建本地化AI代码助手:架构、微调与工程实践
1. 项目概述:从零构建你自己的Claude代码助手最近在开发者社区里,一个名为“build-your-claude-code-from-scratch”的项目引起了我的注意。这个标题本身就充满了吸引力——它暗示着一种可能性:我们是否能够不依赖任何现成的、闭源的商业API&…...
Rulebook-AI:用规则引擎为AI智能体构建可控决策框架
1. 项目概述:一个基于规则的AI智能体框架最近在探索如何让AI智能体(Agent)的行为更可控、更符合业务逻辑时,我遇到了一个挺有意思的开源项目:botingw/rulebook-ai。乍一看这个名字,可能会觉得它又是一个试图…...
Nextra:基于Next.js的现代化文档站构建利器
1. 项目概述:为什么Nextra能成为文档站构建的“瑞士军刀”?如果你最近在寻找一个构建技术文档、博客或个人知识库的工具,大概率会听到“Nextra”这个名字。它不是一个独立框架,而是一个基于Next.js的静态站点生成器,专…...
开源PCB自动布线神器FreeRouting:5分钟上手,效率提升300%
开源PCB自动布线神器FreeRouting:5分钟上手,效率提升300% 【免费下载链接】freerouting Advanced PCB auto-router 项目地址: https://gitcode.com/gh_mirrors/fr/freerouting FreeRouting是一款功能强大的开源PCB自动布线工具,它能帮…...
面试鸭:程序员面试备战工作台,构建结构化知识图谱与智能复习系统
1. 项目概述:一个面向求职者的“面试鸭”最近在技术社区里,看到不少朋友在讨论一个叫“mianshiya”的开源项目。乍一看这个名字,还以为是哪个美食博主分享的菜谱。点进去才发现,这其实是一个为程序员,特别是正在准备面…...
基于NestJS与Next.js的自托管电影管理应用Story Flicks部署与实战
1. 项目概述:一个为影迷打造的私人观影档案库 如果你和我一样,是个重度电影爱好者,那么你一定经历过这样的时刻:看完一部好片子,内心澎湃,想写点什么记录一下,却发现豆瓣、IMDb的评论区要么太嘈…...
ElevenLabs克隆成功率从31%飙升至96.7%:基于LPC共振峰校准+Prosody Transfer双引擎微调法(实测数据包已脱敏上传)
更多请点击: https://intelliparadigm.com 第一章:ElevenLabs语音克隆方法概览 ElevenLabs 提供了高保真、低延迟的语音克隆能力,其核心依赖于少量高质量语音样本(通常 1–3 分钟)与上下文感知的零样本/少样本微调技术…...
从开源项目到个人监控工具:clawmonitor的设计、部署与实战
1. 项目概述:从开源项目到个人监控工具的蜕变最近在折腾一个挺有意思的东西,叫clawmonitor。这名字乍一听有点怪,像是“爪子监控器”,但如果你对开源社区,特别是自动驾驶辅助系统领域有所关注,可能会觉得眼…...
