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

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