基于msp430f5529的MPU6050测角度 2Word文档下载推荐.docx
《基于msp430f5529的MPU6050测角度 2Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《基于msp430f5529的MPU6050测角度 2Word文档下载推荐.docx(18页珍藏版)》请在冰豆网上搜索。
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,"
a_y);
sprintf(sum3,"
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
****************************************************************************
*/
msp430f5529.h"
//#include"
mytype.h"
staticvoidI2C_Start();
staticvoidI2C_Stop();
staticvoidI2C_SendACK(ucharack);
staticucharI2C_RecvACK();
staticvoidI2C_SendByte(uchardat);
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();
//产生下降沿
MPU_SCL_L();
//拉低时钟线
//I2C停止信号
voidI2C_Stop()
//拉低数据线
//产生上升沿
//I2C发送应答信号
//入口参数:
ack(0:
ACK1:
NAK)
voidI2C_SendACK(ucharack)
if(ack)
else
//SDA=ack;
//写应答信号
//I2C接收应答信号
ucharI2C_RecvACK()
ucharcy;
MPU_SDA_IN();
//SDA设置为输入
if(MPU_SDA_DAT())
cy=1;
cy=0;
//cy=SDA;
//读应答信号
returncy;
//向I2C总线发送一个字节数据
voidI2C_SendByte(uchardat)
uchari;
for(i=0;
i<
8;
i++)//8位计数器
if((dat<
<
i)&
0x80)
//SDA=cy;
//送数据口
I2C_RecvACK();
//从I2C总线接收一个字节数据
ucharI2C_RecvByte()
uchardat=0,cy;
//使能内部上拉,准备读取数据,
//SDA设置为输入,准备向主机输入数据
dat<
=1;
dat|=cy;
//读数据
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_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(H<
8)+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;
//返回测量值
floatMpu6050GyroAngle(int8dir)
输出陀螺仪测量的倾角加速度
**范围为2000deg/s时,换算关系:
16.4LSB/(deg/s)
测量的倾角加速度值
**GYRO_XOUT-X轴方向
**GYRO_YOUT-Y轴方向
**GYRO_ZOUT-Z轴方向
floatMpu6050GyroAngle(uchardir)
floatgyro_angle;
//floatAngle_gy;
gyro_angle=(float)Get6050Data(dir);
//检测陀螺仪的当前值
gyro_angle=-(gyro_angle+MPU6050_ZERO_GYRO)/16.4;
//去除零点偏移,计算角速度值,负号为方向处理
//Angle_gy+=gyro_angle*0.005;
returngyro_angle;
//采样10次去掉两个最大最小值求平均
voidMPU6050ReadAcc()
inti=0,j=0;
intx_buf[10];
inty_buf[10];
intz_buf[10];
inttemp=0;
longtemp2=0;
for(i=0;
10;
i++)
{
x_buf[i]=Get6050Data(ACCEL_XOUT);
y_buf[i]=Get6050Data(ACCEL_YOUT);
z_buf[i]=Get6050Data(ACCEL_ZOUT);
}
9;
for(j=i+1;
j<
j++)
{
if(x_buf[j]>
x_buf[i])
{
temp=x_buf[j];
x_buf[j]=x_buf[i];
x_buf[i]=temp;
}
if(y_buf[j]>
y_buf[i])
temp=y_buf[j];
y_buf[j]=y_buf[i];
y_buf[i]=temp;
if(z_buf[j]>
z_buf[i])
temp=z_buf[j];
z_buf[j]=z_buf[i];
z_buf[i]=temp;
}
temp2=0;
for(i=2;
temp2=temp2+x_buf[i];
accData[0]=temp2/6;
temp2=temp2+y_buf[i];
accData[1]=temp2/6;
temp2=temp2+z_buf[i];
accData[2]=temp2/6;
//得到角度
//x,y,z:
x,y,z方向的重力加速度分量(不需要单位,直接数值即可)
//dir:
要获得的角度.0,与x轴的角度;
1,与Y轴的角度;
2,与Z轴的角度.
//返回值:
角度值.单位0.1°
.
floatmpu6050_Angle(uchardir)
floattemp,x,y,z;
floatres=0;
MPU6050ReadAcc();
//得到accData[]值
x=accData[0];
y=accData[1];
z=accData[2];
switch(dir)
case0:
//与自然Z轴的角度
temp=sqrt((x*x+y*y))/z;
res=atan(temp);
break;
case1:
//与自然X轴的角度
temp=x/sqrt((y*y+z*z));
case2:
//与自然Y轴的角度
temp=y/sqrt((x*x+z*z));
return(res*180/3.14)+0;
//设置平放的基础角度值
////******LCD12864*****///
#defineucharunsignedchar
#defineuintunsignedint
externunsignedcharADS1256_buf[9];
voidint_port(void)//管脚初始化
P2SEL&
=~BIT4;
//P2.4模拟SID,设置为i/o口输出方向
P2DIR|=BIT4;
P2OUT&
=~BIT5;
//P2.5模拟SCLK,设置为i/o口输出方向
P2DIR|=BIT5;
/********************************************************************
*名称:
delay()
*
*输入:
t
*输出:
无
***********************************************************************/
voiddelay(uintt)//延时函数
{//粗略延时,满足时序要求
uinti,j;
t;
for(j=0;
j++);
sendbyte()
*功能:
按照液晶的串口通信协议,发送数据
zdata
voidsendbyte(ucharzdata)//数据传送函数
ucharcode_seg7;
ucharserial_clk;
ucharserial_shift;
code_seg7=zdata;
serial_shift=0x80;
for(serial_clk=0;
serial_clk<
serial_clk++)
if(code_seg7&
serial_shift)
P2OUT|=BIT4;
//SID为1
//SID为0
//产生时钟信号下沿
P2OUT|=BIT5;
//产生时钟信号上沿
serial_shift=serial_shift>
>
1;
//准备发送下一位数据
write_com()
写串口指令
cmdcode
voidwrite_com(unsignedcharcmdcode)//写命令函数
//串口控制格式(11111AB0)
//A数据方向控制,A=H时读,A=L时写
//B数据类型选择,B=H时为显示数据,B=L时为命令
sendbyte(0xf8);
//MCU向LCD发命令
sendbyte(cmdcode&
0xf0);
//发高四位数据(数据格式D7D6D5D4_0000)
sendbyte((cmdcode<
4)&
0x