基於stm32的兩輪自平衡小車2(原理篇)

該篇博客緊接接上一篇開題篇創 基於stm32的兩輪自平衡小車1(模塊選型篇)(鴿了好些日子了…)。該篇爲原理篇,包含一些理論分析的部分,碰到一些自己可能寫不好的地方直接引用了我認爲很不錯的參考,有些地方還沒能理解透徹,如有不足的地方懇請指出,非常感謝!本篇內容詳見目錄。

目錄

  • 參考資料
  • 系統框圖
  • 運動分析
  • PID算法
  • 定時器PWM輸出
  • 定時器編碼器模式
  • 六軸傳感器獲取角度

參考資料

這裏有一些博主收集資料過程中發現的好東西,分享一波:
正點原子手把手教你學STM32-M3(視頻)
一天攻克平衡小車(視頻)
兩輪平衡小車開源資料(原理圖、PCB、程序源碼、BOM等)
基於STM32和MPU-6050的兩輪自平衡小車系統設計與實現
超詳細雙輪平衡小車原理分析 附STM32源碼
基於stm32兩輪平衡車製作
自平衡小車的入門(arduino)
參賽作品《stm32平衡小車》
基於STM32F103C8T6平衡車–從零開始
編碼器速度和方向檢測,stm32編碼器接口模式
平衡小車中的MPU6050測量傾角
還有一篇非常經典的平衡小車原理論文,是第七屆全國大學生“飛思卡爾”杯智能汽車競賽組委會給的一套超詳細的平衡小車平衡原理資料:直立行車參考設計方案第二版,也放這裏了:gveh
看一下別人的作品再看看自己的,覺得自己好菜… 想不寫下去了…但flag已立,不得不繼續。,。

系統框圖

按照我自己的理解,平衡小車的系統框圖大概是這樣子的一個思路:
在這裏插入圖片描述
獲取小車的速度和角度這兩組數據就是實現小車自平衡的前提,這些數值在stm32的中斷控制中結合PID算法使用,輸出運算後的數值賦值給PWM寄存器控制電機,從而實現小車的自平衡;而遙控數據則是小車轉向控制才需要用的,因此可以先不關注遙控部分,在小車能夠站起來後再去關注。

運動分析

平衡小車的運動控制可以分爲平衡控制、速度控制和方向控制,即直立環、速度環和轉向環,其中平衡控制是最關鍵的部分。平衡小車作爲一個控制對象,可以簡化地把它看做兩個電機的轉動速度和轉動方向控制,小車的直立控制和方向控制是直接通過控制小車兩個驅動電機完成的,小車的速度則是通過調節小車到的角度來完成的,不同的傾角會引起小車的加減速。(這裏需要關注這兩個關鍵詞:速度和角度,這兩個數據是通過檢測裝置(傳感器)獲取的,後面部分會詳細講述)。

平衡控制(直立環)

小車的平衡控制是通過負反饋來實現的。

反饋又稱回饋,是控制論的基本概念,指將系統的輸出返回到輸入端並以某種方式改變輸入,進而影響系統功能的過程;而使輸出起到與輸入相反的作用,使系統輸出與系統目標的誤差減小,系統趨於穩定的反饋稱爲負反饋。(百度)

直立環
平衡小車的兩個輪子着地,車體只會在輪子滾動的方向上發生傾斜,因此可以通過控制輪子轉動,抵消在一個維度上傾斜的趨勢便可以保持車體平衡,即如果車體向前傾斜就向前加速運動,向後傾斜就向後加速運動。

保持小車穩定平衡的條件是:能夠精確測量小車傾角θ的大小和角速度θ ’ 的大小以及可以控制車輪的加速度。(直立行車參考設計方案第二版)

直立控制主要是保證小車在運行過程中保持在一個理想的角度,這個理想的角度一般由小車的機械零點決定。這個點在實際中大多指的是一個範圍。(如果在單純調試直立環的時候調了很多組參數小車的平衡效果還是不好,不妨嘗試一下在直立控制的程序中加上或者減去一個小一些的數值)

