用SDK包開發K66FX18學習筆記(4)

FTM脈衝輸入捕獲

1、宏定義

#define INCAP_INSTANCE				FTM1			//端口號
#define INCAP_CHANNEL0				kFTM_Chnl_0		//通道號
#define INCAP_CHANNEL1				kFTM_Chnl_1		//通道號
#define INCAP_PORT					PORTA			//引腳端口號
#define INCAP_PIN1					8U				//引腳號
#define INCAP_PIN2					9U				//引腳號
#define INCAP_AF					kPORT_MuxAlt3	//複用爲輸入捕獲
#define INCAP_CLKSOURCE				kCLOCK_PortA	//端口時鐘
#define INCAP_IRQ					FTM1_IRQn		//中斷向量號
#define INCAP_INTERRUPT_HANDLE		FTM1_IRQHandler	//中斷服務函數
#define INCAP_CHANNEL_FLAG			kFTM_Chnl0Flag	//中斷通道標誌

2、輸入捕獲初始化

void BMQ_INPUTCAP(void)
{
	ftm_config_t INCAPconfig;//初始化結構體句柄
	
	CLOCK_EnableClock(INCAP_CLKSOURCE);//引腳時鐘初始化
	PORT_SetPinMux(INCAP_PORT,INCAP_PIN1,INCAP_AF);//端口複用爲輸入捕獲模式
	PORT_SetPinMux(INCAP_PORT,INCAP_PIN2,INCAP_AF);//端口複用爲輸入捕獲模式
	
	FTM_GetDefaultConfig(&INCAPconfig);//初始化配置
	FTM_Init(INCAP_INSTANCE,&INCAPconfig);//初始化
	
	FTM_SetupInputCapture(INCAP_INSTANCE,INCAP_CHANNEL0,kFTM_RisingEdge,0);//配置輸入捕獲爲上升沿捕獲,濾波選擇不濾波,則最後參數爲0   
	FTM_SetupInputCapture(INCAP_INSTANCE,INCAP_CHANNEL1,kFTM_RisingEdge,0);//配置輸入捕獲爲上升沿捕獲   
	
	INCAP_INSTANCE->MOD = 0xffff;//空閒運行模式
	
	FTM_EnableInterrupts(INCAP_INSTANCE,kFTM_Chnl0InterruptEnable);	//選擇中斷通道爲通道0
	
	EnableIRQ(INCAP_IRQ);//使能中斷
	
	FTM_StartTimer(INCAP_INSTANCE, kFTM_SystemClock);//開啓定時器,配置時鐘源爲系統時鐘
}

定義一個全局變量

uint32_t count = 0;

輸入捕獲採用中斷採集,每次採集到一個上升沿,進入一次中斷,count值自加1

void INCAP_INTERRUPT_HANDLE(void)
{
	if((INCAP_INSTANCE->STATUS & 0x01)==1)
	{		
	    count++;
		FTM_ClearStatusFlags(INCAP_INSTANCE,INCAP_CHANNEL_FLAG);//清除通道的標誌位	
	}
}

最後,每次10ms打印一次再清零,就可以知道10ms採集了多少個脈衝了

			PRINTF("%d\n",count);	
			count = 0;
			DELAY_MS(10);

個人心得:這個輸入捕獲的捕獲值不用通過讀取CnV寄存器來獲取,兩個方法的效果是一樣的。

發佈了11 篇原創文章 · 獲贊 12 · 訪問量 2201
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章