MPU6050的初始化

网友投稿 361 2022-11-28

MPU6050的初始化

寄存器地址:0x6B(Hex)或107(十进制)。

-

驱动程序

对MPU6050的初始化驱动就是通过IIC的协议,对MPU6050的寄存器进行初始化配置,我选择配置的有:

设置电源管理寄存器1(0X6B),复位MPU6050 (下面举例)

设置陀螺仪配置寄存器(0X1B),将量程设置为 2000dps

设置加速度计配置寄存器(0X1C),将量程设置为 2g

设置采样频率分频器(0X19),将采样率设置为50Hz

设置中断使能寄存器(0X38),关闭中断

设置电源管理寄存器2(0X6C),使加速度陀螺仪都工作

//以下函数通过IIC协议,修改MPU6050的电源管理寄存器,实现复位

//其中的(IIC_……)函数为IIC通信函数,可从名字中了解大致功能,具体应用可参见IIC通信协议的内容

char MPU_Reset()

{

IIC_Start();

{

IIC_Stop();

return 1;

}

IIC_Send_Byte(0x6B); //写寄存器地址,选择电源管理寄存器1

IIC_Wait_Ack();

IIC_Send_Byte(0x80); //发送数据(1000 0000)第七位为1,复位

if(IIC_Wait_Ack())

{

IIC_Stop();

return 1;

}

IIC_Stop();

return 0;

}

按照相同的方法对其余的寄存器进行配置之后,MPU6050就可以正常工作了。接下来的任务就是不断读取它的数据,计算出芯片的姿态了。。。

读取原始数据

使用IIC协议读取以上寄存器的值,每个轴的值由16位二进制表示(0–65535),以X轴为例:ACCEL_XOUT[15:8]、ACCEL_XOUT[7:0]分别为X轴加速度的高八位和低八位,每次读取八位再将它们拼起来即可。

ax=( (unsigned int)buffer[0]《《8 ) | buffer[1];

通过这些我们就可以得到原始数据了,顺便附上初始化MPU6050源代码:

itStructure);

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; GPIO_Init(GPIOB, &GPIO_InitStructure);

if(Single_Read(MPU6050_Addr,WHO_AM_I)==0x68) {

Single_Write(MPU6050_Addr,PWR_MGMT_1, 0x00);

Single_Write(MPU6050_Addr,SMPLRT_DIV, 0x07);//采样速率125Hz Single_Write(MPU6050_Addr,CONFIG,0x06);

//不使能FSYNC,不使用外同步采样速率;DLPF_CFG[2~0],设置任意轴是否通过DLPF,

//对加速度和陀螺仪都有效,输出频率为1kHz,决定SMPLRT_DIV的频率基准

Single_Write(MPU6050_Addr,GYRO_CONFIG, 0x08);//不自测,量程设置500°/s /*?GYRO 量程单位系数

+-250 deg/s 131 LSB/deg/s 初始化hex 0x00 +-500 deg/s 65.5 LSB/deg/s 0x08 +-1000 deg/s 32.8 LSB/deg/s 0x10 +-2000 deg/s 16.4 LSB/deg/s 0x18 */

Single_Write(MPU6050_Addr,ACCEL_CONFIG, 0x00);//不自测,量程设置2g

/* Accle any axe

+-2 g 16384 LSB/g +-4 g 8192 LSB/g +-8 g 4096 LSB/g +-16 g 2048 LSB/g

*/

return 0; } return 1; }

//******读取MPU6050数据**************************************** //**************************************

GetData(u8

REG_Address)

//返回值为有符号的整形,16位 {

s16 H=0,L=0;

H = Single_Read(MPU6050_Addr,REG_Address); //先读高字节,再读低字节

L = Single_Read(MPU6050_Addr,REG_Address+1); return

(H《《8)+L;

//合成数据,为有符号整形数 }

//-------------加速度部分解算角度------------------

s32 Read_Acc(void) {

s32 Accel_x; //mpo6050读出的X轴加速度 s32 Accel_z; //mpu6050读出的z轴加速度 //-------------加速度部分解算------------------

/*使用是加速度轴x轴正向朝向小车行径方向,y轴陀螺仪的正向 逆时针方向。 加速度计的量程范围见配置 不自测,量程设置4g scal系数为8192 Accle any axe

+-2 g 16384 LSB/g +-4 g 8192 LSB/g +-8 g 4096 LSB/g +-16 g 2048 LSB/g */

Accel_x = GetData(ACCEL_XOUT_H); //从mpu6050读取X轴加速度 Accel_z = GetData(ACCEL_ZOUT_H); //从mpu6050读取z轴加速度

if(Accel_x》0) {

Angle_accel = atan2((float)Accel_x,(float)Accel_z)*(180/3.14159265);//反正切计算rad

/* atan2(y,x)是表示X-Y平面上所对应的(x,y)坐标的角度, 它的值域范围是(-Pi,Pi) 用数学表示就是:atan2(y,x)=arg(y/x)-Pi 当y《0时,其值为负,

当y》0时,其值为正。 atan2*180/Pi可以计算出角度值 */

}

else {

s32 read_gyro_y; s32 Angle_gyro; //-------角速度解算-------------------------

//角速度量程见配置 本处使用1000 deg/s。scal系数为32.8 LSB /*?GYRO 量程单位系数

+-250 deg/s 131 LSB/deg/s offset 44.38188277*2 +-500 deg/s 65.5 LSB/deg/s offset 44.38188277 +-1000 deg/s 32.8 LSB/deg/s ok offset 44.38188277/2 +-2000 deg/s 16.4 LSB/deg/s offset 44.38188277/4 */

read_gyro_y= GetData(GYRO_YOUT_H)+Gyro_y_offset; //静止时角速度Y轴输出 //Gyro_y_offset计算方法gyro静止时候N多个数据的算术均值

Angle_accel

=

atan2((float)Accel_z,(float)Accel_x)*(180/3.14159265)-90;//反正切计算 Angle_accel = -Angle_accel; }

//angle_accel物理量单位是角度 deg! return Angle_accel; }

//陀螺仪计算Y轴的角速度 s32 Read_Gry(void) {

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java 整合模板彻底解决ssm配置难题
下一篇:Docker安装Python3教程
相关文章

 发表评论

暂时没有评论,来抢沙发吧~