引言
通过配置STM32的输出可以对负载进行控制,对于只有开启、关闭两种工作状态的负载,GPIO + 继电器 可以完成对此类负载的控制,通过GPIO控制继电器的闭合、断开,从而达到控制开启与关闭的目的。
对于具有多种状态的负载,例如直流电机,不仅只有开启、关闭两种状态,还需要运行在不同转速,需要STM32具有能够输出"模拟量"的能力,进而控制负载运行在不同的状态。
本文将介绍 PWM + 低通滤波器 方案,实现数字引脚输出正弦波,并驱动LED进行测试,实现呼吸灯的效果,为后续使用PWM控制电机等负载做基础。
1、基本原理
下图展示了固定占空比的PWM,只能等效固定电平,不同占空比PWM信号可以等效不同大小的电压,那么按照正弦规律输出不同占空比可以等效出正弦波。
输出正弦规律占空比最简单的方法:使用 锯齿波 + 比较器。
- 锯齿波(蓝色线)为载波,周期信号,其周期决定PWM信号的周期
- 正弦波(红色线)为调制波,与载波进行比较,决定PWM信号的占空比
- 粉红色线为PWM信号
比较逻辑:当调制波比载波大是,PWM输出高,调制波比载波小,PWM输出低。
根据面积等效原理(Voltage-Second Balance) ,每个周期内,冲量相等(即窄脉冲的面积)而形状不同的窄脉冲加在具有惯性的环节上时,输出响应波形基本相同,红色波形窄脉冲与粉红色窄脉冲围成的面积相等,所以两者等效。
综上,需要使用STM32实现,
- 硬件生成锯齿波
- 软件生成调制波
- 执行比较逻辑
- 输出PWM信号
下面使用STM32的高级定时器TIM1输出可以等效50Hz的正弦波的PWM信号,驱动LED实现呼吸灯。
2、PWM底层配置
使用STM32CubeMx进行底层配置,并自动生成代码,
- STM32CubeMx基本使用可参考: STM32入门_GPIO_STM32CubuMX配置点亮LED
- PWM基本配置可参考: STM32入门_PWM_蜂鸣器播放音乐
步骤1:配置定时器的时钟
时钟配置为72MHz,

步骤2:配置载波频率、PWM输出
载波频率 = 定时器时钟 / (Prescaler + 1) / (Period + 1) = 72MHz/72/200 = 5KHz
步骤3:配置定时器中断
配置定时器上溢中断,应用代码中在上溢中断中更新PWM输出比较值,
步骤4:生成底层配置代码

