CubeMX配置STM32驱动MPU6050(包含DMP)并且在0.96寸OLED上显示
一、使用CubeMX进行相关配置 |
1、配置OLED的IIC接口
OLED的具体使用方法我就不细说了,我前面的文章里面有讲OLED的,如果有需要可以去看看。
2、配置MPU6050的接口
我用MPU6050使用的是软件IIC(其实是只找到软件IIC的驱动),所以我们只需要配置两个GPIO口就可以实现对MPU6050的控制了。
这里我使用的是PB8、9,这里特别注意的是在User Label
那儿需要将两个引脚分别设置为MPU6050_SCL和MPU6050_SDA,因为这里涉及到驱动函数里面的宏定义,这样设置之后方便以后驱动函数的移植。
我使用的是C8T6,时钟树我就是配置的最常见的72MHZ。
二、使用keil 5 进一步开发 |
1、引入OLED和MPU6050的驱动文件
OLED的文件在我前面的文章里面给出来了,我这儿就只给出MPU6050的文件了:
资源上传了,因为里面是直接包括DMP的直接下载比较方便,原本我打算下面把所有的文件将代码的方式给出来的,但是都要写完了才发现篇幅太长了是发不出来的,而且越写到后面字数多了浏览器就很卡,所以你们还是直接下载吧。
然后将驱动文件加到keil里面,记得添加路径
具体的函数在OLED和MPU6050的驱动文件里面都有说明。
2、引入头文件、定义变量
/* USER CODE BEGIN Includes */
#include "stdio.h"
//mpu6050文件
#include "IIC.h"
#include "mpu6050.h"
#include "inv_mpu.h"
#include "inv_mpu_dmp_motion_driver.h"
//
#include "oled.h"
/* USER CODE END Includes */
/* USER CODE BEGIN 0 */
float pitch,roll,yaw; //欧拉角
short aacx,aacy,aacz; //加速度传感器原始数据
short gyrox,gyroy,gyroz; //陀螺仪原始数据
float temp; //温度
/* USER CODE END 0 */
示例:
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 */
OLED_Init();
OLED_Clear();
MPU_Init();
mpu_dmp_init();
if(MPU_Init()==0&&mpu_dmp_init()==0)
{
printf("mpu6050初始化成功\r\n");//我是串口和OLED都设置了显示的,所以这儿多了
// 一个printf,下面那个printf也是
OLED_ShowString(0,0,"successfully",16);
}
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
// OLED_ShowNum(24,2,a,3,16);
// HAL_Delay(100);
// a++;
HAL_Delay(500);
while(mpu_dmp_get_data(&pitch, &roll, &yaw)); //必须要用while等待,才能读取成功
MPU_Get_Accelerometer(&aacx,&aacy, &aacz); //得到加速度传感器数据
MPU_Get_Gyroscope(&gyrox, &gyroy, &gyroz); //得到陀螺仪数据
temp=MPU_Get_Temperature(); //得到温度信息
printf("X:%.1f Y:%.1f Z:%.1f %.2f℃ \r\n",roll,pitch,yaw,temp/100);//串口1输出采集信息
OLED_ShowString(0,2,"roll:",16);
OLED_ShowDecimal(40,2,roll,16);
OLED_ShowString(0,4,"pitch:",16);
OLED_ShowDecimal(48,4,pitch,16);
OLED_ShowString(0,6,"yaw:",16);
OLED_ShowDecimal(32,6,yaw,16);
/* USER CODE END WHILE */
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
效果图如下:
对了,上面的显示小数那个函数在我前面的OLED的介绍里面没有,是后面自己加上去的,需要自己重新加一下,不过这个函数还有点问题,就是小数点后面的显示位数那儿,我设置为两位但有时候是现实三位;设置为一位又有时会显示两位。我还没有找到原因,如果有知道的可以联系我帮我讲讲这个。谢谢啦文章来源:https://www.toymoban.com/news/detail-650700.html
//显示小数,小数点前三位,小数点后两位
void OLED_ShowDecimal(uint8_t x,uint8_t y,float num,uint8_t size)
{
float a=0;
if(num>=0)
{
a=10*(num-(int)num);
OLED_ShowNum(x,y,(int)num,3,size);
OLED_ShowChar(x+24,y,'.',size);
OLED_ShowNum(x+32,y,(int)a,1,size);
}
else
{
num=0-num;
OLED_ShowChar(x,y,'-',size);
a=10*(num-(int)num);
OLED_ShowNum(x+8,y,(int)num,3,size);
OLED_ShowChar(x+32,y,'.',size);
OLED_ShowNum(x+40,y,(int)a,1,size);
}
}
如果有什么错误欢迎各位指正哦。文章来源地址https://www.toymoban.com/news/detail-650700.html
到了这里,关于【CubeMX配置STM32驱动MPU6050】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!