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角度陀螺仪相关推荐

  1. 【STM32】CubeMX+HAL库之 硬件IIC+DMA控制OLED(兼容SSD1306SH1106驱动)

    [STM32]CubeMX+HAL库之 硬件IIC+DMA控制1.3寸OLED 前言 目前网上大多数驱动OLED屏都采用软件IIC,因为HAL库的升级使得硬件IIC的稳定性得到了保障,所以想采用硬件I ...

  2. 【STM32笔记】HAL库低功耗STOP停止模式的串口唤醒(解决进入以后立马唤醒、串口唤醒和回调无法一起使用、接收数据不全的问题)

    [STM32笔记]HAL库低功耗STOP停止模式的串口唤醒(解决进入以后立马唤醒.串口唤醒和回调无法一起使用.接收数据不全的问题) [STM32笔记]低功耗模式配置及避坑汇总 前文: blog.csd ...

  3. 【STM32笔记】HAL库低功耗模式配置(ADC唤醒无法使用、低功耗模式无法烧录解决方案)

    [STM32笔记]HAL库低功耗模式配置(ADC唤醒无法使用.低功耗模式无法烧录解决方案) [STM32笔记]低功耗模式配置及避坑汇总 一.低功耗模式简介 系统提供了多个低功耗模式,可在 CPU 不需 ...

  4. STM32如何配置HAL库

    STM32如何配置HAL库 前言   相比较早几年使用标准库开发来讲,最近几年HAL库的使用是越来越多,那么我们开发应当使用哪一种呢,本文着重介绍常用的几种开发方式及相互之间的区别,白猫也好.黑猫也好 ...

  5. STM32CubeMX | STM32 F1系列HAL库低功耗STOP和STANDBY模式唤醒(RTC时钟唤醒+外部中断唤醒示例)

    STM32CubeMX | STM32 F1系列HAL库低功耗STOP和STANDBY模式唤醒(RTC时钟唤醒+外部中断唤醒示例) 目录 STM32CubeMX | STM32 F1系列HAL库低功耗 ...

  6. STC8单片机基于开源库读取mpu6050数据

    STC8单片机基于开源库读取mpu6050数据

  7. STM32单片机基于HAL库开发HC-SR04 超声波测距模块(终极版)

    参考: 某宝HC-SR04 超声波测距模块商品详情页 STM32L051C8T6 HAL库 输入捕获进行超声波测距 案例 STM32CubeMX学习笔记3--TIM2输入捕获(SR-04测距) cub ...

  8. 【STM32】基于HAL库的中断详细学习

    目录 1.中断概述 1.1中断相关概念 1.2 STM32中断系统 2 .HAL库的中断处理 2.1 HAL 库的中断封装 2.2 外部中断处理流程 3.外部中断的HAL库定义 3.1. 外部中断的数 ...

  9. STM32 之九 HAL 库串口(USART/UART)驱动 BUG 及解决方法

    写在前面   在工作中,部分产品使用了ST最新的 HAL驱动库,发现 HAL 库 BUG 还是挺多的!本文重点针对在使用HAL库的 UART / USART 部分时,发现的以下几个个比较严重Bug.其 ...

最新文章

  1. 如何配置mac的mysql环境_mac安装mysql数据库及配置环境变量
  2. hihocoder 1320 压缩字符串(字符串+dp)
  3. ZStack中的编程技巧
  4. 获取android系统手机的铃声和音量
  5. python开发上位机软件-UR机器人通信--上位机通信(python)
  6. python日志模块 限制日志记录数_python日志记录-logging模块
  7. open vswitch_Linux Foundation采用Open vSwitch,定义了“开放”和更多开源新闻
  8. 数学习题:求解不定方程a^2 + b^2 = 3025
  9. 普通软件项目开发过程规范(五)—— 总结
  10. 最新 Bitnami redmine安装与配置
  11. 结合中断分析TCP/IP协议栈在LINUX内核中的运行时序
  12. spark保存数据到hbase_Spark读取Hbase中的数据
  13. iOS:segment对齐原则
  14. Wallpaper透视效果的C++实现(含源文件)
  15. TTL与非门电路的工作原理
  16. 李宏毅老师《机器学习》课程笔记-1深度学习简介
  17. android 英语单词音标获取
  18. 【DCANet2022】:DCANet: Differential Convolution Attention Network for RGB-D Semantic Segmentation
  19. cesium所有示例下载
  20. 前端js以application/octet-stream方式上传文件

热门文章

  1. Http 自定义header
  2. spacy模型英文模型安装实录
  3. [App] 高通系统闹钟app DeskClock的修改
  4. Spring cloud alibaba(二)nacos服务发现docker相同ip冲突
  5. 智能计算系统2 bangc算子开发的demo (CPU和MLU270的异构编程流程)
  6. OpenCV使用教程-读取图像imread使用说明
  7. 计算机音乐 一闪一闪亮晶晶,音乐:一闪一闪亮晶晶
  8. 跨境电商亚马逊erp规避跟卖自发货铺货,数据更安全
  9. uc/os-ii学习
  10. matlab 按分隔符提取,Matlab:如何读取具有多个分隔符的.txt文件