系統(tǒng)框圖
按照我自己的理解,平衡小車的系統(tǒng)框圖大概是這樣子的一個思路:
獲取小車的速度和角度這兩組數(shù)據(jù)就是實現(xiàn)小車自平衡的前提,這些數(shù)值在stm32的中斷控制中結(jié)合PID算法使用,輸出運算后的數(shù)值賦值給PWM寄存器控制電機,從而實現(xiàn)小車的自平衡;而遙控數(shù)據(jù)則是小車轉(zhuǎn)向控制才需要用的,因此可以先不關注遙控部分,在小車能夠站起來后再去關注。
運動分析
平衡小車的運動控制可以分為平衡控制、速度控制和方向控制,即直立環(huán)、速度環(huán)和轉(zhuǎn)向環(huán),其中平衡控制是最關鍵的部分。平衡小車作為一個控制對象,可以簡化地把它看做兩個電機的轉(zhuǎn)動速度和轉(zhuǎn)動方向控制,小車的直立控制和方向控制是直接通過控制小車兩個驅(qū)動電機完成的,小車的速度則是通過調(diào)節(jié)小車到的角度來完成的,不同的傾角會引起小車的加減速。(這里需要關注這兩個關鍵詞:速度和角度,這兩個數(shù)據(jù)是通過檢測裝置(傳感器)獲取的,后面部分會詳細講述)。
平衡控制(直立環(huán))
小車的平衡控制是通過負反饋來實現(xiàn)的。
反饋又稱回饋,是控制論的基本概念,指將系統(tǒng)的輸出返回到輸入端并以某種方式改變輸入,進而影響系統(tǒng)功能的過程;而使輸出起到與輸入相反的作用,使系統(tǒng)輸出與系統(tǒng)目標的誤差減小,系統(tǒng)趨于穩(wěn)定的反饋稱為負反饋。(百度)
平衡小車的兩個輪子著地,車體只會在輪子滾動的方向上發(fā)生傾斜,因此可以通過控制輪子轉(zhuǎn)動,抵消在一個維度上傾斜的趨勢便可以保持車體平衡,即如果車體向前傾斜就向前加速運動,向后傾斜就向后加速運動。
保持小車穩(wěn)定平衡的條件是:能夠精確測量小車傾角θ的大小和角速度θ ’ 的大小以及可以控制車輪的加速度。(直立行車參考設計方案第二版)
直立控制主要是保證小車在運行過程中保持在一個理想的角度,這個理想的角度一般由小車的機械零點決定。這個點在實際中大多指的是一個范圍。(如果在單純調(diào)試直立環(huán)的時候調(diào)了很多組參數(shù)小車的平衡效果還是不好,不妨嘗試一下在直立控制的程序中加上或者減去一個小一些的數(shù)值)
單純直立環(huán)作用,在調(diào)好參數(shù)的情況下小車也是可以保持一定范圍和時間的平衡的,但是對外界干擾特別敏感,不穩(wěn)定,輕輕一推小車就失衡了,因此僅僅使用平衡控制是不足以實現(xiàn)我們想要的平衡效果的,要實現(xiàn)穩(wěn)定效果,還需要加上速度環(huán)。
速度控制(速度環(huán))
小車的速度控制是通過正反饋來實現(xiàn)的。使輸出起到與輸入相同的作用,使系統(tǒng)輸出與系統(tǒng)目標的誤差增大,系統(tǒng)趨于不穩(wěn)定的反饋稱為正反饋;即小車要向前傾斜,就往前更快地加速,以達到再次平衡。
由于存在安裝誤差,傳感器實際測量的角度與車模角度有偏差,因此車模實際不是保持與地面垂直,而是存在一個傾角,在重力的作用下,車模就會朝傾斜的方向加速前進。平衡小車的速度是通過調(diào)節(jié)小車傾角來完成的,平衡小車不同的傾角會引起車模的加減速,從而達到對于速度的控制。(直立行車參考設計方案第二版)
要調(diào)節(jié)小車的傾角,首先需要獲取小車電機的轉(zhuǎn)動速度,一般都是通過編碼器來獲取。某寶上大多數(shù)平衡小車的車模都是帶有編碼器的,引出AB兩相,因為stm32的定時器有編碼器模式,因此特定的GPIO口可以直接連接電機上的編碼器接口,從而讀取脈沖,獲得速度值。
直立環(huán)與速度環(huán)共同作用,就可以實現(xiàn)小車的平衡了,參數(shù)調(diào)好了即使用力推小車,小車也會迅速回到平衡位置。
轉(zhuǎn)向控制(轉(zhuǎn)向環(huán))
實現(xiàn)平衡小車的轉(zhuǎn)向控制的前提是平衡控制和速度控制已經(jīng)能夠?qū)崿F(xiàn)較好地平衡效果,要是還沒調(diào)好這兩個環(huán),就先不要調(diào)轉(zhuǎn)向環(huán)。轉(zhuǎn)向控制比較簡單,就是給予兩個電機差速,例如上位機需要控制小車左轉(zhuǎn),那么在最終賦值給電機的時候讓左輪比右輪慢就行了(即左輪最終賦值減去轉(zhuǎn)向輸入值,右輪最終賦值加上轉(zhuǎn)向輸入值,兩值大小相同,符號相反)。
PID算法
這里分享三篇有關PID算法的文檔,從原理到C語言實現(xiàn)再到調(diào)參,總有一篇能解決你的疑惑,平衡小車運用的PID算法就只是幾個式子,如果是興趣愛好去做的話不用太深入去理解具體的推導過程,有條件的話還是鉆研一番比較利于后面的學習。
<<<<<<<<<<<<<<<<<<<<---------------------------------------->>>>>>>>>>>>>>>>>>>>>>>>
PID控制算法的C語言實現(xiàn).(絕對的好東西) hm5o
PID算法原理、調(diào)試經(jīng)驗和代碼 z2r8
PID調(diào)節(jié)控制做電機速度控制 rw60
<<<<<<<<<<<<<<<<<<<<---------------------------------------->>>>>>>>>>>>>>>>>>>>>>>>
定時器PWM輸出
脈沖寬度調(diào)制(PWM),是英文“Pulse Width Modulation” 的縮寫,簡稱脈寬調(diào)制,是利用微處理器的數(shù)字輸出來對模擬電路進行控制的一種非常有效的技術。
因為我們在驅(qū)動電機的時候是希望它按照一定的速度行駛的,如果直接賦值高低電平來控制,則達不到我們要的控制效果。利用定時器輸出PWM波則可以實現(xiàn)上述要求。STM32 的定時器除了除了基本定時器TIM6和TIM7外,其他的定時器都可以用來產(chǎn)生 PWM 輸出。其中高級定時器 TIM1 和 TIM8 可以同時產(chǎn)生多達 7 路的 PWM 輸出。而通用定時器也能同時產(chǎn)生多達 4路的 PWM 輸出。
定時器輸出PWM的配置無非是相關GPIO口初始化、使能時鐘、使能定時器、設置自動裝載值和預分頻系數(shù)、設置PWM輸出通道和方向這些,相信開發(fā)手冊寫得很詳細了。要是懶得翻開發(fā)手冊,這里再貼一個大佬的一篇博客:【STM32】通用定時器的PWM輸出(實例:PWM輸出)。高級定時器(以TIM1為例)的配置和通用定時器的配置基本一樣,但是還需要使能剎車和死區(qū)寄存器(TIM1_BDTR)的MOE位,以使能整個 OCx(即 PWM)輸出。設置函數(shù)為:TIM_CtrlPWMOutputs(TIM1,ENABLE);// MOE 主輸出使能
定時器編碼器模式
編碼器模式是通用定時器和高級定時器的功能之一:
這里要著重提醒的是:stm32定時器只有TIMx_CH1和TIMx_CH2支持編碼器模式:
選擇編碼器接口模式的方法是:如果計數(shù)器只在TI2的邊沿計數(shù),則置TIMx_SMCR寄存器中的SMS=001;如果只在TI1邊沿計數(shù),則置SMS=010;如果計數(shù)器同時在TI1和TI2邊沿計數(shù),則置SMS=011。
通過設置TIMx_CCER寄存器中的CC1P和CC2P位,可以選擇TI1和TI2極性;如果需要,還可以對輸入濾波器編程。
兩個輸入TI1和TI2被用來作為增量編碼器的接口。參看下表:
假定計數(shù)器已經(jīng)啟動(TIMx_CR1寄存器中的CEN=’1’),計數(shù)器由每次在TI1FP1或TI2FP2上的有效跳變驅(qū)動。 TI1FP1和TI2FP2是TI1和TI2在通過輸入濾波器和極性控制后的信號;如果沒有濾波和變相,則TI1FP1=TI1,TI2FP2=TI2。根據(jù)兩個輸入信號的跳變順序,產(chǎn)生了計數(shù)脈沖和方向信號。依據(jù)兩個輸入信號的跳變順序,計數(shù)器向上或向下計數(shù),同時硬件對TIMx_CR1寄存器的DIR位進行相應的設置。不管計數(shù)器是依靠TI1計數(shù)、依靠TI2計數(shù)或者同時依靠TI1和TI2計數(shù)。在任一輸入端(TI1或者TI2)的跳變都會重新計算DIR位。
編碼器接口模式基本上相當于使用了一個帶有方向選擇的外部時鐘。這意味著計數(shù)器只在0到TIMx_ARR寄存器的自動裝載值之間連續(xù)計數(shù)(根據(jù)方向,或是0到ARR計數(shù),或是ARR到0計數(shù))。所以在開始計數(shù)之前必須配置TIMx_ARR;同樣,捕獲器、比較器、預分頻器、觸發(fā)輸出特性等仍工作如常。在這個模式下,計數(shù)器依照增量編碼器的速度和方向被自動的修改,因此計數(shù)器的內(nèi)容始終指示著編碼器的位置。計數(shù)方向與相連的傳感器旋轉(zhuǎn)的方向?qū)?
當定時器配置成編碼器接口模式時,提供傳感器當前位置的信息。使用第二個配置在捕獲模式的定時器,可以測量兩個編碼器事件的間隔,獲得動態(tài)的信息(速度,加速度,減速度)。指示機械零點的編碼器輸出可被用做此目的。根據(jù)兩個事件間的間隔,可以按照固定的時間讀出計數(shù)器。如果可能的話,你可以把計數(shù)器的值鎖存到第三個輸入捕獲寄存器(捕獲信號必須是周期的并且可以由另一個定時器產(chǎn)生);也可以通過一個由實時時鐘產(chǎn)生的DMA請求來讀取它的值。
以上內(nèi)容參考stm32中文手冊,更詳細說明可以參考這篇博客:【STM32平衡小車】STM32定時器配置為編碼器模式
六軸傳感器獲取角度
平衡小車制作的核心部分是傾角和加速的的獲取,想要使小車站立和運動,這兩種參數(shù)的獲取是非常關鍵的,前者是控制小車直立的關鍵參數(shù),后者是速度環(huán)和轉(zhuǎn)向環(huán)的關鍵參數(shù)。平衡小車使用MPU6050六軸傳感器模塊來獲取角度和加速度值,MPU6050六軸傳感器模塊的本質(zhì)是三軸陀螺儀傾角輸出+三軸加速度計速度輸出,并帶有溫度傳感器。
該模塊的通信方式是IIC通信,芯片內(nèi)置16字節(jié)AD轉(zhuǎn)換器,能輸出16位數(shù)據(jù)。得到輸出的四元數(shù)后,可利用自帶的數(shù)字運動處理器(DMP)硬件加速引擎,通過主IIC接口,向應用端輸出姿態(tài)解算后的數(shù)據(jù),通過DMP,就可以使用InvenSense公司提供的運動處理資料庫,非常方便地實現(xiàn)姿態(tài)解算,降低了運動處理運算對操作系統(tǒng)的負荷,同時大大降低了開發(fā)難度。其內(nèi)部框圖如下:
SCL 和 SDA 是連接 STM32F103C8T6芯片的 IIC 接口, MCU通過這個 IIC 接口來控制 MPU6050。VLOGIC 是 IO 口電壓,該引腳最低可以到 1.8V,一般直接接 VDD 即可。 AD0 是從 IIC 接口(接 MCU)的地址控制引腳,該引腳控制IIC 地址的最低位。如果接 GND,則 MPU6050 的 IIC 地址是: 0X68,如果接 VDD,則是0X69。
因為陀螺儀買的是某點原子的,這里分享他們提供的詳細資料:
ATK-MPU6050六軸傳感器模塊用戶手冊_V1.0 w7wy
ATK-MPU6050六軸傳感器模塊使用說明(Mini V3)_AN1507hhob