在制作平衡車或者飛行器時(shí),不可避免地需要知道設(shè)備本身的姿態(tài),一般我們使用陀螺儀和加速度計(jì)來獲取這些信息。
陀螺儀用來測量物體的角度。傳統(tǒng)的機(jī)械式陀螺的原理,和我們小時(shí)候玩的陀螺一樣,是利用了高速旋轉(zhuǎn)的物體能保持軸線穩(wěn)定的特性;機(jī)械式陀螺需要的加工精度非常高,但是測角精度一般。后來發(fā)展出來的光纖陀螺和激光陀螺雖然原理上已經(jīng)有了很大不同,但還是沿用了陀螺儀這個(gè)叫法,它們的精度要比機(jī)械式的陀螺高很多,價(jià)格也較貴。MEMS陀螺是基于微機(jī)電技術(shù),它的突出特點(diǎn)是體積小、成本低,但是初始精度低,一般需要校準(zhǔn)后才能獲得較理想的數(shù)據(jù);目前市面上常見的小型飛行器、平衡車,都是用的MEMS陀螺,正是由于低成本MEMS器件的出現(xiàn),近年來小型無人機(jī)得到了飛速發(fā)展。
加速度計(jì)用來測量物體的加速度,進(jìn)而可以積分后得到物體的速度和位移。
在一般的姿態(tài)測量的應(yīng)用中,加速度計(jì)還可以用于校準(zhǔn)陀螺儀的數(shù)據(jù)。這是因?yàn)榧铀俣扔?jì)可以實(shí)時(shí)測量重力加速度,根據(jù)重力加速度的方向,可以知道物體本身的一些姿態(tài)信息。陀螺儀的數(shù)據(jù)在較短時(shí)間內(nèi)是比較準(zhǔn)確的,但是長時(shí)間會(huì)有誤差累積;所以,陀螺儀長時(shí)間的數(shù)據(jù)需要通過加速度計(jì)測得的重力角度來修正。
MPU6050集成了3軸陀螺儀和3軸加速度計(jì),可以獲取物體的姿態(tài)和運(yùn)動(dòng)信息。陀螺儀可測范圍為±250,±500,±1000,±2000°/秒,加速度計(jì)可測范圍為±2,±4,±8,±16g,使用16bitAD采樣。使用I2C接口通信。
本節(jié)我們就來使用STM32獲取MPU6050的加速度和角速度數(shù)據(jù),并介紹一種簡單的初始校準(zhǔn)方法,最后使用匿名四軸地面站來顯示加速度和角速度的波形圖。
1)MPU6050硬件介紹
本文使用的是下圖這種MPU6050模塊(GY521):
模塊的電路板上,已經(jīng)標(biāo)明了X軸、Y軸的方向,而Z軸的方向由X軸、Y軸通過右手定則確定。
至于各角速度的方向,也是通過右手定則確定,如下圖:
如果想把MPU6050集成到自己的電路板上,可以參考如下原理圖設(shè)計(jì):
使用LDO降壓成3.3V作為MPU6050的供電;對外的接口最少需要連接VCC_5V、GND供電線,SCL、SDA I2C通信線。
本文把I2C的兩根線連接到STM32的I2C1對應(yīng)的引腳上。
2)配置cubemx工程
設(shè)置I2C1接口,速率為400KHz:
設(shè)置好后,生成keil工程。
3)MPU6050原始數(shù)據(jù)的獲取
STM32的HAL庫生成的硬件I2C代碼有個(gè)bug,這里我們先修正一下:
就是I2C初始化的如下函數(shù),需要添加一句,把時(shí)鐘初始化的內(nèi)容提到GPIO初始化之前,如果不修改,硬件I2C有時(shí)不能用。
編寫代碼時(shí),將HAL庫的I2C讀寫代碼封裝一下,以便于后面使用:
初始化MPU6050,如果我們只用最基本的功能,只要芯片喚醒,設(shè)置采樣率、濾波器、量程等操作就可以了:(具體的寄存器含義,可以查看芯片數(shù)據(jù)手冊)
初始化完成后,就可以讀取MPU6050的數(shù)據(jù)了,我們需要獲取的加速度和角速度數(shù)據(jù),在寄存器ACCEL_XOUT_H(0x3B)為起始地址的14個(gè)字節(jié)中,其中前6個(gè)字節(jié)是三個(gè)方向的加速度,最后6個(gè)字節(jié)是三個(gè)方向的角速度。
主函數(shù)中,整個(gè)使用過程如下:
先調(diào)用MPU6050_Init()初始化、再使用MPU6050_Get()函數(shù)循環(huán)讀取數(shù)據(jù),打印輸出。
依據(jù)前面設(shè)置的量程和采樣bit位數(shù),將加速度的原始數(shù)據(jù)還原成了g的倍數(shù),角速度值還原成了°/s:
上述代碼運(yùn)行后,結(jié)果如圖:
這是把傳感器水平放置、靜止時(shí)的測量原始值打印輸出;可以看到,Z軸的加速度初始誤差很大,達(dá)到了0.3個(gè)g左右;同樣,X軸的角速度誤差也很大。這樣大的初始誤差是不方便使用的。
4)簡單的初始校準(zhǔn)方法
一種簡單的初始值校準(zhǔn)方法,可以依據(jù)下面的方法實(shí)現(xiàn):將MPU6050傳感器固定好一個(gè)角度(如Z軸豎直向上),并且保持靜止;這樣它測量到的加速度值就只有單一的重力加速度,而角速度應(yīng)為0,我們只要記錄一定數(shù)據(jù)的數(shù)據(jù)取平均,就能得知初始的加速度、角速度偏移。
具體實(shí)現(xiàn)的代碼實(shí)現(xiàn)如下:
執(zhí)行完后,ax_cl、ay_cl…等幾個(gè)變量中,就保存好了各方向的加速度、角速度的零位偏移值,以后使用時(shí),獲取原始數(shù)據(jù)后,再減去這些零位偏移,就能獲得校準(zhǔn)后的值。
將MPU6050_Get()函數(shù)作如下改寫,就能實(shí)現(xiàn)獲取校準(zhǔn)后的值:
主函數(shù)中,while(1)之前增加一次校準(zhǔn)函數(shù)MPU6050_calibrate()的調(diào)用,再次測試結(jié)果如下:
可以看到,三個(gè)方向的加速度的偏差已經(jīng)非常小,X軸和Y軸的角速度的偏差也比未校準(zhǔn)前小了幾個(gè)數(shù)量級(jí)。對于MPU6050這種精度較低的MEMS器件,依靠這樣一個(gè)方向的校準(zhǔn)數(shù)據(jù)也可以獲取不錯(cuò)的效果。
5)波形顯示
為了跟直觀地顯示各方向的加速度和角速度值,我們可以通過一些工具來顯示波形圖,這里我們使用匿名四軸的上位機(jī)軟件來顯示。
只需要按照它的格式將數(shù)據(jù)發(fā)到上位機(jī),就能顯示出波形,匿名四軸上位機(jī)的通信協(xié)議(V7版)如下:
我們按此格式將加速度、角速度的值填入,通過串口發(fā)送到上位機(jī),就能顯示了,實(shí)際測試圖形如下:(顯示的是Z軸的加速度和角速度)
在實(shí)際的應(yīng)用中,加速度計(jì)和陀螺儀的數(shù)據(jù)需要融合,比如通過互補(bǔ)濾波或者卡爾曼濾波,才能獲取更準(zhǔn)確的姿態(tài)信息;傳感器數(shù)據(jù)的初始校準(zhǔn),也不僅僅是測試一個(gè)方向、剔除零位這么簡單。有興趣的可以找更專業(yè)的書籍深入學(xué)習(xí)。
好了,本節(jié)關(guān)于MPU6050的一些基本應(yīng)用就講到這里了。
歡迎關(guān)注我的微信公眾號(hào):小白白學(xué)電子,可留言“資料”獲取所有源碼和參考資料:
文章來源:http://www.zghlxwxcb.cn/news/detail-403085.html
?文章來源地址http://www.zghlxwxcb.cn/news/detail-403085.html
到了這里,關(guān)于【STM32+cubemx】0027 HAL庫開發(fā):MPU6050陀螺儀和加速度計(jì)數(shù)據(jù)的獲取和校準(zhǔn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!