1. PWM基础原理与STM32实现
PWM(脉宽调制)是嵌入式开发中最常用的技术之一,它的核心思想是通过调节方波信号的占空比来模拟不同的电压值。想象一下老式的水龙头开关,快速开关就能控制出水量 - PWM就是这个原理的电子版。
在STM32中,PWM功能是通过定时器实现的。我刚开始接触时总搞混三个关键寄存器:
- ARR(自动重装载寄存器):决定PWM周期
- PSC(预分频器):调整定时器时钟频率
- CCR(捕获/比较寄存器):控制占空比
这里有个实用技巧:计算PWM频率时,记住这个公式:
c复制PWM频率 = 定时器时钟 / [(ARR+1)*(PSC+1)]
比如使用72MHz时钟,想要1kHz频率,可以设PSC=71,ARR=999:
(72,000,000)/(72*1000) = 1000Hz
HAL库配置PWM时有个坑我踩过:一定要先调用HAL_TIM_PWM_Init()初始化定时器,再调用HAL_TIM_PWM_Start()启动输出。有次调试两小时才发现漏了初始化步骤。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 从LED调光到电机控制
2.1 LED呼吸灯实战
呼吸灯是PWM最直观的应用。我用PB8引脚(TIM4_CH3)实现时,发现几个关键点:
- 频率选择:人眼对100Hz以上闪烁不敏感,建议用500Hz-1kHz
- 亮度曲线:直接线性变化会有突兀感,改用指数曲线更自然
实测代码:
c复制// 指数亮度变化
for(int i=0; i<100; i++){
uint16_t val = exp(i/20.0)*10;
__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_3, val);
HAL_Delay(10);
}
2.2 舵机精确控制
SG90舵机需要50Hz的PWM信号,但占空比范围很特殊(0.5ms-2.5ms)。我总结出快速配置法:
- 设置ARR=199,PSC=7199(72MHz时钟下产生20ms周期)
- 角度转换公式:CCR = (角度/180)*20 +5
调试时发现舵机有"吱吱"声?可能是:
- 电源功率不足(建议单独供电)
- 机械负载过大
- PWM信号抖动(检查定时器配
