基于msp430f5529的MPU6050測(cè)角度_第1頁(yè)
基于msp430f5529的MPU6050測(cè)角度_第2頁(yè)
基于msp430f5529的MPU6050測(cè)角度_第3頁(yè)
基于msp430f5529的MPU6050測(cè)角度_第4頁(yè)
基于msp430f5529的MPU6050測(cè)角度_第5頁(yè)
已閱讀5頁(yè),還剩8頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、這個(gè)程序完成的功能為:使用msp430f5529在12864上串行顯示GY-521,MPU6050所測(cè)量的角度。在IAR親測(cè)成功。注意:我只給出了C文件 ,h文件自己去建立就好了。/*主函數(shù)*/#include <msp430f5529.h>#include "stdio.h"#include "math.h"#include "6050.h"#include "LCD12864.h"void Delays( uchar i) unsigned int j; while(i-) j=2000; whil

2、e(j-); void main(void) WDTCTL = WDTPW + WDTHOLD; / 關(guān)閉看門(mén)狗 char sum110,sum210,sum310; / 串口發(fā)送緩存 float a_x,a_y,a_z; int_port() ;/管腳初始化 lcdinit(); InitMPU6050(); / 初始化模塊 display(1,1,"角度X:"); display(2,1,"角度Y:"); display(3,1,"角度Z:"); while(1) / Delays(2); a_x = mpu6050_Angle(

3、2); a_y = mpu6050_Angle(1); a_z = mpu6050_Angle(0); sprintf(sum1,"%.2f",a_x); / 將測(cè)量?jī)A角值轉(zhuǎn)換為字符串 sprintf(sum2,"%.2f",a_y); sprintf(sum3,"%.2f",a_z); display(1,4,sum1); display(2,4,sum2); display(3,4,sum3); /*6050IIC*/*文件名:Mpu-6050.c*編寫(xiě)者:黃建軍*描 述:三軸加速度,三軸陀螺儀傳感器Mpu-6050的驅(qū)動(dòng)程序,此

4、處用于149系列。* 注意-此處 MCLK:8Mhz*版 本:2013-6 V1.0*/#include "msp430f5529.h"/#include "mytype.h"#include "6050.h"static void I2C_Start();static void I2C_Stop();static void I2C_SendACK(uchar ack);static uchar I2C_RecvACK();static void I2C_SendByte(uchar dat);static uchar I2C_Rec

