01 前言
前面完成了基于STM32F103C8T6+L298N+MG513P30直流電機(jī)的PWM控制和兩種方法的編碼器實(shí)時(shí)速度反饋,拿到這個(gè)反饋值后我們就可以使用經(jīng)典的PID算法,對(duì)電機(jī)的轉(zhuǎn)速進(jìn)行準(zhǔn)確的控制了,這篇文章主要分享PID基本原理和Keil5的PID編程。
02 PID的基本原理
PID算法是上個(gè)世紀(jì)30年代左右提出的控制算法,大至航空航天、小至家庭溫度調(diào)控都可以使用PID算法,雖然PID算法從提出到現(xiàn)在已經(jīng)歷經(jīng)了快一個(gè)世紀(jì),其后也出現(xiàn)了很多現(xiàn)代的智能算法,比如蒙特卡洛、智能控制等等,但現(xiàn)在PID仍然經(jīng)久不衰,可以說目前80%以上的控制仍然使用PID算法。
PID算法是自動(dòng)控制原理課程學(xué)習(xí)的一部分,但在課程中老師講解的是最基本的原理,沒有任何拓展,更別提應(yīng)用了,首先,先簡(jiǎn)單說一下PID控制算法的原理。
上圖為PID算法的控制框圖,在我們控制電機(jī)速度時(shí),期望輸入就是電機(jī)的期望速度值,期望輸入與由編碼器測(cè)得的實(shí)際速度作差,求出的誤差值傳給PID的控制部分,算出需要輸出的控制信號(hào),將該控制信號(hào)傳給控制器,也就是輸出給電機(jī)驅(qū)動(dòng)板L298N,這樣形成一個(gè)循環(huán),就實(shí)現(xiàn)了對(duì)電機(jī)速度的精準(zhǔn)控制。
中間PID的控制部分的連續(xù)型公式如下:
但是在計(jì)算機(jī)中計(jì)算機(jī)很難實(shí)現(xiàn)連續(xù)型變量的積分或者微分操作,因此在計(jì)算機(jī)中,我們使用離散型的積分和微分,就是取時(shí)間間隔T為1,離散型PID公式如下:
各個(gè)項(xiàng)的主要作用及效果如下:
- P:增加快速性,過大會(huì)引起震蕩和超調(diào),P單獨(dú)作用會(huì)一直有靜態(tài)誤差
- I:減少靜態(tài)誤差,過大會(huì)引起震蕩
- D:減小超調(diào),過大會(huì)使響應(yīng)速度變慢
在實(shí)際的應(yīng)用中,有可能不需要PID同時(shí)使用,比如在速度控制中一般只使用PI控制就夠了
03變式PID
PID算法有很多進(jìn)化版本,分類別的簡(jiǎn)單闡述一下
增量式PID
在電機(jī)的速度PID控制算法中,因?yàn)槲覀円话闶褂肞I算法就夠了,所以我們可以使用增量式PID算法,這樣可以讓我們的公式和代碼更加簡(jiǎn)潔。
積分限幅
因?yàn)榉e分的效果是累加,隨著時(shí)間的推移,積分項(xiàng)的值會(huì)升到很高,積分本來的作用是用來減小靜態(tài)誤差,但積分項(xiàng)過大會(huì)引起過大的震蕩,所以我們可以加一個(gè)判斷函數(shù)if,當(dāng)積分項(xiàng)的值達(dá)到一定值后,就讓積分項(xiàng)保持這個(gè)值,避免引起更大的震蕩。
積分分離
如果剛開始的誤差比較大,那么積分項(xiàng)則會(huì)在剛開始就累計(jì)到了一個(gè)很大的數(shù)值,那么當(dāng)?shù)谝淮螌?shí)際輸出達(dá)到期望值時(shí),不會(huì)立刻停止,而是會(huì)產(chǎn)生一個(gè)很大的過沖。這時(shí)就需要用到積分分離,就是當(dāng)誤差值過大時(shí),我們就不使用積分項(xiàng),只讓PD項(xiàng)單獨(dú)作用,當(dāng)誤差值較小后,再加入積分項(xiàng),以減小靜態(tài)誤差。
04 Keil5程序
為了使用方便,我們先定一個(gè)PID結(jié)構(gòu)體,結(jié)構(gòu)體儲(chǔ)存左右輪的PID參數(shù)、限幅值、誤差等參數(shù)。
typedefstruct
{
//相關(guān)速度PID參數(shù)
floatVelcity_Kp;
floatVelcity_Ki;
floatVelcity_Kd;
floatUr;//限幅值
u8PID_is_Enable;//PID使能
intUn;//期望輸出值
intEn_1;//上一次的誤差值
intEn_2;//上上次的誤差值
intPWM;//輸出PWM值
}PID_InitDefStruct;
在程序初始化部分,定義一個(gè)初始化函數(shù),對(duì)其中的參數(shù)進(jìn)行初始化配置。
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;
}
當(dāng)編碼器的定時(shí)器,每隔10ms反饋一次編碼器測(cè)出的實(shí)際速度后,調(diào)用PID函數(shù),求解輸出給電機(jī)驅(qū)動(dòng)板的PWM值,然后通過Set_Pwm函數(shù)進(jìn)行設(shè)置,以此控制電機(jī)轉(zhuǎn)速。
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);
}
}
測(cè)試給電機(jī)輸入理想轉(zhuǎn)速為1500mm/s,隨便設(shè)置了一組PI參數(shù),得到實(shí)驗(yàn)結(jié)果如下:
可以通過上位機(jī)看一下波形,可以看到在穩(wěn)定狀態(tài)的靜差是比較小的。
05 總結(jié)
對(duì)于PID算法這才是萬里長(zhǎng)征的第一步吧,想要調(diào)出完美的控制程序,還需要復(fù)雜的PID參數(shù)整定,這里可以配合上位機(jī)進(jìn)行調(diào)試。
-
直流電機(jī)
+關(guān)注
關(guān)注
36文章
1710瀏覽量
70414 -
PWM
+關(guān)注
關(guān)注
114文章
5198瀏覽量
214893 -
STM32
+關(guān)注
關(guān)注
2272文章
10924瀏覽量
357599 -
PID
+關(guān)注
關(guān)注
35文章
1473瀏覽量
85826 -
STM32F103C8T6
+關(guān)注
關(guān)注
109文章
162瀏覽量
83996
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論