STM32驅(qū)動(dòng)MPU6050
MPU-60X0是全球首例9軸運(yùn)動(dòng)處理傳感器。它集成了3軸MEMS陀螺儀,3軸MEMS
加速度計(jì),以及一個(gè)可擴(kuò)展的數(shù)字運(yùn)動(dòng)處理器DMP(Digital Motion Processor),可用I2C
接口連接一個(gè)第三方的數(shù)字傳感器,比如磁力計(jì)。擴(kuò)展之后就可以通過其I2C或SPI接口
輸出一個(gè)9軸的信號(hào)(SPI接口僅在MPU-6000可用)。MPU-60X0也可以通過其I2C接口
連接非慣性的數(shù)字傳感器,比如壓力傳感器。
MPU-60X0對(duì)陀螺儀和加速度計(jì)分別用了三個(gè)16位的ADC,將其測(cè)量的模擬量轉(zhuǎn)化
為可輸出的數(shù)字量。為了精確跟蹤快速和慢速的運(yùn)動(dòng),傳感器的測(cè)量范圍都是用戶可控的,
陀螺儀可測(cè)范圍為±250,±500,±1000,±2000°/秒(dps),加速度計(jì)可測(cè)范圍為±2,±4,±8,±16g
對(duì)MPU6050的配置主要需要1.上電檢測(cè)芯片序列號(hào),自檢2.設(shè)定加速度陀螺儀的閾值和檢測(cè)頻率3.設(shè)定外部鏈接設(shè)備的驅(qū)動(dòng)模式以及地址4.設(shè)定中斷模式,比如要打開自由落體中斷需要的設(shè)置,數(shù)據(jù)準(zhǔn)備好中斷需要的設(shè)置等5.設(shè)定電源管理模式,防止進(jìn)入休眠6.循環(huán)讀取數(shù)據(jù)
MPU輸出一共三種數(shù)據(jù),包括陀螺儀輸出加速度傳感器輸出和溫度輸出,溫度輸出需要計(jì)算,計(jì)算方法是讀出16位溫度數(shù)據(jù)temp,然后temp/340.0 + 36.53
另外,中斷引腳的模式也是可以配置的,詳細(xì)的說明在MPU6050驅(qū)動(dòng)的頭文件中有,包含每一個(gè)寄存器的說明,請(qǐng)查看源碼,如下
1.MPU6050.h
#ifndef__MPU6050_H_
#define__MPU6050_H_
#include"common.h"
#include"ioremap.h"
#include"stm32f10x.h"
#include"delay.h"
#include"uart.h"
#defineMPU_ACK_WAIT_TIME200//us
#defineMPU6050_ADDRESS_AD0_LOW0xD0//AD0為低的時(shí)候設(shè)備的寫地址
#defineMPU6050_ADDRESS_AD0_HIGH0XD1//AD0為高的時(shí)候設(shè)備的寫地址
#defineMPU_ADDR0xD0//IIC寫入時(shí)的地址字節(jié)數(shù)據(jù)
#defineMPU_DEBUG1
//技術(shù)文檔未公布的寄存器主要用于官方DMP操作
#defineMPU6050_RA_XG_OFFS_TC0x00//[bit7]PWR_MODE,[6:1]XG_OFFS_TC,[bit0]OTP_BNK_VLD
#defineMPU6050_RA_YG_OFFS_TC0x01//[7]PWR_MODE,[6:1]YG_OFFS_TC,[0]OTP_BNK_VLD
//bit7的定義,當(dāng)設(shè)置為1,輔助I2C總線高電平是VDD。當(dāng)設(shè)置為0,輔助I2C總線高電平是VLOGIC
#defineMPU6050_RA_ZG_OFFS_TC0x02//[7]PWR_MODE,[6:1]ZG_OFFS_TC,[0]OTP_BNK_VLD
#defineMPU6050_RA_X_FINE_GAIN0x03//[7:0]X_FINE_GAIN
#defineMPU6050_RA_Y_FINE_GAIN0x04//[7:0]Y_FINE_GAIN
#defineMPU6050_RA_Z_FINE_GAIN0x05//[7:0]Z_FINE_GAIN
#defineMPU6050_RA_XA_OFFS_H0x06//[15:0]XA_OFFS兩個(gè)寄存器合在一起
#defineMPU6050_RA_XA_OFFS_L_TC0x07
#defineMPU6050_RA_YA_OFFS_H0x08//[15:0]YA_OFFS兩個(gè)寄存器合在一起
#defineMPU6050_RA_YA_OFFS_L_TC0x09
#defineMPU6050_RA_ZA_OFFS_H0x0A//[15:0]ZA_OFFS兩個(gè)寄存器合在一起
#defineMPU6050_RA_ZA_OFFS_L_TC0x0B
#defineMPU6050_RA_XG_OFFS_USRH0x13//[15:0]XG_OFFS_USR兩個(gè)寄存器合在一起
#defineMPU6050_RA_XG_OFFS_USRL0x14
#defineMPU6050_RA_YG_OFFS_USRH0x15//[15:0]YG_OFFS_USR兩個(gè)寄存器合在一起
#defineMPU6050_RA_YG_OFFS_USRL0x16
#defineMPU6050_RA_ZG_OFFS_USRH0x17//[15:0]ZG_OFFS_USR兩個(gè)寄存器合在一起
#defineMPU6050_RA_ZG_OFFS_USRL0x18
/*陀螺儀的采樣頻率*/
/*傳感器的寄存器輸出,FIFO輸出,DMP采樣、運(yùn)動(dòng)檢測(cè)、
*零運(yùn)動(dòng)檢測(cè)和自由落體檢測(cè)都是基于采樣率。
*通過SMPLRT_DIV把陀螺儀輸出率分頻即可得到采樣率
*采樣率=陀螺儀輸出率/(1+SMPLRT_DIV)
*禁用DLPF的情況下(DLPF_CFG=0或7),陀螺儀輸出率=8khz
*在啟用DLPF(見寄存器26)時(shí),陀螺儀輸出率=1khz
*加速度傳感器輸出率是1khz。這意味著,采樣率大于1khz時(shí),
*同一個(gè)加速度傳感器的樣品可能會(huì)多次輸入到FIFO、DMP和傳感器寄存器*/
#defineMPU6050_RA_SMPLRT_DIV0x19//[0-7]陀螺儀輸出分頻采樣率
/*配置外部引腳采樣和DLPF數(shù)字低通濾波器*/
#defineMPU6050_RA_CONFIG0x1A
//bit5-bit3一個(gè)連接到FSYNC端口的外部信號(hào)可以通過配置EXT_SYNC_SET來采樣
//也就是說,這里設(shè)置之后,FSYNC的電平0或1進(jìn)入最終數(shù)據(jù)寄存器,具體如下
//0不使用1FSYNC電平進(jìn)入所有數(shù)據(jù)寄存器2FSYNC電平進(jìn)入GYRO_XOUT_L3FSYNC電平進(jìn)入GYRO_YOUT_L
//4FSYNC電平進(jìn)入GYRO_ZOUT_L5FSYNC電平進(jìn)入ACCEL_XOUT_L6FSYNC電平進(jìn)入ACCEL_YOUT_L
//7FSYNC電平進(jìn)入SYNC_ACCEL_ZOUT_L
//bit2-bit0數(shù)字低通濾波器用于濾除高頻干擾高于這個(gè)頻率的干擾被濾除掉
/*對(duì)應(yīng)關(guān)系如下
**|加速度傳感器|陀螺儀
**DLPF_CFG|帶寬|延遲|帶寬|延遲|采樣率
*-------------+--------+-------+--------+------+-------------
*0|260Hz|0ms|256Hz|0.98ms|8kHz
*1|184Hz|2.0ms|188Hz|1.9ms|1kHz
*2|94Hz|3.0ms|98Hz|2.8ms|1kHz
*3|44Hz|4.9ms|42Hz|4.8ms|1kHz
*4|21Hz|8.5ms|20Hz|8.3ms|1kHz
*5|10Hz|13.8ms|10Hz|13.4ms|1kHz
*6|5Hz|19.0ms|5Hz|18.6ms|1kHz
*7|Reserved|Reserved|Reserved
**/
/*陀螺儀的配置,主要是配置陀螺儀的量程與自檢(通過相應(yīng)的位765開啟自檢)*/
#defineMPU6050_RA_GYRO_CONFIG0x1B
//bit4-bit3量程設(shè)置如下
//0=+/-250度/秒
// 1 = +/- 500 度/秒