MPU6050调试

本文详细介绍了如何使用STM32F103C8T6微控制器通过IIC通信协议与MPU6050六轴传感器进行交互,配置其寄存器,利用DMP进行数据处理,获取欧拉角。实验中强调了GPIO配置、中断设置、DMP初始化和数据读取等关键步骤,并提到了可能遇到的问题和解决注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
图1.1 MPU60X0内部电路结构解析图
(1)16位ADC三轴加速度计:
三轴加速度计为每个轴使用单独的检测质量。
平坦放置时,x、y轴上为0g,z轴为1g
(2)16位ADC三轴陀螺仪:
当陀螺仪绕轴旋转时,模数转换器会对三个轴接受到的电压频率取样,陀螺仪传感器可以被解算为每秒±250,±500,±1000或±2000度(dps)。
1.2 MPU6050电路设计

  1. 典型工作电路
    在这里插入图片描述

图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、 串口打印角度信息

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数据输出周期

使用芯片:MPU-6050MPU-6050数据手册) 供电电源:3-5v(内部低压差稳压) 通信方式:标准IIC通信协议 芯片内置16bit AD转换器,16位数据输出 陀螺仪范围:±250 500 1000 2000 °/s 加速度范围:±2±4±8±16g MPU-6000(MPU-6000数据手册)为全球首例整合性6轴运动处理组件,相较于多组件方案,免除了组合陀螺仪与加速器时之轴间差的问题,减少了大量的包装空间。MPU-6000整合了3轴陀螺仪、3轴加速器,并含可藉由第二个I2C端口连接其他厂牌之加速器、磁力传感器、或其他传感器的数位运动处理(DMP: Digital Motion Processor)硬件加速引擎,由主要I2C端口以单一数据流的形式,向应用端输出完整的9轴融合演算技术 InvenSense的运动处理资料库,可处理运动感测的复杂数据,降低了运动处理运算对操作系统的负荷,并为应用开发提供架构化的API。 MPU-6000的角速度全格感测范围为±250、±500、±1000与±2000°/sec (dps),可准确追緃快速与慢速动作,并且,用户可程式控制的加速器全格感测范围为±2g、±4g±8g与±16g。产品传输可透过最高至400kHz的I2C或最高达20MHz的SPI。 MPU-6000可在不同电压下工作,VDD供电电压介为2.5V±5%、3.0V±5%或3.3V±5%,逻辑接口VVDIO供电为1.8V± 5%。MPU-6000的包装尺寸4x4x0.9mm(QFN),在业界是革命性的尺寸。其他的特征包含内建的温度感测器、包含在运作环境中仅有±1%变动的振荡器。 应用运动感测游戏 现实增强 电子稳像 (EIS: Electronic Image Stabilization) 光学稳像(OIS: Optical Image Stabilization) 行人导航器 “零触控”手势用户接口 姿势快捷方式 认证 市场智能型手机 平板装置设备 手持型游戏产品 3D遥控器 可携式导航设备 特征以数字输出6轴或9轴的旋转矩阵、四元数(quaternion)、欧拉角格式(Euler Angle forma)的融合演算数据。 具有131 LSBs/°/sec 敏感度与全格感测范围为±250、±500、±1000与±2000°/sec 的3轴角速度感测器(陀螺仪)。 可程式控制,且程式控制范围为±2g、±4g、±8g和±16g的3轴加速器。 移除加速器与陀螺仪轴间敏感度,降低设定给予的影响与感测器的飘移。 数字运动处理(DMP: Digital Motion Processing)引擎可减少复杂的融合演算数据、感测器同步化、姿势感应等的负荷。 运动处理数据库支持Android、Linux与Windows 内建之运作时间偏差与磁力感测器校正演算技术,免除了客户须另外进行校正的需求。 以数位输出的温度传感器 以数位输入的同步引脚(Sync pin)支援视频电子影相稳定技术与GPS 可程式控制的中断(interrupt)支援姿势识别、摇摄、画面放大缩小、滚动、快速下降中断、high-G中断、零动作感应、触击感应、摇动感应功能。 VDD供电电压为2.5V±5%、3.0V±5%、3.3V±5%;VDDIO为1.8V± 5% 陀螺仪运作电流:5mA,陀螺仪待命电流:5A;加速器运作电流:350A,加速器省电模式电流: 20A@10Hz 高达400kHz快速模式的I2C,或最高至20MHz的SPI串行主机接口(serial host interface) 内建频率产生器在所有温度范围(full temperature range)仅有±1%频率变化。 使用者亲自测试 10,000 g 碰撞容忍度 为可携式产品量身订作的最小最薄包装 (4x4x0.9mm QFN)
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值