STM32定时器与PWM实战:从呼吸灯到舵机控制的代码要点
定时器和PWM是STM32开发里使用频率极高的外设,呼吸灯、舵机控制、电机调速、蜂鸣器音乐都离不开它们。本文从实战角度拆解STM32定时器产生PWM的核心思路,并给出两个典型应用的实现要点。
先理清基本原理。PWM就是周期固定的方波中高电平宽度可变,占空比决定平均输出大小。STM32用定时器计数,比较寄存器CCR的值决定翻转时刻,从而生成PWM波形。理解ARR(自动重装载值)决定周期、CCR决定占空比,是掌握PWM的第一步。
配置上推荐用CubeMX生成基础代码,再在工程里做二次开发。选择定时器通道并配置为PWM Generation,设置好预分频和计数周期,例如要产生1kHz的PWM,可以先算出合适的预分频值和ARR组合。生成代码后,用HAL_TIM_PWM_Start开启输出,再通过修改CCR寄存器或调用占空比设置函数来改变输出。
呼吸灯是经典的入门实战。思路是让占空比从0缓慢增加到最大,再缓慢减回0,形成亮度渐变的呼吸效果。实现时要注意渐变步进和延时不能阻塞主循环,可以用定时器中断配合状态机,让呼吸过程异步进行。实际效果上,人眼对低亮度变化更敏感,步进采用指数或对数映射会比线性渐变更平滑。
舵机控制则是PWM的高频应用场景。舵机通常需要50Hz(20ms周期)的PWM信号,高电平宽度在0.5ms到2.5ms之间对应0到180度角度。用STM32定时器配置50Hz PWM后,把角度换算成对应的CCR值即可精准控制舵机角度。需要注意舵机电源要独立供电,直接接单片机IO容易造成电压跌落导致复位。
电机调速也是同样的套路。直流电机的平均电压由PWM占空比决定,通过按键或电位器动态调整占空比就能实现无极调速。带编码器的电机还可以用定时器同时实现测速,形成闭环控制,这就进入更进阶的领域了。
最后提醒几个实战细节:一是不同定时器的时钟源和最大计数能力不同,选型时注意主频计算;二是修改占空比时尽量在更新事件里同步修改,避免输出毛刺;三是示波器是调试PWM的最好工具,波形一眼就能看出配置是否正确。把这几个点吃透,STM32定时器和PWM你就能玩得很溜。 |
|
|
|
|
|
|
|