基于msp430f5529的MPU6050测角度

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

这个程序完成的功能为:使用msp430f5529在12864上串行显示GY-521,MPU6050所测量的角度。在IAR亲测成功。注意:我只给出了C文件,h文件自己去建立就好了。////*******主函数******///#includemsp430f5529.h#includestdio.h#includemath.h#include6050.h#includeLCD12864.hvoidDelays(uchari){unsignedintj;while(i--){j=2000;while(j--);}}voidmain(void){WDTCTL=WDTPW+WDTHOLD;//关闭看门狗charsum1[10],sum2[10],sum3[10];//串口发送缓存floata_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(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的驱动程序,此处用于149系列。**注意-此处MCLK:8Mhz**版本:2013-6V1.0*****************************************************************************/#includemsp430f5529.h//#includemytype.h#include6050.hstaticvoidI2C_Start();staticvoidI2C_Stop();staticvoidI2C_SendACK(ucharack);staticucharI2C_RecvACK();staticvoidI2C_SendByte(uchardat);staticucharI2C_RecvACK();shortaccData[3]={0};//**************************************//I2C起始信号//**************************************voidI2C_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停止信号//**************************************voidI2C_Stop(){MPU_SCL_OUT();//SCL设置为输出MPU_SDA_OUT();//SDA设置为输出MPU_SDA_L();//拉低数据线MPU_SCL_H();//拉高时钟线DELAY_US(5);//延时MPU_SDA_H();//产生上升沿DELAY_US(5);//延时}//**************************************//I2C发送应答信号//入口参数:ack(0:ACK1:NAK)//**************************************voidI2C_SendACK(ucharack){MPU_SCL_OUT();//SCL设置为输出MPU_SDA_OUT();//SDA设置为输出if(ack)MPU_SDA_H();elseMPU_SDA_L();//SDA=ack;//写应答信号MPU_SCL_H();//拉高时钟线DELAY_US(5);//延时MPU_SCL_L();//拉低时钟线DELAY_US(5);//延时}//**************************************//I2C接收应答信号//**************************************ucharI2C_RecvACK(){ucharcy;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设置为输出returncy;}//**************************************//向I2C总线发送一个字节数据//**************************************voidI2C_SendByte(uchardat){uchari;MPU_SCL_OUT();//SCL设置为输出MPU_SDA_OUT();//SDA设置为输出for(i=0;i8;i++)//8位计数器{if((dati)&0x80){MPU_SDA_H();}else{MPU_SDA_L();}//SDA=cy;//送数据口MPU_SCL_H();//拉高时钟线DELAY_US(5);//延时MPU_SCL_L();//拉低时钟线DELAY_US(5);//延时}I2C_RecvACK();}//**************************************//从I2C总线接收一个字节数据//**************************************ucharI2C_RecvByte(){uchari;uchardat=0,cy;MPU_SCL_OUT();//SCL设置为输出MPU_SDA_OUT();//SDA设置为输出MPU_SDA_H();//使能内部上拉,准备读取数据,MPU_SDA_IN();//SDA设置为输入,准备向主机输入数据for(i=0;i8;i++)//8位计数器{dat=1;MPU_SCL_H();//拉高时钟线DELAY_US(5);//延时if(MPU_SDA_DAT()){cy=1;}else{cy=0;}dat|=cy;//读数据MPU_SCL_L();//拉低时钟线DELAY_US(5);//延时}MPU_SDA_OUT();returndat;}//**************************************//向I2C设备写入一个字节数据//**************************************voidByteWrite6050(ucharREG_Address,ucharREG_data){I2C_Start();//起始信号I2C_SendByte(SlaveAddress);//发送设备地址+写信号I2C_SendByte(REG_Address);//内部寄存器地址,I2C_SendByte(REG_data);//内部寄存器数据,I2C_Stop();//发送停止信号}//**************************************//从I2C设备读取一个字节数据//**************************************ucharByteRead6050(ucharREG_Address){ucharREG_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();//停止信号returnREG_data;}//**************************************//合成数据//**************************************intGet6050Data(ucharREG_Address){charH,L;H=ByteRead6050(REG_Address);L=ByteRead6050(REG_Address+1);return(H8)+L;//合成数据}//**************************************//初始化MPU6050//**************************************voidInitMPU6050(){ByteWrite6050(PWR_MGMT_1,0x00);//解除休眠状态ByteWrite6050(SMPLRT_DIV,0x07);//陀螺仪采样率设置(125HZ)ByteWrite6050(CONFIG,0x06);//低通滤波器频率设置(5HZ)ByteWrite6050(GYRO_CONFIG,0x18);//陀螺仪自检及检测范围设置(不自检,16.4LSB/DBS/S)ByteWrite6050(ACCEL_CONFIG,0x01);//加速计自检、测量范围及高通滤波频率(不自检,2G(16384LSB/G),5Hz)}/*************************************************函数名:floatMpu6050AccelAngle(int8dir)**函数功能:输出加速度传感器测量的倾角值**范围为2g时,换算关系:16384LSB/g**角度较小时,x=sinx得到角度(弧度),deg=rad*180/3.14**因为x=sinx,故乘以1.2适当放大**返回参数:测量的倾角值**传入参数:dir-需要测量的方向**ACCEL_XOUT-X方向**ACCEL_YOUT-Y方向**ACCEL_ZOUT-Z方向***********************************************/floatMpu6050AccelAngle(uchardir){floataccel_agle;//测量的倾角值floatresult;//测量值缓存变量result=(float)Get6050Data(dir);//测量当前方向的加速度值,转换为浮点数accel_agle=(result+MPU6050_ZERO_ACCELL);//去除零点偏移,计算得到角度(弧度)//accel_agle=accel_agle*1.2*180/3.14;//弧度转换为度returnaccel_agle;//返回测量值}/****************************************

1 / 13
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功