模糊自適應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; }
