STM32移植(抄)起来特别爽。。。
MPU6050简介



1.MPU6050是一款六轴(三轴加速度+三轴角速度(陀螺仪))传感器
2.MPU6050含有一个第二IIC接口,可用于连接外部磁力传感器
3.MPU6050自带数字运动处理器(DMP)通过主IIC接口,可以向CPU提供四元数,CPU可利用四元数得到欧拉角,避免了CPU通过原始数据进行姿态计算(DMP驱动库由官方提供,使用时需要改动)
4.据说stm32的硬件IIC接口存在bug,需要用软件模拟IIC时序

MPU6050初始化步骤

(1)初始化IIC接口
即SDA和SCL对应的GPIO
(2)复位MPU6050
使MPU6050内部所有的寄存器恢复默认值,通过对电源管理寄存器(0x6B)1的bit7写1实现(0x40),然后必须设置该寄存器为0x00,以唤醒MPU6050,进入工作状态
(3)设置角速度传感器(陀螺仪)和加速度传感器的满量程范围
陀螺仪配置寄存器(0x1B)和加速度传感器配置寄存器(0x1C)
(4)设置其他参数
关闭中断、关闭AUX IIC接口、禁止FIFO、设置陀螺仪采样率和设置数字低通滤波器(DLPF)等。
(5)配置系统时钟源并使能角速度传感器和加速度传感器
电源管理器1(0x6B)和电源管理器2(0x6C)

移植时的注意点

(1)在mpuiic.h中更改IIC对应的GPIO的设置

//mpuiic.h
//IO方向设置
#define MPU_SDA_IN()  {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=0x80000000;}
#define MPU_SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=0x30000000;}//IO操作函数
#define MPU_IIC_SCL    PBout(8)         //SCL
#define MPU_IIC_SDA    PBout(7)         //SDA
#define MPU_READ_SDA   PBin(7)      //输入SDA

(2)在mpu6050.c的初始化函数中,更改开头的GPIO,此引脚的电平决定的是MPU6050的硬件地址

//mpu6050.c
//初始化MPU6050
//返回值:0,成功
//其他,错误代码
u8 MPU_Init(void)
{ u8 res;GPIO_InitTypeDef  GPIO_InitStructure;//RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//使能AFIO时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//先使能外设IO PORTA时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;   // 端口配置GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //IO口速度为50MHzGPIO_Init(GPIOB, &GPIO_InitStructure);                     //根据设定参数初始化GPIOA//GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//禁止JTAG,从而PA15可以做普通IO使用,否则PA15不能做普通IO!!!MPU_AD0_CTRL=0;         //控制MPU6050的AD0脚为低电平,从机地址为:0X68MPU_IIC_Init();//初始化IIC总线MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X80); //复位MPU6050delay_ms(100);MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X00);    //唤醒MPU6050 MPU_Set_Gyro_Fsr(3);                    //陀螺仪传感器,±2000dpsMPU_Set_Accel_Fsr(0);                  //加速度传感器,±2gMPU_Set_Rate(50);                       //设置采样率50HzMPU_Write_Byte(MPU_INT_EN_REG,0X00); //关闭所有中断MPU_Write_Byte(MPU_USER_CTRL_REG,0X00); //I2C主模式关闭MPU_Write_Byte(MPU_FIFO_EN_REG,0X00); //关闭FIFOMPU_Write_Byte(MPU_INTBP_CFG_REG,0X80); //INT引脚低电平有效res=MPU_Read_Byte(MPU_DEVICE_ID_REG);if(res==MPU_ADDR)//器件ID正确{MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X01);   //设置CLKSEL,PLL X轴为参考MPU_Write_Byte(MPU_PWR_MGMT2_REG,0X00); //加速度与陀螺仪都工作MPU_Set_Rate(50);                       //设置采样率为50Hz}else return 1;return 0;
}

(3)inv_mpu.c中不需要改动,需要调用的是DMP的初始化函数mpu_dmp_init()和取四元数的函数mpu_dmp_get_data(float *pitch,float *roll,float *yaw)

