1. 项目概述与核心功能解析
这个基于STM32的智能风扇控制系统,是我在去年夏天为解决宿舍闷热问题而设计的实用项目。当时市面上大多数风扇要么只有机械旋钮控制,要么价格高昂的智能产品功能过剩。于是决定自己动手打造一个兼具实用性和性价比的解决方案。
系统最核心的创新点在于将工业级PID控制算法降维应用到家用风扇场景。通过DHT11传感器采集环境温湿度数据,STM32实时计算当前温度与设定值的偏差,动态调整PWM占空比来控制电机转速。实测证明,这种闭环控制方式比传统档位调节更精准,室温波动能控制在±0.5℃范围内。
硬件架构上采用模块化设计思路:
- 主控:STM32F103C8T6最小系统板(市场价仅15元左右)
- 感知层:DHT11温湿度传感器 + HC-SR505红外人体感应
- 执行层:SG90舵机控制摆头 + 直流电机驱动电路
- 人机交互:0.96寸OLED + tactile按键 + 蜂鸣器报警
- 无线控制:HC-08蓝牙模块对接手机APP
关键设计决策:选择STM32F103而非51单片机,主要考量其内置硬件PWM生成器和12位ADC,这对电机调速和传感器采样精度至关重要。实测证明,相同PID参数下,STM32的转速控制响应速度比89C52快30%以上。
2. 硬件设计深度解析
2.1 主控模块选型对比
在方案论证阶段,我们对比了三款主流MCU:
| 型号 | 价格 | PWM分辨率 | ADC精度 | 中断响应 | 开发难度 |
|---|---|---|---|---|---|
| STC89C52 | 8元 | 软件模拟 | 8位 | 5μs | 简单 |
| ATmega328P | 18元 | 8位硬件 | 10位 | 2μs | 中等 |
| STM32F103C8T6 | 15元 | 16位硬件 | 12位 | 1μs | 较复杂 |
最终选择STM32主要基于三点考量:
- 硬件PWM可直接驱动电机,无需外接专用芯片
- 12位ADC能更精确读取DHT11的模拟量输出
- Cortex-M3内核的中断机制确保红外感应响应延迟<50ms
2.2 传感器电路设计要点
DHT11的接口电路看似简单,但实际调试中发现几个关键细节:
- 上拉电阻取值:4.7KΩ时信号最稳定(10KΩ会导致偶尔通信失败)
- 电源去耦:必须并联100nF陶瓷电容,否则温湿度读数会有±3%波动
- 布线规范:数据线长度不宜超过20cm,且要远离电机驱动线路
红外模块HC-SR505的安装位置也很有讲究。经过多次测试,建议:
- 安装高度:距地面1.2-1.5米(适配坐姿检测)
- 探测角度:向下倾斜15°(避免误触发)
- 防干扰措施:加装黑色海绵遮光罩(抑制日光干扰)
3. 软件架构与PID实现
3.1 主程序状态机设计
系统采用有限状态机(FSM)模式管理运行逻辑:
c复制typedef enum {
BOOT_STATE, // 启动自检
MENU_STATE, // 模式选择
MANUAL_STATE, // 手动调速
AUTO_STATE, // 自动温控
STANDBY_STATE // 无人待机
} SystemState;
void MainLoop() {
static SystemState state = BOOT_STATE;
while(1) {
switch(state) {
case BOOT_STATE:
if(CheckSensors()) state = MENU_STATE;
break;
case MENU_STATE:
state = KeyScan() ? MANUAL_STATE : AUTO_STATE;
break;
// ...其他状态处理
}
}
}
3.2 PID算法参数整定
电机调速采用位置式PID算法:
c复制float PID_Control(float target, float current) {
static float errSum = 0, lastErr = 0;
float err = target - current;
errSum += err;
// 抗积分饱和处理
if(errSum > 1000) errSum = 1000;
else if(errSum < -1000) errSum = -1000;
float output = Kp*err + Ki*errSum + Kd*(err-lastErr);
lastErr = err;
return output;
}
参数整定经验:
- 先设Ki=Kd=0,增大Kp直到系统出现等幅振荡
- 记录振荡周期Tu,按Ziegler-Nichols法计算:
- Kp = 0.6*Ku (Ku为临界增益)
- Ki = 2*Kp/Tu
- Kd = Kp*Tu/8
- 本系统最终参数:Kp=2.5, Ki=0.8, Kd=0.3
4. PCB设计避坑指南
4.1 布局布线关键技巧
-
电源分区布局:
- 数字电源(MCU、蓝牙)与模拟电源(传感器)星型拓扑走线
- 电机驱动单独用2oz铜厚铺铜
-
信号完整性措施:
- PWM信号走线包地处理
- 晶振下方禁止走线
- 蓝牙天线区域净空
-
散热设计:
- 电机驱动MOSFET添加散热过孔阵列
- 避免大电流路径形成环路
4.2 生产测试要点
-
焊接顺序:
- 先贴片后直插
- 温度敏感器件(DHT11)最后焊接
-
功能测试流程:
mermaid复制graph TD A[上电检测] --> B[传感器通讯测试] B --> C[电机空载测试] C --> D[PWM波形测量] D --> E[蓝牙配对测试] E --> F[整机老化测试] -
常见故障排查:
- 电机不转:检查MOSFET栅极电压是否>2.5V
- OLED花屏:重刷I2C上拉电阻(典型值4.7K)
- 蓝牙断连:检查天线阻抗匹配(50Ω特性阻抗)
5. 系统优化与扩展
5.1 实测性能提升方案
通过示波器捕捉PWM波形发现两个优化点:
-
电机启动冲击电流抑制:
- 原方案:直接全占空比启动
- 优化后:软启动策略
c复制void Motor_Start(void) { for(int i=0; i<100; i+=5) { PWM_SetDuty(i); delay_ms(10); } } -
红外抗干扰算法:
- 增加5次连续检测机制
- 动态阈值调整(根据环境光变化)
5.2 功能扩展方向
-
手机APP增强功能:
- 温湿度历史曲线
- 自定义情景模式
- 用电量统计
-
硬件升级选项:
- 换装DHT22提高精度
- 增加PM2.5传感器
- 改用ESP32实现WiFi控制
这个项目从原型到稳定运行历时两个月,最深刻的体会是:嵌入式开发中,硬件可靠性和软件鲁棒性必须同步考虑。比如最初没做电机反电动势保护,导致MCU频繁复位;又比如PID参数未做抗饱和处理,出现过积分失控现象。这些经验教训最终都转化为了系统稳定性的提升。