找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1616|回复: 8
收起左侧

上传一个PID的算法(有注解)

  [复制链接]
ID:1104531 发表于 2025-8-13 15:57 | 显示全部楼层 |阅读模式

// PID计算
unsigned int PID_Calculate(struct PID *pid, unsigned int feedback)
{
        // 偏差  设定值-ADC反馈值
    unsigned int Error = pid->SetPoint - feedback; // 偏差

    // 积分项更新(使用有符号数)
    pid->SumError += (int)Error;

    // 积分抗饱和
    if(pid->SumError > MAX_INTEGRAL) pid->SumError = MAX_INTEGRAL;
    else if(pid->SumError < -MAX_INTEGRAL) pid->SumError = -MAX_INTEGRAL;

    // 微分计算
    unsigned int dError = pid->LastError - pid->PrevError;
    pid->PrevError = pid->LastError;
    pid->LastError = Error;

    // 计算各项(使用长整型防溢出)
    unsigned long p_term = (unsigned long)pid->Proportion * Error;
    unsigned long i_term = (unsigned long)pid->Integral * (unsigned long)pid->SumError;
    unsigned long d_term = (unsigned long)pid->Derivative * dError;

    // 综合输出  SCALE_FACTOR这是放大倍数 运算之前进行放大,出去前回归
    unsigned long output = (p_term + i_term + d_term) / SCALE_FACTOR;

    return (unsigned int)output;
}

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:30165 发表于 2025-8-14 17:35 | 显示全部楼层
没有搞明白 PID算法主要是为了解决什么问题?比如温度控制 。PID算法和传统到设定控制优缺点是什么?
回复

使用道具 举报

ID:1104531 发表于 2025-8-15 17:11 | 显示全部楼层
通过设定值与反馈值计算;再通过PWM进行控制
回复

使用道具 举报

ID:230500 发表于 2025-8-17 08:19 | 显示全部楼层
现在有了AI , 这些算法不用死记硬背了 稍微修改下 就可以用, 主要精力可以放在KP KI KD的整定上,
下面这部分是AI做的, 直接调用, 就行, 在结构体对PID初始化的时候填入整定好的参数即可运行; 但是AI也不是完全准确,他只对共用算法很准确,对STC的单片机就有点问题, PWM部分需要自己重写,

/********************* PID计算函数 *********************/
float PID_Compute(PID_Controller *pid, float setpoint, float input) {
    float error = setpoint - input; //声明误差变量
    float Pout; //声明比例变量
        float Iout; //声明积分变量
        float Dout; //声明微分变量

    // 死区处理(误差小于0.3℃时不调节)
    if(fabs(error) < 0.3) {
        error = 0;
    }
   
    // 比例项
    Pout = pid->Kp * error;
   
    // 积分项(抗积分饱和)
    pid->integral += pid->Ki * error;
    if(pid->integral > pid->out_max) pid->integral = pid->out_max;
    else if(pid->integral < pid->out_min) pid->integral = pid->out_min;
    Iout = pid->integral;
       
    // 微分项
    Dout = pid->Kd * (error - pid->prev_error);
    pid->prev_error = error; // 保存误差用于下次计算
   
    // 计算输出PID
    pid->output = Pout + Iout + Dout;
   
    // 输出限幅
    if(pid->output > pid->out_max) pid->output = pid->out_max;
    else if(pid->output < pid->out_min) pid->output = pid->out_min;
   
    return pid->output;
}
回复

使用道具 举报

ID:879809 发表于 2025-9-12 13:52 | 显示全部楼层
zhang32568 发表于 2025-8-14 17:35
没有搞明白 PID算法主要是为了解决什么问题?比如温度控制 。PID算法和传统到设定控制优缺点是什么?

PID适合大惯性环节场合,比如你提到的温控,加热管从0瞬间火力全开,过了两分钟传感器还没有感觉到热。这种有大惯性环节的场合,你用直接控制——温度高了就调低加热管功率,温度低了就加大加热管功率,结果必然是温度震荡起来,完全失控。
回复

使用道具 举报

