天哪!原来PWM这么简单

大鱼机器人 2020-12-03

目录

  • 基本原理

  • PWM是如何实现?

  • 分类

  • 程序实现

  • 总结

基本原理

PWM的全称是 脉冲宽度调制Pulse-width modulation),是通过将有效的电信号分散成离散形式从而来降低电信号所传递的平均功率的一种方式;
所以根据 面积等效法则,可以通过对改变脉冲的时间宽度,来等效的获得所需要合成的相应 幅值频率的波形;
具体如下图所示;
由上图可知, 脉冲宽度调制使用一个脉冲宽度会被调制的方波,并且波型的平均值会有所变化。
如果我们考虑一个周期为 的脉冲波 ,低值 ,高值为 ,跟占空比 (duty cycle),此波的平均值为:
是一个脉冲波,它的值在 而在
上式的描述可以变为:
以上公式可以在很多状况下被简化,当
从这里可以看出,波型的平均值非常明显地直接与占空比 有关。
占空比
图中存在三种占空比状态, 25%50%75%占空比状态,不难发现,假设占空比为 D,则满足:
其中 是PWM的周期,通常和载波的周期相同;

PWM是如何实现?

PWM实现的原理是通过锯齿波/三角波(载波)所需要合成的波形(调制波)进行比较,然后确定PWM所需要输出的极性,通常是 ON或者是 OFF,因为一般都是作用到开关元器件上;如下图所示;
振荡器和比较器
振荡器输出的锯齿波和参考值 进行比较,然后就可以输出 PWM波形了;
matlabsimulink中搭建了一下仿真,具体如下图所示;
simulink
最终输出波形如下:
50%占空比
这里简单说明一下:
  • 锯齿波(图中橙色波形)最大为 10,然后我希望输出平均为 5的波形(图1中红色的水平直线);
  • 那么通过比较,当锯齿波小于 5时;PWM输出低电平,即为 OFF
  • 当锯齿波大于 5时,PWM输出高电平,即为 ON
所以再换一个思路,如果我希望输出一个电压逐渐升高的波形呢,该如何设计呢?
其实很简单,只要把需要调制的波形设置为斜坡输出的波形就可以了,具体如下图所示;
占空比逐渐增大
可以看到,最终占空比逐渐从 0%增大到 100%
然后我们继续想, 能不能调制出其他的波形,比如调制一个 正弦波 sin wave,那也就是我们常说的 SPWM,其实是可以的,具体如下图所示;
SPWM

分类

参考STM32中PWM的配置,根据载波波形的形状,假设三角波最大值是10,那么它的变化过程可能存在以下两种情况:
  • 完整周期包括两个过程,先递增,再递减: ,这种也叫中央对齐PWM;
  • 完整周期只有递增过程:
中央对齐PWM
脉冲波的中心将会被固定在时间窗格的中心,同时脉冲波的两边可以移动,使得波的宽度被延伸或压缩,具体如下图所示;
中央对齐PWM
另一种类型的PWM脉冲波形如下图所示;

程序实现

现在的 MCU大部分都自带硬件 PWM发生器,即配置好相应的寄存器,就能直接产生 PWM,下面的例子基于 NUCLEO-F767ZI,通过 cubemx配置了三路 PWM输出,然后实现了呼吸灯的效果;
   
int main(void)
{

 HAL_Init();

 MX_GPIO_Init();
 MX_TIM4_Init();
 MX_TIM3_Init();
 MX_TIM12_Init();

  int32_t time_stamp =  0;
  int32_t time_stamp_old =  0;
  int32_t ccr_val =  0;
  uint8_t add_flag =  1;
 HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_2);
 HAL_TIM_PWM_Start(&htim12, TIM_CHANNEL_1);
 HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_3); 
  while ( 1)
 {
   time_stamp = HAL_GetTick();
   if(time_stamp - time_stamp_old >  5){
   time_stamp_old = time_stamp;
   if(add_flag){
    ccr_val+= 25;
    if(ccr_val >=  0xFFFF){
    ccr_val =  0xFFFF;
    add_flag =  0;
   }
   } else{
    ccr_val-= 25;
    if(ccr_val <=  0){
     add_flag =  1;
     ccr_val =  0;
    }
   }
   TIM4->CCR2 = ccr_val;
   TIM12->CCR1 = ccr_val;
   TIM3->CCR3 = ccr_val;
   }
 }
}
整体效果如下:
呼吸灯
通过示波器看其中的一路 PWM输出的占空比也是随时间变化;
PWM变化情况

总结

本文简单介绍了PWM的原理,以及如何产生PWM,可以通过锯齿波作为载波和调制波经过比较强,产生相应的PWM输出波形,最后结合STM32实现了一个呼吸灯的简单程序。
-END-

整理文章为传播相关技术,版权归原作者所有 |
| 如有侵权,请联系删除 |

往期好文合集


什么是PWM“死区”?

电子设计竞赛(三)-SPWM与PID

PCB工程师的7个好习惯

  最 后   
 

若觉得文章不错,转发分享,也是我们继续更新的动力。
5T资源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,PCB、FPGA、DSP、labview、单片机、等等
在公众号内回复「更多资源」,即可免费获取,期待你的关注~
大鱼机器人 一个专注于机器人技术,单片机,嵌入式系统,智能家居,智能设备,PCB设计,IT最新动态的自媒体。此外,还有海量学习资源等你来领取。作者:张巧龙,个人微信号:well_xiaolong。欢迎关注公众号,名称:大鱼机器人,公众号ID:All_best_xiaolong
评论
热门推荐
相关推荐
我要评论
0
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