本帖最后由 FSL_TICS_Robin 于 2014-7-18 14:25 编辑
FTM进阶特性介绍 —【双边沿捕捉】
在经验分享《FTM与TPM差异简析》一文中,对FTM和TPM的差异作了详细的介绍,但并未就FTM的进阶功能如:硬件增加死区,故障控制输入,增强触发功能,脉冲双边沿捕捉,初始化和极性控制的使用作过多的阐述。为了加深大家对FTM功能的理解,本人会陆续推出FTM进阶功能使用的经验分享,欢迎大家下载浏览及讨论交流。闲话不叙,下面介绍脉冲双边沿捕捉特性,作为FTM进阶功能使用的经验分享的头篇,希望大伙多多支持。
FTM进阶特性介绍【双边沿捕捉】.pdf
(285.74 KB, 下载次数: 31)
2014-5-22 11:33 上传
点击文件名下载附件
pwm_test.rar
(1.3 MB, 下载次数: 32)
2014-5-22 11:33 上传
点击文件名下载附件
PS:本帖可从飞思卡尔版块置顶帖:飞思卡尔Kinetis资料大本营的飞思卡尔论坛支持小组【经验分享】帖汇总链接进入。
后续还有FTM功能使用经验分享,敬请期待留意!
具体功能请参考下载文档介绍。
U8 FTM_InputCapture_Init(FTM_MemMapPtr FTM_No, unsigned char Channel, unsigned char CaptureMode,U8 ucPin)
{
/* open the clock gate */
//FTM 通道使能
if ((FTM0_BASE_PTR == FTM_No) && (Channel < 8))
{
SIM_SCGC6_REG(SIM_BASE_PTR) |= SIM_SCGC6_FTM0_MASK;
}
else if((FTM1_BASE_PTR == FTM_No) && (Channel < 2))
{
SIM_SCGC6_REG(SIM_BASE_PTR) |= SIM_SCGC6_FTM1_MASK;
}
else if ((FTM2_BASE_PTR == FTM_No) && (Channel < 2))
{
SIM_SCGC3_REG(SIM_BASE_PTR) |= SIM_SCGC3_FTM2_MASK;
}
else
return FALSE; /* error in FTM address or channel */
FTM_PinInit(FTM_No,Channel,ucPin);//通道选择
FTM_MODE_REG(FTM_No) &= (FTM_MODE_WPDIS_MASK);
FTM_MODE_REG(FTM_No) &= (FTM_MODE_FTMEN_MASK);//使能ftm全功能
FTM_SC_REG(FTM_No) |= FTM_SC_CLKS(1) | FTM_SC_PS(1); // 系统时钟 6分频
// FTM_SC_REG(FTM_No) |= FTM_SC_TOIE_MASK; //使能计数器溢出中断
FTM_SC_REG(FTM_No) &= (~FTM_SC_CPWMS_MASK);//FTM加计数
FTM_CNT_REG(FTM_No)=0;
FTM_CNTIN_REG(FTM_No)=0;
FTM_MOD_REG(FTM_No) = 0xFFFF;
FTM_QDCTRL_REG(FTM_No)=(~FTM_QDCTRL_QUADEN_MASK);//关闭正交解码
FTM_FILTER_REG(FTM_No)=0x00; //关闭过滤器
FTM_MODE_REG(FTM_No) &= (FTM_MODE_FTMEN_MASK);//使能ftm全功能
FTM_COMBINE_REG(FTM_No) &= FTM_COMBINE_DECAPEN0_MASK|FTM_COMBINE_DECAPEN1_MASK|FTM_COMBINE_DECAPEN2_MASK|FTM_COMBINE_DECAPEN3_MASK;
FTM_CnSC_REG(FTM_No,Channel) &=(~FTM_CnSC_CHF_MASK);
FTM_CnSC_REG(FTM_No,Channel) |= FTM_CnSC_CHIE_MASK;//使能通道输入捕获中断
FTM_CnSC_REG(FTM_No,Channel) &= (~FTM_CnSC_MSB_MASK);//配置成输入捕获模式
FTM_CnSC_REG(FTM_No,Channel) &= (~FTM_CnSC_MSA_MASK);
if(FTM_INPUTCAPTURE_RISINGEDGE == CaptureMode) //允许中断,捕获上升沿
{
FTM_CnSC_REG(FTM_No,Channel) = FTM_CnSC_CHIE_MASK | FTM_CnSC_ELSA_MASK;
}
else if(FTM_INPUTCAPTURE_FALLINGEDGE == CaptureMode) // 捕获下降沿
{
FTM_CnSC_REG(FTM_No,Channel) = FTM_CnSC_CHIE_MASK | FTM_CnSC_ELSB_MASK;
}
else if(FTM_INPUTCAPTURE_BOTHEDGE == CaptureMode) // 捕获双沿
{
FTM_CnSC_REG(FTM_No,Channel) |= FTM_CnSC_ELSB_MASK ; //上升或下降沿捕获
FTM_CnSC_REG(FTM_No,Channel) |= FTM_CnSC_ELSA_MASK ;
}
else
return FALSE;
FTM_CnSC_REG(FTM_No,Channel) &=(~FTM_CnSC_DMA_MASK);
if ((FTM0_BASE_PTR == FTM_No) && (Channel < 8))
{
enable_irq(INT_FTM0);
}
else if((FTM1_BASE_PTR == FTM_No) && (Channel < 2))
{
enable_irq(INT_FTM1);
}
else if ((FTM2_BASE_PTR == FTM_No) && (Channel < 2))
{
enable_irq(INT_FTM2);
}
return TRUE;
}
这是我的初始化程序 哪有问题 希望版主告诉我 编程新手 写的比较差 别笑
一周热门 更多>