摘要:使用小熊派开发板,通过硬件IIC与MPU6050六轴传感器模块通信,完成相应寄存器配置,成功获取陀螺仪、加速度计数据。

本问主要讲述使用小熊派开发板+MPU6050六轴传感器,获取加速度计以及陀螺仪信息。

一、实验准备

1.实验环境

  • 一块stm32开发板(推荐使用小熊派),以及数据线
  • 已经安装STM32CubeMX
  • 已经安装KeilMDK,并导入stm32开发板对应的芯片包(小熊派使用的是STM32L431RCT6)
  • 一个MPU6050模块(IIC接口)以及杜邦线

2.目标效果

  • 通过CubeMX创建工程并配置参数
  • IIC方式通信,配置MPU6050寄存器
  • 小熊派通过IIC,获取陀螺仪、加速度计数据
  • 串口1重定向输出编码器转动的角度、角速度

二、通过CubeMX生产MDK工程

A.芯片选择

  • 打开CubeMX,进入芯片选择:

  • 选择自己的stm32芯片(即STM32L431RCT6):

B.时钟源RCC设置

  • 更改系统时钟源

系统时钟默认使用内部的高速时钟(HSI),选择使用HSE,时钟更精确

  • 设置外部时钟对应的端口

  • 配置时钟树

STM32L431RCT6系统时钟最大可以为80MHz,我们配置到最大即可

C.参数配置(对应端口设置)

1)配置USART1

使用USART,模式为异步,波特率为115200,无硬件流控制

2)硬件IIC配置

IIC(Inter-Integrated Circuit)其实是IICBus简称,所以中文应该叫集成电路总线,它是一种串行通信总线,使用多主从架构

我们使用小熊派的I2C1,小熊派引出的引脚为PB7->I2C1_SDA,PB6->I2C1_SCL

其他选项我们保持默认即可

3)MPU6050模块

当然,我们还需要了解MPU6050模块的电路,更好的进行配置。当然我们也可以自主制作模块

如果AD0脚(9脚)接地,IIC地址为0X68(不包含最低位);如果AD0脚接V3.3,则IIC地址为0X69(不包含最低位).

可以看到,AD0引脚已经被拉低,所有默认IIC地址为0x68.

最后,生成代码就OK了

D.工程设置

一些基础的设置,包括工程名、存储位置、工程环境、工程中各个文件的组成

E.生成代码

三、编写相应代码

1. 串口1输出重定向

我们知道printf是打印函数,原理是根据传入的字符串参数格式化打印输出到stdout中。我们需要让printf打印到串口之中,只需要在usart.c文件中模仿printf写一个输出函数即可

  • 在添加头文件
  1. /* USER CODE BEGIN 0 */#include <stdarg.h>#include <string.h>#include <stdio.h>/* USER CODE END 0 */
  • 写输出函数
  1. /* USER CODE BEGIN 1 */void UsartPrintf(UART_HandleTypeDef *huart, char *fmt,...){
  2.  
  3. unsigned char UsartPrintfBuf[296];
  4. va_list ap;
  5. unsigned char *pStr = UsartPrintfBuf;
  6.  
  7. va_start(ap, fmt);
  8. vsprintf((char *)UsartPrintfBuf, fmt, ap); //格式化
  9. va_end(ap);
  10.  
  11. while(*pStr != 0)
  12. {
  13. USART1->TDR = *pStr++;
  14. while((USART1->ISR & 0x40) == 0);
  15. }}//注意:在usart.h中添加void UsartPrintf(UART_HandleTypeDef *huart, char *fmt,...);//使用方法:UsartPrintf(&huart1;,"hello world\r\n");/* USER CODE END 1 */

注意:自己添加的代码,需要在begin和end之间

2.写MPU6050驱动

我们创建两个文件,分别是mpu6050.h和mpu6050.c

a).首先我们在mpu6050.h中宏定义相应的寄存器,方便后续使用。

在main函数中,我们首先设置计数器初值为10000,然后打开编码器,每1S获取一次计数器的更新值,判断编码器信息
因为寄存器实在太多,就没有一一列出,可以在附件中查看哦~

b).配置各个寄存器

主要的函数为:IIC读写、初始化MPU6050、设置陀螺仪和加速度计满量程、设置采样率、读取数据

代码附件中有,不一一讲解。

