从LED到智能风扇:STM32 HAL库PWM驱动舵机全实战
在嵌入式开发中,PWM(脉宽调制)技术常被用于LED亮度调节这类基础应用。但PWM的真正魅力远不止于此——它能驱动舵机、控制电机、甚至构建智能家居的核心部件。本文将带你突破LED调光的局限,用STM32F103C8T6的HAL库PWM功能,打造一个会智能摇头的小风扇项目。
1. 项目核心:SG90舵机工作原理
SG90这类微型舵机的控制本质上是通过PWM信号的占空比来指定角度位置。与LED只需改变亮度不同,舵机对PWM信号的时序有严格要求:
- 基准频率:50Hz(周期20ms)
- 脉冲宽度范围:0.5ms-2.5ms
- 角度对应关系:
- 0.5ms → 0°
- 1.5ms → 90°
- 2.5ms → 180°
在STM32中实现这一控制,需要精确计算定时器参数。以72MHz主频为例:
// 计算50Hz PWM参数(周期20ms) PSC = 71; // 预分频值 ARR = 19999; // 自动重装载值 // 实际周期 = (PSC+1)*(ARR+1)/72MHz = 72*20000/72000000 = 0.02s角度到CCR值的转换公式为:
CCR = (Angle/180 * 2 + 0.5) / 20 * (ARR+1)2. CubeMX定时器配置实战
使用STM32CubeMX配置TIM4的PWM输出通道(以PB9为例):
- 时钟树设置:确保APB1定时器时钟为72MHz
- 定时器参数:
- Prescaler (PSC): 71
- Counter Mode: Up
- Counter Period (ARR): 19999
- auto-reload preload: Enable
- PWM生成配置:
- Mode: PWM Mode 1
- Pulse: 初始占空比(如1500对应90°)
- Fast Mode: Disable
- CH Polarity: High
关键代码实现:
// 角度设置函数 void SetServoAngle(TIM_HandleTypeDef *htim, uint32_t Channel, float angle) { uint32_t ccr = (angle / 180.0 * 2000) + 500; // 0.5ms-2.5ms对应500-2500 __HAL_TIM_SET_COMPARE(htim, Channel, ccr); } // 主循环实现往复运动 while(1) { for(int angle=0; angle<=180; angle+=10) { SetServoAngle(&htim4, TIM_CHANNEL_4, angle); HAL_Delay(100); } for(int angle=180; angle>=0; angle-=10) { SetServoAngle(&htim4, TIM_CHANNEL_4, angle); HAL_Delay(100); } }3. 摇头风扇的机械设计与实现
将舵机转换为风扇摇头动作需要简单的机械结构:
- 材料清单:
- SG90舵机 + 支架
- 5V小风扇
- 3D打印/手工制作的连接件
- 杜邦线若干
安装要点:
- 舵机臂与风扇支架固定时确保重心平衡
- 使用热熔胶或螺丝固定连接部位
- 供电需满足:
- 舵机单独工作时需5V/500mA
- 带负载时建议使用外部5V/2A电源
典型问题解决方案:
| 现象 | 可能原因 | 解决方法 |
|---|---|---|
| 舵机抖动 | 电源不稳 | 增加1000μF电容 |
| 角度不准 | 机械阻力 | 检查结构是否卡顿 |
| 发热严重 | 持续堵转 | 避免硬性限位 |
4. 高级控制:平滑运动与节能优化
基础往复运动可能显得机械呆板,通过改进算法可实现更自然的摇头效果:
// 使用缓动函数实现平滑运动 float easeInOutCubic(float t) { return t < 0.5 ? 4*t*t*t : 1-pow(-2*t+2,3)/2; } void SmoothSweep(TIM_HandleTypeDef *htim, uint32_t Channel) { const uint32_t steps = 50; for(uint32_t i=0; i<=steps; i++) { float progress = easeInOutCubic((float)i/steps); float angle = 180 * progress; SetServoAngle(htim, Channel, angle); HAL_Delay(30); } // 反向运动同理... }节能技巧:
- 在到达目标位置后关闭PWM输出(
HAL_TIM_PWM_Stop) - 使用硬件待机模式降低功耗
- 添加红外或超声波传感器实现有人时启动
5. 项目扩展与创意应用
完成基础功能后,可以考虑以下增强方案:
无线控制:
- 通过蓝牙模块(HC-05)连接手机APP
- 使用ESP8266实现WiFi远程控制
环境响应:
// 根据温度自动调整转速和角度 if(ReadTemperature() > 30) { SetFanSpeed(100); // 全速 SetSweepRange(0, 180); // 最大摇头范围 } else { SetFanSpeed(50); SetSweepRange(45, 135); }多舵机联动:
- 使用多个定时器通道控制
- 实现更复杂的运动轨迹
实际部署中发现,给舵机供电线路并联一个0.1μF的陶瓷电容能显著减少信号干扰。风扇叶片选择轻质材料(如塑料)比金属叶片更适合SG90这类微型舵机驱动。