zhangxu56726 发表于 2018-10-27 18:12:29

关于增量式PID

在网上找到两种增量式PID 算法的程序,有区别,了解增量式PID 算法的高手,麻烦解释下,对增量的计算不同,都是增量式PID,对控制系统的影响有什么区别?

int IncPIDCalc(int NextPoint){register int iError, iIncpid; //当前误差iError = sptr-》SetPoint - NextPoint; //增量计算iIncpid = sptr-》Proportion * iError //E[k]项- sptr-》Integral * sptr-》LastError //E[k-1]项+ sptr-》Derivative * sptr-》PrevError; //E[k-2]项//存储误差,用于下次计算sptr-》PrevError = sptr-》LastError;sptr-》LastError = iError;//返回增量值return(iIncpid);}
float PID_realize(float speed)
{
    float incrementSpeed;
    pid.SetSpeed = speed;
    pid.err = pid.SetSpeed - pid.ActualSpeed;
   

    incrementSpeed = pid.Kp * (pid.err -pid.err_last ) + pid.Ki*pid.err + pid.Kd*(pid.err -2* pid.err_last + pid.err_last_next);

    pid.ActualSpeed += incrementSpeed;
    pid.err_last = pid.err;
    pid.err_last_next = pid.err_last;
    return pid.ActualSpeed;
}


踏平幼稚园 发表于 2018-10-29 11:33:15

作用是一样的,第二种是公式得到的pid公式,第一种是基于第二种展开化简得到的;
第二种p、i、d参数定义更符合传统pid控制定义;第二种简化公式后的减少了计算量(同时参数的意义也有所变化);
化简过程:
incrementSpeed = pid.Kp * (pid.err -pid.err_last ) + pid.Ki*pid.err + pid.Kd*(pid.err -2* pid.err_last + pid.err_last_next);
展开:
incrementSpeed =pid.Kp * pid.err - pid.Kp * pid.err_last + pid.Ki * pid.err + pid.Kd * pid.err - 2 * pid.Kd pid.err_last + pid.Kd *pid.err_last_next;
合并:
incrementSpeed =(pid.Kp + pid.Ki + pid.Kd) *pid.err - (pid.Kp + 2 * pid.Kd) * pid.err_last + pid.Kd *pid.err_last_next;
替换:
pid.Kp + pid.Ki + pid.Kd = kp;
pid.Kp + 2 * pid.Kd = ki;
pid.Kd = kd;
结果:
incrementSpeed = kp *pid.err - ki * pid.err_last + kd *pid.err_last_next;
这样就和第一个公式一样了
moz-extension://4fcec6a8-71d0-4b93-b72d-b55140e7d883/static/sound.svg






hejun1203 发表于 2018-10-28 09:13:38

:):):):)

一代睡神的崛起 发表于 2018-10-29 08:54:39

表示只用过第二种,第一种没看见过

ff321 发表于 2018-10-29 11:21:31

第一个是增量式PID吗,看着不像啊

leo121_3006061 发表于 2018-10-29 12:31:23

楼上解释的非常好,增量式适合用于自平衡小车等,位置式适合温控之类的,现在还有模糊PID控制,也可以了解一下

zhangxu56726 发表于 2018-10-29 15:23:49

leo121_3006061 发表于 2018-10-29 12:31
楼上解释的非常好,增量式适合用于自平衡小车等,位置式适合温控之类的,现在还有模糊PID控制,也可以了解 ...

你好,我要控制温度,要用位置式的PID?

李长风 发表于 2018-10-29 16:51:06

踏平幼稚园 发表于 2018-10-29 11:33
作用是一样的,第二种是公式得到的pid公式,第一种是基于第二种展开化简得到的;
第二种p、i、d参数定义更 ...

我突然发现我数学没学好。,好难过

zhangxu56726 发表于 2018-10-30 16:21:21

leo121_3006061 发表于 2018-10-29 12:31
楼上解释的非常好,增量式适合用于自平衡小车等,位置式适合温控之类的,现在还有模糊PID控制,也可以了解 ...

请问,我要做恒温,看你回的贴是用位置式,请问,怎么将温度的差值转换为PWM的占空比,我这边还有个疑问,就是我这边使用电池供电,加热的过程中电池电压是在下降的,那么怎么处理?谢谢

leo121_3006061 发表于 2018-11-1 15:06:32

zhangxu56726 发表于 2018-10-30 16:21
请问,我要做恒温,看你回的贴是用位置式,请问,怎么将温度的差值转换为PWM的占空比,我这边还有个疑问 ...

我只是举个例子,实际上增量式也可以用于温控,计算量更小,本身是从位置式演化出来的。有现成的电源管理模块,类似于充电宝那种,价格也不贵。你计算出来的的数值去比pwm的精度,比如8位的就是256(0-255),PID参数的调整需要做实验才能计算出来的,如果只做单一的恒温控制就非常简单了。
页: [1]
查看完整版本: 关于增量式PID