【STM32】I2C练习,HAL库读取MPU6050角度陀螺仪
I2C练习
- MPU6050简介
- 寄存器查询表格
- STM32CubeMx配置
- 代码文件
- mpu6050.h文件
- mpu6050.c文件
- main.c文件
- 总结
MPU6050简介
MPU-6000(6050)为全球首例整合性6轴运动处理组件,相较于多组件方案,免除了组合陀螺仪与加速器时间轴之差的问题,减少了大量的封装空间。当连接到三轴磁强计时,MPU-60X0提供完整的9轴运动融合输出到其主I2C或SPI端口(SPI仅在MPU-6000上可用)。
寄存器查询表格
寄存器地址 | 寄存器内容 |
---|---|
0X3B | X轴加速度测量值高位 |
0X3C | X轴加速度测量值低位 |
0X3D | Y轴加速度测量值高位 |
0X3E | Y轴加速度测量值低位 |
0X3F | Z轴加速度测量值高位 |
0X40 | Z轴加速度测量值低位 |
0X41 | 温度测量值高位 |
0X42 | 温度测量值低位 |
0X43 | X轴角度测量值高位 |
0X34 | X轴角度测量值低位 |
0X45 | Y轴角度测量值高位 |
0X46 | Y轴角度测量值低位 |
0X47 | Z轴角度测量值高位 |
0X48 | Z轴角度测量值低位 |
0X6B | 电源管理,典型值:0x00(正常启用) |
STM32CubeMx配置
配置使用外部高速时钟
配置调试方式
配置I2C,这里只需要选择I2C即可其余配置默认,记住自己选择的I2C引脚。
配置时钟
生成工程
代码文件
mpu6050.h文件
#ifndef __MPU6050_H
#define __MPU6050_H#include "main.h"#define SMPLRT_DIV 0x19 // 采样率分频,典型值:0x07(125Hz) */
#define CONFIG 0x1A // 低通滤波频率,典型值:0x06(5Hz) */
#define GYRO_CONFIG 0x1B // 陀螺仪自检及测量范围,典型值:0x18(不自检,2000deg/s) */
#define ACCEL_CONFIG 0x1C // 加速计自检、测量范围及高通滤波频率,典型值:0x01(不自检,2G,5Hz) */#define ACCEL_XOUT_H 0x3B // 存储最近的X轴、Y轴、Z轴加速度感应器的测量值 */
#define ACCEL_XOUT_L 0x3C
#define ACCEL_YOUT_H 0x3D
#define ACCEL_YOUT_L 0x3E
#define ACCEL_ZOUT_H 0x3F
#define ACCEL_ZOUT_L 0x40#define TEMP_OUT_H 0x41 // 存储的最近温度传感器的测量值 */
#define TEMP_OUT_L 0x42#define GYRO_XOUT_H 0x43 // 存储最近的X轴、Y轴、Z轴陀螺仪感应器的测量值 */
#define GYRO_XOUT_L 0x44
#define GYRO_YOUT_H 0x45
#define GYRO_YOUT_L 0x46
#define GYRO_ZOUT_H 0x47
#define GYRO_ZOUT_L 0x48#define PWR_MGMT_1 0x6B // 电源管理,典型值:0x00(正常启用) */
#define WHO_AM_I 0x75 // IIC地址寄存器(默认数值0x68,只读) */
#define MPU6050_ADDR 0xD0 // MPU6050手册上的地址,这里也可以使用serch函数去搜索typedef struct{// 角速度float Accel_X;float Accel_Y;float Accel_Z;// 角度float Gyro_X;float Gyro_Y;float Gyro_Z;// 温度float Temp;
}MPU6050DATATYPE;extern MPU6050DATATYPE Mpu6050_Data;
extern I2C_HandleTypeDef hi2c1;
extern I2C_HandleTypeDef hi2c2;int16_t Sensor_I2C2_Serch(void);
int8_t MPU6050_Init(int16_t Addr);int8_t Sensor_I2C2_ReadOneByte(uint16_t DevAddr, uint16_t MemAddr, uint8_t *oData);
int8_t Sensor_I2C2_WriteOneByte(uint16_t DevAddr, uint16_t MemAddr, uint8_t *iData);void MPU6050_Read_Accel(void);
void MPU6050_Read_Gyro(void);
void MPU6050_Read_Temp(void);#endif
mpu6050.c文件
#include "mpu6050.h"static int16_t Mpu6050Addr = 0xD0;
MPU6050DATATYPE Mpu6050_Data;int8_t Sensor_I2C2_Read(uint16_t DevAddr, uint16_t MemAddr, uint8_t *oData, uint8_t DataLen)
{return HAL_I2C_Mem_Read(&hi2c2,DevAddr,MemAddr,1,oData,DataLen,1000);
}int8_t Sensor_I2C2_Write(uint16_t DevAddr, uint16_t MemAddr, uint8_t *iData, uint8_t DataLen)
{return HAL_I2C_Mem_Write(&hi2c2,DevAddr,MemAddr,1,iData,DataLen,1000);
}int16_t Sensor_I2C2_Serch(void)
{for(uint8_t i = 1; i < 255; i++){if(HAL_I2C_IsDeviceReady(&hi2c2, i, 1, 1000) == HAL_OK){Mpu6050Addr = i;return i;}}return 0xD1;
}int8_t MPU6050_Init(int16_t Addr)
{uint8_t check;HAL_I2C_Mem_Read(&hi2c2,Addr,WHO_AM_I,1,&check,1,1000);if(check == 0x68) // 确认设备用 地址寄存器{ check = 0x00;Sensor_I2C2_Write(Addr,PWR_MGMT_1,&check, 1); // 唤醒check = 0x07; Sensor_I2C2_Write(Addr,SMPLRT_DIV,&check, 1); // 1Khz的速率check = 0x00;Sensor_I2C2_Write(Addr,ACCEL_CONFIG,&check, 1); // 加速度配置check = 0x00;Sensor_I2C2_Write(Addr,GYRO_CONFIG,&check, 1); // 陀螺配置return 0;}return -1;
}void MPU6050_Read_Accel(void)
{uint8_t Read_Buf[6];// 寄存器依次是加速度X高 - 加速度X低 - 加速度Y高位 - 加速度Y低位 - 加速度Z高位 - 加速度度Z低位Sensor_I2C2_Read(Mpu6050Addr, ACCEL_XOUT_H, Read_Buf, 6); Mpu6050_Data.Accel_X = (int16_t)(Read_Buf[0] << 8 | Read_Buf[1]);Mpu6050_Data.Accel_Y = (int16_t)(Read_Buf[2] << 8 | Read_Buf[3]);Mpu6050_Data.Accel_Z = (int16_t)(Read_Buf[4] << 8 | Read_Buf[5]);Mpu6050_Data.Accel_X = Mpu6050_Data.Accel_X / 16384.0f;Mpu6050_Data.Accel_Y = Mpu6050_Data.Accel_Y / 16384.0f;Mpu6050_Data.Accel_Z = Mpu6050_Data.Accel_Z / 16384.0f;}
void MPU6050_Read_Gyro(void)
{uint8_t Read_Buf[6];// 寄存器依次是角度X高 - 角度X低 - 角度Y高位 - 角度Y低位 - 角度Z高位 - 角度Z低位Sensor_I2C2_Read(Mpu6050Addr, GYRO_XOUT_H, Read_Buf, 6); Mpu6050_Data.Gyro_X = (int16_t)(Read_Buf[0] << 8 | Read_Buf[1]);Mpu6050_Data.Gyro_Y = (int16_t)(Read_Buf[2] << 8 | Read_Buf[3]);Mpu6050_Data.Gyro_Z = (int16_t)(Read_Buf[4] << 8 | Read_Buf[5]);Mpu6050_Data.Gyro_X = Mpu6050_Data.Gyro_X / 131.0f;Mpu6050_Data.Gyro_Y = Mpu6050_Data.Gyro_Y / 131.0f;Mpu6050_Data.Gyro_Z = Mpu6050_Data.Gyro_Z / 131.0f;}
void MPU6050_Read_Temp(void)
{uint8_t Read_Buf[2];Sensor_I2C2_Read(Mpu6050Addr, TEMP_OUT_H, Read_Buf, 2); Mpu6050_Data.Temp = (int16_t)(Read_Buf[0] << 8 | Read_Buf[1]);Mpu6050_Data.Temp = 36.53f + (Mpu6050_Data.Temp / 340.0f);
}
main.c文件
MPU6050_Init(Sensor_I2C2_Serch());
while(1)
{HAL_Delay(500);MPU6050_Read_Accel();MPU6050_Read_Gyro();MPU6050_Read_Temp();
}
总结
MPU6050的数据的读取非常的简单,但是这个数据还无法直接使用,这里我只是用来联系I2C的读取,对于六轴的算法还有很多,可以转移到别的博主文章进行学习参考。
【STM32】I2C练习,HAL库读取MPU6050角度陀螺仪相关推荐
- 【STM32】CubeMX+HAL库之 硬件IIC+DMA控制OLED(兼容SSD1306SH1106驱动)
[STM32]CubeMX+HAL库之 硬件IIC+DMA控制1.3寸OLED 前言 目前网上大多数驱动OLED屏都采用软件IIC,因为HAL库的升级使得硬件IIC的稳定性得到了保障,所以想采用硬件I ...
- 【STM32笔记】HAL库低功耗STOP停止模式的串口唤醒(解决进入以后立马唤醒、串口唤醒和回调无法一起使用、接收数据不全的问题)
[STM32笔记]HAL库低功耗STOP停止模式的串口唤醒(解决进入以后立马唤醒.串口唤醒和回调无法一起使用.接收数据不全的问题) [STM32笔记]低功耗模式配置及避坑汇总 前文: blog.csd ...
- 【STM32笔记】HAL库低功耗模式配置(ADC唤醒无法使用、低功耗模式无法烧录解决方案)
[STM32笔记]HAL库低功耗模式配置(ADC唤醒无法使用.低功耗模式无法烧录解决方案) [STM32笔记]低功耗模式配置及避坑汇总 一.低功耗模式简介 系统提供了多个低功耗模式,可在 CPU 不需 ...
- STM32如何配置HAL库
STM32如何配置HAL库 前言 相比较早几年使用标准库开发来讲,最近几年HAL库的使用是越来越多,那么我们开发应当使用哪一种呢,本文着重介绍常用的几种开发方式及相互之间的区别,白猫也好.黑猫也好 ...
- STM32CubeMX | STM32 F1系列HAL库低功耗STOP和STANDBY模式唤醒(RTC时钟唤醒+外部中断唤醒示例)
STM32CubeMX | STM32 F1系列HAL库低功耗STOP和STANDBY模式唤醒(RTC时钟唤醒+外部中断唤醒示例) 目录 STM32CubeMX | STM32 F1系列HAL库低功耗 ...
- STC8单片机基于开源库读取mpu6050数据
STC8单片机基于开源库读取mpu6050数据
- STM32单片机基于HAL库开发HC-SR04 超声波测距模块(终极版)
参考: 某宝HC-SR04 超声波测距模块商品详情页 STM32L051C8T6 HAL库 输入捕获进行超声波测距 案例 STM32CubeMX学习笔记3--TIM2输入捕获(SR-04测距) cub ...
- 【STM32】基于HAL库的中断详细学习
目录 1.中断概述 1.1中断相关概念 1.2 STM32中断系统 2 .HAL库的中断处理 2.1 HAL 库的中断封装 2.2 外部中断处理流程 3.外部中断的HAL库定义 3.1. 外部中断的数 ...
- STM32 之九 HAL 库串口(USART/UART)驱动 BUG 及解决方法
写在前面 在工作中,部分产品使用了ST最新的 HAL驱动库,发现 HAL 库 BUG 还是挺多的!本文重点针对在使用HAL库的 UART / USART 部分时,发现的以下几个个比较严重Bug.其 ...
最新文章
- 如何配置mac的mysql环境_mac安装mysql数据库及配置环境变量
- hihocoder 1320 压缩字符串(字符串+dp)
- ZStack中的编程技巧
- 获取android系统手机的铃声和音量
- python开发上位机软件-UR机器人通信--上位机通信(python)
- python日志模块 限制日志记录数_python日志记录-logging模块
- open vswitch_Linux Foundation采用Open vSwitch,定义了“开放”和更多开源新闻
- 数学习题:求解不定方程a^2 + b^2 = 3025
- 普通软件项目开发过程规范(五)—— 总结
- 最新 Bitnami redmine安装与配置
- 结合中断分析TCP/IP协议栈在LINUX内核中的运行时序
- spark保存数据到hbase_Spark读取Hbase中的数据
- iOS:segment对齐原则
- Wallpaper透视效果的C++实现(含源文件)
- TTL与非门电路的工作原理
- 李宏毅老师《机器学习》课程笔记-1深度学习简介
- android 英语单词音标获取
- 【DCANet2022】:DCANet: Differential Convolution Attention Network for RGB-D Semantic Segmentation
- cesium所有示例下载
- 前端js以application/octet-stream方式上传文件
热门文章
- Http 自定义header
- spacy模型英文模型安装实录
- [App] 高通系统闹钟app DeskClock的修改
- Spring cloud alibaba(二)nacos服务发现docker相同ip冲突
- 智能计算系统2 bangc算子开发的demo (CPU和MLU270的异构编程流程)
- OpenCV使用教程-读取图像imread使用说明
- 计算机音乐 一闪一闪亮晶晶,音乐:一闪一闪亮晶晶
- 跨境电商亚马逊erp规避跟卖自发货铺货,数据更安全
- uc/os-ii学习
- matlab 按分隔符提取,Matlab:如何读取具有多个分隔符的.txt文件