當前正在備戰(zhàn)第十八屆智能車,記錄一下學習和實踐的過程,這一篇主要是講pid算法以及調(diào)試。
PID即:Proportional(比例)、Integral(積分)、Differential(微分)的縮寫。
PID是經(jīng)典的閉環(huán)控制算法,具有原理簡單,易于實現(xiàn),適用面廣,控制參數(shù)相互獨立,參數(shù)的選定比較簡單等優(yōu)點。
在智能車閉環(huán)中,pid算法起到了關(guān)鍵作用,他可以保證車輛行駛的速度按照你所設定的目標速度執(zhí)行,提高了車輛行駛的穩(wěn)定性。
接下來是代碼部分
首先在main函數(shù)中對pid進行初始化。
PID_init(&Motor_pid_r);
PID_init(&Motor_pid_l);
PID_Set(&Motor_pid_r,10,10,4);
PID_Set(&Motor_pid_l,10,10,4);
這是所調(diào)用的pid函數(shù)。
//初始化PID
void PID_init(PID_TypDef* sptr)
{
sptr->Kp = 0.0; // 比例常數(shù) Proportional Const
sptr->Ki = 0.0; // 積分常數(shù) Integral Const
sptr->Kd = 0.0; // 微分常數(shù) Derivative Const
sptr->Bias = 0.0;
sptr->Integral = 0.0;
sptr->Last_Bias = 0.0;
sptr->Pre_Bias = 0.0;
}
//PID設置
void PID_Set(PID_TypDef *PID,float Kp,float Ki,float Kd)
{
PID->Kp = Kp;
PID->Ki = Ki;
PID->Kd = Kd;
}
這是在中斷中調(diào)用來計算pwm的函數(shù)
pwm_r += IncPID(r_speed,target_speed_r,&Motor_pid_r);
pwm_l += IncPID(l_speed,target_speed_l,&Motor_pid_l);
這是增量式PID和位置式PID,具體用那一個要看實際應用情況
typedef struct
{
float Kp; // 比例常數(shù) Proportional Const
float Ki; // 積分常數(shù) Integral Const
float Kd; // 微分常數(shù) Derivative Const
float Integral;
float Bias;
float Last_Bias;
float Pre_Bias;
}PID_TypDef;
PID_TypDef Motor_pid_r; //右電機PID
PID_TypDef Motor_pid_l; //左電機PID
//PID設置
void PID_Set(PID_TypDef *PID,float Kp,float Ki,float Kd)
{
PID->Kp = Kp;
PID->Ki = Ki;
PID->Kd = Kd;
}
//增量式PID
float IncPID(int Encoder,int Target,PID_TypDef* sptr)
{
float Pwm;
sptr->Bias = Target - Encoder; // 計算當前誤差
Pwm = sptr->Kp * (sptr->Bias-sptr->Last_Bias) // P
+sptr->Ki * sptr->Bias // I
+sptr->Kd * (sptr->Bias-2*sptr->Last_Bias+sptr->Pre_Bias); // D
sptr->Pre_Bias=sptr->Last_Bias; // 存儲誤差,用于下次計算
sptr->Last_Bias=sptr->Bias;
return(Pwm); // 返回增量值
}
//位置式PID
float PstPID(float Angle, float Target,PID_TypDef* sptr)
{
float Pwm;
// if(around==2)
// {
sptr->Bias = 30 ;
// }else
// {
sptr->Bias = Target -Angle ;
// }
sptr->Integral += sptr->Bias;
Pwm = sptr->Kp * sptr->Bias // P
+sptr->Ki * sptr->Integral // I
+sptr->Kd * (sptr->Bias-sptr->Last_Bias); // D
sptr->Last_Bias=sptr->Bias;
return(Pwm);
}
增量式PID
比例P : ? ?e(k)-e(k-1) ? 當前誤差 - 上次誤差
積分I : ? e(i) ? ? 當前誤差 ??
微分D : ?e(k) - 2e(k-1)+e(k-2) ? 當前誤差 - 2*上次誤差 + 上上次誤差
增量式PID中不需要累加,控制增量Δu(k)的確定僅與最近3次的采樣值有關(guān),容易通過加權(quán)處理獲得比較好的控制效果,并且在系統(tǒng)發(fā)生問題時,不會出現(xiàn)突變的情況,增量式不會嚴重影響系統(tǒng)的工作。
位置式 PID?
e(k):?用戶設定的值(目標值) -??控制對象的當前的狀態(tài)值?
比例P :????e(k)
積分I :???∑e(i)?????誤差的累加(包括e(k))
微分D :??e(k) - e(k-1)??這次誤差-上次誤差
因為有誤差積分一直累加,也就是當前的輸出u(k)與過去的所有狀態(tài)都有關(guān)系,用到了誤差的累加值;(誤差e會有誤差累加),輸出的u(k)對應的是執(zhí)行機構(gòu)的實際位置,,一旦控制輸出出錯(控制對象的當前的狀態(tài)值出現(xiàn)問題 ),u(k)的大幅變化會引起系統(tǒng)的大幅變化
并且位置式PID在積分項達到飽和時,誤差仍然會在積分作用下繼續(xù)累積,一旦誤差開始反向變化,系統(tǒng)需要一定時間從飽和區(qū)退出,所以在u(k)達到最大和最小時,要停止積分作用,并且要有積分限幅和輸出限幅
所以在使用位置式PID時,一般我們直接使用PD控制
而位置式 PID 適用于執(zhí)行機構(gòu)不帶積分部件的對象,如舵機和平衡小車的直立和溫控系統(tǒng)的控制
(詳細的位置式pid與增量式pid可以看原文鏈接https://blog.csdn.net/u014453443/article/details/100573722)
寫下來是用上位機調(diào)PID
這是我使用的上位機軟件
這是上位機軟件所看到的雙電機上電后粗調(diào)的效果
?
?基本上實現(xiàn)了pid閉環(huán)控制,用手施加外部持續(xù)穩(wěn)定的阻力,電機依舊可以保證穩(wěn)定的轉(zhuǎn)速,效果比較理想。
?? ? ? ? 我最近發(fā)了一篇文章里面包含了常用的功能函數(shù)以及常用的模塊底層驅(qū)動函數(shù)封裝庫,大家感興趣的可以收藏一下,需要的時候就不用到處找代碼,一篇就夠用,我會持續(xù)更新。文章來源:http://www.zghlxwxcb.cn/news/detail-461766.html
????????常用模塊函數(shù)封裝庫(持續(xù)更新中。。。。。。)-CSDN博客?文章來源地址http://www.zghlxwxcb.cn/news/detail-461766.html
到了這里,關(guān)于第十八屆智能車之PID算法以及上位機調(diào)節(jié)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!