|
#include "stm32f10x.h" // Device header"
#include "OLED.h"
#include "Delay.h"
#include "inv_mpu.h"
#include "Serial.h"
#include "string.h"
#include "Servo.h"
#include "Motor.h"
#include "MPU6050_Exti.h"
#include "MPU6050.h"
float Pitch,Roll,Yaw;
int16_t GX, GY, GZ;
int main(void)
{
delay_init();
OLED_Init();
Serial_Init(); //串口初始化
Servo_Init(); //舵機(jī)初始化
Motor_Init(); //直流電機(jī)初始化
MPU6050_Exti_Init();//為MUP6050配置中斷引腳PB12
MPU6050_DMP_Init(); //MUP6050 DMP庫(kù)初始化
Servo_SetAngle(90);
Motor_SetSpeed(70);
while(1)
{
Serial_Printf("%.2f %.2f %.2f\r\n",Pitch,Roll,Yaw);
delay_ms(50);
OLED_ShowFloatNum(1, 1, Roll, 3, 2, OLED_8X16);
OLED_ShowFloatNum(1, 20, GY, 3, 2, OLED_8X16);
//OLED_ShowFloatNum(1, 40, Yaw, 3, 2, OLED_8X16);
OLED_Update();
}
}
void EXTI15_10_IRQHandler(void)
{
if (EXTI_GetITStatus(EXTI_Line12) == SET) //判斷是否是外部中斷12號(hào)線觸發(fā)的中斷
{
MPU6050_DMP_Get_Data(&Pitch,&Roll,&Yaw);//獲取MPU6050 DMP庫(kù)的角度數(shù)據(jù)
MPU_Get_Gyroscope(&GX,&GY,&GZ); //獲取MPU6050 原始角速度數(shù)據(jù)
EXTI_ClearITPendingBit(EXTI_Line12); //清除外部中斷12號(hào)線的中斷標(biāo)志位
//中斷標(biāo)志位必須清除
} //否則中斷將連續(xù)不斷地觸發(fā),導(dǎo)致主程序卡死
}
問(wèn)題時(shí)這樣的:中斷函數(shù)里有兩個(gè)函數(shù)。第一個(gè)是獲取DMP庫(kù)的數(shù)據(jù),第二個(gè)是獲取陀螺儀原始的數(shù)據(jù)。如何我兩個(gè)函數(shù)同時(shí)運(yùn)行,第一個(gè)函數(shù)就獲取不到數(shù)據(jù),第二個(gè)函數(shù)可以獲取到數(shù)據(jù)。如果我把第二個(gè)函數(shù)注釋掉,第一個(gè)函數(shù)又能獲取數(shù)據(jù)了。我參考別人平衡車(chē)的代碼也是這樣寫(xiě)的,可到了我這里就出現(xiàn)問(wèn)題了,麻煩大神幫忙指點(diǎn)一下!
謝謝了!
|
|