温控风扇作为嵌入式系统开发的经典练手项目,完美融合了传感器采集、信号处理、PWM控制等核心技能点。这个基于STM32的实现方案特别适合有一定C语言基础,正准备进军嵌入式领域的开发者。我在实际教学中发现,通过这个项目学员能够快速掌握从原理图设计到代码调试的完整开发流程。
相比市面上的玩具级温控风扇,我们这个方案有几个硬核优势:首先采用工业级DS18B20温度传感器,测量精度达到±0.5℃;其次使用STM32硬件PWM驱动风扇,比常见的三极管方案更稳定;最重要的是提供了完整的原理图、PCB设计文件和经过实际验证的固件代码,这些都是在真实项目中积累的宝贵资料。
主控芯片选用STM32F103C8T6这颗性价比之王,72MHz主频完全够用,内置的12位ADC和高级定时器正好满足项目需求。温度传感器方面,DS18B20的单总线协议虽然对时序要求严格,但其防水封装和-55℃~+125℃的宽量程特别适合恶劣环境。风扇驱动部分采用MOSFET IRF540N配合1N4007续流二极管,实测可稳定驱动12V/0.3A的直流风扇。
关键提示:DS18B20的供电方式选择很有讲究。当传输距离超过3米时,建议改用寄生供电模式,但要注意此时温度转换期间总线必须保持高电平。
原理图中这几个细节需要特别注意:
PCB布局时我把温度传感器单独放在板边,通过排针连接,这样方便后期外接探头。电源走线宽度特意加粗到1mm,PWM信号线则做了包地处理。实际打样测试发现,这种布局能有效减少风扇启停对温度测量的干扰。
整个程序采用前后台架构,主循环中主要处理三个任务:
温度控制采用分段线性策略:
DS18B20的时序要求极为严格,这里分享一个经过验证的读取函数:
c复制uint8_t DS18B20_ReadBit(void) {
uint8_t bit=0;
GPIO_ResetBits(DS18B20_PORT, DS18B20_PIN); // 拉低总线
delay_us(2); // 保持2μs
GPIO_SetBits(DS18B20_PORT, DS18B20_PIN); // 释放总线
delay_us(10); // 等待10μs
if(GPIO_ReadInputDataBit(DS18B20_PORT, DS18B20_PIN))
bit=1;
delay_us(50); // 等待周期结束
return bit;
}
调试心得:使用逻辑分析仪抓取时序波形时,发现STM32的GPIO速度配置为50MHz时最稳定。如果出现数据错位,可以尝试微调延时时间。
原始版本的温度控制存在明显超调现象,后来引入增量式PID算法:
c复制typedef struct {
float Kp, Ki, Kd;
float error, lastError, prevError;
} PID_TypeDef;
float PID_Calculate(PID_TypeDef *pid, float setpoint, float input) {
pid->error = setpoint - input;
float increment = pid->Kp * (pid->error - pid->lastError)
+ pid->Ki * pid->error
+ pid->Kd * (pid->error - 2*pid->lastError + pid->prevError);
pid->prevError = pid->lastError;
pid->lastError = pid->error;
return increment;
}
经过多次实测总结出参数调整经验:
最终采用的参数组合:Kp=3.2, Ki=0.05, Kd=1.8,在25℃~60℃范围内能将温度波动控制在±1℃内。
现象:DS18B20返回85℃或-127℃
现象:低占空比时风扇不转
通过以下措施将待机功耗从120mA降至35mA:
在基础版本稳定运行后,可以尝试这些进阶改造:
这个项目的完整资料包中包含了我精心整理的开发笔记,其中记录了二十多个关键调试节点的波形图和解决方案,这些实战经验比单纯的代码更有参考价值。建议初学者先从裸机版本入手,等充分理解各模块工作原理后再进行RTOS改造。