ID:60178 发表于 2026-2-28 15:23 | 显示全部楼层
几乎所有自动化控制,跟踪稳定控制多要用到它。温度,电流,转速,力矩,电压,速度,高度,导航多要用,其实一点不难。其实主要是对前几次的误差累加起来
回复

使用道具 举报

ID:496636 发表于 2026-3-1 11:31 | 显示全部楼层
发表于 2025-8-14 17:35
没有搞明白 PID算法主要是为了解决什么问题?比如温度控制 。PID算法和传统到设定控制优缺点是什么?

PID就是比例、积分、微分、是用偏差进行的控制。如果没有偏差了,那么输出就不会有变化。
这个控制系统有模拟量输出(或是PWM的开关量输出)、模拟量输入、控制器组成。
比如:用蒸汽调节阀给热水加热,热水的温度计就是模拟量输入、蒸汽调节阀就是模拟量输出,调节蒸汽调节阀就能控制热水温度,使它稳定在你需要的温度上。
PLC系统上的PID算法大概是这样的:
以下是位置式的PID算法
把输入的设定值和输入都规格化,如上面例子,这个温度计是0-100度量程,现在温度为50度,设定温度为60度,那么规格化后,就是去单位后:设定温度为0.6,现在温度为0.5,而偏差就是0.6-0.5=0.1。
比例项输出=偏差*比例系数,如果比例系数为2,那么比例项输出就是20%(0.2)。
输出=积分项+比例项+微分项。
积分项有什么作用?
接着上面的例子,纯采用比例项的话,如果温度达到58度是,偏差为0.02,乘以2,就是0.04,那调节阀输出开度为4%,你可以看出比例的特点:偏差越大输出越大,偏差越小,输出越小。等接近设定值时,散热和加热功率相等,然后温度就升不上去了。怎么办,那加积分项。
积分项中的参数:积分时间的意义?如果我设了积分时间为1分钟,采样时间为1秒,这个时候偏差为0.02,比例输出为4%,那一分钟要采样60次,每次就加4%的60分之一。同样的意思即:如果偏差一直维持在0.02 一分钟的话,积分项就加4%。
这样有了个积分项,输出就会慢慢变大了,从而微调增加输出,使加热的功率大于散发的功率,使温度缓慢上升,从而达到设定温度。
注意:积分项是有正负值的,上例中如果即时温度大于设定温度时,项分项会变小。
微分项有什么作用?如果一个反应釜在60度情况下准备反应,我向它滴加了物料,开始反应了,反应上升速度很快,放出的热量很大,如果纯手工操作,我根据升温的速率(可以看上升0.1度需要多少秒)调节阀门的大小。现在的偏差很小,算出来的比例项很小,所以你得根据偏差变化的速度来增加输出。
微分项就是根据偏差变化的速度(那是温度变化的速度)来控制。
那么微分项中的微分时间的意思是什么?
假设微分时间设为5分钟,意思是依这样的温度变化速度,5分钟后偏差能达到多少,然后根据比例项那么算出来的值作为微分项的输出。
如反应釜60度,滴加反应液后,每五秒上升0.1度,那么依这样的速度温度就会上升6度,温度计量程为0-100,比例系数为2,那么积分项输出就是10%,这样温度从60度变成60.1度时,微分项就输出了12%的开度,这里是冷却水的调节阀。
如果按照比例输出的话,在60.1度时,偏差是0.001,比例项输出为0.2%,这么猛的放热,根本没法控制好温度,等你上升到66度时,比例项输出才达到12%,你这批反应物料要报废了。
微分项也是有正负的,如果上升到61度时,温度变化率为0了,那么微分项就是0,如果温度在下跌,微分项就是负值。
那有人会问,达到61度时,输出减了12%,那怎么平衡放热和冷却功率,从而稳定温度,积分项在增加呀 。
回复

使用道具 举报

ID:496636 发表于 2026-3-1 12:06 | 显示全部楼层
输出=比例项+积分项+微分项
当三项加起来大于1时,输出等于1,积分项=1-比例项-微分项(超幅,积分项也会跟着调整)
当三项加起来小于0时,输出等于0,积分项=0-微分项-比例项
单片机中,输出是整数,调整一下算法即可
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表