1. 项目概述与核心设计思路
这个智能风扇控制系统源于我在智能家居领域的实际项目经验。市面上大多数传统风扇要么只能手动调节档位,要么简单的温控功能响应迟缓、精度不足。我们设计的这套系统通过STM32微控制器实现了真正意义上的智能温控,结合人体感应和无线控制,让普通风扇也能拥有高端家电的体验。
系统最核心的创新点在于将工业级PID算法应用于家用风扇控制。与常见的简单阈值控制不同,PID调节能根据温度偏差的变化率动态调整响应速度,避免风速突变带来的不适感。实测表明,在26-30℃这个人体最敏感的温度区间,系统能将环境温度波动控制在±0.5℃以内,远超市面上同类产品。
硬件架构上采用模块化设计思路,主控选用性价比极高的STM32F103C8T6,这款Cortex-M3内核的MCU具有:
- 72MHz主频和丰富的外设接口
- 多达37个GPIO引脚
- 硬件PWM输出和12位ADC
- 低至2.0V的工作电压
这些特性完美匹配了我们的需求,特别是其内置的硬件PWM生成器,可直接驱动电机调速而无需软件模拟,大大减轻了CPU负担。
2. 硬件设计与关键器件选型
2.1 主控模块深度解析
STM32F103C8T6最小系统板的设计有几个工程细节值得注意:
- 复位电路采用10kΩ上拉电阻+0.1μF电容的组合,确保复位信号干净稳定
- 晶振电路选用8MHz无源晶振并联两个22pF负载电容
- 每个电源引脚都放置0.1μF去耦电容,布局时尽量靠近MCU引脚
实际调试中发现,若去耦电容距离MCU超过5mm,可能导致ADC采样出现毛刺。建议使用0805封装的电容直接放置在引脚背面。
2.2 传感器模块对比测试
我们对比了三款常见温湿度传感器:
| 型号 | 测温范围 | 精度 | 响应时间 | 接口方式 | 单价 |
|---|---|---|---|---|---|
| DHT11 | 0-50℃ | ±2℃ | 5s | 单总线 | 8元 |
| DHT22 | -40-80℃ | ±0.5℃ | 2s | 单总线 | 25元 |
| HDC1080 | -40-125℃ | ±0.2℃ | 15ms | I2C | 35元 |
最终选择DHT11主要基于以下考量:
- 家用环境温度极少超出0-50℃范围
- ±2℃精度对风扇控制完全足够
- 单总线接口节省IO资源
- 成本优势明显
2.3 电机驱动电路设计
风扇电机驱动采用经典的MOSFET方案:
c复制// PWM配置代码示例
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 0; // 初始占空比0%
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC3Init(TIM2, &TIM_OCInitStructure);
TIM_Cmd(TIM2, ENABLE);
关键参数计算:
- 电机额定电压12V/0.5A
- MOSFET选型:IRLZ44N(55V/47A)
- 栅极驱动电阻10Ω
- 续流二极管1N5822
3. 软件架构与核心算法实现
3.1 系统状态机设计
系统采用有限状态机(FSM)模型管理运行状态:
mermaid复制stateDiagram
[*] --> 初始化
初始化 --> 待机: 完成自检
待机 --> 手动模式: K1按下
待机 --> 自动模式: K2按下
手动模式 --> 低速: K2短按
手动模式 --> 中速: K2再次短按
手动模式 --> 高速: K2第三次短按
自动模式 --> 待机: 红外无人体信号
3.2 PID控制算法实现
PID核心代码采用位置式算法:
c复制float PID_Calculate(PID_TypeDef *pid, float setpoint, float pv)
{
float error = setpoint - pv;
pid->integral += error;
if(pid->integral > pid->maxIntegral) pid->integral = pid->maxIntegral;
else if(pid->integral < -pid->maxIntegral) pid->integral = -pid->maxIntegral;
float derivative = error - pid->lastError;
pid->lastError = error;
return pid->Kp * error +
pid->Ki * pid->integral +
pid->Kd * derivative;
}
参数整定经验:
- 先设Ki=0,Kd=0,增大Kp直到系统出现等幅振荡
- 取振荡周期Tu,按Ziegler-Nichols法计算:
- Kp = 0.6*Kcr
- Ki = 2*Kp/Tu
- Kd = Kp*Tu/8
- 实际项目中最终采用Kp=3.5, Ki=0.2, Kd=1.8
3.3 蓝牙协议设计
HC-08模块通信协议定义:
code复制帧格式: [HEAD][LEN][CMD][DATA][CRC]
HEAD: 0xAA
LEN: 数据长度
CMD:
0x01 - 设置模式
0x02 - 设置转速
0x03 - 查询状态
CRC: 累加和校验
典型数据包示例:
- 切换自动模式: AA 01 01 00 AC
- 设置转速50%: AA 02 02 32 DE
4. PCB设计实战技巧
4.1 布局规范
-
电源分区布局:
- 数字电源与模拟电源分处PCB两侧
- 电机驱动电路靠近板边便于散热
- DHT11传感器远离发热元件
-
关键信号线处理:
- PWM走线宽度≥15mil
- 晶振走线做包地处理
- 模拟信号走线避免穿越数字区
4.2 设计验证清单
在投板前务必检查:
- 所有元件封装与实际器件匹配
- 电源网络无短路
- 高压部分安全间距≥0.5mm
- 每个IC都有去耦电容
- 测试点覆盖所有关键信号
5. 系统调试与性能优化
5.1 常见故障排查
| 现象 | 可能原因 | 解决方法 |
|---|---|---|
| OLED无显示 | 3.3V电源异常 | 检查1117稳压器输出 |
| 电机抖动不转 | PWM频率设置不当 | 调整频率至16-20kHz |
| 蓝牙连接不稳定 | 天线附近有金属屏蔽 | 调整模块位置或外接天线 |
| 温度读数跳变 | 未添加10kΩ上拉电阻 | 在DATA线添加上拉电阻 |
5.2 实测性能数据
在25℃环境温度下测试:
| 设定温度 | 稳定时间 | 超调量 | 稳态误差 |
|---|---|---|---|
| 26℃ | 2分15秒 | 0.8℃ | ±0.3℃ |
| 28℃ | 1分50秒 | 0.5℃ | ±0.2℃ |
| 30℃ | 3分05秒 | 1.2℃ | ±0.4℃ |
功耗表现:
- 待机状态:12mA @5V
- 全速运行:350mA @12V
- 蓝牙连接增加约8mA
6. 项目进阶方向
这套系统在实际部署后还可以进一步扩展:
- 增加WiFi模块接入家庭物联网
- 实现多风扇组网协同工作
- 添加PM2.5传感器实现空气净化联动
- 开发语音控制功能
我在后续项目中改用了STM32F401系列,其内置硬件浮点单元能显著提升PID运算效率。另外改用BTS7960电机驱动芯片后,PWM频率可提升至50kHz,完全消除电机高频噪声。