【记录】自己动手使用HAL库对MPU6050进行编程

这篇具有很好参考价值的文章主要介绍了【记录】自己动手使用HAL库对MPU6050进行编程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

有关于I2C的知识看这篇文章:

【记录】嵌入式经典通信I2C理解

有关于MPU6050的基础知识和手册去看这篇文章:

【记录】MPU6050原理快速入门(附手册)

此篇记录代码编写过程:

直接看汇总: 代码汇总

一、完成CubeMX的配置。

首先分析自身需求:MPU6050需要用到I2C或者是模拟I2C,因为stm32自身具备I2C,故选择使用物理I2C。此外,通过串口来将数据传给电脑,实现在电脑上查看吗,因此需要配置串口,并完成串口的重定向。

使用的控制板是正点原子的探索者,主控芯片是STM32F407ZGT6。

CubeMX的配置请参考其它文章,这里只给出I2C的配置图和最终的引脚配置图。

I2C的配置如图:

mpu6050hal库,stm32,嵌入式硬件

最终的引脚配置如图:

mpu6050hal库,stm32,嵌入式硬件

 二、完成实物接线。

mpu6050hal库,stm32,嵌入式硬件

只需要四个引脚,其名称和对应接线为:VCC接3~5V,GND接GND,SDA接PB6,SCL接PB7(这里PB6和PB7根据自己的板子配置)。 

三、阅读MPU6050的数据手册,查阅相关寄存器地址。

首先,要知道MPU6050的地址,可以通过数据手册也可以通过代码来查阅。接下来用代码进行查看。

#include <stdio.h>// 包含标准输入输出头文件
int fputc(int ch,FILE *f)
{
//采用轮询方式发送1字节数据,超时时间设置为无限等待
	HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,HAL_MAX_DELAY);
	return ch;
}
int fgetc(FILE *f)
{
	uint8_t ch;
// 采用轮询方式接收 1字节数据,超时时间设置为无限等待
	HAL_UART_Receive( &huart1,(uint8_t*)&ch,1, HAL_MAX_DELAY );
	return ch;
}

int main()
{
    for(uint8_t i=0;i<255;i++)
    {
        if(HAL_I2C_IsDeviceReady(&hi2c,i,1,1000)==HAL_OK)
        {
            printf("%d\n",i);
            break;
        }
    }
}

通过代码或查阅手册知道MPU6050的设备地址为0xD0。进行宏定义方便使用。

#define mpu_addr 0xD0

 为了方便对MPU6050进行读写操作,编写函数。因为MPU6050的使用需要访问寄存器,因此选择能进行读写设备地址和寄存器的地址的语句。

//HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress,  uint8_t *pData, uint16_t Size, uint32_t Timeout);//只有设备地址
//HAL_I2C_Mem_Read(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout);//有设备地址和寄存器地址

通过上面封装函数的对比,可以完成读写函数的编写。 

void mpu_w(uint8_t addr,uint8_t data)//写
{
    HAL_I2C_Mem_Write(&hi2c1, mpu_addr, addr, 1, &data, 1, HAL_MAX_DELAY);
}
uint8_t mpu_r(uint8_t addr)//读
{
    uint8_t data;
    HAL_I2C_Mem_Read(&hi2c1, mpu_addr,addr, 1, &data, 1, HAL_MAX_DELAY);
    return data;
}

 其次,完成MPU6050的初始化函数。

mpu6050hal库,stm32,嵌入式硬件

void mpu_begin(void)//初始化
{
	if(mpu_r(0x75)==0x68)//检测
	{
		mpu_w(0x1B,0x18);//改角速度速率
		mpu_w(0x1C,0x10);//改加速度
		mpu_w(0x6B,0x01);//关睡眠,改时钟到G
	}
}

最后,完成各个函数的编写,重力感应,温度,角速度。

 mpu6050hal库,stm32,嵌入式硬件文章来源地址https://www.toymoban.com/news/detail-598202.html

//X,Y,Z读数据时需要组合
int16_t mpu_acc_x(void) //x重力感应
{
	int16_t x=0;
	x=mpu_r(0x3B)<<8;
	x=x|mpu_r(0x3C);
	return x;
}
int16_t mpu_acc_y(void) //y重力感应
{
	int16_t y=0;
	y=mpu_r(0x3D)<<8;
	y=y|mpu_r(0x3E);
	return y;
}
int16_t mpu_acc_z(void) //z重力感应
{
	int16_t z=0;
	z=mpu_r(0x3F)<<8;
	z=z|mpu_r(0x40);
	return z;
}
int16_t mpu_temp(void) //温度
{
	int16_t t=0;
	t=mpu_r(0x41)<<8;
	t=t|mpu_r(0x42);
	return t;
}
int16_t mpu_gy_x(void) //x角速度
{
	int16_t x=0;
	x=mpu_r(0x43)<<8;
	x=x|mpu_r(0x44);
	return x;
}
int16_t mpu_gy_y(void) //y角速度
{
	int16_t y=0;
	y=mpu_r(0x45)<<8;
	y=y|mpu_r(0x46);
	return y;
}
int16_t mpu_gy_z(void) //z角速度
{
	int16_t z=0;
	z=mpu_r(0x47)<<8;
	z=z|mpu_r(0x48);
	return z;
}

 代码汇总:

