基于51单片机控制的温控风扇(含PID调节、Proteus仿真、原理图与流程图等详细资料)
基于51单片机的风扇(温度,PID)proteus、原理图 1236-基于51单片机的风扇(温度,PID)proteus、原理图、流程图、物料清单、仿真图、源代码 功能介绍: 温控风扇(散热器、电扇等) 1、手动控制启停,按键控制 2、可任意调节PID参数,改善控制效果 3、输出为PWM信号控制直流电机 有哪些资料: 1、仿真工程文件 2、源代码工程文件 3、原理图工程文件 4、流程图 5、功能介绍 6、元件清单

搞单片机开发的人,谁没折腾过温控风扇呢?今天咱们来拆解一个基于51的智能风扇方案,从硬件到代码手把手看它怎么玩转PID控制。这个项目最有趣的地方在于——它居然用古老的STC89C52实现了带参数自整定的PID算法!(别急着说51太low,人家在低成本场景里照样能打)

基于51单片机的风扇(温度,PID)proteus、原理图 1236-基于51单片机的风扇(温度,PID)proteus、原理图、流程图、物料清单、仿真图、源代码 功能介绍: 温控风扇(散热器、电扇等) 1、手动控制启停,按键控制 2、可任意调节PID参数,改善控制效果 3、输出为PWM信号控制直流电机 有哪些资料: 1、仿真工程文件 2、源代码工程文件 3、原理图工程文件 4、流程图 5、功能介绍 6、元件清单

先看硬件配置:DS18B20测温,LCD1602显示参数,四个按键负责启停和PID调节,PWM信号通过三极管驱动直流电机。电路里有个细节挺有意思——用三极管TIP41组成的H桥电路驱动电机,实测中发现占空比低于20%时电机容易卡死,于是在代码里加了最小占空比限制:
if(PWM_Duty > 80) PWM_Duty = 80; //限制最大转速
if(PWM_Duty < 20) PWM_Duty = 20; //防止电机堵转
PID算法的核心代码在定时器中断里执行,每秒钟计算一次输出。注意这里用了浮点运算,虽然51处理浮点有点吃力,但实测1秒的运算周期完全hold住:
float PID_Calculate(float currentTemp){
static float integral = 0, lastError = 0;
float error = targetTemp - currentTemp;
integral += error * dt; //积分项
float derivative = (error - lastError)/dt; //微分项
lastError = error;
return Kp*error + Ki*integral + Kd*derivative;
}
按键处理部分采用了状态机设计,长按参数时数值变化会加速,这个交互细节很实用。看这个按键扫描函数:
void Key_Scan(){
if(KEY1 == 0){
delay_ms(10); //消抖
if(KEY1 == 0){
while(!KEY1); //等待松开
if(++mode > 3) mode = 0; //切换显示模式
}
}
//其他按键处理类似...
}
PWM生成用的是定时器0的8位自动重载模式,通过修改TH0的值调整占空比。这里有个技巧——把PWM周期设为20ms(50Hz),既能保证电机平稳运行,又不会让三极管过热:
void PWM_Init(){
TMOD |= 0x02; //定时器0模式2
TH0 = 256 - 100; //初始占空比
TL0 = 256 - 100;
ET0 = 1;
TR0 = 1;
}
void Timer0() interrupt 1{
static unsigned char pwm_cnt = 0;
if(++pwm_cnt >= 100) pwm_cnt = 0;
PWM_PIN = (pwm_cnt < duty) ? 1 : 0;
}
调试PID参数时发现,当Kd设置过大时系统容易震荡。后来在代码里加入了变化率限幅,问题迎刃而解:
//微分项限幅
if(derivative > 0.5) derivative = 0.5;
if(derivative < -0.5) derivative = -0.5;
这个项目最让我惊喜的是Proteus仿真效果——虽然数字温度传感器在仿真中的响应速度比实物快,但通过调整仿真步长和采样周期,竟然完美复现了真实电机的转速变化过程。想要快速验证PID参数时,直接拖拽仿真工程里的滑竿就能模拟温度突变,比焊板子调试效率高多了。

最后给想复现的伙伴提个醒:实物制作时务必在电机电源端并接100uF以上电容,否则单片机容易被电机的反向电动势搞死机。别问我是怎么知道的...(焊了三块板才找到这个坑)



更多推荐
所有评论(0)