初始化函数

  1. uint8_t MPUInit(void){
  2. uint8_t res;
  3. extern I2C_HandleTypeDef hi2c1;
  4.  
  5. HAL_I2C_Init(&hi2c1;); //初始化IIC
  6.  
  7. /*上电后最好有一定延时,保证数据准确*/
  8. HAL_Delay(500);
  9. MPU_Write_Byte(MPU_PWR_MGMT1_REG,0x80); //复位MPU6050,写入1000 0000
  10. MPU_Write_Byte(MPU_PWR_MGMT1_REG,0x00);//sleep写入0,保持唤醒状态
  11.  
  12. MPU_Set_Gyro_Fsr(3); //陀螺仪满量程±2000
  13. MPU_Set_Accel_Fsr(0); //加速度计满量程±2g
  14. MPU_Set_Rate(50); //设置采样率=50Hz
  15.  
  16. MPU_Write_Byte(MPU_INT_EN_REG,0x00);//关闭所有中断
  17. MPU_Write_Byte(MPU_USER_CTRL_REG,0x00); //关闭从iic
  18. MPU_Write_Byte(MPU_FIFO_EN_REG,0x00); //关闭FIFO
  19. MPU_Write_Byte(MPU_INTBP_CFG_REG,0x80); //INT引脚低电平有效
  20.  
  21. res = MPU_Read_Byte(MPU_DEVICE_ID_REG); //读取地址
  22. UsartPrintf(&huart1;,"\r\nMPU6050:0x%2x\r\n",res);
  23. UsartPrintf(&huart1;,"\r\nMPU6050:0x%2x\r\n",MPU_ADDR);
  24. if(res == MPU_ADDR) //判断地址是否正确
  25. {
  26. MPU_Write_Byte(MPU_PWR_MGMT1_REG,0x01); //001,pll,x轴为参考系统时钟源
  27. MPU_Write_Byte(MPU_PWR_MGMT2_REG,0x00); //都不使用待机模式
  28. MPU_Set_Rate(50);
  29. }else return 1;
  30.  
  31. return 0;}

需要注意到,mpu6050上电后需要有一定延时,保证数据的稳定。重启mpu6050会有睡眠模式,写入关闭睡眠。最后检测并判断IIC地址是否正确

3.main函数

  1. /* USER CODE BEGIN PV */short x;short y;short z;/* USER CODE END PV */
  2. /* USER CODE BEGIN 2 */
  3. MPUInit();
  4. /* USER CODE END 2 */
  5.  
  6. /* Infinite loop */
  7. /* USER CODE BEGIN WHILE */
  8. while (1)
  9. {
  10. /* USER CODE END WHILE */
  11. while(MPU_Get_Gyroscope(&x,&y,&z) !=0);
  12. HAL_Delay(1000);
  13. printf("\r\n陀螺仪:x=-,y=-,z=-\r\n",x,y,z);
  14. while(MPU_Get_Accelerometer(&x,&y,&z) != 0);
  15. HAL_Delay(1000);
  16. printf("\r\n加速度计:x=-,y=-,z=-\r\n",x,y,z);
  17. /* USER CODE BEGIN 3 */
  18. }

四、编译+下载

点击编译后,0 error,0 warning

小熊派连接在电脑上,代码下载到开发板

五、连接硬件

1.将小熊派串口1和电脑相连,即拨到 AT-MUC,按下复位键

2.连接MPU6050

我们只需要使用mpu6050的SDA\SCL\GND\VCC。
即:

  • SDA-->PB7
  • SCL-->PB6
  • GND-->GND
  • VCC-->5V

3.效果

打开串口调试助手,我们手动转动开发板(包括模块),看见陀螺仪和加速度数据不断变化,当静止时数据保持稳定 。

至此,我们已经可以通过小熊派以IIC获取六轴传感器原始数据信息

本文分享自华为云社区《小熊派实践——获取MPU6050六轴原始数据》,原文作者:ttking 。

点击关注,第一时间了解华为云新鲜技术~

