1. 程式人生 > >平衡車之速度環分析及除錯

平衡車之速度環分析及除錯

平衡車為什麼只有角度環不夠,還需要速度環:

因為當角度環有偏差的時候,根據角度環的pid是可以給小車輸出pwm波維持小車平衡的,但是小車要以什麼樣的速度維持平衡角度環是做不到的,加上速度環的目的就是於此。

速度環PI: PI是一種線性控制器 根據眾多大神所說的平衡小車速度環的除錯ki=kp/200來除錯,
/************************************************************************/ 速度環: int velocity(int encoder_left,int encoder_right) { static float Velocity,Encoder_Least,Encoder,Movement;
static float Encoder_Integral,Target_Velocity; Encoder_Least =(Encoder_Left+Encoder_Right)-0; //===獲取最新速度偏差==測量速度(左右編碼器之和)-目標速度(此處為零) Encoder *= 0.8; //===一階低通濾波器 Encoder += Encoder_Least*0.2; //===一階低通濾波器 * Encoder_Integral +=Encoder; //===積分出位移 積分時間:10ms Encoder_Integral=Encoder_Integral-Movement; if(Encoder_Integral>10000) Encoder_Integral=10000; //===積分限幅
if(Encoder_Integral<-10000) Encoder_Integral=-10000; //===積分限幅 * Velocity=Encoder*Vkp+Encoder_Integral*Vki; //===速度控制 if(Turn_Off(Angle_Balance,Voltage)==1||Flag_Stop==1) Encoder_Integral=0; //===電機關閉後清除積分 return Velocity; } 首先明確速度環的pid也是位置式pid (1)首先kp ki乘的引數選擇: kp*速度:既然是速度控制,那當然是速度作為比例被乘引數,來使速度維持在一個穩定狀態 ki*位移 :KI是積分環節,速度的積分就是位移了,所以選取了位移控制引數 (2)然後先不要糾結算速度的時候為什麼不除以2,為什麼不初以中斷時間 原因:1我們想要的只是一個變化量,如果除以2的話會捨去誤差 2.至於為什麼不除以中斷時間 同樣在最後速度還pwm的式子中kp乘的引數是速度,但他只是一個變化量 他沒有和別的變數乘除,他只是自己在加減,需要的只是一個變化量。 (3)為什麼要進行低通濾波: 低通濾波就是上次速度差值佔80% + 這次速度差佔20% =此次速度差值; 這樣是為了減緩速度差值,對直立的干擾 (3)最後說說調引數 用PI控制器是因為PI組合是線性控制,平衡車最主要的還是直立環,其他都是對他的干擾(除了速度環速度設為0的時候是幫助平衡車直立): 首先明確速度環控制的原理是正反饋,就是小車在直立環的時候,小車往一個方向加速,速度環的作用就是用一個同方向更快的速度使小車平衡,這就是所謂的正反饋。 由前輩總結的工程經驗ki=kp/200 所以在確定了kp ki的極性的時候,直接給kp算出ki開啟直立環測試 首先確定速度環kp和ki的極性: 如何速度控制是正反饋還是負反饋呢
。 根據之前的估計,先設定 kp=-50,ki=kp/200,當我們拿起小車,旋轉其中一個小車輪胎的時候,根據我們設定的速度偏差 Encoder_Least =(Encoder_Left+Encoder_Right)-0; 另外一個車輪會反向轉動,讓偏差趨向於零。這就是常規的速度控制裡面的負反饋,不是我們需要的效果。接下來設定 kp=50,ki=kp/200,此時,當我們旋轉其中一個小車輪胎的時候,兩個輪胎會往相同的方向加速,直至電機的最大速度,這是典型的正反饋效果,也是我們期望看到的。至此,我們可以確定 kp,ki的符號應該是正的。 kp ki太小現象:平衡車還是直立一兩秒向一個方向加速 kp ki太大現象:平衡車高頻抖動這時候要關電機避免燒壞電機 讓小車以一定的速度前進: 怎麼控制小車前進:給速度閉環設定一個偏差,該偏差就是控制小車的速度,至於前後的話就是速度偏差的正負了。 怎麼控制加速跑:這是我從一個大神裡面看到的,覺得寫得很好,就是給角度環裡面的角速度一個偏差,這裡可以用在競速比賽中起跑時候以及彎道加減速的地方 速度環用什麼引數控制速度合適: 這裡有兩個選擇:(1)Encoder_Least =(Encoder_Left+Encoder_Right)-0; (2)Encoder_Integral=Encoder_Integral-Movement; 沒錯,這兩個引數就是紅色標出來的,第一個0是目標速度,第二個是積分出來的位移,方法都是給偏差從而達到控制目的。我們選擇後者是因為直接給速度偏差,對直立造成的干擾太大了,實際實驗的時候也很不穩,而積分出來的位移給他位移偏差變化緩慢,對直立影響不大。所以我們選擇後者的方案。而控制速度的本質就是改變傾角,我們可以發現當速度給的越大,車子啟動的時候傾角就越大,這是因為,你給的速度偏差越大,相比於小車平衡的時候,速度環給的pwm差值就越大,最後角度環和速度環相加後與原來平衡時候總的pwm就有差值,所以小車就不平衡了在剛開始,會傾斜一個角度。又因為有速度環控制著以穩定的速度向平衡位置輸送pwm,這個速度狀態就在角度環和速度環的雙重閉環的反饋下就一直保持直立並以這個速度下去了。 movement決定速度的大小。 積分的限幅決定速度的最大上限 movemennt決定速度大小可以很好理解,,至於速度的積分限幅決定速度最大上限是因為:首先這個積分是每次加起來的或者每次減下去的,這要看前進還是後退,我以前就是這裡想不通,現在想一想,積分控制的是靜差,當movement越大,積分出來的靜差就越大,大於實際平衡時候的pwm,但是積分最大值給了1000,所以就是靜差最大值就是1000,如果要改變最大速度上限,就要更改這個上限。

藍色就是靜差 黑色是平衡位置 紅色是目標位置