天天看點

PID算法通俗了解,平衡車,倒立擺,适合不了解PID算法的人來看!

先插句廣告,本人QQ522414928,不熟悉PID算法的可以一起交流學習,随時線上(PID資料再我的另一篇部落格裡)

倒立擺資料連接配接↓

https://www.cnblogs.com/LiuXinyu12378/p/11222614.html

PID視訊資料連接配接↓

 https://www.cnblogs.com/LiuXinyu12378/p/11214174.html

  在正式進入正文前,補充一下本人學習PID算法的背景,先自我介紹一下:本人之前是一名電子專業的學生,上學期間一直在做PID,現在工作主要做神經網絡,大學期間做過帆闆角度控制系統,做過平衡車,做過倒立擺,做過闆球控制系統,做過openmv小球追蹤系統,還做過四旋翼等……,可以說現在已經很熟悉PID算法,包括單級的PID算法和多級的PID算法。到現在感覺其實這個PID算法還是很經典,很有用的,那麼簡簡單單的幾行代碼,就能實作自動追蹤,自動跟随,平衡等操作,用途廣泛。如果你不會PID算法,大多數控制其實你是實作不了的,如果這個經典而又簡單的算法你不會,别的控制類的算法估計你也不會。可能讓你做一件産品或是參加某些控制類比賽,顯然,不會PID這些算法,你隻能做簡單的邏輯控制,而邏輯控制又太簡單,幾個if()語句判斷顯然是不滿足控制類設計的需要的。另外,很多不需要PID算法的設計其實也是可以加入PID算法的,這能讓你的設計更有穩定性,有些必須需要PID算法的設計,沒有PID不能形成閉環控制,是根本不能完成的。

  扯淡的不多說,本人就喜歡簡單粗暴,喜歡把複雜的東西簡單化,很多的電子教程雖然把PID算法介紹的很全面,但是寫的複雜的不得了,今天本人就用通俗易懂的語言把複雜的問題簡單化:

  先解釋一下傳統的位式算法,也就是簡單的邏輯算法:位式算法的輸出要麼是0,要麼是1,也就是在一定條件下是全速運作,不滿足這個條件就完全停止或反向全速運作。

  ①先拿恒溫燒水系統來說,假如說你要把水燒到80度,簡單的邏輯做法是在水裡加一個溫度傳感器和電熱燒水器,然後用單片機測溫,如果if(溫度<80度),那你就給電熱燒水器加熱燒水,如果if(溫度>80度),那我就停止加熱。思考一下,最後你得到的水溫一定會是80(可以上下有微小差别)度嗎?答案肯定是否定的。(這裡說明一下,不要教條,不要問你為什麼會把水燒到80度)這是為什麼?我來解釋一下,當傳感器測到溫度達到80度時,單片機控制加熱器停止加熱,雖然加熱器斷電了,但是加熱器的餘溫還是比水的溫度要高,是以加熱器不會立即停止加熱,而是繼續給水加熱一會兒直到和水的溫度一樣,此時水的溫度會高于80度,可能電熱器的餘溫就把水加熱到了90度,對吧!然後水和加熱器又一起降溫,是以當水的溫度下降到80度時,這時傳感器檢測到水溫低于80度,單片機又控制加熱器加熱,但是加熱器現在涼了需要預熱一下再給水加熱,在預熱的這段時間裡水的溫度可能又降到了75度才開始加熱。是以,水的溫度不能保持在80度上下輕微浮動的範圍内,水溫一直都是在75度到90度之間浮動的!

  ②再拿平衡車系統來說,你需要一個陀螺儀傳感器,比如(mpu6050),先說下平衡車的原理,避免有些人不懂,平衡車為什麼兩個輪子能站着不到,大家一定都軍訓過,站過軍姿,站軍姿的時候教官讓你身體前傾,但是隻能輕微的前傾,如果你能前傾45度,那你一定控制不住身體平衡,需要往前邁步才能達到平衡。平衡車跟這個原理是一樣的,如果車要往前倒,那我讓車輪前轉來維持平衡,如果車往後倒,那我讓車輪後傳來維持平衡,原理都應該明白了吧!(如果這個原理還不明白建議多思考一下,了解清楚)繼續,假設車上的陀螺儀角度0度時車是平衡的,如果角度大于0度我就讓車輪前轉,如果角度小于0度我就讓車輪後轉,顯然這樣做,車是平衡不了的,由于車的慣性作用,一下可能就過調了,直接倒了。原理跟燒水差不多,不多說了。

       再來解釋下PID算法:

1.剛才介紹了半天位式算法,位式算法的輸出就是簡單的邏輯輸出,不是0就是1,比如燒水,小于80度就接通燒水器的繼電器,功率直接達到最大,當水溫大于80度時,繼電器就直接斷開,功率直接降到最低。在平衡車上用位式算法解讀就是,車的傾角<0度,電機控制器給-1,電機反向全速運轉,車的傾角>0度時,電機控制器給+1,電機正向全速運轉,位式算法的特點就是要不就全速運作,要不就直接停止。

