電子發燒友App

硬聲App

創作
電子發燒友網>電子資料下載>單片機>基于英飛凌TC264D的MPU6050調用DMP的移值

基于英飛凌TC264D的MPU6050調用DMP的移值

2021-12-06 | pdf | 未知 | 次下載 | 免費

資料介紹

為了準備第十五屆全國大學生智能車競賽,信標組要求使用英飛凌單片機,選擇使用MPU6050陀螺儀,花了好多天成功完成了調用DMP的移值,程序用TASKING編譯,參考龍邱的例程和野火stm32的例程。
看網上沒有關于TC264D移值的資料,特地記錄一下。

MPU6050接線(軟件模擬I2C通信)

共有八個引腳用到的就只有五個,VCC(3.3V供電)、GND(接地)、SCL(P13.1)、SDL(P13.2)、AD0(接地,也可接3.3V需要更改地址)。

程序部分

參考野火的STM32例程復制以下幾個文件(也是官方提供的庫文件)對其中的程序修改調用。;
程序中要改的位置很簡單
照著官方的庫寫一個新的宏定義,i2c_write(I2C寫)、i2c_read(I2C讀)、delay_ms(延時)、get_ms(獲取時間)改成自己的函數。


在這個我也不知道叫啥的地方加上這兩行東西
MOTION_DRIVER_TARGET_TC264
MPU6050
大概作用就是申明一下用的芯片(這里是TC264),和陀螺儀型號(這里是MPU6050)。


準備好這些兩個部分就開始寫自己要用的函數
主要就是兩個函數
mpu6050_dmp_init 初始化(按步驟進行調用)
Read_DMP 讀取四元數解算出角度

#define DEFAULT_MPU_HZ  (20)
#define q30 ((1<<30)*1.0f)
struct platform_data_s {
    signed char orientation[9];
};
static struct platform_data_s gyro_pdata = {	
	.orientation = { 1, 0, 0,
                   	  0, 1, 0,
                   	  0, 0, 1}
};
static unsigned short inv_row_2_scale(const signed char *row)
{
    unsigned short b;
    if (row[0] > 0)
        b = 0;
    else if (row[0] < 0)
        b = 4;
    else if (row[1] > 0)
        b = 1;
    else if (row[1] < 0)
        b = 5;
    else if (row[2] > 0)
     	b = 2; 
    else if (row[2] < 0)
        b = 6;
    else
        b = 7;
    return b;
}       



int mpu6050_dmp_init(void)
{
	 struct int_param_s int_param;
	 unsigned short dmp_features;
	 unsigned char accel_fsr;
	 unsigned short gyro_rate, gyro_fsr;
	 led_control(LEDALL, ON);
	 if(mpu_init(&int_param))
 	{
	        OLED_P8x16Str(15,2,"6050 Test Fail \r\n");
	          while (1);
	}
	if(mpu_set_sensors(INV_XYZ_GYRO | INV_XYZ_ACCEL))	
	return -1;
     	if(mpu_configure_fifo(INV_XYZ_GYRO | INV_XYZ_ACCEL))
    	return -2;
    	if(mpu_set_sample_rate(DEFAULT_MPU_HZ))
    	return -3;
    	if(mpu_get_sample_rate(&gyro_rate))
     	return -4;
     	if(mpu_get_gyro_fsr(&gyro_fsr))
     	return -5;    
     	if(mpu_get_accel_fsr(&accel_fsr))
     	return -6;
     	if(dmp_load_moTIon_driver_firmware())
     	return -7;
	if(dmp_set_orientaTIon(inv_orientaTIon_matrix_to_scalar(gyro_pdata.orientation)))
    	return -8
    	dmp_features = DMP_FEATURE_6X_LP_QUAT | DMP_FEATURE_TAP |
        DMP_FEATURE_ANDROID_ORIENT | DMP_FEATURE_SEND_RAW_ACCEL | DMP_FEATURE_SEND_CAL_GYRO |
        DMP_FEATURE_GYRO_CAL;
       	if(dmp_enable_feature(dmp_features))
   	return -8;
      	if(dmp_set_fifo_rate(DEFAULT_MPU_HZ))
     	return -9;
   	if(mpu_set_dmp_state(1))
    	return -10;

   	return 0;
}

uint8_t Read_DMP(float* Pitch,float* Roll,float* Yaw)
{	
	short gyro[3], accel[3], sensors;
        float q0=1.0f,q1=0.0f,q2=0.0f,q3=0.0f;
        unsigned long sensor_timestamp;
        unsigned char more;
        long quat[4];
        if(dmp_read_fifo(gyro, accel, quat, &sensor_timestamp, &sensors, &more)) return 1;
        	if (sensors & INV_WXYZ_QUAT)
                {
                     q0=quat[0] / q30;
                     q1=quat[1] / q30;
                     q2=quat[2] / q30;
                     q3=quat[3] / q30;
                     *Pitch = (float)asin(-2 * q1 * q3 + 2 * q0* q2)* 57.3;
                     *Roll = (float)atan2(2 * q2 * q3 + 2 * q0 * q1, -2 * q1 * q1 - 2 * q2* q2 + 1)* 57.3; // roll
                     *Yaw = (float)atan2(2*(q1*q2 + q0*q3),q0*q0+q1*q1-q2*q2-q3*q3) * 57.3;
                     return 0;
                }
                else
                    return 2;
}

接下來就是主函數的部分

