KE02 FTM0输入捕获(已解决)
2020-02-11 09:01发布
ln08136207
FSL_TICS_ZJJ 发表于 2014-2-11 13:48 你好,新的问题的话,最好发个帖子出来,这样也便于我到时候结贴。 发问题的时候,最好说明自己用的什么 ...
最多设置5个标签!
这个不是新问题,也是在输入捕获脉宽这个问题中遇到的,
使用IAR 6.7环境,FRDM_KE02Z测试板, 使用FTM0的Channel0作为输入通道。
问题1:当FTM0_channel0(PTA0)没有有输入信号时,程序会10ms进一次输入捕获中断
问题2:当有信号输入时,程序读取下降沿时的寄存器值会被污染掉。
下面是部分程序:
/***********初始化FTM0*******************/
FTM_InputCaptureInit(FTM0,FTM_CHANNEL_CHANNEL0,FTM_INPUTCAPTURE_DUALEDGE_BOTHEDGE);
FTM_ClockSet(FTM0,FTM_CLOCK_SYSTEMCLOCK,FTM_CLOCK_PS_DIV8);
FTM_SetCallback(FTM0, FTM0_Task);
GPIO_PinInit(GPIO_PTH2,GPIO_PinOutput);
/*************中断服务函数*****************/
void FTM0_Isr(void)
{
if(FTM_Callback[0])
{
FTM_Callback[0]();
}
FTM_ClrChanneleventFlag(FTM0,0);
}
/**************其他子函数*****************/
void FTM0_Task(void)
{
char Port_Data;
Port_Data = (char)(GPIO_Read(GPIOA)&0x1); //判断是上升沿还是下降沿
switch(Port_Data)
{
case 0:
Read_ChannelValue(FTM0,0,0); //读取下降沿时计数器的值,并计算脉宽(下降沿时的值-上升沿时的值)
break;
case 1:
Read_ChannelValue(FTM0,1,0); //读取上升沿时计数器的值。
break;
}
GPIO_PinToggle(GPIO_PTH2);
}
void Read_ChannelValue(FTM_Type *pFTM,char edge,char Ftm_Channel)
{
static uint32_t Rising_Edge;
static uint32_t Falling_Edge;
static char flag;
ASSERT((FTM0 == pFTM)&&(Ftm_Channel<2)&&(edge<2));
switch(edge)
{
case 0:
Falling_Edge = pFTM->CONTROLS[Ftm_Channel].CnV; //读取此时计数器时的值
if(flag)
{
/**********计算脉宽******************/
if(Falling_Edge > Rising_Edge)
Pluse_Width = Falling_Edge - Rising_Edge;
else
Pluse_Width = Falling_Edge +(65535 - Rising_Edge);
flag = 0;
}
break;
case 1:
Rising_Edge = pFTM->CONTROLS[Ftm_Channel].CnV;
flag = 1;
break;
}
}
一周热门 更多>