2.PID算法就不一樣了,PID算法通常輸出的都是可以調節輸出功率大小的,比如輸出的PWM或直接輸出電壓值大小DAC(PWM即脈寬調速占空比),假設PWM的周期是255,當高電平占空比為255(100%)時相當位式算法輸出的1,即全速運作,當高電平占空比為128(50%)時,輸出的功率理論上為全速的一般。說到這大家就應該明白了,PID的輸出是可以控制方向以及大小的。

  下面開始說PID算法:

  先說PID三個參數,P是比例,I是積分,D是微分;很多人都知道這三個參數,隻是不了解其背後代表的含義,為啥用比例積分微分。不着急聽我慢慢給你介紹,隻要我介紹完,你一下就懂了。

  首先介紹一下P,P代表比例,光用一個比例算法其結構是這樣的:

    err(誤差)=setpoint(設定值)-actual_value(傳感器測量的實際值)    (誤差這個概念大家應該都明白)

    output(輸出值比如PWM)=p(比例系數)*err(誤差)

    比例反應的是現在的狀态。

    這個比例系數P,需要你大概估測一下值是多少,比如平衡車,光一個比例控制就能讓平衡車站半天了。比如設定平衡點為0度,此時實際的值為8度,此時誤差就為-8度,輸出的PWM值就等于(-8)*P。PWM=(-8)*P,這個P的具體值就需要你根據周期和占空比來估計決定,比如此時的PWM值應該是64才能讓平衡車具有恢複平衡的能力,那麼P的值就應該為8.0。這下大家應該明白了P這個參數該如何來設定。

在介紹一下積分I,積分分為好幾種,這裡先介紹兩種:

1.普通的

    一般滴,沒有單獨用一個I控制的模型,是以這裡用PI控制:

    err(目前誤差)=setpoint(設定值)-actual_value(傳感器測量的實際值)

    err_integral(誤差的積分值)=err_integral(誤差的積分值)+err(目前誤差)

    output(輸出值比如PWM)=p(比例系數)*err(誤差)+I(積分系數)*err_integral(誤差的積分值)

    這裡介紹一下積分的作用,

    積分反應的是過去的狀态。

    積分的意義:積分的作用就在于對誤差的累加,我就根據實際情況來解釋,比如說,我光用一個比例P來控制一個模型的運轉,在誤差較大的時候這個比例的作用起的很大,還是說平衡車,當角度誤內插補點為8時,假定預測P=8.0,PWM=角度誤差*P,此時PWM值為64,這時候電機可以按一定的速度轉動起來,當偏差為0.5時,PWM的值就為4,當PWM為4的時候,根據電機的特性,可能因為這個4太小,電機根本連轉的力氣都沒有,這時候本來平衡點應該是0,可到了0.5電機因為pwm值太小而不起作用,這樣就始終達不到平衡點。那我現在加上積分,積分的作用就是把一個個的誤差加起來,因為誤差有正也有負,是以積分不會隻朝着一個方向增大(正或負),比如誤差在0.5時比例就失去了調節能力,那麼此時積分就起作用了,積分會把這個0.5累加直到PWM值能夠給電機充足的能量去達到0這個平衡點。一般積分I這個系數的值設為P*1/200.

2.積分分離算法

    普通的PI算法積分,積分會一直起作用,不管誤差有多大,而當誤差太大的時候,積分的一直累加運作會讓系統産生過沖,一個普通的PID算法做的平衡車一上電時因為手持擺放的位置離平衡點太遠會引起過沖,讓平衡車一上電電機就猛地往一邊沖,過一會兒才能好。

    為了解決這個問題可以用積分分離的方式,誤差太大時,積分就不起作用,當誤差小的時候,積分再起作用。能有效避免過沖。

    

    if(err(目前誤差)<某個值時)

    {err_integral(誤差的積分值)=err_integral(誤差的積分值)+err(誤差)}

    else

    {err_integral(誤差的積分值)=err_integral(誤差的積分值)+ 0(0誤差,不讓誤差累加到積分上)}   

    output(輸出值比如PWM)=p(比例系數)*err(目前誤差)+I(積分系數)*err_integral(誤差的積分值)

 最後咱們說微分D

微分反應的是誤差的變化率

微分預測将來的狀态。

    {err_integral(誤差的積分值)=err_integral(誤差的積分值)+ 0(0誤差,不讓誤差累加到積分上)}

    differential(微分)=err(目前誤差)-last_err(上一次誤差)

    執行完這句後

    last_err(上一次誤差)=err(目前誤差)

    output(輸出值比如PWM)=p(比例系數)*err(目前誤差)+I(積分系數)*err_integral(誤差的積分值)+D(微分系數)*differential(微分)

總結,PID的算法基本含義就是,要觀測目前的誤差并進行調整,還要總結過去的誤差來擺脫現狀,還需預測未來的誤差趨勢加快調整。

多思考也是一種努力,做出正确的分析和選擇,因為我們的時間和精力都有限,是以把時間花在更有價值的地方。