5、vACK();short accData3=0;/*/I2C起始信號(hào)/*void I2C_Start() MPU_SCL_OUT(); / SCL設(shè)置為輸出 MPU_SDA_OUT(); / SDA設(shè)置為輸出 MPU_SDA_H(); /拉高數(shù)據(jù)線 MPU_SCL_H(); /拉高時(shí)鐘線 DELAY_US(5); /延時(shí) MPU_SDA_L(); /產(chǎn)生下降沿 DELAY_US(5); /延時(shí) MPU_SCL_L(); /拉低時(shí)鐘線/*/I2C停止信號(hào)/*void I2C_Stop() MPU_SCL_OUT(); / SCL設(shè)置為輸出 MPU_SDA_OUT(); / SDA設(shè)置為輸出 MP

6、U_SDA_L(); /拉低數(shù)據(jù)線 MPU_SCL_H(); /拉高時(shí)鐘線 DELAY_US(5); /延時(shí) MPU_SDA_H(); /產(chǎn)生上升沿 DELAY_US(5); /延時(shí)/*/I2C發(fā)送應(yīng)答信號(hào)/入口參數(shù):ack (0:ACK 1:NAK)/*void I2C_SendACK(uchar ack) MPU_SCL_OUT(); / SCL設(shè)置為輸出 MPU_SDA_OUT(); / SDA設(shè)置為輸出 if(ack) MPU_SDA_H(); else MPU_SDA_L();/ SDA = ack; /寫(xiě)應(yīng)答信號(hào) MPU_SCL_H(); /拉高時(shí)鐘線 DELAY_US(5); /

7、延時(shí) MPU_SCL_L(); /拉低時(shí)鐘線 DELAY_US(5); /延時(shí)/*/I2C接收應(yīng)答信號(hào)/*uchar I2C_RecvACK() uchar cy; MPU_SCL_OUT(); / SCL設(shè)置為輸出 MPU_SDA_IN(); / SDA設(shè)置為輸入 MPU_SCL_H(); /拉高時(shí)鐘線 DELAY_US(5); /延時(shí) if(MPU_SDA_DAT() cy=1; else cy=0; / cy = SDA; /讀應(yīng)答信號(hào) MPU_SCL_L(); /拉低時(shí)鐘線 DELAY_US(5); /延時(shí) MPU_SDA_OUT(); / SDA設(shè)置為輸出 return cy; /*

8、/向I2C總線發(fā)送一個(gè)字節(jié)數(shù)據(jù)/*void I2C_SendByte(uchar dat) uchar i; MPU_SCL_OUT(); / SCL設(shè)置為輸出 MPU_SDA_OUT(); / SDA設(shè)置為輸出 for (i=0; i<8; i+) /8位計(jì)數(shù)器 if(dat<<i)&0x80) MPU_SDA_H(); else MPU_SDA_L(); / SDA = cy; /送數(shù)據(jù)口 MPU_SCL_H(); /拉高時(shí)鐘線 DELAY_US(5); /延時(shí) MPU_SCL_L(); /拉低時(shí)鐘線 DELAY_US(5); /延時(shí) I2C_RecvACK();

9、/*/從I2C總線接收一個(gè)字節(jié)數(shù)據(jù)/*uchar I2C_RecvByte() uchar i; uchar dat = 0,cy; MPU_SCL_OUT(); / SCL設(shè)置為輸出 MPU_SDA_OUT(); / SDA設(shè)置為輸出 MPU_SDA_H(); /使能內(nèi)部上拉,準(zhǔn)備讀取數(shù)據(jù), MPU_SDA_IN(); / SDA設(shè)置為輸入,準(zhǔn)備向主機(jī)輸入數(shù)據(jù) for (i=0; i<8; i+) /8位計(jì)數(shù)器 dat <<= 1; MPU_SCL_H(); /拉高時(shí)鐘線 DELAY_US(5); /延時(shí) if(MPU_SDA_DAT() cy=1; else cy=0;

10、dat |= cy; /讀數(shù)據(jù) MPU_SCL_L(); /拉低時(shí)鐘線 DELAY_US(5); /延時(shí) MPU_SDA_OUT(); return dat;/*/向I2C設(shè)備寫(xiě)入一個(gè)字節(jié)數(shù)據(jù)/*void ByteWrite6050(uchar REG_Address,uchar REG_data) I2C_Start(); /起始信號(hào) I2C_SendByte(SlaveAddress); /發(fā)送設(shè)備地址+寫(xiě)信號(hào) I2C_SendByte(REG_Address); /內(nèi)部寄存器地址, I2C_SendByte(REG_data); /內(nèi)部寄存器數(shù)據(jù), I2C_Stop(); /發(fā)送停止信號(hào)

11、/*/從I2C設(shè)備讀取一個(gè)字節(jié)數(shù)據(jù)/*uchar ByteRead6050(uchar REG_Address)uchar REG_data;I2C_Start(); /起始信號(hào)I2C_SendByte(SlaveAddress); /發(fā)送設(shè)備地址+寫(xiě)信號(hào)I2C_SendByte(REG_Address); /發(fā)送存儲(chǔ)單元地址,從0開(kāi)始I2C_Start(); /起始信號(hào)I2C_SendByte(SlaveAddress+1); /發(fā)送設(shè)備地址+讀信號(hào)REG_data=I2C_RecvByte(); /讀出寄存器數(shù)據(jù)I2C_SendACK(1); /接收應(yīng)答信號(hào)I2C_Stop(); /停止信

12、號(hào)return REG_data;/*/合成數(shù)據(jù)/*int Get6050Data(uchar REG_Address)char H,L;H=ByteRead6050(REG_Address);L=ByteRead6050(REG_Address+1);return (H<<8)+L; /合成數(shù)據(jù)/*/初始化MPU6050/*void InitMPU6050()ByteWrite6050(PWR_MGMT_1, 0x00); / 解除休眠狀態(tài)ByteWrite6050(SMPLRT_DIV, 0x07); / 陀螺儀采樣率設(shè)置(125HZ)ByteWrite6050(CONFIG,

13、 0x06); / 低通濾波器頻率設(shè)置(5HZ)ByteWrite6050(GYRO_CONFIG, 0x18); / 陀螺儀自檢及檢測(cè)范圍設(shè)置(不自檢,16.4LSB/DBS/S)ByteWrite6050(ACCEL_CONFIG, 0x01); / 加速計(jì)自檢、測(cè)量范圍及高通濾波頻率(不自檢,2G(16384LSB/G),5Hz)/*函數(shù)名 :float Mpu6050AccelAngle(int8 dir)*函數(shù)功能:輸出加速度傳感器測(cè)量的傾角值* 范圍為2g時(shí),換算關(guān)系:16384 LSB/g* 角度較小時(shí),x=sinx得到角度(弧度), deg = rad*180/3.14* 因?yàn)?/p>

14、x>=sinx,故乘以1.2適當(dāng)放大*返回參數(shù):測(cè)量的傾角值*傳入?yún)?shù):dir - 需要測(cè)量的方向* ACCEL_XOUT - X方向* ACCEL_YOUT - Y方向* ACCEL_ZOUT - Z方向*/float Mpu6050AccelAngle(uchar dir) float accel_agle;/ 測(cè)量的傾角值 float result; / 測(cè)量值緩存變量 result = (float)Get6050Data(dir); / 測(cè)量當(dāng)前方向的加速度值,轉(zhuǎn)換為浮點(diǎn)數(shù) accel_agle = (result + MPU6050_ZERO_ACCELL); / 去除零點(diǎn)偏