/* USER CODE BEGIN 0 */
#define mpu_addr 0xD0
//完成串口重定向
#include <stdio.h>// 包含标准输入输出头文件
int fputc(int ch,FILE *f)
{
//采用轮询方式发送1字节数据,超时时间设置为无限等待
	HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,HAL_MAX_DELAY);
	return ch;
}
int fgetc(FILE *f)
{
	uint8_t ch;
// 采用轮询方式接收 1字节数据,超时时间设置为无限等待
	HAL_UART_Receive( &huart1,(uint8_t*)&ch,1, HAL_MAX_DELAY );
	return ch;
}
//完成MPU6050相关函数编写
void mpu_w(uint8_t addr,uint8_t data)//写
{
	HAL_I2C_Mem_Write(&hi2c1, mpu_addr, addr, 1, &data, 1, HAL_MAX_DELAY);
}
uint8_t mpu_r(uint8_t addr)//读
{
	uint8_t data;
	HAL_I2C_Mem_Read(&hi2c1, mpu_addr,addr, 1, &data, 1, HAL_MAX_DELAY);
	return data;
}
void mpu_begin(void)//初始化
{
	if(mpu_r(0x75)==0x68)//检测
	{
		mpu_w(0x1B,0x18);//改角速度速率
		mpu_w(0x1C,0x10);//改加速度
		mpu_w(0x6B,0x01);//关睡眠,改时钟到G
	}
}
//X,Y,Z读数据时需要组合
int16_t mpu_acc_x(void) //x重力感应
{
	int16_t x=0;
	x=mpu_r(0x3B)<<8;
	x=x|mpu_r(0x3C);
	return x;
}
int16_t mpu_acc_y(void) //y重力感应
{
	int16_t y=0;
	y=mpu_r(0x3D)<<8;
	y=y|mpu_r(0x3E);
	return y;
}
int16_t mpu_acc_z(void) //z重力感应
{
	int16_t z=0;
	z=mpu_r(0x3F)<<8;
	z=z|mpu_r(0x40);
	return z;
}
int16_t mpu_temp(void) //温度
{
	int16_t t=0;
	t=mpu_r(0x41)<<8;
	t=t|mpu_r(0x42);
	return t;
}
int16_t mpu_gy_x(void) //x角速度
{
	int16_t x=0;
	x=mpu_r(0x43)<<8;
	x=x|mpu_r(0x44);
	return x;
}
int16_t mpu_gy_y(void) //y角速度
{
	int16_t y=0;
	y=mpu_r(0x45)<<8;
	y=y|mpu_r(0x46);
	return y;
}
int16_t mpu_gy_z(void) //z角速度
{
	int16_t z=0;
	z=mpu_r(0x47)<<8;
	z=z|mpu_r(0x48);
	return z;
}
/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_I2C1_Init();
  MX_USART1_UART_Init();
	
  /* USER CODE BEGIN 2 */
	mpu_begin();
  //读取数据通过串口传给电脑
	int acc_x,acc_y,acc_z,temp,gy_x,gy_y,gy_z;
	/* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
		acc_x=mpu_acc_x();
		acc_y=mpu_acc_y();
		acc_z=mpu_acc_z();
		temp=mpu_temp();
		gy_x=mpu_gy_x();
		gy_y=mpu_gy_y();
		gy_z=mpu_gy_z();
		printf("%d,%d,%d,%d,%d,%d\n",acc_x,acc_y,acc_z,temp,gy_x,gy_y,gy_z);
		HAL_Delay(1000);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

到了这里,关于【记录】自己动手使用HAL库对MPU6050进行编程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 01_STM32软件+硬件I2C读取MPU6050(HAL库)

    目录 1、I2C简介 2、I2C时序单元 2.1 起始条件 2.2 终止条件 2.3 发送一个字节 2.4 接收一个字节 2.5 发送应答 2.6 接收应答 3、I2C完整时序 3.1 指定地址写一个字节 3.2 当前地址读一个字节 3.2 指定地址读一个字节 4、简单软件I2C代码(HAL) 4.1 软件I2C 4.2 软件I2C读MPU6050寄存器 5、ST

    2024年04月17日
    浏览(40)
  • 【STM32】I2C练习,HAL库读取MPU6050角度陀螺仪

    MPU-6000(6050)为全球首例整合性6轴运动处理组件,相较于多组件方案,免除了组合陀螺仪与加速器时间轴之差的问题,减少了大量的封装空间。当连接到三轴磁强计时,MPU-60X0提供完整的9轴运动融合输出到其主I2C或SPI端口(SPI仅在MPU-6000上可用)。 寄存器地址 寄存器内容 0X3B

    2024年02月16日
    浏览(42)
  • MPU6050(读取原数据、移植DMP、stm32f4、HAL库、KEIL5)

    记录一下自己遇到的问题及解决方法,希望能帮助到一些人。 第一步,读取芯片的原始数据。需要注意两点:1、对HAL库提供的IIC读取写入函数进行再包装。(千万不要觉的这步多此一举,后面移植DMP时用得到) 2、芯片的地址(这里面有俩坑)第一就是,芯片的 I2C 设备地址

    2023年04月08日
    浏览(41)
  • mpu6050六轴陀螺仪dmp姿态解算-C语言移植(stm32+hal)

    官方库源文件: 1 移植官方6个库文件 2 修改inv_mpu.h中结构体 3 修改inv_mpu.c 4 修改 inv_mpu_motion_driver.c 5 keil中增加宏定义 6 移植核心[修改inv_mpu.c|inv_mpu_motion_driver.c]

    2024年02月14日
    浏览(37)
  • 【记录】MPU6050原理快速入门(附手册)

            MPU6050 MPU6050主要参数 MPU6050通信接口 MPU6050电路 向MPU6050的一个寄存器写一个字节的数据 从MPU6050的一个寄存器读一个字节的数据 MPU6050是一个运动处理传感器,其内部集成了3轴加速度传感器和3轴陀螺仪(角速度传感器) (芯片内部陀螺仪,当改变其转动时会产生

    2023年04月11日
    浏览(30)
  • 【STM32+cubemx】0027 HAL库开发:MPU6050陀螺仪和加速度计数据的获取和校准

    在制作平衡车或者飞行器时,不可避免地需要知道设备本身的姿态,一般我们使用陀螺仪和加速度计来获取这些信息。 陀螺仪用来测量物体的角度。传统的机械式陀螺的原理,和我们小时候玩的陀螺一样,是利用了高速旋转的物体能保持轴线稳定的特性;机械式陀螺需要的加

    2023年04月08日
    浏览(42)
  • 学习记录之STM32F103C8T6最小系统板驱动MPU6050串口打印数据

    1.使用到的工具介绍 2.MPU6050和整体和简单介绍 3.程序的介绍 1.使用到的工具介绍 硬件方面:STM32F103C8T6最小系统板核心板,MPU6050模块三维角度传感器,经典的CH340烧写和串口作用,和若干个杜邦线。 软件方面:keil5编写程序软件,烧写软件FlyMcu.exe烧写工具,sscom.exe串口调试工

    2023年04月09日
    浏览(50)
  • [Arduino ESP32] mpu6050使用笔记(含dmp)

    Arduino ESP32 I2C管脚定义:Arduino.h(第209行左右) - pins_arduino.h如图: VCC---3.3v GND--GND 简单使用() 代码位置 代码如下(直接粘的): 上传,然后卡在初始化 原因: 可能是I2Cdev库和MPU6050库不同步(I2Cdev太新了) 解决: 依次检查 (F12) main.cpp的accelgyro.initialize();== MPU6050.cpp的setClockSource

    2024年02月11日
    浏览(37)
  • (Rockpi 4b使用心得),Python的smbus模块,mpu6050等模块的使用

    大家好,关于有些新手们买了rockpi4b,或者使用过树莓派的在转rockpi4b的过程中,使用Python中的smbus模块会遇到很多错误,而Python又因为其中的语法特别简单的关系,所以受到了众多程序员的拥戴,而这篇文章主要讲的是使用rockpi4b的时候,和树莓派之间又有什么不同。本人也

    2023年04月12日
    浏览(34)
  • stm32cubemx配置mpu6050——10分钟0基础到灵活使用

    10分钟速通!你没看错,就是10min,从0基础到灵活运用mpu6050。 不信?往下看看就会:嗷~原来如此 下载github开源代码。 首先声明,此代码不是本人所写,为某俄罗斯大佬提供。 如果你访问不了github不用担心,我在文章最后附上下载下来的文件 软件 根据github开源项目的Readm

    2024年02月03日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包