标题:
基于STM32F103ZET6驱动MPU9250程序 OLED显示
[打印本页]
作者:
@what1
时间:
2022-2-10 15:39
标题:
基于STM32F103ZET6驱动MPU9250程序 OLED显示
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)
2022-2-13 05:06 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
qinyuning
时间:
2022-3-3 22:39
其他数据怎么读 加速度 磁力
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1