15、移,計(jì)算得到角度(弧度)/ accel_agle = accel_agle*1.2*180/3.14; /弧度轉(zhuǎn)換為度 return accel_agle; / 返回測(cè)量值/*函數(shù)名 :float Mpu6050GyroAngle(int8 dir)*函數(shù)功能:輸出陀螺儀測(cè)量的傾角加速度* 范圍為2000deg/s時(shí),換算關(guān)系:16.4 LSB/(deg/s)*返回參數(shù):測(cè)量的傾角加速度值*傳入?yún)?shù):dir - 需要測(cè)量的方向* GYRO_XOUT - X軸方向* GYRO_YOUT - Y軸方向* GYRO_ZOUT - Z軸方向*/float Mpu6050GyroAngle(uchar

16、dir) float gyro_angle;/ float Angle_gy; gyro_angle = (float)Get6050Data(dir); / 檢測(cè)陀螺儀的當(dāng)前值 gyro_angle = -(gyro_angle + MPU6050_ZERO_GYRO)/16.4; /去除零點(diǎn)偏移,計(jì)算角速度值,負(fù)號(hào)為方向處理 / Angle_gy += gyro_angle*0.005; return gyro_angle; / 返回測(cè)量值/采樣10次去掉兩個(gè)最大最小值求平均void MPU6050ReadAcc() int i=0,j=0;int x_buf10;int y_buf10;

17、int z_buf10;int temp=0;long temp2=0;for(i=0;i<10;i+)x_bufi = Get6050Data(ACCEL_XOUT);y_bufi = Get6050Data(ACCEL_YOUT);z_bufi = Get6050Data(ACCEL_ZOUT);for(i=0;i<9;i+)for(j=i+1;j<10;j+)if(x_bufj>x_bufi)temp=x_bufj;x_bufj=x_bufi;x_bufi=temp;if(y_bufj>y_bufi)temp=y_bufj;y_bufj=y_bufi;y_b

18、ufi=temp;if(z_bufj>z_bufi)temp=z_bufj;z_bufj=z_bufi;z_bufi=temp;temp2=0;for(i=2;i<8;i+)temp2=temp2+x_bufi;accData0=temp2/6;temp2=0;for(i=2;i<8;i+)temp2=temp2+y_bufi;accData1=temp2/6;temp2=0;for(i=2;i<8;i+)temp2=temp2+z_bufi;accData2=temp2/6;/得到角度/x,y,z:x,y,z方向的重力加速度分量(不需要單位,直接數(shù)值即可)/dir:要

19、獲得的角度.0,與x軸的角度;1,與Y軸的角度;2,與Z軸的角度./返回值:角度值.單位0.1°.float mpu6050_Angle(uchar dir)float temp,x,y,z; float res=0; MPU6050ReadAcc(); /得到accData值 x = accData0; y = accData1; z = accData2; switch(dir)case 0:/與自然Z軸的角度 temp=sqrt(x*x+y*y)/z; res=atan(temp); break;case 1:/與自然X軸的角度 temp=x/sqrt(y*y+z*z); re

