在网上找到两种增量式PID 算法的程序,有区别,了解增量式PID 算法的高手,麻烦解释下,对增量的计算不同,都是增量式PID,对控制系统的影响有什么区别? [color=rgb(51, 51, 51) !important]int IncPIDCalc(int NextPoint) [color=rgb(51, 51, 51) !important]{ [color=rgb(51, 51, 51) !important]register int iError, iIncpid; //当前误差 [color=rgb(51, 51, 51) !important]iError = sptr-》SetPoint - NextPoint; //增量计算 [color=rgb(51, 51, 51) !important]iIncpid = sptr-》Proportion * iError //E[k]项 [color=rgb(51, 51, 51) !important]- sptr-》Integral * sptr-》LastError //E[k-1]项 [color=rgb(51, 51, 51) !important]+ sptr-》Derivative * sptr-》PrevError; //E[k-2]项 [color=rgb(51, 51, 51) !important]//存储误差,用于下次计算 [color=rgb(51, 51, 51) !important]sptr-》PrevError = sptr-》LastError; [color=rgb(51, 51, 51) !important]sptr-》LastError = iError; [color=rgb(51, 51, 51) !important]//返回增量值 [color=rgb(51, 51, 51) !important]return(iIncpid); [color=rgb(51, 51, 51) !important]} 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; } |
第二种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;
这样就和第一个公式一样了
评分
查看全部评分
你好,我要控制温度,要用位置式的PID?
我突然发现我数学没学好。,好难过
请问,我要做恒温,看你回的贴是用位置式,请问,怎么将温度的差值转换为PWM的占空比,我这边还有个疑问,就是我这边使用电池供电,加热的过程中电池电压是在下降的,那么怎么处理?谢谢
我只是举个例子,实际上增量式也可以用于温控,计算量更小,本身是从位置式演化出来的。有现成的电源管理模块,类似于充电宝那种,价格也不贵。你计算出来的的数值去比pwm的精度,比如8位的就是256(0-255),PID参数的调整需要做实验才能计算出来的,如果只做单一的恒温控制就非常简单了。