3、编写应用代码
底层配置已经生成锯齿波,配置PWM输出后可执行比较逻辑输出PWM信号,如何生成正弦波?如何控制正弦波频率?
步骤5:软件生成正弦波
- 通过C标准库中sin函数生成正弦波数组
- 正弦波频率由正弦波周期内的采样点个数决定,正弦波频率 = 载波频率 / 采样点个数。需求正弦波频率是50Hz,载波频率是5KHz,采样点个数100。
c
#define SIN_SAMPLES 100
#define PI 3.14
uint16_t sin_table[SIN_SAMPLES];
for (int i = 0; i < SIN_SAMPLES; i++) {
sin_table[i] = (uint16_t)(100* (1 + sin(2 * PI * i / SIN_SAMPLES)));
}
程序运行后生成的正弦数组如下所示,
步骤6:定时器中断查表更新比较值
打开定时器、启用中断,
c
HAL_TIM_Base_Start_IT(&htim1); //启动定时器并启用中断
HAL_TIM_PWM_Start_IT(&htim1,TIM_CHANNEL_1);//启动PWM输出
在定时器中断查正弦表更新PWM占空比,
c
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == TIM1)
{
if(count < 100)
{
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, sin_table[count]);//查表更新占空比
count++;
}
else
{
count = 0;
}
}
}
步骤6:PWM输出引脚增加RC低通滤波器
在PWM输出引脚后连接RC低通滤波器,RC低通滤波器的截止频率需要略高于目标正弦波频率。
RC电路的截止频率为 <math xmlns="http://www.w3.org/1998/Math/MathML"> f c = 1 2 π R C f_c = \frac{1}{2\pi RC} </math>fc=2πRC1
- <math xmlns="http://www.w3.org/1998/Math/MathML"> R R </math>R为电阻值(单位:欧姆)
- <math xmlns="http://www.w3.org/1998/Math/MathML"> C C </math>C为电容值(单位:法拉)
4、测试
示波器测量PWM输出引脚的输出波形。
PWM的频率为5KHz,符合预期设计,如下图所示, 正弦波的频率为50Hz,符合设计预计,如下视频所示,
参考
1\] CSDN博客: [STM32开发板上生成PWM正弦波](https://link.juejin.cn?target=https%3A%2F%2Fblog.csdn.net%2Fweixin_62244995%2Farticle%2Fdetails%2F146959842%3Fops_request_misc%3D%25257B%252522request%25255Fid%252522%25253A%2525220ab62be1034cab9fc86dee811fbb8535%252522%25252C%252522scm%252522%25253A%25252220140713.130102334.pc%25255Fall.%252522%25257D%26request_id%3D0ab62be1034cab9fc86dee811fbb8535%26biz_id%3D0%26utm_medium%3Ddistribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-1-146959842-null-null.142%255Ev102%255Epc_search_result_base7%26utm_term%3DSTM32%25E5%25BC%2580%25E5%258F%2591%25E6%259D%25BF%25E4%25B8%258A%25E7%2594%259F%25E6%2588%2590PWM%25E6%25AD%25A3%25E5%25BC%25A6%25E6%25B3%25A2%26spm%3D1018.2226.3001.4187 "https://blog.csdn.net/weixin_62244995/article/details/146959842?ops_request_misc=%257B%2522request%255Fid%2522%253A%25220ab62be1034cab9fc86dee811fbb8535%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=0ab62be1034cab9fc86dee811fbb8535&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-1-146959842-null-null.142%5Ev102%5Epc_search_result_base7&utm_term=STM32%E5%BC%80%E5%8F%91%E6%9D%BF%E4%B8%8A%E7%94%9F%E6%88%90PWM%E6%AD%A3%E5%BC%A6%E6%B3%A2&spm=1018.2226.3001.4187") \[2\] 百科: [脉冲宽度调制](https://link.juejin.cn?target=https%3A%2F%2Fzh.wikipedia.org%2Fzh-cn%2F%25E8%2584%2588%25E8%25A1%259D%25E5%25AF%25AC%25E5%25BA%25A6%25E8%25AA%25BF%25E8%25AE%258A "https://zh.wikipedia.org/zh-cn/%E8%84%88%E8%A1%9D%E5%AF%AC%E5%BA%A6%E8%AA%BF%E8%AE%8A") \[3\] B站: [【STM32】动画讲解轻松学会STM32的PWM](https://link.juejin.cn?target=https%3A%2F%2Fwww.bilibili.com%2Fvideo%2FBV1Yx4y1x7xY%2F%3Fspm_id_from%3D333.337.search-card.all.click%26vd_source%3D7c627405016c6f00ee3899e8bc03c58d "https://www.bilibili.com/video/BV1Yx4y1x7xY/?spm_id_from=333.337.search-card.all.click&vd_source=7c627405016c6f00ee3899e8bc03c58d") \[4\] CSDN博客: [SPWM基本原理详解(图文并茂+公式推导+C程序实现)](https://link.juejin.cn?target=https%3A%2F%2Fblog.csdn.net%2Fu010632165%2Farticle%2Fdetails%2F110889621%3Fops_request_misc%3D%25257B%252522request%25255Fid%252522%25253A%252522a09150bcbba7d568105a027dd7a8b4d5%252522%25252C%252522scm%252522%25253A%25252220140713.130102334.pc%25255Fall.%252522%25257D%26request_id%3Da09150bcbba7d568105a027dd7a8b4d5%26biz_id%3D0%26utm_medium%3Ddistribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-14-110889621-null-null.142%255Ev102%255Epc_search_result_base7%26utm_term%3D%25E9%259D%25A2%25E7%25A7%25AF%25E7%25AD%2589%25E6%2595%2588%25E5%258E%259F%25E7%2590%2586%26spm%3D1018.2226.3001.4187 "https://blog.csdn.net/u010632165/article/details/110889621?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522a09150bcbba7d568105a027dd7a8b4d5%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=a09150bcbba7d568105a027dd7a8b4d5&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-14-110889621-null-null.142%5Ev102%5Epc_search_result_base7&utm_term=%E9%9D%A2%E7%A7%AF%E7%AD%89%E6%95%88%E5%8E%9F%E7%90%86&spm=1018.2226.3001.4187")