20、s=atan(temp); break; case 2:/與自然Y軸的角度 temp=y/sqrt(x*x+z*z); res=atan(temp); break; return (res*180/3.14)+0;/設(shè)置平放的基礎(chǔ)角度值/*LCD12864*/#include <msp430f5529.h>#include "LCD12864.h"#define uchar unsigned char#define uint unsigned intextern unsigned char ADS1256_buf9;void int_port(void) /管腳

21、初始化 P2SEL&=BIT4; /P2.4模擬SID,設(shè)置為i/o口輸出方向 P2DIR|=BIT4; P2OUT&=BIT4; P2SEL&=BIT5; /P2.5模擬SCLK,設(shè)置為i/o口輸出方向 P2DIR|=BIT5; P2OUT&=BIT5; /* 名稱(chēng) : delay()* 輸入 : t* 輸出 : 無(wú)*/void delay(uint t) /延時(shí)函數(shù) /粗略延時(shí),滿(mǎn)足時(shí)序要求 uint i,j; for(i=0; i<t; i+) for(j=0; j<10; j+);/* 名稱(chēng) : sendbyte()* 功能 : 按照液晶的串

22、口通信協(xié)議,發(fā)送數(shù)據(jù)* 輸入 : zdata* 輸出 : 無(wú)*/void sendbyte(uchar zdata) /數(shù)據(jù)傳送函數(shù) uchar code_seg7; uchar serial_clk; uchar serial_shift; code_seg7=zdata; serial_shift=0x80; for(serial_clk=0; serial_clk<8; serial_clk+) if(code_seg7&serial_shift) P2OUT|=BIT4; /SID為1 else P2OUT&=BIT4; /SID為0 P2OUT&=BIT

23、5; /產(chǎn)生時(shí)鐘信號(hào)下沿 P2OUT|=BIT5; /產(chǎn)生時(shí)鐘信號(hào)上沿 serial_shift=serial_shift>>1; /準(zhǔn)備發(fā)送下一位數(shù)據(jù) /* 名稱(chēng) : write_com()* 功能 : 寫(xiě)串口指令* 輸入 : cmdcode* 輸出 : 無(wú)*/void write_com(unsigned char cmdcode) /寫(xiě)命令函數(shù) /串口控制格式(11111AB0) /A數(shù)據(jù)方向控制,A=H時(shí)讀,A=L時(shí)寫(xiě) /B數(shù)據(jù)類(lèi)型選擇,B=H時(shí)為顯示數(shù)據(jù),B=L時(shí)為命令 sendbyte(0xf8); /MCU向LCD發(fā)命令 sendbyte(cmdcode &

24、0xf0); /發(fā)高四位數(shù)據(jù)(數(shù)據(jù)格式D7D6D5D4_0000) sendbyte(cmdcode << 4) & 0xf0);/發(fā)低四位數(shù)據(jù)(數(shù)據(jù)格式D3D2D1D0_0000) delay(2); /延時(shí)等待/* 名稱(chēng) : write_data()* 功能 : 寫(xiě)串口數(shù)據(jù)* 輸入 : Dispdata* 輸出 : 無(wú)*/void write_data(uchar Dispdata)/寫(xiě)數(shù)據(jù)函數(shù) sendbyte(0xfa); /MCU向LCD發(fā)數(shù)據(jù) sendbyte(Dispdata & 0xf0); /發(fā)高四位數(shù)據(jù) sendbyte(Dispdata << 4) & 0xf0);/發(fā)低四位數(shù)據(jù) delay(2);/* 名稱(chēng) : lcdinit()* 功能 : 初始化函數(shù)* 輸入 : cmdcode* 輸出 : 無(wú)*/void lcdinit() /LCD初始化 delay(20000); /復(fù)位等待(內(nèi)部自帶上電復(fù)位電路),時(shí)間較長(zhǎng) write_com(0x30); /功能設(shè)定:基本指令集操作 delay(50); /延時(shí)等待 write_com(0x0c); /整體顯示,關(guān)游標(biāo) delay(50); write_com(0x

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論