01 前言
前面完成了基于STM32F103C8T6+L298N+MG513P30直流電機的PWM控制和兩種方法的編碼器實時速度反饋,拿到這個反饋值后我們就可以使用經典的PID算法,對電機的轉速進行準確的控制了,這篇文章主要分享PID基本原理和Keil5的PID編程。
02 PID的基本原理
PID算法是上個世紀30年代左右提出的控制算法,大至航空航天、小至家庭溫度調控都可以使用PID算法,雖然PID算法從提出到現在已經歷經了快一個世紀,其后也出現了很多現代的智能算法,比如蒙特卡洛、智能控制等等,但現在PID仍然經久不衰,可以說目前80%以上的控制仍然使用PID算法。
PID算法是自動控制原理課程學習的一部分,但在課程中老師講解的是最基本的原理,沒有任何拓展,更別提應用了,首先,先簡單說一下PID控制算法的原理。
上圖為PID算法的控制框圖,在我們控制電機速度時,期望輸入就是電機的期望速度值,期望輸入與由編碼器測得的實際速度作差,求出的誤差值傳給PID的控制部分,算出需要輸出的控制信號,將該控制信號傳給控制器,也就是輸出給電機驅動板L298N,這樣形成一個循環,就實現了對電機速度的精準控制。
中間PID的控制部分的連續型公式如下:
但是在計算機中計算機很難實現連續型變量的積分或者微分操作,因此在計算機中,我們使用離散型的積分和微分,就是取時間間隔T為1,離散型PID公式如下:
各個項的主要作用及效果如下:
- P:增加快速性,過大會引起震蕩和超調,P單獨作用會一直有靜態誤差
- I:減少靜態誤差,過大會引起震蕩
- D:減小超調,過大會使響應速度變慢
在實際的應用中,有可能不需要PID同時使用,比如在速度控制中一般只使用PI控制就夠了
03變式PID
PID算法有很多進化版本,分類別的簡單闡述一下
增量式PID
在電機的速度PID控制算法中,因為我們一般使用PI算法就夠了,所以我們可以使用增量式PID算法,這樣可以讓我們的公式和代碼更加簡潔。
積分限幅
因為積分的效果是累加,隨著時間的推移,積分項的值會升到很高,積分本來的作用是用來減小靜態誤差,但積分項過大會引起過大的震蕩,所以我們可以加一個判斷函數if,當積分項的值達到一定值后,就讓積分項保持這個值,避免引起更大的震蕩。
積分分離
如果剛開始的誤差比較大,那么積分項則會在剛開始就累計到了一個很大的數值,那么當第一次實際輸出達到期望值時,不會立刻停止,而是會產生一個很大的過沖。這時就需要用到積分分離,就是當誤差值過大時,我們就不使用積分項,只讓PD項單獨作用,當誤差值較小后,再加入積分項,以減小靜態誤差。
04 Keil5程序
為了使用方便,我們先定一個PID結構體,結構體儲存左右輪的PID參數、限幅值、誤差等參數。
typedefstruct
{
//相關速度PID參數
floatVelcity_Kp;
floatVelcity_Ki;
floatVelcity_Kd;
floatUr;//限幅值
u8PID_is_Enable;//PID使能
intUn;//期望輸出值
intEn_1;//上一次的誤差值
intEn_2;//上上次的誤差值
intPWM;//輸出PWM值
}PID_InitDefStruct;
在程序初始化部分,定義一個初始化函數,對其中的參數進行初始化配置。
voidPID_Init(PID_InitDefStruct*p)
{
p- >Velcity_Kp=5;
p- >Velcity_Ki=0.5;
p- >Velcity_Kd=0;
p- >Ur=7100;
p- >PID_is_Enable=1;
p- >Un=0;
p- >En_1=0;
p- >En_2=0;
p- >PWM=0;
}
當編碼器的定時器,每隔10ms反饋一次編碼器測出的實際速度后,調用PID函數,求解輸出給電機驅動板的PWM值,然后通過Set_Pwm函數進行設置,以此控制電機轉速。
voidVelocity_PID(intTargetVelocity,intCurrentVelocity,PID_InitDefStruct*p)
{
if(p- >PID_is_Enable==1)
{
intEn=TargetVelocity-CurrentVelocity;//誤差值
p- >Un+=p- >Velcity_Kp*(En-p- >En_1)+p- >Velcity_Ki*En+p- >Velcity_Kd*(En-2*p- >En_1+p- >En_2);//增量式PID
p- >En_2=p- >En_1;
p- >En_1=En;
p- >PWM=p- >Un;
/*輸出限幅*/
if(p- >PWM >p- >Ur)p- >PWM=p- >Ur;
if(p- >PWM< -p- >Ur)p- >PWM=-p- >Ur;
}
else
{
PID_Init(p);
}
}
測試給電機輸入理想轉速為1500mm/s,隨便設置了一組PI參數,得到實驗結果如下:
可以通過上位機看一下波形,可以看到在穩定狀態的靜差是比較小的。
05 總結
對于PID算法這才是萬里長征的第一步吧,想要調出完美的控制程序,還需要復雜的PID參數整定,這里可以配合上位機進行調試。
-
直流電機
+關注
關注
36文章
1708瀏覽量
70086 -
PWM
+關注
關注
114文章
5153瀏覽量
213448 -
STM32
+關注
關注
2266文章
10876瀏覽量
354925 -
PID
+關注
關注
35文章
1471瀏覽量
85306 -
STM32F103C8T6
+關注
關注
107文章
160瀏覽量
83281
發布評論請先 登錄
相關推薦
評論