STM32 HAL 库硬件 I2C 驱动 MPU6050

news/2024/11/20 18:41:27/文章来源:https://www.cnblogs.com/KicyKnoty/p/18558992

MPU6050简介

驱动文件

mpu6050.h

#ifndef INC_MPU6050_H_
#define INC_MPU6050_H_#include "i2c.h"// I2C通道配置
#define hI2C &hi2c2// 设备地址配置
#define MPU6050_ADDRESS_Write	0xD0 // 0x68左移一位补0
#define MPU6050_ADDRESS_Read    0xD1 // 0x68左移一位补1// 基本寄存器地址
#define	MPU6050_PWR_MGMT_1		0x6B
#define	MPU6050_PWR_MGMT_2		0x6C
#define	MPU6050_WHO_AM_I		0x75// 初始化配置寄存器地址
#define	MPU6050_SMPLRT_DIV		0x19
#define	MPU6050_CONFIG			0x1A
#define	MPU6050_GYRO_CONFIG		0x1B
#define	MPU6050_ACCEL_CONFIG	0x1C// 原始数据寄存器地址
#define	MPU6050_ACCEL_XOUT_H	0x3B
#define	MPU6050_ACCEL_XOUT_L	0x3C
#define	MPU6050_ACCEL_YOUT_H	0x3D
#define	MPU6050_ACCEL_YOUT_L	0x3E
#define	MPU6050_ACCEL_ZOUT_H	0x3F
#define	MPU6050_ACCEL_ZOUT_L	0x40
#define	MPU6050_TEMP_OUT_H		0x41
#define	MPU6050_TEMP_OUT_L		0x42
#define	MPU6050_GYRO_XOUT_H		0x43
#define	MPU6050_GYRO_XOUT_L		0x44
#define	MPU6050_GYRO_YOUT_H		0x45
#define	MPU6050_GYRO_YOUT_L		0x46
#define	MPU6050_GYRO_ZOUT_H		0x47
#define	MPU6050_GYRO_ZOUT_L		0x48// 共享原始数据变量
extern int16_t tempData;
extern int16_t accelDataX;
extern int16_t accelDataY;
extern int16_t accelDataZ;
extern int16_t gyroDataX;
extern int16_t gyroDataY;
extern int16_t gyroDataZ;// 共享解析数据变量
extern float Temp;
extern float AccelX;
extern float AccelY;
extern float AccelZ;
extern float GyroX;
extern float GyroY;
extern float GyroZ;void MPU6050_Init(void); // 初始化MPU6050
uint8_t MPU6050_GetID(void); // 获取设备IDvoid MPU6050_Send_CMD(uint8_t cmd); // 发送指令
void MPU6050_Set_Register(uint8_t Register_ADDRESS, uint8_t Set_Value); // 配置寄存器
uint8_t MPU6050_Read_Register(uint8_t Register_ADDRESS); // 读取寄存器数据
uint16_t MPU6050_read_data(uint8_t addressH, uint8_t addressL); // 读取原始数据void MPU6050_get_tempData(int16_t *tempData); // 获取温度原始数据
void MPU6050_get_accelData(int16_t *accXData, int16_t *accYData, int16_t *accZData); // 获取加速度原始数据
void MPU6050_get_gyroData(int16_t *gyroXData, int16_t *gyroYData, int16_t *gyroZData); // 获取角速度原始数据void MPU6050_get_temp(float *Temp); // 获取温度解析数据
void MPU6050_get_accel(float *AccelX, float *AccelY, float *AccelZ); // 获取加速度解析数据
void MPU6050_get_gyro(float *GyroX, float *GyroY, float *GyroZ); // 获取角速度解析数据#endif /* INC_MPU6050_H_ */

mpu6050.c

