文章目录
一.PWM介绍
1.含义
PWM
(Pulse Width Modulation)即脉冲宽度调制
,简称脉宽调制。通过对一系列脉冲的宽度进行调制,来等效地获得所需要波形(含形状和幅值)。
2.基本原理
PWM 控制 的基本原理为:冲量相等而开头不同的窄脉冲加在具有惯性的环节上时,其效果基本 相同。其中冲量指窄脉冲的面积
;效果相同指环节输出响应波形
基本相同。 例如:可以用一系列等幅不用一系列等幅不等宽的脉冲来代替一个正弦半波,见图
要改变等效输出正弦波幅值,按同一比例改变各脉冲宽度
即可。 若把拟合的波形改成呼吸特性曲线,即可得到控制呼吸灯使用的 PWM 波形
,要生成 拟合的 PWM波形,通常使用计算法和调制法,本文中使用计算法:根据拟合波形的频率
、幅值
和半周期脉冲数
,准确计算 PWM 波各脉冲宽度和间隔,据此控制开关器件的通断,就可得到所需 PWM 波形。在下边编程实现中会详细说明。(此时我才真正明白,将一个正弦波通过PWM即使实现一个波形输出,具体做了哪些工作)
3.优点及应用范围
由于其控制简单、灵活和动态响应好等优点而成为电力电子技术应用最广泛的控制方式,其应用领域包括测量,通信, 功率控制与变换,电动机控制、伺服控制、调光、开关电源,甚至某些音频放大器,因此学习PWM具有十分重要的现实意义
二.STM32上的PWM
1.PWM产生
STM32的定时器除了TIM6和7,其他的定时器都可以用来产生PWM输出。其中高级定时器TIM1和TIM8可以同时产生多达 7 路的 PWM 输出。而通用定时器也能同时产生多达 4路的 PWM 输出,这样,STM32 最多可以同时产生 30 路 PWM 输出。
脉冲宽度调制模式可以产生一个由TIMx_ARR
寄存器确定频率
、由TIMx_CCRx
寄存器确定占空比
的信号。
2.PWM的一个周期
PWM的一个周期
- 定时器从0开始向上计数
- 当0-t1段,定时器计数器TIMx_CNT值小于CCRx值,输出低电平
- t1-t2段,定时器计数器TIMx_CNT值大于CCRx值,输出高电平
至此一个PWM周期完成
每个定时器有四
个通道,每一个通道都有一个捕获比较寄存器,
将寄存器值和计数器值比较,通过比较结果输出高低电平,便可以实现脉冲宽度调制模式(PWM信号)
TIMx_ARR
寄存器确定PWM频率
,
TIMx_CCRx
寄存器确定占空比
三.stm32cubeMX建立工程
1.配置SYS和RCC
2.配置定时器
选择TIM3定时器
TIM4同理
- Mode 选择PWM模式1
- Pulse(占空比值) 先给0
- Fast Mode PWM脉冲快速模式 : 和我们配置无关,不使能
- PWM 极性: 设置为低电平
- PS: 由于LED是低电平点亮,所以我们把极性设置为low
在 Parameter Settings 页配置预分频系数为 71,计数周期(自动加载值)为 499,定时器溢出频率,即PWM的周期,就是 72MHz/(71+1)/(499+1) = 2kHz
PWM频率
:
Fpwm =Tclk / ((arr+1)*(psc+1))(单位:Hz)
arr 是计数器值
psc 是预分频值
占空比
:
duty circle = TIM3->CCR1 / arr(单位:%)
TIM3->CCR1是用户设定值
改CCR1可以修改占空比,修改arr可以修改频率
3.配置时钟树
1
选择外部时钟HSE 8MHz
2
PLL锁相环倍频72倍
3
系统时钟来源选择为PLL
4
设置APB1分频器为 /2
4.生成keil文件
1
设置项目名称
2
设置存储路径
3
选择所用IDE
4
点击GENERATE CODE 创建工程
四.添加代码
1.定义变量
uint16_t dir1 = 10;
uint16_t dir2 = 10;
2.使能TIM3、TIM4的PWM Channel1 输出
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_1);
3.在while循环中添加代码
while (1)
{
/* USER CODE END WHILE */
while (dir1< 600)
{
dir1++;
__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, dir1); //修改比较值,修改占空比
// TIM3->CCR1 = dir1; 与上方相同
HAL_Delay(1);
}
while (dir1)
{
dir1--;
__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, dir1); //修改比较值,修改占空比
// TIM3->CCR1 = dir1; 与上方相同
HAL_Delay(1);
}
while (dir2< 600)
{
dir2++;
__HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_1, dir2); //修改比较值,修改占空比
// TIM4->CCR1 = dir2; 与上方相同
HAL_Delay(1);
}
while (dir2)
{
dir2--;
__HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_1, dir2); //修改比较值,修改占空比
// TIM4->CCR1 = dir2; 与上方相同
HAL_Delay(1);
}
HAL_Delay(200);
}/* USER CODE END 3 */
}
五.线路连接
并且由上面所给配置定时器图示可看出,TIM3-CH1的输出端口为PA6,TIM4-CH1的输出端口为PB6
所以,我们只需给相应端口外连接外设即可。
因题目所给要求为驱动外接的一个LED以及最小开发板上已焊接的LED(固定接在 PC13 GPIO端口),实现2个 LED呼吸灯的效果。因此我们选择将PB6接外接的LED灯,PA6接开发板上已焊接的LED灯。(两个引脚可互换)
3V3 —> 3V3
GND —> GND
RXD —> PA9
TXD —> PA10
LED灯短脚 —> PB6
LED灯长脚 —> 3V3
PA6 —> PC13
六.烧录运行
1.烧录
2.效果展示
呼吸灯
七.总结
本次实验要点在掌握PWM技术,刚开始实验把注意力放在了如何将定时器和LED灯连接起来的问题,并且多余加入了引脚选择,甚至在查找PC13端口时,发现并没有定时器通道,很懵逼,后来具体了解了PWM技术,发现是直接通过设置其引脚的定时器,然后再直接连接外设就可以,并不需要再设置引脚输出。还是基础知识掌握不牢靠,在本次实验,我通过联系以往实验、和同学交流、参考相关知识,最终还是顺利的解决问题,其实博客里面解释很清楚,但是由于我思路不清晰,导致操作比较散,于是花的时间较长,希望以后继续加油,接受捶打,充实自己。
八.参考资料
https://blog.csdn.net/qq_45237293/article/details/111997424
https://blog.csdn.net/zmhDD/article/details/111942507