
本文主要讲述使用小熊派开发板+MPU6050六轴传感器,获取加速度计以及陀螺仪信息。一、实验准备1.实验环境一块stm32开发板(推荐使用小熊派),以及数据线已经安装STM32CubeMX已经安装Ke......
本文主要讲述使用小熊派开发板+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-IntegratedCircuit)其实是IICBus简称,所以中文应该叫集成电路总线,它是一种串行通信总线,使用多主从架构
我们使用小熊派的I2C1,小熊派引出的引脚为PB7-I2C1_SDA,PB6-I2C1_SCL
其他选项我们保持默认即可

3)MPU6050模块
当然,我们还需要了解MPU6050模块的电路,更好的进行配置。当然我们也可以自主制作模块
如果AD0脚(9脚)接地,IIC地址为0X68(不包含最低位);如果AD0脚接,则IIC地址为0X69(不包含最低位).

可以看到,AD0引脚已经被拉低,所有默认IIC地址为0x68.
最后,生成代码就OK了
D.工程设置
一些基础的设置,包括工程名、存储位置、工程环境、工程中各个文件的组成


E.生成代码

1.串口1输出重定向
我们知道printf是打印函数,原理是根据传入的字符串参数格式化打印输出到stdout中。我们需要让printf打印到串口之中,只需要在文件中模仿printf写一个输出函数即可
在添加头文件
/*USERCODEBEGIN0*/#/*USERCODEEND0*/
写输出函数
/*USERCODEBEGIN1*/voidUsartPrintf(UART_HandleTypeDef*huart,char*fmt,){unsignedcharUsartPrintfBuf[296];va_listap;unsignedchar*pStr=UsartPrintfBuf;va_start(ap,fmt);vsprintf((char*)UsartPrintfBuf,fmt,ap);//格式化va_(ap);while(*pStr!=0){USART1-TDR=*pStr++;while((USART1-ISR0x40)==0);}}//注意:在中添加voidUsartPrintf(UART_HandleTypeDef*huart,char*fmt,);//使用方法:UsartPrintf(huart1;,"helloworld\r\n");/*USERCODEEND1*/注意:自己添加的代码,需要在begin和之间
2.写MPU6050驱动
我们创建两个文件,分别是和
a).首先我们在中宏定义相应的寄存器,方便后续使用。
在main函数中,我们首先设置计数器初值为10000,然后打开编码器,每1S获取一次计数器的更新值,判断编码器信息
因为寄存器实在太多,就没有一一列出,可以在附件中查看哦~

b).配置各个寄存器
主要的函数为:IIC读写、初始化MPU6050、设置陀螺仪和加速度计满量程、设置采样率、读取数据
代码附件中有,不一一讲解。
初始化函数
uint8_tMPUInit(void){uint8_tres;externI2C_HandleTypeDefhi2c1;HAL_I2C_Init(hi2c1;);//初始化IIC/*上电后最好有一定延时,保证数据准确*/HAL_Delay(500);MPU_Write_Byte(MPU_PWR_MGMT1_REG,0x80);//复位MPU6050,写入10000000MPU_Write_Byte(MPU_PWR_MGMT1_REG,0x00);//sleep写入0,保持唤醒状态MPU_Set_Gyro_Fsr(3);//陀螺仪满量程±2000MPU_Set_Accel_Fsr(0);//加速度计满量程±2gMPU_Set_Rate(50);//设置采样率=50HzMPU_Write_Byte(MPU_INT_EN_REG,0x00);//关闭所有中断MPU_Write_Byte(MPU_USER_CTRL_REG,0x00);//关闭从iicMPU_Write_Byte(MPU_FIFO_EN_REG,0x00);//关闭FIFOMPU_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);}elsereturn1;return0;}需要注意到,mpu6050上电后需要有一定延时,保证数据的稳定。重启mpu6050会有睡眠模式,写入关闭睡眠。最后检测并判断IIC地址是否正确
3.main函数
/*USERCODEBEGINPV*/shortx;shorty;shortz;/*USERCODEENDPV*/
/*USERCODEBEGIN2*/MPUInit();/*USERCODEEND2*//*Infiniteloop*//*USERCODEBEGINWHILE*/while(1){/*USERCODEENDWHILE*/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);/*USERCODEBEGIN3*/}四、编译+下载
小熊派连接在电脑上,代码下载到开发板

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

2.连接MPU6050
我们只需要使用mpu6050的SDA\SCL\GND\VCC。
即:
SDA--PB7
SCL--PB6
GND--GND
VCC--5V
3.效果
打开串口调试助手,我们手动转动开发板(包括模块),看见陀螺仪和加速度数据不断变化,当静止时数据保持稳定。
至此,我们已经可以通过小熊派以IIC获取六轴传感器原始数据信息