




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、这个程序完成的功能为:使用msp430f5529在12864上串行显示GY-521,MPU6050所测量的角度。在IAR亲测成功。注意:我只给出了C文件 ,h文件自己去建立就好了。/*主函数*/#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; / 串口发送缓存 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); / 将测量倾角值转换为字符串 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的驱动程序,此
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(); /拉高数据线 MPU_SCL_H(); /拉高时钟线 DELAY_US(5); /延时 MPU_SDA_L(); /产生下降沿 DELAY_US(5); /延时 MPU_SCL_L(); /拉低时钟线/*/I2C停止信号/*void I2C_Stop() MPU_SCL_OUT(); / SCL设置为输出 MPU_SDA_OUT(); / SDA设置为输出 MP
6、U_SDA_L(); /拉低数据线 MPU_SCL_H(); /拉高时钟线 DELAY_US(5); /延时 MPU_SDA_H(); /产生上升沿 DELAY_US(5); /延时/*/I2C发送应答信号/入口参数: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总线发送一个字节数据/*void I2C_SendByte(uchar dat) uchar i; MPU_SCL_OUT(); / SCL设置为输出 MPU_SDA_OUT(); / SDA设置为输出 for (i=0; i<8; i+) /8位计数器 if(dat<<i)&0x80) MPU_SDA_H(); else MPU_SDA_L(); / SDA = cy; /送数据口 MPU_SCL_H(); /拉高时钟线 DELAY_US(5); /延时 MPU_SCL_L(); /拉低时钟线 DELAY_US(5); /延时 I2C_RecvACK();
9、/*/从I2C总线接收一个字节数据/*uchar I2C_RecvByte() uchar i; uchar dat = 0,cy; MPU_SCL_OUT(); / SCL设置为输出 MPU_SDA_OUT(); / SDA设置为输出 MPU_SDA_H(); /使能内部上拉,准备读取数据, MPU_SDA_IN(); / SDA设置为输入,准备向主机输入数据 for (i=0; i<8; i+) /8位计数器 dat <<= 1; MPU_SCL_H(); /拉高时钟线 DELAY_US(5); /延时 if(MPU_SDA_DAT() cy=1; else cy=0;
10、dat |= cy; /读数据 MPU_SCL_L(); /拉低时钟线 DELAY_US(5); /延时 MPU_SDA_OUT(); return dat;/*/向I2C设备写入一个字节数据/*void ByteWrite6050(uchar REG_Address,uchar REG_data) I2C_Start(); /起始信号 I2C_SendByte(SlaveAddress); /发送设备地址+写信号 I2C_SendByte(REG_Address); /内部寄存器地址, I2C_SendByte(REG_data); /内部寄存器数据, I2C_Stop(); /发送停止信号
11、/*/从I2C设备读取一个字节数据/*uchar ByteRead6050(uchar REG_Address)uchar REG_data;I2C_Start(); /起始信号I2C_SendByte(SlaveAddress); /发送设备地址+写信号I2C_SendByte(REG_Address); /发送存储单元地址,从0开始I2C_Start(); /起始信号I2C_SendByte(SlaveAddress+1); /发送设备地址+读信号REG_data=I2C_RecvByte(); /读出寄存器数据I2C_SendACK(1); /接收应答信号I2C_Stop(); /停止信
12、号return REG_data;/*/合成数据/*int Get6050Data(uchar REG_Address)char H,L;H=ByteRead6050(REG_Address);L=ByteRead6050(REG_Address+1);return (H<<8)+L; /合成数据/*/初始化MPU6050/*void InitMPU6050()ByteWrite6050(PWR_MGMT_1, 0x00); / 解除休眠状态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)/*函数名 :float Mpu6050AccelAngle(int8 dir)*函数功能:输出加速度传感器测量的倾角值* 范围为2g时,换算关系:16384 LSB/g* 角度较小时,x=sinx得到角度(弧度), deg = rad*180/3.14* 因为
14、x>=sinx,故乘以1.2适当放大*返回参数:测量的倾角值*传入参数:dir - 需要测量的方向* ACCEL_XOUT - X方向* ACCEL_YOUT - Y方向* ACCEL_ZOUT - Z方向*/float Mpu6050AccelAngle(uchar dir) float accel_agle;/ 测量的倾角值 float result; / 测量值缓存变量 result = (float)Get6050Data(dir); / 测量当前方向的加速度值,转换为浮点数 accel_agle = (result + MPU6050_ZERO_ACCELL); / 去除零点偏
15、移,计算得到角度(弧度)/ accel_agle = accel_agle*1.2*180/3.14; /弧度转换为度 return accel_agle; / 返回测量值/*函数名 :float Mpu6050GyroAngle(int8 dir)*函数功能:输出陀螺仪测量的倾角加速度* 范围为2000deg/s时,换算关系:16.4 LSB/(deg/s)*返回参数:测量的倾角加速度值*传入参数: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方向的重力加速度分量(不需要单位,直接数值即可)/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) /延时函数 /粗略延时,满足时序要求 uint i,j; for(i=0; i<t; i+) for(j=0; j<10; j+);/* 名称 : sendbyte()* 功能 : 按照液晶的串
22、口通信协议,发送数据* 输入 : zdata* 输出 : 无*/void sendbyte(uchar zdata) /数据传送函数 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; /产生时钟信号下沿 P2OUT|=BIT5; /产生时钟信号上沿 serial_shift=serial_shift>>1; /准备发送下一位数据 /* 名称 : write_com()* 功能 : 写串口指令* 输入 : cmdcode* 输出 : 无*/void write_com(unsigned char cmdcode) /写命令函数 /串口控制格式(11111AB0) /A数据方向控制,A=H时读,A=L时写 /B数据类型选择,B=H时为显示数据,B=L时为命令 sendbyte(0xf8); /MCU向LCD发命令 sendbyte(cmdcode &
24、0xf0); /发高四位数据(数据格式D7D6D5D4_0000) sendbyte(cmdcode << 4) & 0xf0);/发低四位数据(数据格式D3D2D1D0_0000) delay(2); /延时等待/* 名称 : write_data()* 功能 : 写串口数据* 输入 : Dispdata* 输出 : 无*/void write_data(uchar Dispdata)/写数据函数 sendbyte(0xfa); /MCU向LCD发数据 sendbyte(Dispdata & 0xf0); /发高四位数据 sendbyte(Dispdata << 4) & 0xf0);/发低四位数据 delay(2);/* 名称 : lcdinit()* 功能 : 初始化函数* 输入 : cmdcode* 输出 : 无*/void lcdinit() /LCD初始化 delay(20000); /复位等待(内部自带上电复位电路),时间较长 write_com(0x30); /功能设定:基本指令集操作 delay(50); /延时等待 write_com(0x0c); /整体显示,关游标 delay(50); write_com(0x
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 物业从业考试试题及答案
- 龙江森工考试试题及答案
- 人防能力考试试题及答案
- 网络原理考试试题及答案
- 初三音乐考试试题及答案
- itest期末考试试题及答案
- 2025建筑工程土石方承包合同书
- 2025大学生创新创业基金贷款合同
- 2025-2030中国划桨行业市场发展趋势与前景展望战略研究报告
- 厦门海底隧道施工组织设计-pdf
- T-NKFA 015-2024 中小学午休课桌椅
- 课题开题报告:推进家校社协同育人研究
- 拒绝校园霸凌守护美好校园
- 不要慌太阳下山有月光二部合唱简谱
- 2025春新七年级道德与法治下册全册知识点
- Unit 9 Active learning 教学设计-2023-2024学年高中英语北师大版(2019)必修第三册
- 渔场基地建设实施方案
- 《食源性病原体》课件
- 《药品泡罩包装应用指南(征求意见稿)》
- Unit 6 Beautiful landscapes Integration 说课稿 -2024-2025学年译林版英语七年级下册001
- 2025年国家电投集团招聘笔试参考题库含答案解析
评论
0/150
提交评论