别再只会调LED亮度了!用STM32 HAL库的PWM驱动舵机,做个会摇头的小风扇(附完整代码)
2026/5/3 19:38:47 网站建设 项目流程

从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为例):

  1. 时钟树设置:确保APB1定时器时钟为72MHz
  2. 定时器参数
    • Prescaler (PSC): 71
    • Counter Mode: Up
    • Counter Period (ARR): 19999
    • auto-reload preload: Enable
  3. 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打印/手工制作的连接件
    • 杜邦线若干

安装要点

  1. 舵机臂与风扇支架固定时确保重心平衡
  2. 使用热熔胶或螺丝固定连接部位
  3. 供电需满足:
    • 舵机单独工作时需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. 项目扩展与创意应用

完成基础功能后,可以考虑以下增强方案:

  1. 无线控制

    • 通过蓝牙模块(HC-05)连接手机APP
    • 使用ESP8266实现WiFi远程控制
  2. 环境响应

    // 根据温度自动调整转速和角度 if(ReadTemperature() > 30) { SetFanSpeed(100); // 全速 SetSweepRange(0, 180); // 最大摇头范围 } else { SetFanSpeed(50); SetSweepRange(45, 135); }
  3. 多舵机联动

    • 使用多个定时器通道控制
    • 实现更复杂的运动轨迹

实际部署中发现,给舵机供电线路并联一个0.1μF的陶瓷电容能显著减少信号干扰。风扇叶片选择轻质材料(如塑料)比金属叶片更适合SG90这类微型舵机驱动。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询