STM32学习——MPU6050姿态传感器
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姿态传感器相关推荐
- MPU6050姿态传感器的接线说明
原理图: MPU6050姿态传感器的典型接线图: 封装引脚说明: 4个电容规格说明: 封装坐标系: 上电过程建议:
- STM32学习记录——光敏传感器的使用
文章目录 前言 一.学习目的 二.模块介绍 三.代码记录 总结 前言 只做学习记录,记录自己如何从零学会使用一个模块,仅仅只是会用,缺乏专业知识.如果需要了解更多原理,可以从我推荐的技术大佬的文章中获 ...
- STM32学习记录——声音传感器的使用
文章目录 前言 一.学习目的 二.模块介绍 三.代码记录 前言 今天记录的是声音传感器模块的学习 一.学习目的 我的学习目的是学会使用声音传感器模块,并通过检测声音的有无控制LED的亮灭.我使用的是S ...
- 【STM32学习】红外传感器实现——广告自动关闭和自动打开功能
所用硬件设备: 1.电脑 2.STM32嵌入式最小系统--其实51控制成本会更低,也同样稳定.(* ̄︶ ̄) 3.HC-SR501 RD-624人体红外感应电子模块 淘宝上多的一塌糊涂,几块钱即可购买 ...
- 基于STM32的姿态传感器电路设计与使用
文章目录 引言 程序设计描述 编写串口通信的驱动程序 编写系统延时程序 对于MPU6050姿态传感器进行初始化 编写定时中断程序 电路设计描述 具体设计分析 代码部分详细说明 设计实现效果 MPU60 ...
- stm32 MPU6050 6轴姿态传感器的介绍与DMP的应用
最近应用到三轴姿态传感器,因为之前有MPU6050(6轴传感器,这是6轴的), 进行搭配使用,通过三轴姿态传感器进行舵机的角度调整.(内容来源学习正点原子的教程) 同步B站也已经发布过原子官方教程.让 ...
- STM32学习值传感器篇——MPU6050六轴加速度传感器
这个传感器整体来说不难只要将模拟iic的时序写对基本问题不大 剩下的驱动文件 按照我介绍的加进去就可以实现了,还是有官方算法的好啊,直接用就完事了,很方便,节省了不少代码开发时间, 注意mpu6050 ...
- 学习 STM32之九轴姿态传感器(BWT901CL)串口通信读取数据
由于个人应用到3轴传感器,所以买了直接买了一个9轴的,用于学习STM32Core平台串口2连接维特智能串口Normal协议,然后通过串口1直接打印数据,接收传感器数据和与传感器进行通信:需要看产品文档 ...
- 基于STM32的四旋翼无人机项目(二):MPU6050姿态解算(含上位机3D姿态显示教学)
前言:本文为手把手教学飞控核心知识点之一的姿态解算--MPU6050 姿态解算(飞控专栏第2篇).项目中飞行器使用 MPU6050 传感器对飞行器的姿态进行解算(四元数方法),搭配设计的卡尔曼滤波器与 ...
最新文章
- jquery.min.map 404 (Not Found)出错的原因及解决办法
- Centos7.2搭建Openstack的Swift组件,查看状态:No such file or directory
- python爬虫requests-Python爬虫之requests介绍
- salt return mysql_mysql中储存salt返回结果
- DNS攻击的主要方式
- [html] h5页面如何传递参数给小程序?
- [转载] python中的且语句_简单探讨python中的语句和语法
- IIS 常见异常及解决办法
- GitHub资源学习的网址(未完待续)
- 【Python】用pip安装python库下载超时的解决办法
- A Game with Traps—— 二分
- vs2010最佳配色选择_2010年代35部最佳电影
- Logback-日志文件按日期切分解决方案
- java连接阿里云物联网(服务器端)
- iOS CPU VS GPU
- 手把手教你做时间序列图
- 离散数学计算机专业论文,计算机与离散数学论文.doc
- 常用数据结构和算法总结
- 玩vr游戏的计算机配置要求,你的电脑能玩VR游戏吗?合格电脑不足1%
- 二级计算机公共基础知识
热门文章
- ssh 协议 java_java代码之SSH协议连接linux
- LGBM使用贝叶斯调参
- python标准化输出
- 小学教师计算机说课,浙江温州小学计算机教师资格认证说课稿
- 用c语言编程求分数和,用C语言编程平均分数
- java5分钟项目讲解_5分钟快速创建spring boot项目的完整步骤
- 金蝶记账王登录显示连接金蝶云服务器异常,金蝶KIS记账王系统初始化常见问题...
- php 条码打印控件,jQuery插件jquery-barcode实现条码打印的方法
- angular6 中使用bootstrap
- 乘法器之四( 乘加器(Sum of multiplication))