STM32使用MPU6050在TFT_LCD上显示数据

续上一篇,实现非填充模式显示数值的目的是在显示屏上显示MPU6050的数值,方便后面做调试,这一篇是记录使用MPU6050的一些过程。

  • 所需材料
  • 一些修改
  • 效果

所需材料

  1. stm32f103c8t6核心板
  2. MPU6050
  3. 1.44寸TFT LCD
  4. 杜邦线

核心板是带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显示效果如下:
在这里插入图片描述
移植到这里就完成了,晃动开发板,数值改变。该程序还可以上传匿名上位机显示飞控状态,挺好用的,上位机的图忘了拍…。

发布了17 篇原创文章 · 获赞 47 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_42827999/article/details/103339332