最近在研究6050,真是很磨人啊,這個小東西還挺復雜,一個讀取程序竟然需要600多行。
這幾天連查資料找到了幾個很好的帖子,要是以后有人看到這篇帖子,可以避免誤入歧途,也可以省去很多時間。
1、阿西莫夫電子論壇:神貼。。ahttp://www.amobbs.com/thread-5581033-1-1.html?_dsign=5c5b5cde
2、強大的百度出來的第七實驗室:https://wenku.baidu.com/view/89db87ac7375a417876f8f6b.html
3、6050角度轉換原理:http://blog.csdn.net/u010389437/article/details/38541561
說一下我對他的理解。其實也不是特別的復雜,6050就是一個i2c器件,就像一個微控制器,通過它你能知道你當錢的姿態,把他想象成一個黑箱,
要使用它,首先你得了解他的寄存器,知道如何初始化,讀取,寫入等等。都是套路其實,看着照葫蘆畫瓢就行,
重要的就是知道如何將輸出的數據進行轉化為你能需要並且能看懂的數據。而下面你得資料你絕對用得到。
6050的操作:
#include "mpu6050.h" #include "bsp_usart1.h" #include "bsp_i2c.h" /** * @brief 寫數據到MPU6050寄存器 * @param * @retval */ void MPU6050_WriteReg(u8 reg_add,u8 reg_dat) { i2c_Start(); i2c_SendByte(MPU6050_SLAVE_ADDRESS); //寫從機地址,並配置成寫模式 i2c_WaitAck(); i2c_SendByte(reg_add); //寫寄存器地址 i2c_WaitAck(); i2c_SendByte(reg_dat); //寫寄存器數據 i2c_WaitAck(); i2c_Stop(); } /** * @brief 從MPU6050寄存器讀取數據 * @param * @retval */ void MPU6050_ReadData(u8 reg_add,unsigned char*Read,u8 num) { unsigned char i; i2c_Start(); i2c_SendByte(MPU6050_SLAVE_ADDRESS); i2c_WaitAck(); i2c_SendByte(reg_add); i2c_WaitAck(); i2c_Start(); i2c_SendByte(MPU6050_SLAVE_ADDRESS+1); //寫從機地址,並配置成讀模式 i2c_WaitAck(); for(i=0;i<(num-1);i++) { *Read=i2c_ReadByte(1); Read++; } *Read=i2c_ReadByte(0); i2c_Stop(); } //**************至此mpu6050的讀寫操作函數都搞定了,下面只需要初始化就可以讀取他的數據了 /** * @brief 初始化MPU6050芯片 * @param * @retval */ void MPU6050_Init(void) { int i=0,j=0; //在初始化之前要延時一段時間,若沒有延時,則斷電后再上電數據可能會出錯 for(i=0;i<1000;i++) { for(j=0;j<1000;j++) { ; } } MPU6050_WriteReg(MPU6050_RA_PWR_MGMT_1, 0x00); //解除休眠狀態 MPU6050_WriteReg(MPU6050_RA_SMPLRT_DIV , 0x07); //陀螺儀采樣率,1KHz MPU6050_WriteReg(MPU6050_RA_CONFIG , 0x06); //低通濾波器的設置,截止頻率是1K,帶寬是5K MPU6050_WriteReg(MPU6050_RA_ACCEL_CONFIG , 0x00); //配置加速度傳感器工作在2G模式,不自檢 MPU6050_WriteReg(MPU6050_RA_GYRO_CONFIG, 0x18); //陀螺儀自檢及測量范圍,典型值:0x18(不自檢,2000deg/s) } /** * @brief 讀取MPU6050的ID * @param * @retval */ uint8_t MPU6050ReadID(void) { unsigned char Re = 0; MPU6050_ReadData(MPU6050_RA_WHO_AM_I,&Re,1); //讀器件地址 if(Re != 0x68) { printf("MPU6050 dectected error!\r\n檢測不到MPU6050模塊,請檢查模塊與開發板的接線"); return 0; } else { printf("MPU6050 ID = %d\r\n",Re); return 1; } } /** * @brief 讀取MPU6050的加速度數據 * @param * @retval */ void MPU6050ReadAcc(short *accData) { u8 buf[6]; MPU6050_ReadData(MPU6050_ACC_OUT, buf, 6); accData[0] = (buf[0] << 8) | buf[1]; accData[1] = (buf[2] << 8) | buf[3]; accData[2] = (buf[4] << 8) | buf[5]; } /** * @brief 讀取MPU6050的角加速度數據 * @param * @retval */ void MPU6050ReadGyro(short *gyroData) { u8 buf[6]; MPU6050_ReadData(MPU6050_GYRO_OUT,buf,6); gyroData[0] = (buf[0] << 8) | buf[1]; gyroData[1] = (buf[2] << 8) | buf[3]; gyroData[2] = (buf[4] << 8) | buf[5]; } /** * @brief 讀取MPU6050的原始溫度數據 * @param * @retval */ void MPU6050ReadTemp(short *tempData) { u8 buf[2]; MPU6050_ReadData(MPU6050_RA_TEMP_OUT_H,buf,2); //讀取溫度值 *tempData = (buf[0] << 8) | buf[1]; } /** * @brief 讀取MPU6050的溫度數據,轉化成攝氏度 * @param * @retval */ void MPU6050_ReturnTemp(short*Temperature) { short temp3; u8 buf[2]; MPU6050_ReadData(MPU6050_RA_TEMP_OUT_H,buf,2); //讀取溫度值 temp3= (buf[0] << 8) | buf[1]; *Temperature=(((double) (temp3 + 13200)) / 280)-13; }
,
光知道6050怎么操作還是不行的,你的有一個橋梁到6050上面去,得有一個放大鏡偷窺里面的數據。這是就需要i2c閃亮登場。
偽代碼我就不說了,看我的其他博客。
有了這些你就無敵了。