#include "mpu6050.h"// 初始化原始数据变量
int16_t tempData    = 0;
int16_t accelDataX  = 0;
int16_t accelDataY  = 0;
int16_t accelDataZ  = 0;
int16_t gyroDataX   = 0;
int16_t gyroDataY   = 0;
int16_t gyroDataZ   = 0;// 初始化解析数据变量
float Temp   = 0;
float AccelX = 0;
float AccelY = 0;
float AccelZ = 0;
float GyroX  = 0;
float GyroY  = 0;
float GyroZ  = 0;void MPU6050_Init(void)
{MX_I2C2_Init(); // 初始化I2C(用户初始化代码区在自动初始化区域的前面,所有得在这里面先初始化一遍)HAL_Delay(100);// 初始化配置寄存器MPU6050_Set_Register(MPU6050_PWR_MGMT_1, 0x00);MPU6050_Set_Register(MPU6050_SMPLRT_DIV, 0x07);MPU6050_Set_Register(MPU6050_CONFIG, 0x00);MPU6050_Set_Register(MPU6050_GYRO_CONFIG, 0x00);MPU6050_Set_Register(MPU6050_ACCEL_CONFIG, 0x00);
}uint8_t MPU6050_GetID(void)
{return MPU6050_Read_Register(MPU6050_WHO_AM_I); // 返回0x68
}void MPU6050_Send_CMD(uint8_t cmd)
{uint8_t CMD = cmd;HAL_I2C_Master_Transmit(hI2C, MPU6050_ADDRESS_Write, &CMD, 1, HAL_MAX_DELAY);
}void MPU6050_Set_Register(uint8_t Register_ADDRESS, uint8_t Set_Value)
{uint8_t sendBuffer[2] = {Register_ADDRESS, Set_Value};HAL_I2C_Master_Transmit(hI2C, MPU6050_ADDRESS_Write, sendBuffer, 2, HAL_MAX_DELAY);
}uint8_t MPU6050_Read_Register(uint8_t Register_ADDRESS)
{uint8_t readBuffer;MPU6050_Send_CMD(Register_ADDRESS);HAL_I2C_Master_Receive(hI2C, MPU6050_ADDRESS_Read, &readBuffer, 1, HAL_MAX_DELAY);return readBuffer;
}uint16_t MPU6050_read_data(uint8_t addressH, uint8_t addressL)
{uint8_t highData = MPU6050_Read_Register(addressH);uint8_t lowData  = MPU6050_Read_Register(addressL);uint16_t rawData = ((int16_t) highData << 8) | (int16_t) lowData; // 拼接数据return rawData;
}void MPU6050_get_tempData(int16_t *tempData)
{*tempData = MPU6050_read_data(MPU6050_TEMP_OUT_H, MPU6050_TEMP_OUT_L);
}void MPU6050_get_accelData(int16_t *accelDataX, int16_t *accelDataY, int16_t *accelDataZ)
{*accelDataX = MPU6050_read_data(MPU6050_ACCEL_XOUT_H, MPU6050_ACCEL_XOUT_L);*accelDataY = MPU6050_read_data(MPU6050_ACCEL_YOUT_H, MPU6050_ACCEL_YOUT_L);*accelDataZ = MPU6050_read_data(MPU6050_ACCEL_ZOUT_H, MPU6050_ACCEL_ZOUT_L);
}void MPU6050_get_gyroData(int16_t *gyroDataX, int16_t *gyroDataY, int16_t *gyroDataZ)
{*gyroDataX = MPU6050_read_data(MPU6050_GYRO_XOUT_H, MPU6050_GYRO_XOUT_L);*gyroDataY = MPU6050_read_data(MPU6050_GYRO_YOUT_H, MPU6050_GYRO_YOUT_L);*gyroDataZ = MPU6050_read_data(MPU6050_GYRO_ZOUT_H, MPU6050_GYRO_ZOUT_L);
}void MPU6050_get_temp(float *Temp)
{MPU6050_get_tempData(&tempData);*Temp = tempData / 340.0 + 36.53;
}void MPU6050_get_accel(float *AccelX, float *AccelY, float *AccelZ)
{MPU6050_get_accelData(&accelDataX, &accelDataY, &accelDataZ);*AccelX = accelDataX / 16384.0 * 9.8;*AccelY = accelDataY / 16384.0 * 9.8;*AccelZ = accelDataZ / 16384.0 * 9.8;
}void MPU6050_get_gyro(float *GyroX, float *GyroY, float *GyroZ)
{MPU6050_get_gyroData(&gyroDataX, &gyroDataY, &gyroDataZ);*GyroX = gyroDataX / 131.0;*GyroY = gyroDataY / 131.0;*GyroZ = gyroDataZ / 131.0;
}

main.c

