基于单片机MC9S12XS128的两轮自平衡小车设计
目 錄
1.緒論 1
1.1研究背景與意義 1
1.2兩輪自平衡車的關鍵技術 2
1.2.1系統設計 2
1.2.2數學建模 2
1.2.3姿態檢測系統 2
1.2.4控制算法 3
1.3本文主要研究目標與內容 3
1.4論文章節安排 3
2.系統原理分析 5
2.1控制系統要求分析 5
2.2平衡控制原理分析 5
2.3自平衡小車數學模型 6
2.3.1兩輪自平衡小車受力分析 6
2.3.2自平衡小車運動微分方程 9
2.4 PID控制器設計 10
2.4.1 PID控制器原理 10
2.4.2 PID控制器設計 11
2.5姿態檢測系統 12
2.5.1陀螺儀 12
2.5.2加速度計 13
2.5.3基于卡爾曼濾波的數據融合 14
2.6本章小結 16
3.系統硬件電路設計 17
3.1 MC9SXS128單片機介紹 17
3.2單片機最小系統設計 19
3.3 電源管理模塊設計 21
3.4傾角傳感器信號調理電路 22
3.4.1加速度計電路設計 22
3.4.2陀螺儀放大電路設計 22
3.5電機驅動電路設計 23
3.5.1驅動芯片介紹 24
3.5.2 驅動電路設計 24
3.6速度檢測模塊設計 25
3.6.1編碼器介紹 25
3.6.2 編碼器電路設計 26
3.7輔助調試電路 27
3.8本章小結 27
4.系統軟件設計 28
4.1軟件系統總體結構 28
4.2單片機初始化軟件設計 28
4.2.1鎖相環初始化 28
4.2.2模數轉換模塊(ATD)初始化 29
4.2.3串行通信模塊(SCI)初始化設置 30
4.2.4測速模塊初始化 31
4.2.5 PWM模塊初始化 32
4.3姿態檢測系統軟件設計 32
4.3.1陀螺儀與加速度計輸出值轉換 32
4.3.2卡爾曼濾波器的軟件實現 34
4.4平衡PID控制軟件實現 35
4.5兩輪自平衡車的運動控制 37
4.6本章小結 39
5. 系統調試 40
5.1系統調試工具 40
5.2系統硬件電路調試 40
5.3姿態檢測系統調試 41
5.4控制系統PID參數整定 44
5.5兩輪自平衡小車動態調試 44
5.6本章小結 45
6. 總結與展望 46
6.1 總結 46
6.2 展望 46
參考文獻 47
附 錄 48
附錄一 系統電路原理圖 48
附錄二 系統核心源代碼 49
致謝 52
2. 系統原理分析
2.1控制系統要求分析
根據系統要求,小車必須要能夠在無外界干預下依靠一對平行的車輪保持平衡,并完成前進,后退,左右轉彎等動作。分析系統要求可知,保持小車直立和運動的動力都來自于小車的兩只車輪,車輪由兩只直流電機驅動。因此,從控制角度來看,可以將小車作為一個控制對象,控制輸入量是兩個車輪的轉動速度。整個控制系統可以分為三個子系統:
(1)小車平衡控制:以小車傾角為輸入量,通過控制兩個電機的正反轉保持小車衡。
(2)小車速度控制:在保持平衡的基礎上,通過調節小車傾角實現對速度的控制,實際上還是演變為對電機的控制實現小車的速度控制。
(3)小車方向控制:通過控制兩個電機間的轉速不同實現轉向。
小車直立和方向控制任務都是直接通過控制車模兩個后輪驅動電機完成的,而速度控制則是通過調節小車傾角完成的。小車不同的傾角會引起車模的加減速,從而達到對小車速度的控制。
三個子系統各自獨立進行控制。由于最終都是對同一個控制對象(小車的電機)進行控制,所以各個子系統之間存在著耦合。為了方便分析,在分析其中之一時,假設其它控制對象都已經達到穩定。比如在速度控制時,需要小車已經能夠保持直立控制;在方向控制時,需要小車能夠保持平衡和速度恒定;同樣,在小車平衡控制時,也需要速度和方向控制已經達到平穩。這三個任務中保持小車平衡是關鍵。由于小車同時受到三種控制的影響,從小車平衡控制的角度來看,其它兩個控制就成為干擾。因此對小車速度、方向的控制應該盡量保持平滑,以減少對平衡控制的干擾。以速度調節為例,需要通過改變車模平衡控制中小車傾角設定值,從而改變車模實際傾斜角度,達到速度控制的要求。為了避免影響車模平衡控制,這個車模傾角的改變需要非常緩慢的進行。其中平衡控制是系統的最基本要求,也是整個控制系統的難點。
2.2平衡控制原理分析
控制小車平衡的直觀經驗來自人類日常生活經驗。如人類身體擁有豐富的感知器官,通過大腦調節便可以控制腰部及腿部肌肉保持人體的直立。而一般人通過簡單訓練就可以讓一根直木棍在手指尖保持直立不倒。這需要兩個條件:一個是托著木棍的手指可以自由移動;另一個是人的眼睛可以觀察木棍的傾斜角度與傾斜趨勢(角速度)。這兩個條件缺一不可,實際上這就是控制系統中的負反饋機制,如圖2-1所示。
圖2-1 保持木棍直立的反饋控制系統
自平衡車的控制也是通過負反饋來實現的,與在指尖保持木棍直立比較則相對簡單。由于小車只依靠兩個車輪著地,車輪與地面會發生相對滾動使得小車傾斜。而小車上裝載的姿態檢測系統能夠對小車的傾斜狀況進行實時檢測,通過控制器控制車輪轉動,抵消在這個維度上的傾斜力矩便可以保持小車平衡,本文轉載自http://www.biyezuopin.vip/onews.asp?id=12737如圖2-2所示。
圖2-2 通過車輪轉動保持小車平衡
/*****************************************************普通IO模擬I2C通信STC12C5A60S2 IT單片機 AXTL;11.0592MHz*****************************************************/#ifndef __I2C_H__ #define __I2C_H__#include <REG52.H> #include <math.h> //Keil library #include <stdio.h> //Keil library #include <INTRINS.H>//********端口定義********************************** sbit SCL=P2^1; //IIC時鐘引腳定義 sbit SDA=P2^0; //IIC數據引腳定義#define SlaveAddress 0xD0 //IIC寫入時的地址字節數據,+1為讀取//********函數初始定義****************************** void Delay5us(); void I2C_Start(); void I2C_Stop(); void I2C_SendACK(bit ack); bit I2C_RecvACK(); void I2C_SendByte(uchar dat); uchar I2C_RecvByte(); void I2C_ReadPage(); void I2C_WritePage(); void display_ACCEL_x(); void display_ACCEL_y(); void display_ACCEL_z(); uchar Single_ReadI2C(uchar REG_Address); //讀取I2C數據 void Single_WriteI2C(uchar REG_Address,uchar REG_data); //向I2C寫入數據//************************************** //延時5微秒(STC12C5A60S2@12M) //不同的工作環境,需要調整此函數 //此延時函數是使用1T的指令周期進行計算,與傳統的12T的MCU不同 //**************************************/ void Delay5us() {uchar n = 4;while (n--){_nop_();_nop_();} }//************************************** //I2C起始信號 //************************************** void I2C_Start() {SDA = 1; //拉高數據線SCL = 1; //拉高時鐘線Delay5us(); //延時SDA = 0; //產生下降沿Delay5us(); //延時SCL = 0; //拉低時鐘線 }//************************************** //I2C停止信號 //************************************** void I2C_Stop() {SDA = 0; //拉低數據線SCL = 1; //拉高時鐘線Delay5us(); //延時SDA = 1; //產生上升沿Delay5us(); //延時 }//************************************** //I2C發送應答信號 //入口參數:ack (0:ACK 1:NAK) //************************************** void I2C_SendACK(bit ack) {SDA = ack; //寫應答信號SCL = 1; //拉高時鐘線Delay5us(); //延時SCL = 0; //拉低時鐘線Delay5us(); //延時 }//************************************** //I2C接收應答信號 //************************************** bit I2C_RecvACK() {SCL = 1; //拉高時鐘線Delay5us(); //延時CY = SDA; //讀應答信號SCL = 0; //拉低時鐘線Delay5us(); //延時return CY; }//************************************** //向I2C總線發送一個字節數據 //************************************** void I2C_SendByte(uchar dat) {uchar i;for (i=0; i<8; i++) //8位計數器{dat <<= 1; //移出數據的最高位SDA = CY; //送數據口SCL = 1; //拉高時鐘線Delay5us(); //延時SCL = 0; //拉低時鐘線Delay5us(); //延時}I2C_RecvACK(); }//************************************** //從I2C總線接收一個字節數據 //************************************** uchar I2C_RecvByte() {uchar i;uchar dat = 0;SDA = 1; //使能內部上拉,準備讀取數據,for (i=0; i<8; i++) //8位計數器{dat <<= 1;SCL = 1; //拉高時鐘線Delay5us(); //延時dat |= SDA; //讀數據 SCL = 0; //拉低時鐘線Delay5us(); //延時}return dat; }//************************************** //向I2C設備寫入一個字節數據 //************************************** void Single_WriteI2C(uchar REG_Address,uchar REG_data) {I2C_Start(); //起始信號I2C_SendByte(SlaveAddress); //發送設備地址+寫信號I2C_SendByte(REG_Address); //內部寄存器地址I2C_SendByte(REG_data); //內部寄存器數據I2C_Stop(); //發送停止信號 }//************************************** //從I2C設備讀取一個字節數據 //************************************** uchar Single_ReadI2C(uchar REG_Address) {uchar REG_data;I2C_Start(); //起始信號I2C_SendByte(SlaveAddress); //發送設備地址+寫信號I2C_SendByte(REG_Address); //發送存儲單元地址,從0開始 I2C_Start(); //起始信號I2C_SendByte(SlaveAddress+1); //發送設備地址+讀信號REG_data=I2C_RecvByte(); //讀出寄存器數據I2C_SendACK(1); //接收應答信號I2C_Stop(); //停止信號return REG_data; }#endif
總結
以上是生活随笔為你收集整理的基于单片机MC9S12XS128的两轮自平衡小车设计的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Jess学习一
- 下一篇: 降压式变换电路(Buck电路)详解