通俗理解 模糊自适应PID
模糊自适应PID算法就是在经典的PID的基础上添加模糊控制规则库,建立这个库的目的就是算法能够自己来进行改变P、I、D的值。
就拿温度的上升过程控制来说,刚开始的时候,希望温度能够快速的升到终点温度,并且以尽量小的波动将温度稳定在目标温度处(最好不让其超过)。此时如果利用经典的PID控制方式,那么此时的P值就是恒定不变,但是我们希望他刚开始的时候尽量大。加入规则库,就可以实现,可以用语句
if冷 then 加大热
当然也有:
if热 then 加大冷
从而快速的改变温度。
就好比我们在冬天里用冷水洗脚, 冷水 + 冷脚 = 感觉非常的冷,迫不及待想让水快点热,所以我们加入很热的水,而不是加入温水。
这应该是最通俗的理解了。
扩充PID_C程序参考如下:(还没有验证)
#include <stdio.h> /*定义PID变量结构体*/ struct _pid { float SetSpeed;//定义设定值 float ActualSpeed;//定义实际值 float err;//定义偏差值 float err_last;//定义上一个偏差 float Kp, Ki, Kd;// float voltage;//定义电压值(控制执行器的变量) float integral;//定义积分值 }; /*初始化变量*/ void PID_init(){ printf("PID_init begin \n"); pid.SetSpeed = 0.0; pid.ActualSpeed = 0.0; pid.err = 0.0; pid.err_last = 0.0; pid.voltage = 0.0; pid.integral = 0.0; pid.Kp = 0.2; pid.Ki = 0.015; pid.Kd = 0.2; printf("PID_init end \n"); } /*编写编写控制算法*/ float PID_realize(float speed){ pid.SetSpeed = speed; pid.err = pid.SetSpeed - pid.ActualSpeed; pid.integral+=pid.err; pid.voltage = pid.Kp*pid.err + pid.Ki*pid.integral + pid.Kd*(pid.err-pid.err_last); pid.err_last = pid.err; pid.ActualSpeed = pid.voltage*1.0; return pid.ActualSpeed; } int main (){ printf("System begin \n"); PID_init(); int count; while (1){ float speed = PID_realize(200.00); printf("%f\n",speed); count++; } return 0; }