/* USER CODE BEGIN Includes */
#include "stdio.h"
#include "mpu6050.h"
/* USER CODE END Includes *//* USER CODE BEGIN 0 */
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endifPUTCHAR_PROTOTYPE
{HAL_UART_Transmit(&huart4,(uint8_t*)&ch, 1, HAL_MAX_DELAY);return ch;}
/* USER CODE END 0 *//* USER CODE BEGIN Init */MPU6050_Init();/* USER CODE END Init *//* USER CODE BEGIN WHILE */while (1){MPU6050_get_temp(&Temp);MPU6050_get_accel(&AccelX, &AccelY, &AccelZ);MPU6050_get_gyro(&GyroX, &GyroY, &GyroZ);printf("%.2f %.2f %.2f %.2f %.2f %.2f %.2f\n", Temp, AccelX, AccelY, AccelZ, GyroX, GyroY, GyroZ);HAL_Delay(100);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/837462.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

人工智能之机器学习基础——贝叶斯(Bayesian Methods)

贝叶斯分类器 贝叶斯分类器是一类基于贝叶斯定理的统计学习方法,广泛应用于分类问题。其核心思想是通过计算后验概率 P(y∣x),将输入样本 x 分类到具有最大后验概率的类别。 1. 贝叶斯定理 贝叶斯定理是概率论中的基本法则,用于描述条件概率的关系: 其中:P(y∣x):在已知…

2024.11.20 NOIP模拟 - 模拟赛记录

异或(xor) 每次所加三角形的范围如图所示:这道题做法较多,我是通过两组差分与前缀和来做的。 首先需要一个三角形差分,使每一次在差分数组中修改时,影响到的范围是一个三角形,比如这样(红色点为 \((x,y)\),即 \((r,c)\)):假设我们真正需要修改的三角形是橙色部分:那…

实时多模态 AI 的 N 种新可能丨实时互动和大模型专场@RTE2024回顾

在本届 RTE2024 大会上,来自产业界和学术界的多位专家深入探讨了实时互动和大模型技术的最新进展及其潜在应用。西湖心辰联合创始人俞佳、声网 AI 算法工程师乔齐、MiniMax 资深音频算法专家张博闻、商汤科技数字文娱解决方案负责人焦文奎以及面壁智能算法 VP 翟忠武等分享了他…

vscode主题美化

vscode 主题美化 主题使用Tokyo Night由于我在用rust的时候发现其对一些变量的颜色不太好看,所以自己又在设置中改了一点"editor.tokenColorCustomizations": {...."[Tokyo Night]": { // or "[Tokyo Night Storm]""textMateRules": […

2024.11.20总结

1本文于 github 博客同步更新。 A: 一个数可以被操作当且仅存在一列的顶部元素为它且存在一列的底部元素为它,初始扫一遍,将合法的元素以顶部所在列为关键字扔到小根堆里,每次找到最小的元素添加,然后检查将新露出来的元素是否存在匹配,若结束时未填完即为无解。 B: 要么…

ABAP 日期计算

RP_CALC_DATE_IN_INTERVAL 日期函数2 FIMA_DATE_CREATE 有问题 在2月份计算有问题 慎用 计算两个日期月份 FIMA_DAYS_AND_MONTHS_AND_YEARS

群晖NAS维修数据恢复

一台群晖NAS,开机状态灯是黄灯,DISC4也是亮黄灯,机器一直在报警。 群辉型号DS415+,是一种典型的硬盘损坏的情况,这是一台四盘位的一个群辉NAS,第一时间把每个硬盘取下来编个编号,WD的红盘也就是nasVR专用硬盘,型号是WD401F2X的,生产日期有三块是2015年,有一块是比较新…

实景三维技术在基层社会治理中的数智化应用

在推进国家治理体系和治理能力现代化的进程中,基层社会治理的数字化转型尤为关键。实景三维技术,以其直观、精准的空间信息表达能力,正在成为基层社会治理的有力工具。本文将探讨实景三维技术如何在“地、房、人、用、管”五个维度赋能基层社会治理。一、实景三维技术简介实…

Nginx服务器配置---反向代理服务时proxy_pass的转发规则

nginx是由俄罗斯开发的一款http web服务器,我们经常用这款服务器做负载均衡和反向代理。今天我们就来聊聊Nginx作为反向代理时,如何进行路由配置。假设你已经部署好Nginx了,我们进入Nginx安装目录,进入nginx.conf文件。找到http节点下的server节点,值是一个json。在json中…

less 全局变量使用 引用

参考链接: https://blog.csdn.net/qq_42493241/article/details/120021001 照搬成功 (以防链接失效截图)