版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、這個程序完成的功能為:使用msp430f5529在12864上串行顯示GY-521,MPU6050所測量的角度。在IAR親測成功。注意:我只給出了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; / 關閉看門狗 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); / 將測量傾角值轉(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*編寫者:黃建軍*描 述:三軸加速度,三軸陀螺儀傳感器Mpu-6050的驅(qū)動程序,此
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起始信號/*void I2C_Start() MPU_SCL_OUT(); / SCL設置為輸出 MPU_SDA_OUT(); / SDA設置為輸出 MPU_SDA_H(); /拉高數(shù)據(jù)線 MPU_SCL_H(); /拉高時鐘線 DELAY_US(5); /延時 MPU_SDA_L(); /產(chǎn)生下降沿 DELAY_US(5); /延時 MPU_SCL_L(); /拉低時鐘線/*/I2C停止信號/*void I2C_Stop() MPU_SCL_OUT(); / SCL設置為輸出 MPU_SDA_OUT(); / SDA設置為輸出 MP
6、U_SDA_L(); /拉低數(shù)據(jù)線 MPU_SCL_H(); /拉高時鐘線 DELAY_US(5); /延時 MPU_SDA_H(); /產(chǎn)生上升沿 DELAY_US(5); /延時/*/I2C發(fā)送應答信號/入口參數(shù):ack (0:ACK 1:NAK)/*void I2C_SendACK(uchar ack) MPU_SCL_OUT(); / SCL設置為輸出 MPU_SDA_OUT(); / SDA設置為輸出 if(ack) MPU_SDA_H(); else MPU_SDA_L();/ SDA = ack; /寫應答信號 MPU_SCL_H(); /拉高時鐘線 DELAY_US(5); /
7、延時 MPU_SCL_L(); /拉低時鐘線 DELAY_US(5); /延時/*/I2C接收應答信號/*uchar I2C_RecvACK() uchar cy; MPU_SCL_OUT(); / SCL設置為輸出 MPU_SDA_IN(); / SDA設置為輸入 MPU_SCL_H(); /拉高時鐘線 DELAY_US(5); /延時 if(MPU_SDA_DAT() cy=1; else cy=0; / cy = SDA; /讀應答信號 MPU_SCL_L(); /拉低時鐘線 DELAY_US(5); /延時 MPU_SDA_OUT(); / SDA設置為輸出 return cy; /*
8、/向I2C總線發(fā)送一個字節(jié)數(shù)據(jù)/*void I2C_SendByte(uchar dat) uchar i; MPU_SCL_OUT(); / SCL設置為輸出 MPU_SDA_OUT(); / SDA設置為輸出 for (i=0; i<8; i+) /8位計數(shù)器 if(dat<<i)&0x80) MPU_SDA_H(); else MPU_SDA_L(); / SDA = cy; /送數(shù)據(jù)口 MPU_SCL_H(); /拉高時鐘線 DELAY_US(5); /延時 MPU_SCL_L(); /拉低時鐘線 DELAY_US(5); /延時 I2C_RecvACK();
9、/*/從I2C總線接收一個字節(jié)數(shù)據(jù)/*uchar I2C_RecvByte() uchar i; uchar dat = 0,cy; MPU_SCL_OUT(); / SCL設置為輸出 MPU_SDA_OUT(); / SDA設置為輸出 MPU_SDA_H(); /使能內(nèi)部上拉,準備讀取數(shù)據(jù), MPU_SDA_IN(); / SDA設置為輸入,準備向主機輸入數(shù)據(jù) for (i=0; i<8; i+) /8位計數(shù)器 dat <<= 1; MPU_SCL_H(); /拉高時鐘線 DELAY_US(5); /延時 if(MPU_SDA_DAT() cy=1; else cy=0;
10、dat |= cy; /讀數(shù)據(jù) MPU_SCL_L(); /拉低時鐘線 DELAY_US(5); /延時 MPU_SDA_OUT(); return dat;/*/向I2C設備寫入一個字節(jié)數(shù)據(jù)/*void ByteWrite6050(uchar REG_Address,uchar REG_data) I2C_Start(); /起始信號 I2C_SendByte(SlaveAddress); /發(fā)送設備地址+寫信號 I2C_SendByte(REG_Address); /內(nèi)部寄存器地址, I2C_SendByte(REG_data); /內(nèi)部寄存器數(shù)據(jù), I2C_Stop(); /發(fā)送停止信號
11、/*/從I2C設備讀取一個字節(jié)數(shù)據(jù)/*uchar ByteRead6050(uchar REG_Address)uchar REG_data;I2C_Start(); /起始信號I2C_SendByte(SlaveAddress); /發(fā)送設備地址+寫信號I2C_SendByte(REG_Address); /發(fā)送存儲單元地址,從0開始I2C_Start(); /起始信號I2C_SendByte(SlaveAddress+1); /發(fā)送設備地址+讀信號REG_data=I2C_RecvByte(); /讀出寄存器數(shù)據(jù)I2C_SendACK(1); /接收應答信號I2C_Stop(); /停止信
12、號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); / 陀螺儀采樣率設置(125HZ)ByteWrite6050(CONFIG,
13、 0x06); / 低通濾波器頻率設置(5HZ)ByteWrite6050(GYRO_CONFIG, 0x18); / 陀螺儀自檢及檢測范圍設置(不自檢,16.4LSB/DBS/S)ByteWrite6050(ACCEL_CONFIG, 0x01); / 加速計自檢、測量范圍及高通濾波頻率(不自檢,2G(16384LSB/G),5Hz)/*函數(shù)名 :float Mpu6050AccelAngle(int8 dir)*函數(shù)功能:輸出加速度傳感器測量的傾角值* 范圍為2g時,換算關系:16384 LSB/g* 角度較小時,x=sinx得到角度(弧度), deg = rad*180/3.14* 因為
14、x>=sinx,故乘以1.2適當放大*返回參數(shù):測量的傾角值*傳入?yún)?shù):dir - 需要測量的方向* ACCEL_XOUT - X方向* ACCEL_YOUT - Y方向* ACCEL_ZOUT - Z方向*/float Mpu6050AccelAngle(uchar dir) float accel_agle;/ 測量的傾角值 float result; / 測量值緩存變量 result = (float)Get6050Data(dir); / 測量當前方向的加速度值,轉(zhuǎn)換為浮點數(shù) accel_agle = (result + MPU6050_ZERO_ACCELL); / 去除零點偏
15、移,計算得到角度(弧度)/ accel_agle = accel_agle*1.2*180/3.14; /弧度轉(zhuǎn)換為度 return accel_agle; / 返回測量值/*函數(shù)名 :float Mpu6050GyroAngle(int8 dir)*函數(shù)功能:輸出陀螺儀測量的傾角加速度* 范圍為2000deg/s時,換算關系:16.4 LSB/(deg/s)*返回參數(shù):測量的傾角加速度值*傳入?yún)?shù):dir - 需要測量的方向* 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); / 檢測陀螺儀的當前值 gyro_angle = -(gyro_angle + MPU6050_ZERO_GYRO)/16.4; /去除零點偏移,計算角速度值,負號為方向處理 / Angle_gy += gyro_angle*0.005; return gyro_angle; / 返回測量值/采樣10次去掉兩個最大最小值求平均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;/設置平放的基礎角度值/*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,設置為i/o口輸出方向 P2DIR|=BIT4; P2OUT&=BIT4; P2SEL&=BIT5; /P2.5模擬SCLK,設置為i/o口輸出方向 P2DIR|=BIT5; P2OUT&=BIT5; /* 名稱 : delay()* 輸入 : t* 輸出 : 無*/void delay(uint t) /延時函數(shù) /粗略延時,滿足時序要求 uint i,j; for(i=0; i<t; i+) for(j=0; j<10; j+);/* 名稱 : sendbyte()* 功能 : 按照液晶的串
22、口通信協(xié)議,發(fā)送數(shù)據(jù)* 輸入 : zdata* 輸出 : 無*/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)生時鐘信號下沿 P2OUT|=BIT5; /產(chǎn)生時鐘信號上沿 serial_shift=serial_shift>>1; /準備發(fā)送下一位數(shù)據(jù) /* 名稱 : write_com()* 功能 : 寫串口指令* 輸入 : cmdcode* 輸出 : 無*/void write_com(unsigned char cmdcode) /寫命令函數(shù) /串口控制格式(11111AB0) /A數(shù)據(jù)方向控制,A=H時讀,A=L時寫 /B數(shù)據(jù)類型選擇,B=H時為顯示數(shù)據(jù),B=L時為命令 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); /延時等待/* 名稱 : write_data()* 功能 : 寫串口數(shù)據(jù)* 輸入 : Dispdata* 輸出 : 無*/void write_data(uchar Dispdata)/寫數(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);/* 名稱 : lcdinit()* 功能 : 初始化函數(shù)* 輸入 : cmdcode* 輸出 : 無*/void lcdinit() /LCD初始化 delay(20000); /復位等待(內(nèi)部自帶上電復位電路),時間較長 write_com(0x30); /功能設定:基本指令集操作 delay(50); /延時等待 write_com(0x0c); /整體顯示,關游標 delay(50); write_com(0x
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 個性化反擔保合同合同新規(guī)定樣本版B版
- 2025年度生態(tài)養(yǎng)殖場承包經(jīng)營權轉(zhuǎn)讓合同范本4篇
- 2024年高科技園區(qū)全額承包運營管理合同3篇
- 二零二五版農(nóng)業(yè)墊資服務合同樣本2篇
- 2025年度應急指揮車輛設備采購合同4篇
- 教育信息化背景下的中小學教學方法變革
- 2025年度珠寶首飾出口貨物運輸代理與鑒定服務合同4篇
- 2025年物流配送與快遞快遞行業(yè)標準化合同范本3篇
- 2025年度動物行為研究錄像采集合同4篇
- 2025年度特種工程挖掘機購置與操作培訓合同4篇
- 定額〔2025〕1號文-關于發(fā)布2018版電力建設工程概預算定額2024年度價格水平調(diào)整的通知
- 2024年城市軌道交通設備維保及安全檢查合同3篇
- 【教案】+同一直線上二力的合成(教學設計)(人教版2024)八年級物理下冊
- 湖北省武漢市青山區(qū)2023-2024學年七年級上學期期末質(zhì)量檢測數(shù)學試卷(含解析)
- 單位往個人轉(zhuǎn)賬的合同(2篇)
- 科研倫理審查與違規(guī)處理考核試卷
- GB/T 44101-2024中國式摔跤課程學生運動能力測評規(guī)范
- 高危妊娠的評估和護理
- 2024年山東鐵投集團招聘筆試參考題庫含答案解析
- 2023年高考全國甲卷數(shù)學(理)試卷【含答案】
- 數(shù)獨題目A4打印版無答案
評論
0/150
提交評論