续上一篇,实现非填充模式显示数值的目的是在显示屏上显示MPU6050的数值,方便后面做调试,这一篇是记录使用MPU6050的一些过程。
所需材料
核心板是带TFT LCD 接口的,图片顺便贴出来(侵权请联系我删除):
MPU6050是原子自己生产的,去他们店铺搜索就行了,这里就不贴了。
TFT看我上一篇帖子,也不贴…。
修改程序(移植原子mini板的MPU6050)
因为MPU6050是使用IIC驱动的,因此需要初始化IIC相关的接口。这个核心板可使用两路IIC,原理图如下:
我这里使用的是PB6和PB7,初始化如下:
//初始化IIC
void MPU_IIC_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//先使能外设IO PORTB时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7; // 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化GPIO
GPIO_SetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7); //PB6,PB7 输出高
}
下面的IO口操作函数的修改很重要:
//IO方向设置PB10、PB11
//#define MPU_SDA_IN() {GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=8<<12;}
//#define MPU_SDA_OUT() {GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=3<<12;}
//IO操作函数
//#define MPU_IIC_SCL PBout(10) //SCL
//#define MPU_IIC_SDA PBout(11) //SDA
//#define MPU_READ_SDA PBin(11) //输入SDA
//IO方向设置PB6、PB7
#define MPU_SDA_IN() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)8<<28;}
#define MPU_SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)3<<28;}
//IO操作函数
#define MPU_IIC_SCL PBout(6) //SCL
#define MPU_IIC_SDA PBout(7) //SDA
#define MPU_READ_SDA PBin(7) //输入SDA
关于操作IO口寄存器CRL和CRH的说明,可以参考下面博客:https://blog.csdn.net/qq_22520215/article/details/72357076
当初使用F429开发的时候也碰到了这个点,翻了翻当时的代码,自己的理解如下:
主函数如下:
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "mpu6050.h"
#include "inv_mpu.h"
#include "niming.h"
#include "lcd.h"
#include "GUI.h"
int main(void)
{
u8 t=0,report=1; //默认开启上报
float pitch,roll,yaw; //欧拉角
short aacx,aacy,aacz; //加速度传感器原始数据
short gyrox,gyroy,gyroz; //陀螺仪原始数据
short temp;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_init(500000); //串口初始化为500000
delay_init(); //延时函数初始化
SystemInit();
LED_Init();
MPU_Init(); //初始化MPU6050
LCD_Init();
LCD_Clear(WHITE); //清屏
POINT_COLOR=RED;//设置字体为红色
LCD_ShowString(0,10,16,"MPU6050 DATASHOW",1);
while(mpu_dmp_init())
{
delay_ms(200);
}
POINT_COLOR=BLUE;
LCD_ShowString(0,30,16," Temp: . C",1);
LCD_ShowString(0,50,16,"Pitch: . P",1);
LCD_ShowString(0,70,16," Roll: . R",1);
LCD_ShowString(0,90,16," Yaw: . Y",1);
while(1)
{
if(mpu_dmp_get_data(&pitch,&roll,&yaw)==0)
{
temp=MPU_Get_Temperature(); //得到温度值
MPU_Get_Accelerometer(&aacx,&aacy,&aacz); //得到加速度传感器数据
MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz); //得到陀螺仪数据
if(report)mpu6050_send_data(aacx,aacy,aacz,gyrox,gyroy,gyroz);//用自定义帧发送加速度和陀螺仪原始数据
if(report)usart1_report_imu(aacx,aacy,aacz,gyrox,gyroy,gyroz,(int)(roll*100),(int)(pitch*100),(int)(yaw*10));//上报匿名上位机
if((t%10)==0)
{
//温度
if(temp<0)
{
LCD_ShowChar(48,30,BLUE,WHITE,'-',16,0);//显示负号
temp=-temp;//转成正数
}
else LCD_ShowChar(48,30,BLUE,WHITE,' ',16,0);//去掉负号
LCD_ShowNum(48+8,30,temp/100,3,16);//显示整数部分
LCD_ShowNum(48+8+30,30,temp%10,1,16);//显示小数部分
//Pitch
temp=pitch*10;
if(temp<0)
{
LCD_ShowChar(48,50,BLUE,WHITE,'-',16,0);//显示负号
temp=-temp;//转成正数
}
else LCD_ShowChar(48,50,BLUE,WHITE,' ',16,0);//去掉负号
LCD_ShowNum(48+8,50,temp/10,3,16);//显示整数部分
LCD_ShowNum(48+8+30,50,temp%10,1,16);//显示小数部分
//Roll
temp=roll*10;
if(temp<0)
{
LCD_ShowChar(48,70,BLUE,WHITE,'-',16,0);//显示负号
temp=-temp;//转成正数
}
else LCD_ShowChar(48,70,BLUE,WHITE,' ',16,0);//去掉负号
LCD_ShowNum(48+8,70,temp/10,3,16);//显示整数部分
LCD_ShowNum(48+8+30,70,temp%10,1,16);//显示小数部分
//Yaw
temp=yaw*10;
if(temp<0)
{
LCD_ShowChar(48,90,BLUE,WHITE,'-',16,0);//显示负号
temp=-temp;//转成正数
}
else LCD_ShowChar(48,90,BLUE,WHITE,' ',16,0);//去掉负号
LCD_ShowNum(48+8,90,temp/10,3,16);//显示整数部分
LCD_ShowNum(48+8+30,90,temp%10,1,16);//显示小数部分
t=0;
//LED0=!LED0;
}
}
t++;
}
}
在TFT LCD显示效果如下:
移植到这里就完成了,晃动开发板,数值改变。该程序还可以上传匿名上位机显示飞控状态,挺好用的,上位机的图忘了拍…。