1 原理简介
1.1 MPU6050芯片资料
1.内部主要结构:陀螺仪、加速度计、数字运动处理器DMP(Digital Motion Processor)。另外MPU6050还含有第二个IIC接口,用于连接一个第三方数字传感器AUXAUX_DA(如磁力计)用于输出完整九轴信号(角速度、角加速度以及磁场信号等)
2.连接接口:
(1)IIC通信接口:SDA、SCL
(2)电源接口:VCC、GND
(3)外部接口:AUX_CL
3.内部电路:
图1.1 MPU60X0内部电路结构解析图
(1)16位ADC三轴加速度计:
三轴加速度计为每个轴使用单独的检测质量。
平坦放置时,x、y轴上为0g,z轴为1g
(2)16位ADC三轴陀螺仪:
当陀螺仪绕轴旋转时,模数转换器会对三个轴接受到的电压频率取样,陀螺仪传感器可以被解算为每秒±250,±500,±1000或±2000度(dps)。
1.2 MPU6050电路设计
- 典型工作电路
图1-2 MPU60X0典型工作电路图
2.AD原理图绘制
图1-3 MPU6050 AD原理图
3.PCB绘制
图1-4 MPU6050 PCB图
1.3MPU6050自带运动数字处理器(DMP)
通过MPU6050得到四元数和欧拉角的过程有两种方法:
一是利用直接读取寄存器原始数据(三轴加速度,三轴角速度),通过一些(积分运算,卡尔曼滤波,减少误差临点漂移等)姿态融合算法转化为角度输出
二是用MPU6050内部自带的数字运动处理器(DMP)实现直接向MCU输出四元数,MCU可以通过四元数得到欧拉角:偏航角(YAW)、横滚角(ROLL)、俯仰角(PITCH)
2.1 实验现象描述
本实验我们调试MPU6050将通过配置寄存器实现主控STM32F103C8T6与MPU6050通信并通过串口打印输出当前欧拉角。
3.1 代码
(1)STM32F103C8T6与MPU6050通信初始化配置
1、 开启GPIOA和GPIOB时钟
2、 配置PA15,PB3为推挽输出模式。
3、 配置MCU对MPU6050外部中断的响应
GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //外部中断,需要使能AFIO时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能PA端口时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; // 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化GPIO
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;// 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化GPIO
GPIO_SetBits(GPIOA,GPIO_Pin_15);//初始化拉高总线
GPIO_SetBits(GPIOB,GPIO_Pin_3);//初始化拉高总线
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;//端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入
GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化GPIOB
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource4);
EXTI_InitStructure.EXTI_Line=EXTI_Line4;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;//使能按键所在的外部中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级2,
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//子优先级1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道
NVIC_Init(&NVIC_InitStructure);
(2)MPU6050内部寄存器配置
1、 初始化IIC总线
2、 配置电源管理寄存器1唤醒MPU6050
3、 配置陀螺仪传感器
4、 配置加速度传感器
5、 设置采样率
6、 配置中断使能寄存器关闭所有中断
7、 配置用户控制寄存器关闭IIC主模式
8、 配置中断使能寄存器关闭FIFO中断
9、 配置中断/旁路设置寄存器使INT引脚低电平触发
10、读取器件ID寄存器自检
11、配置电源管理寄存器1设置CLKSEL,PLL X轴为参考
12、配置电源管理寄存器2使加速度与陀螺仪都工作
u8 res;
MPU_IIC_Init();//初始化IIC总线
MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X80);//复位MPU6050
delay_ms(100);//适当延时等待初始化成功
MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X00);//唤醒MPU6050
MPU_Set_Gyro_Fsr(3);//陀螺仪传感器,±2000dps
MPU_Set_Accel_Fsr(0);//加速度传感器,±2g
MPU_Set_Rate(200);//设置采样率200Hz
MPU_Write_Byte(MPU_INT_EN_REG,0X00);//关闭所有中断
MPU_Write_Byte(MPU_USER_CTRL_REG,0X00);//I2C主模式关闭
MPU_Write_Byte(MPU_INT_EN_REG, 0X00); //关闭FIFO中断
MPU_Write_Byte(MPU_INTBP_CFG_REG, 0X80);//INT引脚0X80低电平触发
res=MPU_Read_Byte(MPU_DEVICE_ID_REG);
if(res==0x68)//器件ID正确
{
MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X02); //设置CLKSEL,PLL X轴为参考
MPU_Write_Byte(MPU_PWR_MGMT2_REG,0X00);//加速度与陀螺仪都工作
MPU_Set_Rate(200);//设置采样率为50Hz
}else return 1;
return 0;
(3)DMP配置
1、 初始化IIC总线
2、 初始化MPU6050
3、 设置需要的传感器(本次实验为陀螺仪和加速度计)
4、 设置FIFO
5、 设置采样率
6、 加载DMP固件
7、 设置陀螺仪方向
8、 设计DMP功能
9、 设置DMP输出速率(最大不超过200Hz)
10、自检
11、使能DMP
u8 res=0;
MPU_IIC_Init();
if(mpu_init()==0)
{
res=mpu_set_sensors(INV_XYZ_GYRO|INV_XYZ_ACCEL);//设置所需要的传感器
if(res)return 1;
res=mpu_configure_fifo(INV_XYZ_GYRO|INV_XYZ_ACCEL);//设置FIFO
if(res)return 2;
res=mpu_set_sample_rate(DEFAULT_MPU_HZ);
if(res)return 3;
res=dmp_load_motion_driver_firmware();
if(res)return 4;
res=dmp_set_orientation(inv_orientation_matrix_to_scalar(gyro_orientation));//设置陀螺仪方向
if(res)return 5;
res=dmp_enable_feature(DMP_FEATURE_6X_LP_QUAT|DMP_FEATURE_TAP|
DMP_FEATURE_ANDROID_ORIENT|DMP_FEATURE_SEND_RAW_ACCEL|
DMP_FEATURE_SEND_CAL_GYRO| DMP_FEATURE_GYRO_CAL);
if(res)return 6;
res=dmp_set_fifo_rate(DEFAULT_MPU_HZ);
if(res)return 7;
res=run_self_test();
if(res)return 8;
res=mpu_set_dmp_state(1);
if(res)return 9;
}else return 10;
return 0;
(4)读取初始数据和欧拉角并输出
1、 读取陀螺仪原始数据
2、 得到DMP处理后的角度数据
3、 串口打印角度信息文章来源:https://www.toymoban.com/news/detail-458515.html
MPU_Get_Gyroscope(&gyro_X,&gyro_Y,&gyro_Z);//陀螺仪数据
mpu_dmp_get_data(&pitch,&roll,&yaw);//角度数据
printf("Pitch:%f Roll:%f Yaw: %f\r\n",Pitch,Roll,Yaw); //串口打印数据
4.1操作流程
1、配置MCU的GPIO为模拟IIC
2、MCU与MPU6050通信,配置MPU6050寄存器
3、配置DMP用以数据处理
4、输出数据
5.1实验中可能出现的问题及注意事项
1、在配置MCU的模拟IIC通信时,要注意修改.C和.H两个文件中的IO口配置
2、接线时注意MCU的数据线和时钟线要与MPU6050的数据线和时钟线相对应连接
否则会通信不成功
3、定时器中断处理函数周期要大于MPU6050数据输出周期文章来源地址https://www.toymoban.com/news/detail-458515.html
到了这里,关于MPU6050调试的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!