本文紧张讲述利用小熊派开拓板+MPU6050六轴传感器,获取加速度计以及陀螺仪信息。
一、实验准备1.实验环境
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 world\r\n");/ 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;,"\r\nMPU6050:0x%2x\r\n",res); UsartPrintf(&huart1;,"\r\nMPU6050:0x%2x\r\n",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("\r\n陀螺仪:x=-,y=-,z=-\r\n",x,y,z); while(MPU_Get_Accelerometer(&x,&y,&z) != 0); HAL_Delay(1000); printf("\r\n加速度计:x=-,y=-,z=-\r\n",x,y,z); / USER CODE BEGIN 3 / }
四、编译+下载
点击编译后,0 error,0 warning
小熊派连接在电脑上,代码下载到开拓板
五、连接硬件
1.将小熊派串口1和电脑相连,即拨到 AT-MUC,按下复位键
2.连接MPU6050
我们只须要利用mpu6050的SDA\SCL\GND\VCC。即:
SDA-->PB7SCL-->PB6GND-->GNDVCC-->5V3.效果
打开串口调试助手,我们手动迁徙改变开拓板(包括模块),瞥见陀螺仪和加速度数据不断变革,当静止时数据保持稳定 。
至此,我们已经可以通过小熊派以IIC获取六轴传感器原始数据信息
本文分享自华为云社区《小熊派实践——获取MPU6050六轴原始数据》,原文作者:ttking 。
点击关注,第一韶光理解华为云新鲜技能~