單純直立環作用,在調好參數的情況下小車也是可以保持一定範圍和時間的平衡的,但是對外界干擾特別敏感,不穩定,輕輕一推小車就失衡了,因此僅僅使用平衡控制是不足以實現我們想要的平衡效果的,要實現穩定效果,還需要加上速度環。

速度控制(速度環)

小車的速度控制是通過正反饋來實現的。使輸出起到與輸入相同的作用,使系統輸出與系統目標的誤差增大,系統趨於不穩定的反饋稱爲正反饋;即小車要向前傾斜,就往前更快地加速,以達到再次平衡。
解釋
在這裏插入圖片描述

由於存在安裝誤差,傳感器實際測量的角度與車模角度有偏差,因此車模實際不是保持與地面垂直,而是存在一個傾角,在重力的作用下,車模就會朝傾斜的方向加速前進。平衡小車的速度是通過調節小車傾角來完成的,平衡小車不同的傾角會引起車模的加減速,從而達到對於速度的控制。(直立行車參考設計方案第二版)

要調節小車的傾角,首先需要獲取小車電機的轉動速度,一般都是通過編碼器來獲取。某寶上大多數平衡小車的車模都是帶有編碼器的,引出AB兩相,因爲stm32的定時器有編碼器模式,因此特定的GPIO口可以直接連接電機上的編碼器接口,從而讀取脈衝,獲得速度值。
編碼盤
直立環與速度環共同作用,就可以實現小車的平衡了,參數調好了即使用力推小車,小車也會迅速回到平衡位置。

轉向控制(轉向環)

實現平衡小車的轉向控制的前提是平衡控制和速度控制已經能夠實現較好地平衡效果,要是還沒調好這兩個環,就先不要調轉向環。轉向控制比較簡單,就是給予兩個電機差速,例如上位機需要控制小車左轉,那麼在最終賦值給電機的時候讓左輪比右輪慢就行了(即左輪最終賦值減去轉向輸入值,右輪最終賦值加上轉向輸入值,兩值大小相同,符號相反)。
在這裏插入圖片描述

PID算法

這裏分享三篇有關PID算法的文檔,從原理到C語言實現再到調參,總有一篇能解決你的疑惑,平衡小車運用的PID算法就只是幾個式子,如果是興趣愛好去做的話不用太深入去理解具體的推導過程,有條件的話還是鑽研一番比較利於後面的學習。

<<<<<<<<<<<<<<<<<<<<---------------------------------------->>>>>>>>>>>>>>>>>>>>>>>>

PID控制算法的C語言實現.(絕對的好東西) hm5o
PID算法原理、調試經驗和代碼 z2r8
PID調節控制做電機速度控制 rw60

<<<<<<<<<<<<<<<<<<<<---------------------------------------->>>>>>>>>>>>>>>>>>>>>>>>

定時器PWM輸出

脈衝寬度調製(PWM),是英文“Pulse Width Modulation” 的縮寫,簡稱脈寬調製,是利用微處理器的數字輸出來對模擬電路進行控制的一種非常有效的技術。

因爲我們在驅動電機的時候是希望它按照一定的速度行駛的,如果直接賦值高低電平來控制,則達不到我們要的控制效果。利用定時器輸出PWM波則可以實現上述要求。STM32 的定時器除了除了基本定時器TIM6和TIM7外,其他的定時器都可以用來產生 PWM 輸出。其中高級定時器 TIM1 和 TIM8 可以同時產生多達 7 路的 PWM 輸出。而通用定時器也能同時產生多達 4路的 PWM 輸出。

定時器輸出PWM的配置無非是相關GPIO口初始化、使能時鐘、使能定時器、設置自動裝載值和預分頻係數、設置PWM輸出通道和方向這些,相信開發手冊寫得很詳細了。要是懶得翻開發手冊,這裏再貼一個大佬的一篇博客:【STM32】通用定時器的PWM輸出(實例:PWM輸出)高級定時器(以TIM1爲例)的配置和通用定時器的配置基本一樣,但是還需要使能剎車和死區寄存器(TIM1_BDTR)的MOE位,以使能整個 OCx(即 PWM)輸出。設置函數爲:TIM_CtrlPWMOutputs(TIM1,ENABLE);// MOE 主輸出使能

