續上一篇,實現非填充模式顯示數值的目的是在顯示屏上顯示MPU6050的數值,方便後面做調試,這一篇是記錄使用MPU6050的一些過程。
- 所需材料
- 一些修改
- 效果
所需材料
- stm32f103c8t6核心板
- MPU6050
- 1.44寸TFT LCD
- 杜邦線
核心板是帶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顯示效果如下:
移植到這裏就完成了,晃動開發板,數值改變。該程序還可以上傳匿名上位機顯示飛控狀態,挺好用的,上位機的圖忘了拍…。