位置型PID的C語言實現
首先,再次給出位置型PID離散化公式:
根據位置型PID離散化公式編寫C語言代碼程序:
第一步,定義PID變量結構體代碼以下:
struct _pid{ float SetSpeed; //定義設定值 float ActualSpeed;//定義實際值 float err; //定義誤差值 float err_last; //定義上一個誤差值 float err_past; //定義前一個誤差值 float Kp,Ki,Kd; //定義比例、積分、微分系數 float voltage; //定義電壓值(控制執行器變量) float integral; //定義積分值 int index; // 積分分離時的變量 float umax; //積分極限 float umin; }pid;
第二步,初始化變量:
void PID_init() //pid變量初始化 { printf("PID_init begin \n"); pid.SetSpeed = 0.0; pid.ActualSpeed = 0.0; pid.err = 0.0; pid.err_last = 0.0; pid.err_past = 0.0; pid.voltage = 0.0; pid.integral = 0.0; pid.Kp = 0.4; pid.Ki = 0.2; pid.Kd = 0.2; pid.umax = 400; pid.umin = -200; printf("PID_init end \n"); }
統一初始化變量,尤爲是 Kp,Ki,Kd 三個參數,調試過程中,對於要求的控制效果,能夠經過調節這三個量直接進行調節。
第三步,編寫控制算法:算法
/**********************************************************************************/ //PID算法 驅動代碼 //對比例、微分、積分進行離散化處理以後 /*********************************************************************************/ //位置型PID算法 //PID算法最基本形式,未考慮死區問題,未定義上下限,對公式的直接實現 float PID_realize1(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(void) { uart_init(115200); //串口初始化波特率爲115200 delay_init(168); //初始化延時函數 LED_Init(); //初始化LED端口 PID_init(); int count = 0; while(count<1000) { GPIO_ResetBits(GPIOC,GPIO_Pin_13); delay_ms(50); //延時300ms GPIO_SetBits(GPIOC,GPIO_Pin_13); delay_ms(50); //延時300ms float speed = PID_realize1(200.0); printf("%f\n",speed); count++; } return 0 ; }
測試說明:測試代碼中,初始化串口,獎PID的數據經過串口發送給電腦上位機,同時每傳送一次數據,LED等閃爍一次,用以提 示程序運行情況。
第四步,測試結果說明:
通過1000次調節後輸出單片機1000個數據,其中一部分以下所示:
83.000001 11.555000 59.559675 28.175408 52.907421 38.944152 51.891699 46.141651 53.339054 51.509998 55.908450 55.944631 58.970680 199.999094 199.999115 199.999123 199.999135 199.999152 199.999161 199.999172 199.999183 199.999201 199.999203 199.999224 199.999232 199.999243 199.999261 199.999263 199.999284 199.999292 199.999304 199.999321 199.999323 199.999344 199.999352 199.999364 199.999381 199.999390 199.999401 199.999412 199.999430 199.999432 199.999453 199.999461 199.999473