PWM是 Pulse Width Modulation 的缩写,中文意思就是脉冲宽度调制,简称脉宽调制。它是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,其控制简单、灵活和动态响应好等优点而成为电力电子技术最广泛应用的控制方式,其应用领域包括测量,通信,功率控制与变换,电动机控制、伺服控制、调光、开关电源,甚至某些音频放大器,因此学习PWM具有十分重要的现实意义。其实我们也可以这样理解,PWM是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。
如上图所示,数字信号的脉冲宽度与模似信号的大小成正比,这就实现了模拟信号对脉冲宽度的调制——所谓调制,就是随它的变化而变化的另一种说法而已。
反过来,也可以说,用数字信号,对模拟信号幅度变化实现了编码。
2.STM32F1 PWM介绍
STM32F1除了基本定时器TIM6和TIM7,其他定时器都可以产生PWM输出。其中高级定时器 TIM1 和 TIM8 每个可以同时产生多达 7 路的 PWM 输出。而通用定时器每个也能同时产生多达 4路的 PWM 输出。所以,一个STM32芯片,就可以同时产生2*7+4*4=30路的PWM输出,这在机器人实验中很有用,因为机器人动作需要驱动很多个电机,每个电机就需要一个PWM来控制。
PWM的输出其实就是对外输出脉宽可调(即占空比调节)的方波信号,信号频率是由自动重装寄存器 ARR 的值决定,占空比由比较寄存器 CCR 的值决定。
信号频率是由自动重装寄存器 ARR 的值决定,这个很好理解。从前面定时器就可以知道,定时器初值ARR设定后,以向上模式为例,CNT从0计数到ARR值-1时,就会产生一个溢出中断。假定每500ms产生这样一个中断,那么,这就是PWM的周期或者说频率。
这样的一个周期,是包括了PWM高电平和低电平的。那么,在这个周期里,高电平多长,低电平多长,这需要另外一个值(也就是CCR里的值)以及一个比较器来决定。
以上图为例来说明,上图中ARR的值为8,也就是整个PWM的周期就是8,从上图中可以看出,OCXREF就是输出的PWM信号,在一个周期内,其高电平的宽度,取决于CCR里的值。这就是等,只要改变CCR里的值,就可以动态地改变每个PWM周期里高电平的宽度。这样就实现了脉冲宽度调节的功能。
当CNT开始计数后,在每一个ARR的值的周期,它都不断地动态与CCR值进行比较,只要它大于CCR里的值,它就输出高电平,反之就输出低电平。
比如,在CCR为4时,CNT计数从0-3时,因为与CCR比较,发现它都小于CCR,所以,OCXREF就一直输出高电平(默认)。当CNT计数到4时,发现与其大于等于当前的CCR了,那么,OCXREF就输出高电平,同时产生一个CCXIF翻转标志。之后就维持低电平,直到CNT计数到ARR值(8),产生溢出中断。然后就重新变为默认的高电平。