KEA128使用FTM单通道捕获PWM波占空比的实现

提前说明,实测效果只能捕获4kHz-40kHz

需求:使用通用定时器单通道实现PWM波占空比的捕获。

实现大致思路:

1、将定时器配置成上升沿触发中断

2、进入中断之后将中断触发方式改成下降沿触发

3、如此反复,在上升沿触发时改为下降沿触发,在下降沿触发时改为上升沿触发

4、在中断中读取计数器的值

5、清0计数器

代码:

初始化FTM

void init_FTM(void) {SIM_SCGC |= SIM_SCGC_FTM2_MASK; /* Sys Clk Gate Ctrl: enable bus clock to FTM2 *//* FTM2 module settings for desired channel modes: */FTM2_MODE |= FTM_MODE_WPDIS_MASK; /* Write protect to registers disabled (default) */FTM2_COMBINE = 0x00000000;    /* DECAPEN (Dual Edge Capture Mode Enable) = 0 (default) *//* COMBINE (chans n & n+1) = 0 (default; independent chans) */FTM2_MOD = 65500;FTM2_CNTIN = 1;FTM2_SC = 0x00000007;  /* CWMS (Center aligned PWM Select) = 0 (default, up count) *//* TOIE (Timer Overflow Interrupt Ena) = 0 (default) *//* CLKS (Clock source) = 0 (default, no clock; FTM disabled) *//* PS (Prescaler factor) = 7. Prescaler = 2**7 = 128 */
}

初始化捕获通道:

void init_FTM2_ch3_IC(void) {FTM2_C3SC = 0x00000044;       /* FTM2 ch3: Input Capture on rising edge *//* CHIE (Chan Interrupt Ena) = 0 (default) *//* MSB:MSA (chan Mode Select) = 0b00 *//* ELSB:ELSA (chan Edge or Level Select) = 0b01 */SIM_PINSEL1 &= ~SIM_PINSEL1_FTM2PS3_MASK; /* Use default pad PTB4 */FTM2_FILTER = 0x0000F000;//添加滤波器FTM2_FLTCTRL = 0x00000F88;
}

中断函数:

void FTM2_IRQHandler(void)
{FTM2_C3SC &= ~FTM_CnSC_CHF_MASK;//清除中断标志位if(flag == 0){CurrentCaptureVal1 = FTM2_C3V;FTM2_C3SC = 0x00000048;       /* FTM2 ch4: Input Capture on falling edge *//* CHIE (Chan Interrupt Ena) = 1 (default) *//* MSB:MSA (chan Mode Select) = 0b00 *//* ELSB:ELSA (chan Edge or Level Select) = 0b10 */flag = 1;FTM2_CNT = 0x00000000;}else{CurrentCaptureVal2 = FTM2_C3V;FTM2_C3SC = 0x00000044;       /* FTM2 ch4: Input Capture on falling edge *//* CHIE (Chan Interrupt Ena) = 1 (default) *//* MSB:MSA (chan Mode Select) = 0b00 *//* ELSB:ELSA (chan Edge or Level Select) = 0b01 */flag = 0;}
}

选择时钟源:

void start_FTM_counters (void) {FTM2_SC |= FTM_SC_CLKS(1);  /* Start FTM2 ctr with clk source TIMER_CLK (20 MHz)*/
}

时钟初始化

/* clocks.c              (c) 2015 Freescale Semiconductor, Inc.* Descriptions: Basic clock functions* 28 Sept 2015 Osvaldo Romero et al: Initial version*/#include "derivative.h"
#include "clocks.h"void init_clks_FEI_48MHz (void) {      /* FLL Enabled with Internal clock */OSC_CR = 0x00;       /* (default value) *//* OSCEN=0: OSC module disabled *//* OSCSTEN=0: OSC clock disabled in Stop mode *//* OSCOS=0: Ext clk source (don't care here) *//* RANGE=0: Low Freq range of 32 KHz *//* HGO=0: low power High Gan Osc mode (don't care here) */ICS_C2 = 0x20;       /* Use defaults until dividers configured (default) *//* BDIV=1:  divided by 2  *//* LP = 0:  FLL Not disabled in bypass mode  */ICS_C1 = 0x04;       /* Internal ref clock is FLL source (default)*//* CLKS=0: Output of FLL is selected to control bus freq *//* RDIV=0: Ref divider = 1 since RANGE = 0 *//* IREFS=1: Int Ref clock is selected *//* IRCLKEN=0: ICSIRCLK is inactive *//* IREFSTEN=0: Int ref clk is disabled in Stop mode */while ((ICS_S & ICS_S_LOCK_MASK) == 0); /* Wait for FLL to lock*/SIM_CLKDIV = 0x01100000; /* OUTDIV1 = 0; Core/sysclk is ICSOUTCLK div by 1 *//* OUTDIV2 = 1  bus/flash is OUTDIV1/2 *//* OUTDIV3 = 1; FTMs, PWT is ICSOUTCLK div by 2 */ICS_C2 = 0x00;           /* BDIV div by 1- increases bus/flash freq */
}void init_clks_FEE_40MHz(void) {     /* FLL Enabled with External clock */OSC_CR = 0x96;       /* High range & gain; select osc *//* OSCEN =1 ; OSC module enabled *//* OSCSTEN = 0; OSC clock disabled in stop mode *//* OSCOS = 1; OSC clcok source is selected *//* RANGE = 1; High freq range of 4-24 MHz *//* HGO = 1; High-gain mode */while ((OSC_CR & OSC_CR_OSCINIT_MASK) == 0); /* Wait until oscillator is ready*/ICS_C2 = 0x20;      /* BDIV div by 2; use default until dividers configured*//* LP = 0; FLL is not disabled in bypass mode */ICS_C1 = 0x18;      /* 8 Mhz ext ref clk/256 is source to FLL *//* CLKS = 0; Output of FLL is selected (default) *//* RDIV = 3; ref clk prescaled by 256 with RANGE=0 *//* IREFS = 0; ext clk source selected *//* IRCLKEN = 0; ICSIRCLK inactive *//* IREFSTEN = 0; Int ref clk disabled in Stop mode */while ((ICS_S & ICS_S_IREFST_MASK) == 1);    /* Wait for external source selected */while ((ICS_S & ICS_S_LOCK_MASK) == 0);      /* Wait for FLL to lock */SIM_CLKDIV = 0x01100000; /* OUTDIV1 = 0; Core/sysclk is ICSOUTCLK div by 1 *//* OUTDIV2 = 1  bus/flash is OUTDIV1/2 *//* OUTDIV3 = 1; FTMs, PWT is ICSOUTCLK div by 2 */ICS_C2 = 0x00;           /* BDIV div by 1- increases bus/flash freq */
}

主函数:

/* main.c              (c) 2015 Freescale Semiconductor, Inc.* Descriptions: FTM example code.* 28 Sept 2015 Osvaldo Romero: Initial version*/#include "derivative.h" /* include peripheral declarations SKEAZ128M4 */
#include "FTM.h"
#include "clocks.h"int main(void) {init_clks_FEE_40MHz();        /* KEA128 clks FEE, 8MHz xtal: core 40 MHz, bus 20MHz */init_FTM ();  	            /* Enable bus clock to FTM1,2 prescaled by 128 */init_FTM2_ch3_IC(); 	        /* PTB5 input; connect J2_5 and J2_10  */NVIC_EnableIRQ(FTM2_IRQn);start_FTM_counters();for(;;){}
}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部