PWM呼吸灯之三角波、锯齿波、正弦函数波

时间:2024-05-23 12:12:03

脉冲宽度调制(PWM),是英文“Pulse Width Modulation” 的缩写,简称脉宽调制,是利用
微处理器(MCU)的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点,就是对脉冲宽
度的控制。

STM32的定时器分为高级控制定时器(TIM1和TIM8)、通用定时器(TIM2-TIM5)、基本定时器(TIM6和TIM7)。STM32 的定时器除了 TIM6 和 7。其他的定时器都可以用来产生 PWM 输出。其中高级定时器 TIM1 和 TIM8 可以同时产生多达 7 路的 PWM 输出。而通用定时器也能同时产生多达 4路的 PWM 输出,这样, STM32 最多可以同时产生 30 路 PWM 输出!
话不多说,来看程序流程。
首先,对定时器进行初始化,这些参考库函数版本。初始化过程中有几个问题需要注意:1.有的输出引脚需要用到定时器重映射或者完全映射,这个对应自己用的引脚,查表配置即可;2.设置输出PWM脉冲波形引脚为复用推挽输出;3.初始化定时器的时候,注意到ARR是自动重载值,PSC为时钟预分频系数;4.初始化PWM模式的时候,先确定是PWM1模式还是PWM2模式,因为这里有个关键配置(这个很容易疏忽),即TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性比较。这里设置为Low,在PWM2模式下,意味着当计数器的值<自己设置的占空比的值时,引脚输出高电平,反之亦然。
然后,我们看一个关键公式:PWM的频率=72MHz/(psc+1)(arr+1)。其中72MHz为二倍时钟周期,psc和arr前面提到了。这样得到了PWM脉冲波形的频率之后,就可以进一步算出周期。CNT为定时器的值,CCRX是由自己设置的占空比的值,ARR为占空比的最大值。
最后,我们看一下如何让PWM输出脉冲波形以三角波,锯齿波,正弦函数形式变化。
PWM呼吸灯之三角波、锯齿波、正弦函数波
这是我用示波器截取的PWM脉冲波形的变化图,我的arr值为899,psc值为0(不分频),所以一个周期为12.5μs。STM32库函数历程上给的是以三角波形式变化:即由亮变暗再由暗变亮。而根据三角波的配置可以很轻松地改成锯齿波的形式:即由亮变暗再接着由亮变暗。
下面重点说一下正弦函数形式。需要引进一个函数:result = 450.0sin(param3.14/180);其中result为占空比的值,占空比不断变化导致灯泡亮度按照占空比的变化规律而变化,param为弧度值,我们让它从0到90变化,450.0为CCRX的值,即占空比的最大值为450.0。这样PWM脉冲波形就可以以正弦函数形式变化。