目录
一、pwm的介绍
1.高级控制定时器功能实现框图
其中分为6个板块:①时钟源②控制器 ③时基单元 ④输入捕获 ⑤输出比较 ⑥断路功能
2.pwm的定义
pwm是一种模拟控制方式,根据相应载荷的变化来调制晶体管栅极或基极的偏置,来实现开关稳压电源输出晶体管或晶体管导通时间的改变,这种方式能使电源的输出电压在工作条件变化时保持恒定。脉冲宽度调制(PWM )是一种对模拟信号电平进行数字编码的方法。
通过高分辨率计数器的使用,利用方波的占空比调制来对一个具体模拟信号的电平进行编码。pwm信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。
3.pwm的控制方式
1.线电压控制PWM
2.电流控制 PWM
3.空间电压矢量控制PWM
4.矢量控制PWM
5.直接转矩控制PWM
6.非线性控制PWM
7.谐振软开关PWM
4.主要参数
PWM
:脉宽调制
脉宽调试
是数字信号输出对模拟信号输出的一种方式。
占空比
:一个周期内,高电平时间与整个周期的比值。
5.实现原理
PWM实现的原理是通过锯齿波/三角波(载波)所需要合成的波形(调制波)进行比较,然后确定PWM所需要输出的极性,通常是ON或者是OFF,作用于开关元器件。如下图
6.端口的选择
IO模拟PWM输出时速度不是很快。端口选择时,普通IO可以输出PWM,但还是尽量选择PWM口进行PWM输出。
7.PWM口对应配置
8.PWM 输入模式
该模式是输入捕获的特例,只能使用通道 1 和通道 2,通道 3 和通道 4 使用不了。与上面那种只使用一个捕获寄存器测量脉宽和频率的方法相比,PWM 输入模式需要占用两个捕获寄存器。
9.PWM 输出模式
PWM输出就是对外输出脉宽(即占空比)可调的方波信号,信号频率由自动重装寄存器 ARR 的值决定,占空比由比较寄存器 CCR 的值决定。
PWM 模式分为两种,PWM1 和 PWM2,总得来说是差不多,具体的区别。
PWM1 与 PWM2 模式的区别:
模式|计数器 CNT 计算方式|说明
PWM1 递增 CNT<CCR,通道 CH 为有效,否则为无效
PWM2 递减 CNT>CCR,通道 CH 为无效,否则为有效 PWM2 递增 CNT<CCR,通道 CH 为无效,否则为有效
PWM2 递减 CNT>CCR,通道 CH 为有效,否则为无效
(1) PWM 边沿对齐模式
在递增计数模式下,计数器从 0 计数到自动重载值(TIMx_ARR 寄存器的内容),然后重新从 0 开始计数并生成计数器上溢事件。
(2)PWM 中心对齐模式
在中心对齐模式下,计数器 CNT 是工作做递增/递减模式下。开始的时候,计数器CNT 从 0 开始计数到自动重载值减1(ARR-1),生成计数器上溢事件;然后从自动重载值开始向下计数到 1 并生成计数器下溢事件。之后从 0 开始重新计数。
二、用cubemx创建工程
1.创建新工程
2.芯片的选择
3.配置环境
System Core–RCC–Crystal/Ceramic ResonatorSystem Core–SYS–Serial Wire
TM3–Internal Clock(内部时钟–PWM Generation CH1(选择通道1)–Prtscaler (定时器分频系数) : 71–Counter Mode (Up向上计数模式)–Counter Period(自动重装载值 500)–CKD(不分频 No Division)
TM4–Internal Clock(内部时钟–PWM Generation CH1(选择通道1)–Prtscaler (定时器分频系数) : 71–Counter Mode (Up向上计数模式)–Counter Period(自动重装载值 500)–CKD(不分频 No Division)
4.时钟的配置
5.生成项目
三、代码的编译
main.c文件中添加变量
uint16_t pwm=0; //占空比
添加后如下图所示:
在main.c中添加PWM的通道
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_1);
添加后如下图所示:
在while循环中添加如下所示代码
while (pwm< 500)
{
pwm++;
__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, pwm);
__HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_1, pwm);
HAL_Delay(1);
}
while (pwm)
{
pwm--;
__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, pwm);
__HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_1, pwm);
HAL_Delay(1);
}
HAL_Delay(200);
编译未出现错误,连接完电路后准备烧录
四、电路的连接
3V3 —> 3V3
GND —> GND
RXD —> A9
TXD —> A10
LED灯短脚 —> A6
LED灯长脚 —> 3V3
PB6 —> PC13
五、代码实现
利用PWM完成呼吸灯
六、总结
通过本次练习,以PWM输出端实现led呼吸灯。在本次练习的过程中,出现了许多小问题例如代码未添加变量导致无法编译;程序编译成功,由于led引脚接错无法实现呼吸灯;程序编译成功,线路连接也没问题时,烧录软件出错导致无法实现等问题。再出现这些问题时不要急于放弃,沉下心来慢慢摸索,总会成功。希望本篇博客可以帮助到你,欢迎指正!!
参考文献
一文搞懂什么是PWM
pwm超详细解读,大佬细说pwm的控制方式
STM32CUBEMX_基于PWM的呼吸灯
stm32f103呼吸灯(PWM脉冲宽度调制)
使用STM32输出PWM波形