定時器編碼器模式

編碼器模式是通用定時器和高級定時器的功能之一:
在這裏插入圖片描述
這裏要着重提醒的是:stm32定時器只有TIMx_CH1和TIMx_CH2支持編碼器模式:
在這裏插入圖片描述
選擇編碼器接口模式的方法是:如果計數器只在TI2的邊沿計數,則置TIMx_SMCR寄存器中的SMS=001;如果只在TI1邊沿計數,則置SMS=010;如果計數器同時在TI1和TI2邊沿計數,則置SMS=011。

通過設置TIMx_CCER寄存器中的CC1P和CC2P位,可以選擇TI1和TI2極性;如果需要,還可以對輸入濾波器編程。

兩個輸入TI1和TI2被用來作爲增量編碼器的接口。參看下錶:
在這裏插入圖片描述
假定計數器已經啓動(TIMx_CR1寄存器中的CEN=’1’),計數器由每次在TI1FP1或TI2FP2上的有效跳變驅動。 TI1FP1和TI2FP2是TI1和TI2在通過輸入濾波器和極性控制後的信號;如果沒有濾波和變相,則TI1FP1=TI1,TI2FP2=TI2。根據兩個輸入信號的跳變順序,產生了計數脈衝和方向信號。依據兩個輸入信號的跳變順序,計數器向上或向下計數,同時硬件對TIMx_CR1寄存器的DIR位進行相應的設置。不管計數器是依靠TI1計數、依靠TI2計數或者同時依靠TI1和TI2計數。在任一輸入端(TI1或者TI2)的跳變都會重新計算DIR位。

編碼器接口模式基本上相當於使用了一個帶有方向選擇的外部時鐘。這意味着計數器只在0到TIMx_ARR寄存器的自動裝載值之間連續計數(根據方向,或是0到ARR計數,或是ARR到0計數)。所以在開始計數之前必須配置TIMx_ARR;同樣,捕獲器、比較器、預分頻器、觸發輸出特性等仍工作如常。在這個模式下,計數器依照增量編碼器的速度和方向被自動的修改,因此計數器的內容始終指示着編碼器的位置。計數方向與相連的傳感器旋轉的方向對應。
在這裏插入圖片描述
當定時器配置成編碼器接口模式時,提供傳感器當前位置的信息。使用第二個配置在捕獲模式的定時器,可以測量兩個編碼器事件的間隔,獲得動態的信息(速度,加速度,減速度)。指示機械零點的編碼器輸出可被用做此目的。根據兩個事件間的間隔,可以按照固定的時間讀出計數器。如果可能的話,你可以把計數器的值鎖存到第三個輸入捕獲寄存器(捕獲信號必須是週期的並且可以由另一個定時器產生);也可以通過一個由實時時鐘產生的DMA請求來讀取它的值。

以上內容參考stm32中文手冊,更詳細說明可以參考這篇博客:【STM32平衡小車】STM32定時器配置爲編碼器模式

六軸傳感器獲取角度

平衡小車製作的核心部分是傾角和加速的的獲取,想要使小車站立和運動,這兩種參數的獲取是非常關鍵的,前者是控制小車直立的關鍵參數,後者是速度環和轉向環的關鍵參數。平衡小車使用MPU6050六軸傳感器模塊來獲取角度和加速度值,MPU6050六軸傳感器模塊的本質是三軸陀螺儀傾角輸出+三軸加速度計速度輸出,並帶有溫度傳感器。
在這裏插入圖片描述
該模塊的通信方式是IIC通信,芯片內置16字節AD轉換器,能輸出16位數據。得到輸出的四元數後,可利用自帶的數字運動處理器(DMP)硬件加速引擎,通過主IIC接口,嚮應用端輸出姿態解算後的數據,通過DMP,就可以使用InvenSense公司提供的運動處理資料庫,非常方便地實現姿態解算,降低了運動處理運算對操作系統的負荷,同時大大降低了開發難度。其內部框圖如下:
在這裏插入圖片描述
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

前前後後寫了好幾天,一些我認爲比較容易進坑的地方都加粗了。原理部分就先到這裏,下一篇硬件篇。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章