这个是全网最详细的STM32项目教学视频。
第一篇CSDN文章在这里在这里:
75
V3:HAL库开发、手把手教学下面功能:PID速度控制、PID循迹、PID跟随、遥控、避障、PID角度控制、openmv视觉控制、电磁循迹、FreeRTOS、K210视觉智能车(更新中)、K230视觉智能车(更新中)、MSPM0G3507视觉智能车(更新中)
23.2.1-编写MPU6050初始化
前面代码我们都把6050代码注释掉了,是因为MPU605代码有循环容易卡死。我们增加多次循环后就退出,这样就不会卡死了。
复制23-1_LED_FreeRTOS的代码,然后命名23-2_LED_FreeRTOS
我们把之前注释掉的MPU6050初始化代码修改成最多初始化3次,3次都不能初始化成功就退出并且串口一和蓝牙打印。初始化函数返回值。
这个初始化在main.c里面
// while(MPU_Init()!=0);//初始化MPU6050模块的MPU 注意初始化阶段不要移动小车
for(uint8_t i = 0; i < 3 ; i++)
{
uint8_t mpu_init_result = MPU_Init(); // 保存函数返回值
if(mpu_init_result == 0)//初始化成功
{
printf("In main.c:MPU_Init() was initialized successfullyn");//串口1 输出初始化成功 注意! 这个要写再串口1初始化之后
sprintf((char*)Usart3String, "In main.c:MPU_Init() was initialized successfullyrn");//蓝牙输出 初始化成功
HAL_UART_Transmit(&huart3,( uint8_t *)Usart3String,strlen(( const char *)Usart3String),50);//阻塞式发送通过串口三输出字符 strlen:计算字符串大小
break;
}
if(i == 3-1 )//说明初始化失败
{
printf("In main.c:MPU_Init() failed to initialize last return value: %dn", mpu_init_result);//串口1 输出初始化失败 注意! 这个要写再串口1初始化之后 初始化失败及最后一次返回值
sprintf((char*)Usart3String, "In main.c:MPU_Init() failed to initialize last return value: %dn", mpu_init_result);//蓝牙输出 初始化失败
HAL_UART_Transmit(&huart3,( uint8_t *)Usart3String,strlen(( const char *)Usart3String),50);//阻塞式发送通过串口三输出字符 strlen:计算字符串大小
}
}
// while(mpu_dmp_init()!=0);//mpu6050,dmp初始化
for(uint8_t i = 0; i < 3 ; i++)
{
uint8_t mpu_dmp_init_result = mpu_dmp_init();
if(mpu_dmp_init_result == 0)//初始化成功
{
printf("In main.c:mpu_dmp_init() was initialized successfullyn");//串口1 输出初始化成功 注意! 这个要写再串口1初始化之后
sprintf((char*)Usart3String, "In main.c:mpu_dmp_init() was initialized successfullyrn");//蓝牙输出 初始化成功
HAL_UART_Transmit(&huart3,( uint8_t *)Usart3String,strlen(( const char *)Usart3String),50);//阻塞式发送通过串口三输出字符 strlen:计算字符串大小
break;
}
if(i == 3-1 )//说明初始化失败
{
printf("In main.c: mpu_dmp_init() failed to initialize, last return value: %dn", mpu_dmp_init_result);//串口1 输出初始化失败 注意! 这个要写再串口1初始化之后
sprintf((char*)Usart3String, "In main.c: mpu_dmp_init() failed to initialize, last return value: %dn", mpu_dmp_init_result);//蓝牙输出 初始化成功
HAL_UART_Transmit(&huart3,( uint8_t *)Usart3String,strlen(( const char *)Usart3String),50);//阻塞式发送通过串口三输出字符 strlen:计算字符串大小
}
}
然后我们修改一下OLED显示任务的内容,循环读取20次数据如果都失败就退出循环
注意这里设置读取次数不能太少,测试发现小于5次会经常读取失败
OLED显示的任务需要读取MPU605数据
for(uint8_t i = 0; i < 20 ; i++)
{
if(mpu_dmp_get_data(&pitch,&roll,&yaw) == 0)//获得MPU6050数据成功
{
printf("mpu_dmp_get_data() Data for successn");//串口1 输出数据获取成功 注意! 这个要写再串口1初始化之后
break;
}
if(i == 20-1 )//i已经等于(20-1)次 还没有退出循环说明 说明输出读取失败
{
printf("mpu_dmp_get_data() Data acquisition failuren");//串口1 输出数据获取失败 注意! 这个要写再串口1初始化之后
}
}
再修改一下模式5 里面获得MPU6050数据的部分
//获得6050数据
//如果6050无法获得正确数据,可以连接串口1 查看相关输出
//这里的总体
for(uint8_t i = 0; i < 20 ; i++)
{
if(mpu_dmp_get_data(&pitch,&roll,&yaw) == 0)//获得MPU6050数据成功
{
printf("mpu_dmp_get_data() Data for successn");//串口1 输出数据获取成功 注意! 这个要写再串口1初始化之后
break;
}
if(i == 20-1 )//i已经等于(20-1)次 还没有退出循环说明 说明输出读取失败
{
printf("mpu_dmp_get_data() Data acquisition failuren");//串口1 输出数据获取失败 注意! 这个要写再串口1初始化之后
}
}
23.2.2-测试MPU6050和角度控制
具体演示测试见视频