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

先插句廣告,本人QQ522414928,不熟悉PID算法的能夠一塊兒交流學習,隨時在線(PID資料再個人另外一篇博客裏)算法

個人其餘博客裏有我作過的東西展現學習

個人其餘博客裏有pid的資料url

個人其餘博客裏還有倒立擺的資料spa

感謝你們對我這篇博客的支持!!設計

 

                    http://liuxinyu520zhuanshu.qzone.qq.com                                        教程

  在正式進入正文前,補充一下本人學習PID算法的背景,先自我介紹一下:本人以前是一名電子專業的學生,到如今能夠說我已經研究了快兩年的PID,這期間作過帆板角度控制系統,作過平衡車,作過倒立擺,作過板球控制系統,作過openmv小球追蹤系統,還作過四旋翼等……,能夠說如今已經很熟悉PID算法,包括單級的PID算法和多級的PID算法。到如今感受其實這個PID算法仍是很經典,頗有用的,那麼簡簡單單的幾行代碼,就能實現自動追蹤,自動跟隨,平衡等操做,用途普遍。若是你不會PID算法,大多數控制其實你是實現不了的,若是這個經典而又簡單的算法你不會,別的控制類的算法估計你也不會。可能讓你作一件產品或是參加某些控制類比賽,顯然,不會PID這些算法,你只能作簡單的邏輯控制,而邏輯控制又太簡單,幾個if()語句判斷顯然是不知足控制類設計的須要的。另外,不少不須要PID算法的設計其實也是能夠加入PID算法的,這能讓你的設計更有穩定性,有些必須須要PID算法的設計,沒有PID不能造成閉環控制,是根本不能完成的。get

 

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

 

  先解釋一下傳統的位式算法,也就是簡單的邏輯算法:位式算法的輸出要麼是0,要麼是1,也就是在必定條件下是全速運行,不知足這個條件就徹底中止或反向全速運行。產品

  ①先拿恆溫燒水系統來講,假如說你要把水燒到80度,簡單的邏輯作法是在水裏加一個溫度傳感器和電熱燒水器,而後用單片機測溫,若是if(溫度<80度),那你就給電熱燒水器加熱燒水,若是if(溫度>80度),那我就中止加熱。思考一下,最後你獲得的水溫必定會是80(能夠上下有微小差異)度嗎?答案確定是否認的。這裏說明一下,不要教條,不要問你爲何會把水燒到80度這是爲何?我來解釋一下,當傳感器測到溫度達到80度時,單片機控制加熱器中止加熱,雖然加熱器斷電了,可是加熱器的餘溫仍是比水的溫度要高,因此加熱器不會當即中止加熱,而是繼續給水加熱一下子直到和水的溫度同樣,此時水的溫度會高於80度,可能電熱器的餘溫就把水加熱到了90度,對吧!而後水和加熱器又一塊兒降溫,通常狀況下加熱器降溫的速度會更快,因此當水的溫度降低到80度時,加熱器的溫度又低於80度,這時傳感器檢測到水溫低於80度,單片機又控制加熱器加熱,而此時加熱器溫度不夠低於80度,因此須要預熱一下再給水加熱,在預熱的這段時間裏水的溫度可能又降到了75度纔開始加熱。因此,水的溫度不能保持在80度上下輕微浮動的範圍內,水溫一直都是在75度到90度之間浮動的!io

  ②再拿平衡車系統來講,你須要一個陀螺儀傳感器,好比(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算法作的平衡車一上電時由於手持擺放的位置離平衡點太遠會引發過沖,讓平衡車一上電電機就猛地往一邊衝,過一下子才能好。

    爲了解決這個問題能夠用積分分離的方式,偏差太大時,積分就不起做用,當偏差小的時候,積分再起做用。能有效避免過沖。

    

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

    if(err(當前偏差)<某個值時)

 

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

    else

    {err_integral(偏差的積分值)=0}

 

    output(輸出值好比PWM)=p(比例係數)*err(當前偏差)+I(積分系數)*err_integral(偏差的積分值)

 

 最後我們說微分D

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

微分預測未來的狀態。

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

    if(err(當前偏差)<某個值時)

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

    else

    {err_integral(偏差的積分值)=0}

    differential(微分)=err(當前偏差)-last_err(上一次偏差)

    執行完這句後

    last_err(上一次偏差)=err(當前偏差)

    output(輸出值好比PWM)=p(比例係數)*err(當前偏差)+I(積分系數)*err_integral(偏差的積分值)+D(微分系數)*differential(微分)

 

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

相關文章
相關標籤/搜索