基于STM32与多传感器融合的智能风扇系统设计与实现

张开发
2026/4/15 18:36:25 15 分钟阅读

分享文章

基于STM32与多传感器融合的智能风扇系统设计与实现
1. 智能风扇系统的设计初衷与核心功能每次夏天被热醒的时候我都在想能不能做个会看脸色的风扇——人靠近自动调风速离开自动关机躺着不动也能用手机遥控。这就是我们基于STM32设计的智能风扇系统的起点。这个系统最让我自豪的是它像长了眼睛和耳朵红外传感器能探测3米内的人体活动TCRT5000模块在10cm距离内发现障碍物会立即刹车配合蓝牙模块用手机APP就能远程调节五档风速。实际测试中发现个有趣现象当室内温度达到30℃时人体感应模块的灵敏度会提升约15%。这意味着天气越热风扇越积极地寻找服务对象。系统采用STM32F103ZET6作为主控这颗72MHz的Cortex-M3芯片同时处理着四路传感器数据——红外遥控解码、人体热释电信号、蓝牙数据包解析、电机转速反馈CPU占用率始终保持在60%以下。2. 硬件架构的巧妙设计2.1 主控与感知层配置在硬件选型上我踩过不少坑最初用的STM32F103C8T6就因为IO口不够被迫升级。现在的配置是主控STM32F103ZET6144引脚封装显示2.8寸TFTLCD240x320分辨率人体检测HC-SR501热释电传感器可调灵敏度防撞检测TCRT5000红外反射传感器无线控制HC-05蓝牙模块Class2 10米距离特别要说下L298N电机驱动模块的散热问题。实测驱动12V直流电机时不加散热片的情况下连续工作30分钟芯片表面温度会达到78℃。后来我在模块背面加了铝合金散热片温度直降42℃现在长时间运行稳如老狗。2.2 电源管理的实战经验电源设计上有三个关键点主控与传感器共用AMS1117-3.3稳压芯片电机驱动单独使用LM2596降压模块输入24V输出12V在VCC与GND之间并联100μF电解电容104瓷片电容组合这种设计让系统在电机启停时的电压波动不超过0.3V。有次实验室突然断电电容储备的电能居然让系统完整执行了停机保护流程成功避免了电机堵转。3. PWM调速的工程实践3.1 定时器的精准配置TIM3的PWM配置代码看着复杂其实就把握三个参数TIM_TimeBaseStructure.TIM_Period 899; // 自动重装载值 TIM_TimeBaseStructure.TIM_Prescaler 0; // 预分频系数 TIM_OCInitStructure.TIM_Pulse 300; // 比较值这三个数字决定了PWM频率72MHz/(8991)/(01)80kHz占空比TIM_Pulse/(TIM_Period1)。实测发现当PWM频率超过20kHz时电机啸叫声完全消失但驱动芯片发热量会增加。3.2 风速档位的算法优化传统风扇的档位切换像楼梯台阶我们改进的算法是这样的void set_speed(uint8_t level) { static const uint16_t speed_table[5] {0, 200, 400, 600, 800}; TIM_SetCompare2(TIM3, speed_table[level-1]); current_speed level; }但实测发现电机从0加速到800需要1.2秒于是加入软启动功能for(int i0; ispeed_table[level-1]; i10) { TIM_SetCompare2(TIM3, i); delay_ms(10); }现在换档过程如德芙般丝滑再没有咔咔的机械冲击声。4. 多传感器数据融合策略4.1 安全防护的优先级设计当多个传感器同时触发时系统按这个优先级处理TCRT5000防撞信号立即断电HC-SR501人体信号维持运转红外遥控指令改变状态蓝牙控制后台运行用状态机实现特别合适typedef enum { EMERGENCY_STOP, NORMAL_OPERATION, STANDBY_MODE } FanState; void handle_sensors() { if(TCRT5000_Read()) current_state EMERGENCY_STOP; else if(HC_SR501_Read()) current_state NORMAL_OPERATION; else current_state STANDBY_MODE; }4.2 滤波算法的选择红外遥控容易受日光干扰我们采用3取2表决法#define SAMPLE_TIMES 3 uint8_t ir_decode() { uint8_t votes[32] {0}; for(int i0; iSAMPLE_TIMES; i) { uint32_t code NEC_Decode(); for(int b0; b32; b) { if(code (1b)) votes[b]; } } uint32_t result 0; for(int b0; b32; b) { if(votes[b] 2) result | (1b); } return result; }这方法让遥控识别准确率从87%提升到99.6%代价只是多了50ms的解码时间。5. 蓝牙控制与状态同步5.1 协议设计的小技巧蓝牙通信最怕数据粘包我们的解决方案是每个指令以0xAA开头用0x55作为结束符加入异或校验字节手机端发送正转3档的指令格式如下AA 01 03 55 [校验码]STM32收到后会回复当前状态AA 81 [转速] [模式] 55 [校验码]5.2 低功耗优化发现蓝牙模块即使空闲也有35mA耗电于是加入超时机制if(last_ctrl_time 300000 HAL_GetTick()) { HC05_Sleep(); LCD_Display(蓝牙休眠); }当5分钟无操作时自动进入休眠模式整体功耗从120mA降到85mA。唤醒只需要手机重新连接用户体验完全不受影响。6. 系统稳定性提升方案6.1 看门狗的实战应用有次电机堵转导致系统死机后来我加了独立看门狗IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); IWDG_SetPrescaler(IWDG_Prescaler_32); // 约1.6秒超时 IWDG_SetReload(0xFFF); IWDG_ReloadCounter(); IWDG_Enable();在main循环里定期喂狗while(1) { IWDG_ReloadCounter(); // ...其他代码 }现在即使程序跑飞也会自动复位再没出现过风扇发疯的情况。6.2 电机保护的进阶设计L298N的驱动电流可达2A但持续工作容易过热。我们设计了三重保护软件限流PWM占空比不超过85%硬件保护在输出端加快速熔断保险丝温度监控DS18B20检测驱动板温度当温度超过65℃时系统会自动降低档位并提示if(ds18b20_read() 65) { current_speed MAX(1, current_speed-1); LCD_Display(降温保护中); }

更多文章