1. 项目概述:当单片机遇上电热毯
去年冬天帮老家亲戚修电热毯时,发现市面上大多数产品还在用机械旋钮控制温度,不仅精度差,还存在安全隐患。于是萌生了用STM32改造传统电热毯的想法——通过PID算法实现±0.5℃的精准控温,加入定时关闭、异常断电保护等智能功能。这个仿真系统在Proteus里完整实现了硬件电路设计、温度闭环控制和用户交互界面,所有源码都经过实际验证。
2. 系统架构设计
2.1 核心控制模块选型
选用STM32F103C8T6作为主控,这款Cortex-M3内核单片机具有:
- 72MHz主频满足实时控制需求
- 内置12位ADC(用于NTC热敏电阻采样)
- 4个通用定时器(其中TIM1用于PWM发热控制)
- 充足的GPIO驱动按键和显示屏
注意:Proteus仿真时需加载STM32F103C8库文件,部分型号可能缺失ADC模块
2.2 温度检测方案对比
| 方案 | 精度 | 成本 | 响应速度 | 适用性 |
|---|---|---|---|---|
| DS18B20 | ±0.5℃ | 中 | 慢 | 数字接口 |
| NTC热敏电阻 | ±1℃ | 低 | 快 | 需ADC |
| PT100 | ±0.1℃ | 高 | 中 | 工业级 |
最终选择10K NTC热敏电阻(MF52-103)方案,配合分压电路和软件滤波:
c复制// 温度计算公式(Steinhart-Hart方程简化版)
float Temp_Calculate(uint16_t adc_val) {
float Rt = 10000.0 * (4095.0/adc_val - 1); // 10K分压电阻
float tempK = 1/(1/(273.15+25) + log(Rt/10000)/3950.0);
return tempK - 273.15; // 转摄氏温度
}
2.3 加热执行单元设计
采用MOSFET(IRF540N)驱动发热丝,关键参数计算:
- 发热丝功率:50W(安全电压24V时电流约2.1A)
- PWM频率:1kHz(避免可闻噪声)
- 占空比分辨率:1%(TIM1配置为100级PWM)
硬件保护措施:
- 自恢复保险丝(2.5A)
- MOSFET栅极保护二极管
- 继电器冗余断电保护
3. 控制算法实现
3.1 PID参数整定过程
通过Ziegler-Nichols方法现场调试:
- 先设Ki=Kd=0,增大Kp至系统开始振荡(临界增益Kc=8.2)
- 记录振荡周期Tc=25s
- 按PID公式计算:
- Kp = 0.6*Kc = 4.92
- Ki = 2*Kp/Tc = 0.393
- Kd = Kp*Tc/8 = 15.375
c复制// 增量式PID实现代码
typedef struct {
float Kp,Ki,Kd;
float Err[3]; // 最近三次误差
} PID;
float PID_Calculate(PID* pid, float target, float actual) {
pid->Err[2] = pid->Err[1];
pid->Err[1] = pid->Err[0];
pid->Err[0] = target - actual;
float delta = pid->Kp*(pid->Err[0]-pid->Err[1])
+ pid->Ki*pid->Err[0]
+ pid->Kd*(pid->Err[0]-2*pid->Err[1]+pid->Err[2]);
return delta;
}
3.2 温度场均匀性优化
实测发现电热毯边缘散热快导致温差达3℃,采取以下措施:
- 分区控温:将发热丝分为3个独立回路
- 边缘补偿:边缘区域设定温度提高1.5℃
- 动态调整:根据环境温度自动修正PID参数
4. Proteus仿真要点
4.1 关键元件参数设置
-
NTC热敏电阻模型:
- 选择"THERMISTOR"元件
- B值设为3950
- R25设为10kΩ
-
发热丝等效电路:
- 用电阻串联电感模拟(0.5Ω + 10mH)
- 并联100nF电容消除开关噪声
-
虚拟示波器监测点:
- ADC输入通道(温度反馈)
- PWM输出波形
- MOSFET栅极驱动信号
4.2 仿真调试技巧
-
加速仿真方法:
- 修改NTC的Thermal Time Constant为0.1s(实际约5s)
- 调小发热丝热容参数
-
典型故障模拟:
python复制# 在脚本中注入故障(需Proteus VSM API) def inject_fault(): if time > 30: # 30秒后模拟传感器故障 write_ADC(0) # 输出0V elif time > 60: # 60秒后模拟MOSFET击穿 set_pin(GATE_PIN, 1) # 持续导通
5. 安全防护机制
5.1 三级保护策略
-
软件保护层:
- 温度超过50℃立即切断输出
- 持续加热30分钟提醒用户
- ADC采样异常检测(开路/短路判断)
-
硬件保护层:
- 过流保护电路(比较器+保险丝)
- 机械温控开关(双金属片,65℃动作)
-
系统级保护:
- 看门狗定时器(独立硬件WDT)
- 供电电压监测(STM32内置PVD)
5.2 故障自诊断设计
通过LED编码显示故障类型:
- 快闪2次:温度传感器异常
- 快闪3次:MOSFET驱动故障
- 慢闪1次:过流保护触发
6. 实际部署注意事项
-
电磁兼容处理:
- 发热丝双绞布线降低辐射
- MOSFET就近放置续流二极管
- 控制板与功率线路物理隔离
-
长期运行建议:
- 每季度校准一次温度传感器
- 检查发热丝绝缘电阻(应>10MΩ)
- 避免折叠使用(局部过热风险)
-
功耗优化技巧:
- 采用Bang-Bang+PID混合控制
- 睡眠模式下关闭显示屏背光
- 根据被褥厚度自动调整控温曲线
这个项目最让我意外的是PID参数对环境温度非常敏感,后来增加了温度-参数对照表才解决。另外建议用硅胶加热片替代传统电热丝,不仅更安全还能实现分区控温。
