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顯示效果如下:
在這裏插入圖片描述
移植到這裏就完成了,晃動開發板,數值改變。該程序還可以上傳匿名上位機顯示飛控狀態,挺好用的,上位機的圖忘了拍…。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章