基于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以上电容,否则单片机容易被电机的反向电动势搞死机。别问我是怎么知道的...(焊了三块板才找到这个坑)
