第一步思考:想讓平衡小車站立起來首先要知道的是平衡的原理是什麼?
實驗立棍:平衡的原理就比如在你手掌上立輥,棍子要倒的時候,你的手掌應該要向傾斜的方向移動。你立的久了你就會發現倒的速度是因為重力的作用,傾斜角度越大,你的手應該要移動的越快,而棍子在中心的時候會出現小幅度的移動,需要你的手微調就可以了。
好了,我們在做上面的小實驗之後是不是發現了我們的手的移動可以讓小木棍保持平衡,我們知道這個原理之後引入一個概念叫“反饋控制”,我們看到了木棍要倒(反饋),然後經過大腦反應去對手操作(控制)。而在控制領域的演算法適用於平衡小車專案的是PID 控制(比例-積分-微分控制),知道了有PID這個控制演算法前,是不是應該要知道“反饋”,後面的問題我會提及反饋作為一個問題
但是現在我們應該先知道反饋到來時,我們對手的控制是怎麼樣的是吧。而我們對手的控制會發現,在傾斜角度很大時向反方向移動就很塊,快要立起來平衡的時候手就移動的慢一些,如圖
第一次反饋的時候反饋傾斜角很大,如何控制手向傾斜方向的速度也很大。
第二次反饋的時候反饋傾斜角比上次的小,所以控制手向傾斜方向的速度就比上一次的小。
所以在連續的手移動的動作當中,我們是不是應該把他模擬成以傾斜角為Y軸(誤差),對於手的速度變化這段時間內手移動的距離為X軸。
在這裡我們是不是對一段時間內誤差的計算e(t),還有對誤差的累積∫e(t)dt。而我們把累積的過程稱為積分Integral(PID中的I),這裡積分的目的是為了什麼呢,是為了小車直立平衡(也就是傾斜角度為零)。
在傾斜排程比較大的時候是不是由於PID的P=Kp×e(t)比例控制來調整的反應的劇烈程度,然後我們把累積的誤差加上,那麼我們先看結論公式:
Out = P + I 輸出是比例積分控制之和
下面公式為加入增益常數K和單位時間t
Out(t)=Kp×e(t)+Ki×∫e(t)dt
解釋:Out(t),單位時間t內Out(t)該輸出的值
Kp×e(t),Kp比例控制反應的劇烈程度
Kp×∫e(t)dt累積該時間內誤差
解釋一下Kp,Kp的作用,這是比例常數,也就是他們在out=P+I+D當中的對out的增益效果,
增大Kp增加系統的響應速度,過大的話由於小車的自身重量的慣性,就很可能導致過沖或震盪。
增大Ki可以消除穩態誤差,如果它的增益太大,就會影響到整體的輸出了,就會可能會引起系統不穩定,太小又不精確。
所以對小車來說僅僅以PI來調節控制而言,在傾斜角為零的直立狀態來說時,沒有對傾斜角的速度進行控制,PI調節會讓小車過沖和震盪,極容易導致小車立不起來,即使調好P和I的增益引數讓他不倒,那在直立點也會經過一段時間震盪,而且震盪的幅度比較大。為了解決這個問題所以才在PI調節中加入Derivative微分控制。
完整的PID公式就是PID三個引數之和,所以加入微分控制的目的就是控制小車不過沖和震盪劇烈的情況,透過控制速度使其直立,所以PD控制也稱為直立環,而上面的PI控制稱為速度環。
那解釋了那麼多我們要來了解一下微分是什麼,他為什麼能控制速度使其小車直立的。
那我們先去除對I積分的調節可以吧,這樣可以更好的分析PD調節的原理。
微分作用:微分部分是根據“誤差變化的速度”來調整輸出。它預測系統的未來行為,並試圖減少系統的震盪或過度響應。微分作用對於提高系統的穩定性和響應速度非常重要。當然他也有增益的常數Kd。
D = Kd × (d/dt) × e(t)
其中,(d/dt) 是誤差的變化率,Kd是微分增益常數。
微分的優點:微分控制能夠減少系統的過沖和振盪,幫助控制系統更平穩地接近目標。
微分控制是怎麼實現的呢,根據公式看是不太容易的,通俗的理解就是在過沖前獲取的速度,而這個速度是需要感測器(霍爾編碼返回的計數值)反饋計算的,速度來經過一段時間D的減速或者叫阻尼後,速度變化率趨近於零,這樣就可以平穩在某一傾斜角,為什麼是某一傾斜角呢,因為沒加入I積分的誤差控制,而傾斜角的資料是由MPU6050反饋的。
微分的缺點:是對訊號震盪很敏感,因為速度的計算是上一個週期時間開始到週期時間結束走過的路程除以週期時間,所以在資料訊號採集時震盪導致的誤差在時間週期越短時對小車當前速度計算就會出現很大的偏差。
怎麼解決:解決採集的資料訊號震盪導致的誤差就要進行濾波,常見的是採用卡爾曼濾波演算法,或者用MPU6050自帶的DMP(運動資料處理器),要對這些資料處理是因為PID演算法調節是建立在理想的線性模型。跑題:而卡爾曼濾波和DMP這兩個數學模型都可以適用於平衡小車上面,在6050模組中已經提供了DMP的程式碼,實際專案中也運用了,但是還是要提及一下卡爾曼濾波,他是線性最小方差估計法,是線性動態系統模型,自迴歸濾波器,處理對數字訊號過程噪聲和測量噪聲。有興趣可以去了解。
好!!!你現在已經會使用PID調節控制演算法了,小車已經可以立起來了!
第二步思考:我已經熟悉了小車平衡的理論,那麼我該怎麼實踐他呢?
那麼我們應該想實現直立的功能,以小車直立為目的來做專案。
-
選擇元器件(直流電機),小車的電機是需要減速的直流電機,要減速電機的原因是扭矩大,功率高。試想一下用普通的馬達,直接連線到輪子上,一點點的電流就可以讓小車姿態不穩定,所以需要減速電機。推薦JBG37-520。
(買帶編碼器的),六針腳。!!!買帶兩層亞克力板和底座一起的!!! -
MPU6050,這是最關鍵的核心的元器件,小車能不能立起來就是透過這個元器件測量反饋的資料透過DMP轉換給晶片計算。
-
STM32F103c8t6,主晶片,沒有浮點運算單元,計算能力差,對於需要浮點運算單元的平衡小車來說效能不夠用。當作為專案開發的合適度來說該晶片是目前最好的選擇沒有之一。
-
TB6612驅動模組,由於電機功率較大,所以對電源要求較高,電機需要12v的電壓,其他模組用3.3v。而且JBG37電機帶編碼器(帶編碼器的)上的A和B(3和4針腳)的針腳傳送編碼資訊(關於速度)給晶片,而引腳(1和6針腳)兩端的兩個引腳是用來對電機輸出電流的,而控制該電流的是TB6612上連線晶片控制的PWMx和xIN1、xIN2。TB6612上有鋰電池組輸入進來12V的VM介面,還有內部邏輯供電5V的VCC來對其他模組供電。
-
降壓模組:對繼電器5V的電壓降壓為3.3V進行供電
-
鋰電池組:12V的,優點是電壓穩定,比用5號電池合適,5號用不一會電池的電壓電流衰減嚴重,即不能充電,要以12V供電需要把塊5號電池串聯,並且體積重量太大。密集的鋰電池組可以解決這些問題。
-
PCB板子:直接展示
-
其他擴充模組:SSD1306(4針腳0.96寸OLED)、超聲波HC-SR04、藍芽4.0(HC-05)
||然後主要複雜的接線如下
根據平衡車PCB:
驅動模組tb6612模組與兩個電機JB37-520接線
電機1: M2 - AO1
M1 - AO2
A - PA1//與微控制器連線
B - PA0
G - VCC
電機2: M2 - BO2
M1 - BO1
A - PB7
B - PB6
G - VCC
驅動模組tb6612模組與F103c8t6
PWMA - PA11
PWMB - PA8
AIN2 - PB12
AIN1 - PB13
BIN2 - PB14
BIN1 - PB15