基于msp430f5529的MPU6050测角度.docx
- 文档编号:3206166
- 上传时间:2022-11-20
- 格式:DOCX
- 页数:17
- 大小:171.13KB
基于msp430f5529的MPU6050测角度.docx
《基于msp430f5529的MPU6050测角度.docx》由会员分享,可在线阅读,更多相关《基于msp430f5529的MPU6050测角度.docx(17页珍藏版)》请在冰豆网上搜索。
基于msp430f5529的MPU6050测角度
这个程序完成的功能为:
使用msp430f5529在12864上串行显示GY-521,MPU6050
所测量的角度。
在IAR亲测成功。
注意:
我只给出了C文件,h文件自己去建立就好了。
////*******主函数******///
#include
#include"stdio.h"
#include"math.h"
#include"6050.h"
#include"LCD12864.h”
voidDelays(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);
}
}
/*
***************************************************************************
**文件名:
Mpu-6050.c
**编写者:
黄建军
**描述:
三轴加速度,三轴陀螺仪传感器Mpu-6050的驱动程序,此处用于149系列。
**注意-此处MCLK:
8Mhz
**版本:
2013-6V1.0
*****************************************************************************/
#include"msp430f5529.h"
//#include"mytype.h"
#include”6050.h”staticvoidI2C_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();
else
MPU_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;i<8;i++)//8位计数器
(if((dat<
}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;i<8;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){
/*
**********************************************
***********************************************/floatMpu6050AccelAngle(uchardir){
floataccel_agle;//测量的倾角值
floatresult;//测量值缓存变量
result=(float)Get6050Data(dir);//测量当前方向的加速度值,转换为浮点数
accel_agle=(result+MPU6050_ZERO_ACCELL);//去除零点偏移,计算得到角度
returnaccel_agle;//返回测量值
/*
**********************************************
**********************************************
*/
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;
longt
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 msp430f5529 MPU6050 角度