摘要:应用小熊派开发板,通过硬件 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 写一个输入函数即可
- 在增加头文件
/ USER CODE BEGIN 0 /#include <stdarg.h>#include <string.h>#include <stdio.h>/ USER CODE END 0 /
- 写输入函数
/ USER CODE BEGIN 1 /void UsartPrintf(UART_HandleTypeDef huart, char fmt,…){
unsigned char UsartPrintfBuf[296];
va_list ap;
unsigned char *pStr = UsartPrintfBuf;
va_start(ap, fmt);
vsprintf((char *)UsartPrintfBuf, fmt, ap); // 格式化
va_end(ap); while(*pStr != 0)
{
USART1->TDR = *pStr++; while((USART1->ISR & 0x40) == 0);
}}// 留神:在 usart.h 中增加 void UsartPrintf(UART_HandleTypeDef huart, char fmt,…);// 应用办法:UsartPrintf(&huart1;,”hello worldrn”);/ USER CODE END 1 /
留神:本人增加的代码,须要在 begin 和 end 之间
2. 写 MPU6050 驱动
咱们创立两个文件,别离是 mpu6050.h 和 mpu6050.c
a). 首先咱们在 mpu6050.h 中宏定义相应的寄存器,不便后续应用。
在 main 函数中,咱们首先设置计数器初值为 10000,而后关上编码器,每 1S 获取一次计数器的更新值,判断编码器信息
因为寄存器切实太多,就没有一一列出,能够在附件中查看哦~
b). 配置各个寄存器
次要的函数为:IIC 读写、初始化 MPU6050、设置陀螺仪和加速度计满量程、设置采样率、读取数据
代码附件中有,不一一解说。
初始化函数
uint8_t MPUInit(void){
uint8_t res; extern I2C_HandleTypeDef hi2c1;
HAL_I2C_Init(&hi2c1;); // 初始化 IIC
/上电后最好有肯定延时,保证数据精确/ HAL_Delay(500);
MPU_Write_Byte(MPU_PWR_MGMT1_REG,0x80); // 复位 MPU6050, 写入 1000 0000
MPU_Write_Byte(MPU_PWR_MGMT1_REG,0x00);//sleep 写入 0,放弃唤醒状态
MPU_Set_Gyro_Fsr(3); // 陀螺仪满量程±2000
MPU_Set_Accel_Fsr(0); // 加速度计满量程±2g
MPU_Set_Rate(50); // 设置采样率 =50Hz
MPU_Write_Byte(MPU_INT_EN_REG,0x00);// 敞开所有中断
MPU_Write_Byte(MPU_USER_CTRL_REG,0x00); // 敞开从 iic
MPU_Write_Byte(MPU_FIFO_EN_REG,0x00); // 敞开 FIFO
MPU_Write_Byte(MPU_INTBP_CFG_REG,0x80); //INT 引脚低电平无效
res = MPU_Read_Byte(MPU_DEVICE_ID_REG); // 读取地址
UsartPrintf(&huart1;,”rnMPU6050:0x%2xrn”,res);
UsartPrintf(&huart1;,”rnMPU6050:0x%2xrn”,MPU_ADDR); if(res == MPU_ADDR) // 判断地址是否正确
{
MPU_Write_Byte(MPU_PWR_MGMT1_REG,0x01); //001,pll,x 轴为参考零碎时钟源
MPU_Write_Byte(MPU_PWR_MGMT2_REG,0x00); // 都不应用待机模式
MPU_Set_Rate(50);
}else return 1; return 0;}
须要留神到,mpu6050 上电后须要有肯定延时,保证数据的稳固。重启 mpu6050 会有睡眠模式,写入敞开睡眠。最初检测并判断 IIC 地址是否正确
3.main 函数
/ USER CODE BEGIN PV /short x;short y;short z;/ USER CODE END PV /
/ USER CODE BEGIN 2 / MPUInit(); / USER CODE END 2 /
/ Infinite loop /
/ USER CODE BEGIN WHILE /
while (1)
{/ USER CODE END WHILE /
while(MPU_Get_Gyroscope(&x,&y,&z) !=0);
HAL_Delay(1000);
printf(“rn 陀螺仪:x=-,y=-,z=-rn”,x,y,z); while(MPU_Get_Accelerometer(&x,&y,&z) != 0);
HAL_Delay(1000);
printf(“rn 加速度计:x=-,y=-,z=-rn”,x,y,z); / USER CODE BEGIN 3 / }
四、编译 + 下载
点击编译后,0 error,0 warning
小熊派连贯在电脑上,代码下载到开发板
五、连贯硬件
1. 将小熊派串口 1 和电脑相连,即拨到 AT-MUC, 按下复位键
2. 连贯 MPU6050
咱们只须要应用 mpu6050 的 SDASCLGNDVCC。
即:
- SDA–>PB7
- SCL–>PB6
- GND–>GND
- VCC–>5V
3. 成果
关上串口调试助手,咱们手动转动开发板(包含模块),看见陀螺仪和加速度数据一直变动,当静止时数据保持稳定。
至此,咱们曾经能够通过小熊派以 IIC 获取六轴传感器原始数据信息
本文分享自华为云社区《小熊派实际——获取 MPU6050 六轴原始数据》,原文作者:ttking。
点击关注,第一工夫理解华为云陈腐技术~