int core1_main (void)
{
	char txt[30];
 	uint8_t a;
 	IfxCpu_enableInterrupts();
 	    /*
     	     * 關閉看門狗
             * */
    	IfxScuWdt_disableCpuWatchdog (IfxScuWdt_getCpuWatchdogPassword ());
    	//等待CPU0 初始化完成
   	while(!IfxCpu_acquireMutex(&mutexCpu0InitIsOk));
    	/* 用戶代碼 */
    	IIC_Init();
    	STM_InitConfig(STM0, STM_Channel_0, 50000);
 	OLED_Init();
 	if(mpu6050_dmp_init())
   	{
  		sprintf(txt,"dmp:%d", mpu6050_dmp_init());
  		OLED_P6x8Str(0,6,txt);
  		while(1);
  	}
  	while(1)
  	{
  		a = Read_DMP(&Pitch, &Roll, &Yaw);
		sprintf(txt,"Pitch:%.2f", Pitch);
		OLED_P6x8Str(0,0,txt);
		sprintf(txt,"Roll: %.2f", Roll);
  		OLED_P6x8Str(0,1,txt);
  		sprintf(txt,"Yaw:  %.2f", Yaw);
  		OLED_P6x8Str(0,2,txt);
  		sprintf(txt,"a:%d", a);
  		OLED_P6x8Str(0,3,txt);
  	}
 	

最后貼一張效果圖
前三行顯示分別是俯仰角,橫滾角,偏航角
最后一行是顯示誤碼情況 1為誤碼 0為正確值(雖然我經常顯示1但是前三行的值好像沒什么影響)

幾個注意點和補充

1、要先確保軟件模擬的I2C通信沒有問題;
2、一定一定一定要避免接觸不良,接觸不良會導致一開始的初始化失敗,運行過程中接觸不良讀取的值就會停止無法恢復;
3、初始化大部分出錯在dmp_load_motion_driver_firmware();(至少我是這樣)
4、關于AD0接3.3V需要更改的地址,把圖中(在inv_mpu.c中)的0x68改為0x69(網上看到的說法,沒試過)

5、如果發現DMP不好實現,但是可以直接讀出原始的六個加速度,可以選擇自己對原始數據處理,卡爾曼濾波,可以參考下面這篇文章
基于英飛凌TC264單片機——ICM20602/MPU6050從原始數據到歐拉角代碼(卡爾曼濾波)

第一次發文章,如有錯誤歡迎指出。

下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評論

查看更多

下載排行

本周

  1. 1五、觸摸屏基本概念?
  2.   |  7次下載  |  免費
  3. 2硬核創客DIY遙控氦氣球飛行器——會飛的鯊魚的誕生的全過程
  4.   |  6次下載  |  免費
  5. 3第一次使用國產芯片--芯旺微--KungFu--ChipOn
  6.   |  5次下載  |  免費
  7. 4peakcoo分享:soc芯片
  8.   |  5次下載  |  免費
  9. 5LCD液晶屏連接方式有哪些呢及各自優缺點是什么?
  10.   |  5次下載  |  免費
  11. 6Arduino-IDE配置ESP32-CAM開發環境踩過的那些坑
  12.   |  4次下載  |  免費
  13. 7痞子衡嵌入式:MCUXpresso IDE下在線調試時使用不同復位策略的現象總結
  14.   |  4次下載  |  免費
  15. 8ESP32時鐘筆記
  16.   |  4次下載  |  免費

本月

  1. 1348常用實用電路圖大全
  2. 7.95 MB  |  163次下載  |  免費
  3. 251單片機之邏輯運算指令ANL、ORL、XRL等
  4. 93.18KB  |  67次下載  |  免費
  5. 3磁環介紹與應用(轉)
  6. 214.96KB  |  40次下載  |  免費
  7. 4霍爾編碼器原理及測速--PID—arduino
  8.   |  37次下載  |  免費
  9. 5macOS搭建51單片機開發環境
  10. 593.4KB  |  29次下載  |  免費
  11. 6LED開關電源與普通開關電源有什么區別
  12. 84.11KB  |  26次下載  |  免費
  13. 751單片機中斷的調用寄存器組(PSW)的作用,以及匯編堆棧的作用,堆棧指針的SP的使用方法,RAM的運行和ROM在單片機具體運行和C語言的優勢和中斷,定時器基礎知識(上)
  14. 595.06KB  |  25次下載  |  免費
  15. 8第十二屆藍橋杯單片機省賽題目解析
  16. 642.49KB  |  24次下載  |  免費

總榜

  1. 1matlab 7.0軟件下載(免費破解版)
  2. 1228800  |  934816次下載  |  免費
  3. 2protel99se軟件下載(可英文版轉中文版)
  4. 78.1 MB  |  537325次下載  |  免費
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 1331200  |  419802次下載  |  免費
  7. 4OrCAD10.5下載,OrCAD10.5中文版軟件
  8. 817182  |  233661次下載  |  免費
  9. 5Protel DXP2004破解版下載
  10. 未知  |  232858次下載  |  免費
  11. 6電路仿真軟件multisim 10.0免費下載
  12. 340992  |  190854次下載  |  免費
  13. 7十天學會AVR單片機與C語言視頻教程 下載
  14. 158M  |  183042次下載  |  免費
  15. 8proe5.0野火版下載(中文版免費下載)
  16. 818176  |  137846次下載  |  免費
版權所有 © 深圳華秋電子有限公司 電子發燒友電路圖粵公網安備 44030402000349號 電信與信息服務業務經營許可證:粵B2-20160233 工商網監認證工商網監 粵ICP備14022951號
免费少妇a级毛片