如何利用小熊派获取MPU6050六轴原始数据的更多相关文章

  1. 实践案例丨利用小熊派开发板获取土壤湿度传感器的ADC值

    摘要:一文带你用小熊派开发板动手做土壤湿度传感器. 一.实验准备 1.实验环境 一块stm32开发板(推荐使用小熊派),以及数据线 已经安装STM32CubeMX 已经安装KeilMDK,并导入stm ...

  2. Simulink S-Function的使用(以串口接收MPU6050六轴陀螺仪参数为实例)

    S-Function 允许使用自定义C/C++函数作为传递函数,具有可移植性.也可以同样利用MATLAB函数进行相同的运算,看开发者熟悉程度而定. 项目流程 由系统串口接收数据包. 通过S-Funct ...

  3. STM32—驱动六轴MPU6050输出欧拉角

    文章目录 一.MPU6050介绍 1.MPU6050与陀螺仪.加速度计的关系: 2.整体概括 3.引脚说明 4.基本配置及相关寄存器 电源管理寄存器1 陀螺仪配置寄存器 加速度计配置寄存器 FIFO使 ...

  4. 【.NET 与树莓派】六轴飞控传感器(MPU 6050)

    所谓"飞控",其实是重力加速度计和陀螺仪的组合,因为多用于控制飞行器的平衡(无人机.遥控飞机).有同学会问,这货为什么会有六轴呢?咱们常见的不是X.Y.Z三轴吗?重力加速度有三轴, ...

  5. STC8H开发(七): I2C驱动MPU6050三轴加速度+三轴角速度检测模块

    目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...

  6. 手把手教你丨小熊派移植华为 LiteOS-M

    摘要:本文详细讲解如何移植 LiteOS 到小熊派. 本文分享自华为云社区<小熊派移植华为 LiteOS-M(基于MDK)>,作者: JeckXu666. 前言 之前使用小熊派实现了鸿蒙动 ...

  7. 微信小程序把玩(六)模块化

    原文:微信小程序把玩(六)模块化 模块化也就是将一些通用的东西抽出来放到一个文件中,通过module.exports去暴露接口.我们在最初新建项目时就有个util.js文件就是被模块化处理时间的 /* ...

  8. 支付宝小程序获取 user_id(openid) ThinkPHP版

    支付宝小程序获取 user_id(openid) ThinkPHP版 近期支付宝小程序个人公测了,就想着玩一下,没想到就获取用户唯一标识都这么麻烦,微信的openid的话Get请求一下就完事了,支付宝 ...

  9. iOS之 利用通知(NSNotificationCenter)获取键盘的高度,以及显示和隐藏键盘时修改界面的注意事项

    我们在开发中会遇到这样的情况:调用键盘时需要界面有一个调整,避免键盘遮掩输入框. 但实现时你会发现,在不同的手机上键盘的高度是不同的.这里列举一下: //获取键盘的高度 /* iphone 6: 中文 ...

随机推荐

  1. print( "Hello,NumPy!" )

    print( "Hello,NumPy!" ) 学习痛苦啊,今天学,明天丢.这种天气,还是睡觉最舒服了. 咱说归说,闹归闹,但还是得学才行啊. 之前在学习的过程中一直都有记录笔记的 ...

  2. How to using code post packingSlip on Quality Orders Form[AX2009]

    For simple user operation posting packing slip with purchase order. we added a function button on Qu ...

  3. c++11-17 模板核心知识(三)—— 非类型模板参数 Nontype Template Parameters

    类模板的非类型模板参数 函数模板的非类型模板参数 限制 使用auto推断非类型模板参数 模板参数不一定非得是类型,它们还可以是普通的数值.我们仍然使用前面文章的Stack的例子. 类模板的非类型模板参 ...

  4. 将CSV的数据发送到kafka(java版)

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  5. .Net核心依赖项注入:生命周期和最佳实践

    在讨论.Net的依赖注入(DI)之前,我们需要知道我们为什么需要使用依赖注入 依赖反转原理(DIP): DIP允许您将两个类解耦,否则它们会紧密耦合,这有助于提高可重用性和更好的可维护性 DIP介绍: ...

  6. nginx开启目录浏览

    使用nginx作为下载站点,开启目录浏览的功能 在/etc/nginx/sites-enabled/default中添加: autoindex on ; autoindex_exact_size of ...

  7. FreeMark导出word文件

    1.编辑好word 2.将word模板另存为xml格式, 把需要动态生成的文字用${xxx}代替 eg: 张强 替换为:${name} 注意:图片是很长的一个base64的字符,同样替换就好 比如替换 ...

  8. kettle连接报错

    如何查看端口号 cmd命令行 输入mysql -u root -p密码进入mysql 输入show global variables like 'port'; 就可以看到端口号3306 测试数据库链接 ...

  9. VScode,code::blocksC语言编译运行出现不支持的16位应用程序解决方法

    最近,莫名其妙c代码就是编译运行不了,老是提示不支持的16位应用程序 然后网上找了各种教程 只有这个成功了(害得我还升了下系统) 实现进入Windows设置 然后点更新和安全--恢复 然后点高级启动- ...

  10. 2020-11-02(三年之约D92)-优秀不是一种行为,而是一种习惯

    1.阅读:<软技能-代码之外的生存指南>- 第45章 培养习惯:刷新你的代码 成就我们的恰恰就是那些不断重复做的事情.因此,优秀不是一种行为,而是一种习惯--亚里士多德 习惯主要由三个要素 ...