STM32F103ZET6+MPU9250+0.96寸OLED
MPU9250陀螺仪基本数据读取(定时器)MPU9250陀螺仪角度数据解算
单片机源程序如下:
- /**
- ******************************************************************************
- * MPU9250陀螺仪角度数据解算
- * STM32F103ZET6系统板+MPU9250模块+USB转TTL电平工具+0.96寸OLED
- *
- ******************************************************************************
- */
- #include "main.h"
- int main(void)
- {
- SYS_Init(); //系统初始化总函数
- while(1) //主循环
- {
- MPU_Read(); //MPU6050数据读取
- DATA_Report(); //MPU6050数据上报
- }
- }
- /**
- * @brief 系统初始化总函数
- * @param 无
- * @retval 无
- */
- void SYS_Init(void)
- {
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断优先级分组函数
- delay_init(); //延时函数初始化
- uart_init(115200); //串口初始化为115200
- LED_Init(); //初始化与LED连接的硬件接口
- OLED_Init(); //OLED初始化
- if(MPU_Init() == 0) //初始化MPU9250
- printf("ID读取正常\r\n"); //ID读取正常
- else
- printf("ID读取不正常\r\n"); //ID读取不正常
- while(1)
- {
- error = mpu_dmp_init(); //初始化mpu_dmp库
- printf("ERROR:%d\r\n",error); //串口显示初始化错误值
- switch (error) //对不同错误值类型判断
- {
- case 0:printf("DMP库初始化正常\r\n");break;
- case 1:printf("设置传感器失败\r\n");break;
- case 2:printf("设置FIFO失败\r\n");break;
- case 3:printf("设置采样率失败\r\n");break;
- case 4:printf("加载dmp固件失败\r\n");break;
- case 5:printf("设置陀螺仪方向失败\r\n");break;
- case 6:printf("设置dmp功能失败\r\n");break;
- case 7:printf("设置DMP输出速率失败\r\n");break;
- case 8:printf("自检失败\r\n");break;
- case 9:printf("使能DMP失败\r\n");break;
- case 10:printf("初始化MPU6050失败\r\n");break;
- default :printf("未知错误\r\n");break;
- }
- if(error == 0)break; //如果没有错误直接退出循环
- delay_ms(200); //延时
- LED0 =! LED0; //LED0闪烁报错
- sprintf((char *)tmp_buf," ERROR:%d",error);//字符串格式化命令
- OLED_ShowString(0,0,(u8 *)tmp_buf,16); //OLED显示错误值
- OLED_Refresh(); //刷新显存
- }
- delay_ms(999);
- OLED_ShowString(0,0,(u8*)" MPU9250",16); //OLED显示字符串
- OLED_Refresh(); //刷新显存
- }
- /**
- * @brief MPU6050数据读取函数
- * @param 无
- * @retval 无
- */
- void MPU_Read(void)
- {
-
- if(mpu_dmp_get_data(&yaw,&pitch,&roll)==0) //dmp处理得到数据,对返回值进行判断
- {
- printf("Pitch:%f Roll:%f Yaw:%f\r\n",pitch,roll,yaw);//串口输出三轴角度
- mpu9250.speed++; //显示速度自加
- if(mpu9250.speed == 1) //显示速度阈值设置
- {
- mpu9250.flag = 1; //采集成功标志位设置为有效
- mpu9250.speed = 0; //显示速度归零
- }
- }
- else //采集不成功
- {
- mpu9250.flag = 0; //采集成功标志位设置为无效
- }
- }
- /**
- * @brief MPU6050数据上报
- * @param 无
- * @retval 无
- */
- void DATA_Report(void)
- {
- if(mpu9250.flag == 1) //采集成功时
- {
- temp=pitch*100; //赋temp为pitch
- if(temp<0) //对数据正负判断,判断为负时
- {
- temp=-temp; //对负数据取反
- sprintf((char *)tmp_buf," Pitch:-%.3d.%.2d",temp/100,temp%100);//字符串格式化命令
- }
- else //判断为正时
- {
- sprintf((char *)tmp_buf," Pitch: %.3d.%.2d",temp/100,temp%100);//字符串格式化命令
- }
- OLED_ShowString(0,16,(u8 *)tmp_buf,16); //OLED显示字符串
-
- temp=roll*100; //赋temp为pitch
- if(temp<0) //对数据正负判断,判断为负时
- {
- temp=-temp; //对负数据取反
- sprintf((char *)tmp_buf," Roll :-%.3d.%.2d",temp/100,temp%100);//字符串格式化命令
- }
- else //判断为正时
- {
- sprintf((char *)tmp_buf," Roll : %.3d.%.2d",temp/100,temp%100);//字符串格式化命令
- }
- OLED_ShowString(0,48,(u8 *)tmp_buf,16); //OLED显示字符串
-
- temp=yaw*100; //赋temp为pitch
- if(temp<0) //对数据正负判断,判断为负时
- {
- temp=-temp; //对负数据取反
- sprintf((char *)tmp_buf," Yaw :-%.3d.%.2d",temp/100,temp%100);//字符串格式化命令
- }
- else //判断为正时
- {
- sprintf((char *)tmp_buf," Yaw : %.3d.%.2d",temp/100,temp%100);//字符串格式化命令
- }
- OLED_ShowString(0,32,(u8 *)tmp_buf,16); //OLED显示字符串
- OLED_Refresh(); //刷新显存
- LED1=!LED1; //LED闪烁
- mpu9250.flag = 0; //采集成功标志位设置为无效
- }
- else ; //防卡死
- }
复制代码 Keil代码下载:
驱动程序.7z
(259.35 KB, 下载次数: 43)
|