1. 项目概述与核心设计思路
这个基于STM32的自动调速风扇系统,本质上是一个典型的嵌入式闭环控制系统。我在实际开发中发现,这种温控+人体感应的组合方案特别适合用在小型办公场所或者智能家居场景。系统的大脑采用STM32F103C8T6最小系统板,这款Cortex-M3内核的MCU性价比极高,72MHz主频完全能胜任这种实时控制任务。
整个系统的设计亮点在于双重控制逻辑的融合:
- 自动模式:通过DS18B20温度传感器和HC-SR501人体红外模块的联动,实现"有人且温度达标才启动"的智能判断
- 手动模式:提供四档调速功能,满足个性化需求
硬件选型方面有几个值得注意的点:
- L298N电机驱动模块虽然功耗较大,但其双H桥设计可以同时控制两个电机,且自带隔离保护电路
- HC-SR501的探测距离可调(3-7米),但需要特别注意安装角度(建议倾斜15°)
- DS18B20的测温精度为±0.5℃,实际使用中建议每30秒采样一次
2. 硬件系统搭建详解
2.1 核心器件连接方案
在实际接线时,我推荐以下连接方式:
code复制STM32 PB4(PWM) -> L298N ENA
STM32 PB5/6/7 -> L298N IN1/2/3/4 (根据电机转向需求配置)
STM32 PA0 -> DS18B20 DATA
STM32 PA1 -> HC-SR501 OUT
STM32 PC13/14/15 -> 按键1/2/3
I2C接口 -> OLED显示屏
关键提示:L298N的供电一定要与STM32共地,否则PWM信号无法正确识别。电机电源建议使用12V/2A以上的适配器。
2.2 电源设计注意事项
很多初学者容易忽视电源设计,这里分享几个血泪教训:
- 电机启动瞬间会产生电压跌落,建议在L298N的VCC端并联一个1000μF的电解电容
- STM32的3.3V供电最好与电机驱动电源分开,可以使用AMS1117稳压芯片
- DS18B20的供电电压范围是3-5.5V,直接接STM32的3.3V最安全
3. 关键代码实现解析
3.1 PWM电机控制优化
原始代码中的PWM配置可以进一步优化。以下是改进后的初始化代码:
c复制void PWM_Enhanced_Init(void){
TIM_OCInitTypeDef TIM_OCInitStructure;
// 保持原有TimeBase配置
// ...
// 高级PWM配置
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;
TIM_OCInitStructure.TIM_OCFastMode = TIM_OCFastMode_Disable;
TIM_OC1Init(TIM3, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); // 开启预装载
}
改进点:
- 增加预装载功能,避免PWM占空比更新时的毛刺
- 明确配置了互补通道和快速模式
- 添加了空闲状态设置,提高系统安全性
3.2 温度采样算法优化
原始方案直接使用浮点运算,在资源有限的STM32上可能造成性能瓶颈。建议改用定点数运算:
c复制int16_t DS18B20_GetTemp_FixedPoint(void){
uint8_t tempL = DS18B20_ReadByte();
uint8_t tempH = DS18B20_ReadByte();
return ((tempH << 8) | tempL) * 625 / 10000; // 0.0625=625/10000
}
这种实现方式:
- 完全避免浮点运算
- 通过预先放大的整数运算保持精度
- 返回值为实际温度×100,方便后续处理
4. 系统调优与问题排查
4.1 红外传感器抗干扰方案
HC-SR501在实际使用中容易误触发,我总结的稳定方案包括:
- 硬件层面:
- 在输出端添加0.1μF去耦电容
- 模块供电端串联100Ω电阻
- 软件层面:
c复制#define DETECTION_THRESHOLD 3 uint8_t Human_Detect(void){ static uint8_t count = 0; if(HC_SR501_Read() == HIGH){ if(++count >= DETECTION_THRESHOLD){ count = DETECTION_THRESHOLD; return 1; } } else { count = 0; } return 0; }
4.2 电机启动异常处理
常见问题及解决方案:
| 现象 | 可能原因 | 解决方法 |
|---|---|---|
| 电机不转 | PWM频率过高 | 调整ARR为1999,预分频72 |
| 电机抖动 | 电源功率不足 | 增加电源容量或并联电容 |
| 转速不稳 | 地线干扰 | 使用星型接地,加粗地线 |
5. 进阶改进方向
5.1 平滑调速算法
替代原有的分段调速,实现无级变速:
c复制void Smooth_Speed_Control(float temp){
static float last_duty = 0;
float target_duty = 0;
if(temp > 25.0f){
target_duty = (temp - 25.0f) * 25.0f; // 25-36℃映射0-100%
target_duty = constrain(target_duty, 0, 100);
// 添加低通滤波
last_duty = last_duty * 0.7 + target_duty * 0.3;
}
TIM_SetCompare1(TIM3, (uint16_t)(last_duty * 10));
}
5.2 能耗优化方案
- 改用MOSFET驱动方案(如IR2104+IRLZ44N组合)
- 增加休眠模式:无人状态超过5分钟进入低功耗模式
- 动态PWM频率调整:低速时降低PWM频率减少开关损耗
6. 实际部署经验
在办公室环境部署时,有几个实用技巧:
-
温度传感器安装位置:
- 避免阳光直射
- 距离地面1.5-2米高度
- 远离热源和通风口
-
红外传感器调节技巧:
- 灵敏度旋钮调到中间位置
- 延时旋钮建议设置在1分钟左右
- 检测模式选择"不可重复触发"
-
电机选型建议:
- 优选含油轴承的直流风扇(如ADDA AD0412MX)
- 额定电流不超过L298N单路最大电流(2A)
- 优先选择PWM调速型风扇
这个项目最让我惊喜的是它的扩展性。后期我增加了WiFi模块,通过手机APP可以远程查看温度和控制风扇,甚至接入了语音控制功能。STM32丰富的片上资源让这些扩展变得非常容易实现。
