1. 项目概述:当传统风扇遇上STM32
去年夏天维修老式电风扇时,我发现机械旋钮已经严重老化,每次调节风速都得反复尝试。这让我萌生了一个想法:能不能用STM32给传统风扇来个智能化改造?经过两个月的摸索,这套基于STM32F103C8T6的智能风扇控制系统终于落地,它不仅实现了无级调速、手机遥控等基础功能,还加入了温湿度自动调节和人体感应等实用特性。
这个系统的核心价值在于用不到50元的成本(主控+传感器),让普通风扇获得接近高端智能风扇的体验。特别适合电子爱好者DIY改造,或者作为嵌入式学习的综合实践项目。下面我就从硬件选型到软件实现,完整分享整个开发过程中的关键技术和踩坑经验。
2. 硬件架构设计与关键元件选型
2.1 主控芯片的性价比之选
在对比了STM32F103C8T6(蓝莓派最小系统板)和ESP8266后,最终选择了前者,主要考虑三点:
- PWM输出精度:需要产生0.1%精度的PWM信号控制电机转速
- ADC通道数量:需同时采集温湿度、人体红外等模拟信号
- 实时性要求:ESP8266在WiFi通信时可能出现控制延迟
具体硬件配置:
- 主控:STM32F103C8T6(72MHz Cortex-M3)
- 电机驱动:BTN7971B大电流半桥驱动(支持3A持续电流)
- 温湿度:DHT22(±0.5℃精度)
- 人体感应:HC-SR501红外模块
- 显示:0.96寸OLED(SSD1306驱动)
关键提示:电机驱动一定要留足余量,实测普通风扇启动瞬间电流可达正常工作电流的3倍
2.2 电路设计中的血泪教训
最初版本使用L298N驱动模块,结果出现两个严重问题:
- 电机低速运转时发出刺耳啸叫(PWM频率不当)
- 连续工作1小时后驱动芯片过热保护
改进方案:
- 将PWM频率从1kHz提升到18kHz(超出人耳听觉范围)
- 改用BTN7971B并加装散热片
- 在电机两端并联104电容吸收反电动势
电路连接示意图:
c复制[STM32]PWM1 → [BTN7971B]IN
→ [风扇电机]
→ [电流检测电路] → [STM32]ADC1
3. 核心功能实现与算法解析
3.1 无级调速的三种控制模式
-
手动模式:
- 通过旋转编码器调节PWM占空比(0-100%)
- 关键代码:
c复制void set_motor_speed(uint8_t percent) { TIM1->CCR1 = (percent * MAX_PWM) / 100; }
-
自动温控模式:
- 采用PID算法动态调节转速
- 温度-转速曲线公式:
code复制转速% = (当前温度 - 设定下限) × 100 / (设定上限 - 设定下限)
-
人体感应模式:
- 检测到人时按设定转速运行
- 无人状态30分钟后自动关机
- 使用定时器中断实现延时判断
3.2 手机蓝牙控制实现
采用HC-05模块实现蓝牙串口通信,协议设计要点:
- 固定帧头0xAA 0x55
- 指令类型(1字节)
- 数据长度(1字节)
- 数据内容(N字节)
- CRC校验(1字节)
典型控制指令示例:
code复制AA 55 01 01 32 47 → 设置风速50%(0x32)
AA 55 02 01 01 48 → 切换为自动模式
4. 低功耗设计与优化技巧
4.1 待机功耗从56mA降到2.3mA的秘诀
-
关闭未用外设时钟:
c复制
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, DISABLE); -
优化GPIO配置:
- 输出引脚设置为推挽输出
- 输入引脚配置为下拉模式
-
使用停机模式(Stop Mode):
c复制
PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);
4.2 电机控制的节能策略
-
启动加速算法:
- 初始占空比30%
- 每100ms增加5%直到目标值
- 减少启动冲击电流
-
动态PWM频率调整:
- 低速时用8kHz频率
- 高速时切到18kHz
- 平衡噪音和效率
5. 常见问题与解决方案实录
5.1 电机异常抖动排查
现象:转速低于30%时电机间歇性抖动
原因:PWM占空比太小导致转矩不足
解决方案:
- 修改死区时间为1.5μs
c复制TIM1->BDTR |= 0x18; // 设置死区时间 - 添加最小占空比限制(硬编码不低于20%)
5.2 温湿度传感器读数异常
现象:DHT22偶尔返回85℃错误值
排查过程:
- 检查电源电压(需稳定3.3V)
- 调整数据线长度(缩短到30cm内)
- 添加10K上拉电阻
- 优化读取时序(严格遵循20ms起始信号)
最终修正的读取函数:
c复制uint8_t DHT22_Read(float *temp, float *humi) {
// 增加超时判断
if(等待响应超时) return ERROR;
// 校验数据CRC
if(crc != 预期值) return ERROR;
// 数据转换
*temp = ((data[2]<<8)|data[3]) * 0.1;
*humi = ((data[0]<<8)|data[1]) * 0.1;
return SUCCESS;
}
6. 项目进阶与扩展方向
6.1 可扩展的硬件接口
- 预留I2C接口:可接空气质量传感器(如SGP30)
- 备用USART:支持WiFi模块扩展
- ADC输入端子:方便接入光敏电阻等
6.2 软件功能升级计划
-
增加"自然风"模式:
- 随机波动算法生成拟真风速曲线
- 模拟山谷气流变化规律
-
实现多设备联动:
- 通过RFID识别不同用户
- 记忆个人偏好设置
-
能耗统计功能:
- 基于电流检测计算实时功率
- 统计累计用电量
这个项目最让我惊喜的是,原本只是简单的调速需求,在深入优化过程中发现了嵌入式开发的无数细节乐趣。比如PID参数整定时,发现电机惯性导致的超调问题,最终通过加入速度前馈补偿解决了这个问题。建议大家在复现时,可以先实现基础功能,再逐步添加智能特性,这样更容易获得成就感。