目錄
1、概述
2、輸入捕獲SDK配置
2.1、SAIC中斷方式
2.2、IPWM或者IPM
1、概述
????????輸入捕獲,可以抓取高電平時間、低電平時間、占空比、周期、邊沿檢測與回調函數、邊沿計數(ABZ解碼)、時間戳、喚醒中斷。
????????記錄一下根據Emios模塊實現上述部分功能。
????????適用于輸入捕獲功能的Emios有以下三種模式。
SAIC:信號實時輸入捕獲
????????從上圖可以看出,SAIC僅僅關聯了A寄存器,假設上升沿邊沿檢測,只能在上升沿時候抓取一個A的值,那么使用輪詢的方式實現不了任何功能,在SDK包里面,通過中斷或者DMA實現記錄上次的值與本次的值,進行周期或者占空比的測量。
只有在中斷或者DMA的時候才會置位此標志位
2、輸入捕獲SDK配置
2.1、SAIC中斷方式
????????目的:捕獲通道eMios0_23 引腳PTC13 邊沿檢測 “eMios0_23使用內部計數器方式,所以Emios_Icu模塊無需再配置”
????????Emios_Icu配置如下
1、通道功能配置
2、通道屬性配置
????????在使用中斷的情況下,SAIC、IPWM、IPM都好使,功能屬于全支持了。但是假設使用輪詢,IPM僅僅測量周期,IPWM僅僅測量占空比,SAIC用于邊沿計數,其他功能FAE說支持就要中斷了。周期與占空比同時測量出來是不支持的了。
中斷配置,在ICU的中斷里面配置之后無需再次在中斷容器里面實現配置了。
測試代碼
初始化
/* Initialize Emios0 */Emios_Mcl_Ip_Init(0U, &Emios_Mcl_Ip_0_Config_BOARD_INITPERIPHERALS);
Emios_Icu_Ip_Init(0U, &eMios_Icu_Ip_0_Config_PB);Emios_Icu_Ip_EnableEdgeDetection(0,23);
/*中斷初始化*/IntCtrl_Ip_SetPriority(EMIOS0_0_IRQn,2);IntCtrl_Ip_InstallHandler(EMIOS0_0_IRQn, &eMios0_23_EncoderC_Pulse, NULL_PTR);IntCtrl_Ip_EnableIrq(EMIOS0_0_IRQn);Emios_Icu_Ip_EnableInterrupt(0, 23);
/*中斷執行*/
volatile uint32 eMios0_23_EncoderC_Pulsex = 0;
static void eMios0_23_EncoderC_Pulse(void)
{
Emios_Icu_Ip_IrqHandler(0, 23);
eMios0_23_EncoderC_Pulsex++;
}
測試結果,上升沿進中斷,那么記錄上升沿個數,發現可以完全對的上
2.2、IPWM或者IPM
目的:PTD10連接Emios1_10進行周期或脈沖寬度測量,輪詢方式
IPWM:輸入脈沖寬度測量,可以是高電平也可以是低電平
????????從上述兩圖中可以看出,IPWM與IPM均可以獲取A與B的值,通過相減的方式實現了周期或者脈沖寬度測量。
Emios_Icu配置,作為Count bus使用
ICU配置如下
代碼實現
/* Initialize Emios1 */
Emios_Mcl_Ip_Init(1U, &Emios_Mcl_Ip_1_Config_BOARD_INITPERIPHERALS);
Emios_Icu_Ip_StartSignalMeasurement(1,10);
/*執行代碼*/
uint16 eMios1_10_EncoderA_Preiod(void)
{uint16 EncoderA_UCA ? ? ? ? = IP_EMIOS_1->CH.UC[10].A;uint16 EncoderA_UCB ? ? ? ? = IP_EMIOS_1->CH.UC[10].B;uint16 EncoderA_UCAReyurn ? = 0;if(EncoderA_UCA >= EncoderA_UCB){EncoderA_UCAReyurn = (EncoderA_UCA - EncoderA_UCB);}else{EncoderA_UCAReyurn = (EncoderA_UCA - EncoderA_UCB + 0xFFFF);}EncoderA_UCAReyurn = (uint16)(50000/EncoderA_UCAReyurn) + 1;return EncoderA_UCAReyurn;
}
測試結果
IPWM的實現方式是一樣的。