//得到dmp处理后的数据(注意,本函数需要比较多堆栈,局部变量有点多)
//pitch:俯仰角 精度:0.1°   范围:-90.0° <---> +90.0°
//roll:横滚角  精度:0.1°   范围:-180.0°<---> +180.0°
//yaw:航向角   精度:0.1°   范围:-180.0°<---> +180.0°
//返回值:0,正常
//    其他,失败
u8 mpu_dmp_get_data(float *pitch,float *roll,float *yaw)
{float q0=1.0f,q1=0.0f,q2=0.0f,q3=0.0f;unsigned long sensor_timestamp;short gyro[3], accel[3], sensors;unsigned char more;long quat[4]; if(dmp_read_fifo(gyro, accel, quat, &sensor_timestamp, &sensors,&more))return 1;     /* Gyro and accel data are written to the FIFO by the DMP in chip frame and hardware units.* This behavior is convenient because it keeps the gyro and accel outputs of dmp_read_fifo and mpu_read_fifo consistent.**//*if (sensors & INV_XYZ_GYRO )send_packet(PACKET_TYPE_GYRO, gyro);if (sensors & INV_XYZ_ACCEL)send_packet(PACKET_TYPE_ACCEL, accel); *//* Unlike gyro and accel, quaternions are written to the FIFO in the body frame, q30.* The orientation is set by the scalar passed to dmp_set_orientation during initialization. **/if(sensors&INV_WXYZ_QUAT) {q0 = quat[0] / q30;   //q30格式转换为浮点数q1 = quat[1] / q30;q2 = quat[2] / q30;q3 = quat[3] / q30; //计算得到俯仰角/横滚角/航向角*pitch = asin(-2 * q1 * q3 + 2 * q0* q2)* 57.3;    // pitch*roll  = atan2(2 * q2 * q3 + 2 * q0 * q1, -2 * q1 * q1 - 2 * q2* q2 + 1)* 57.3;  // roll*yaw   = atan2(2*(q1*q2 + q0*q3),q0*q0+q1*q1-q2*q2-q3*q3) * 57.3; //yaw}else return 2;return 0;
}

需要注意的是,在while(1)中不断读取四元数时,若相邻两次调用mpu_dmp_get_data的间隔较长,会发送FIFO溢出,不能再读到数据,错误发生在下述区域,可通过在读取数据时加while(mpu_dmp_get_data(&pitch,&roll,&yaw)!=0);消除

//inv_mpu.c mpu_read_fifo_stream()if (fifo_count > (st.hw->max_fifo >> 1)) {/* FIFO is 50% full, better check overflow bit. */if (i2c_read(st.hw->addr, st.reg->int_status, 1, tmp)){printf("5 -1\r\n"); return -1;}if (tmp[0] & BIT_FIFO_OVERFLOW) {mpu_reset_fifo(); printf("-2");return -2;}}

而读取数据过快,也会发生错误,错误可定位到下述区域,但不影响下次数据,原因未知。。。

//inv_mpu.c mpu_read_fifo_stream()fifo_count = (tmp[0] << 8) | tmp[1];if (fifo_count < length) {more[0] = 0;printf("4 -1\r\n");return -1;}

Reference:正点原子教程

STM32学习——MPU6050姿态传感器相关推荐

  1. MPU6050姿态传感器的接线说明

    原理图: MPU6050姿态传感器的典型接线图: 封装引脚说明: 4个电容规格说明: 封装坐标系: 上电过程建议:

  2. STM32学习记录——光敏传感器的使用

    文章目录 前言 一.学习目的 二.模块介绍 三.代码记录 总结 前言 只做学习记录,记录自己如何从零学会使用一个模块,仅仅只是会用,缺乏专业知识.如果需要了解更多原理,可以从我推荐的技术大佬的文章中获 ...

  3. STM32学习记录——声音传感器的使用

    文章目录 前言 一.学习目的 二.模块介绍 三.代码记录 前言 今天记录的是声音传感器模块的学习 一.学习目的 我的学习目的是学会使用声音传感器模块,并通过检测声音的有无控制LED的亮灭.我使用的是S ...

  4. 【STM32学习】红外传感器实现——广告自动关闭和自动打开功能

    所用硬件设备: 1.电脑 2.STM32嵌入式最小系统--其实51控制成本会更低,也同样稳定.(* ̄︶ ̄) 3.HC-SR501 RD-624人体红外感应电子模块  淘宝上多的一塌糊涂,几块钱即可购买 ...

  5. 基于STM32的姿态传感器电路设计与使用

    文章目录 引言 程序设计描述 编写串口通信的驱动程序 编写系统延时程序 对于MPU6050姿态传感器进行初始化 编写定时中断程序 电路设计描述 具体设计分析 代码部分详细说明 设计实现效果 MPU60 ...

  6. stm32 MPU6050 6轴姿态传感器的介绍与DMP的应用

    最近应用到三轴姿态传感器,因为之前有MPU6050(6轴传感器,这是6轴的), 进行搭配使用,通过三轴姿态传感器进行舵机的角度调整.(内容来源学习正点原子的教程) 同步B站也已经发布过原子官方教程.让 ...

  7. STM32学习值传感器篇——MPU6050六轴加速度传感器

    这个传感器整体来说不难只要将模拟iic的时序写对基本问题不大 剩下的驱动文件 按照我介绍的加进去就可以实现了,还是有官方算法的好啊,直接用就完事了,很方便,节省了不少代码开发时间, 注意mpu6050 ...

  8. 学习 STM32之九轴姿态传感器(BWT901CL)串口通信读取数据

    由于个人应用到3轴传感器,所以买了直接买了一个9轴的,用于学习STM32Core平台串口2连接维特智能串口Normal协议,然后通过串口1直接打印数据,接收传感器数据和与传感器进行通信:需要看产品文档 ...

  9. 基于STM32的四旋翼无人机项目(二):MPU6050姿态解算(含上位机3D姿态显示教学)

    前言:本文为手把手教学飞控核心知识点之一的姿态解算--MPU6050 姿态解算(飞控专栏第2篇).项目中飞行器使用 MPU6050 传感器对飞行器的姿态进行解算(四元数方法),搭配设计的卡尔曼滤波器与 ...

最新文章

  1. jquery.min.map 404 (Not Found)出错的原因及解决办法
  2. Centos7.2搭建Openstack的Swift组件,查看状态:No such file or directory
  3. python爬虫requests-Python爬虫之requests介绍
  4. salt return mysql_mysql中储存salt返回结果
  5. DNS攻击的主要方式
  6. [html] h5页面如何传递参数给小程序?
  7. [转载] python中的且语句_简单探讨python中的语句和语法
  8. IIS 常见异常及解决办法
  9. GitHub资源学习的网址(未完待续)
  10. 【Python】用pip安装python库下载超时的解决办法
  11. A Game with Traps—— 二分
  12. vs2010最佳配色选择_2010年代35部最佳电影
  13. Logback-日志文件按日期切分解决方案
  14. java连接阿里云物联网(服务器端)
  15. iOS CPU VS GPU
  16. 手把手教你做时间序列图
  17. 离散数学计算机专业论文,计算机与离散数学论文.doc
  18. 常用数据结构和算法总结
  19. 玩vr游戏的计算机配置要求,你的电脑能玩VR游戏吗?合格电脑不足1%
  20. 二级计算机公共基础知识

热门文章

  1. ssh 协议 java_java代码之SSH协议连接linux
  2. LGBM使用贝叶斯调参
  3. python标准化输出
  4. 小学教师计算机说课,浙江温州小学计算机教师资格认证说课稿
  5. 用c语言编程求分数和,用C语言编程平均分数
  6. java5分钟项目讲解_5分钟快速创建spring boot项目的完整步骤
  7. 金蝶记账王登录显示连接金蝶云服务器异常,金蝶KIS记账王系统初始化常见问题...
  8. php 条码打印控件,jQuery插件jquery-barcode实现条码打印的方法
  9. angular6 中使用bootstrap
  10. 乘法器之四( 乘加器(Sum of multiplication))