中级会员
积分 202
金钱 202
注册时间 2014-9-16
在线时间 11 小时
5 金钱
如题,使用STM32的定时器T4捕捉随机出现的正负脉冲,因为不知道开始出现的是正还是负脉冲,而且也不知道后面出现的是什么脉冲,
这样就没法确定先上升沿触发还是下降沿触发。 打算采用双边沿触发的方式。
采用原子哥的程序进行验证!
采用双边触发方式,中间不更换触发方式,直接把中断程序中的转换触发方式的语句注释掉,
但得出的结果好像不对,什么原因呢?
1.初始化程序,采用双边触发方式
TIM4_ICInitStructure.TIM_Channel = TIM_Channel_1; // CC1S=01 选择输入端 IC1映射到TI1上
// TIM4_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获
TIM4_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_BothEdge;
TIM4_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1上
TIM4_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频
TIM4_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置输入滤波器 不滤波
TIM_ICInit(TIM4, &TIM4_ICInitStructure);
2.中断处理程序里,直接注释掉触发程序,其他不变,还是原子哥的
void TIM4_IRQHandler(void)
{
if((TIM4CH1_CAPTURE_STA&0X80)==0)//还未成功捕获
{
if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)
{
if(TIM4CH1_CAPTURE_STA&0X40)//已经捕获到高电平了
{
if((TIM4CH1_CAPTURE_STA&0X3F)==0X3F)//高电平太长了
{
TIM4CH1_CAPTURE_STA|=0X80;//标记成功捕获了一次
TIM4CH1_CAPTURE_VAL=0XFFFF;
}else TIM4CH1_CAPTURE_STA++;
}
}
if (TIM_GetITStatus(TIM4, TIM_IT_CC1) != RESET)//捕获1发生捕获事件
{
if(TIM4CH1_CAPTURE_STA&0X40) //捕获到一个下降沿
{
TIM4CH1_CAPTURE_STA|=0X80; //标记成功捕获到一次上升沿
TIM4CH1_CAPTURE_VAL=TIM_GetCapture1(TIM4);
// TIM_OC1PolarityConfig(TIM4,TIM_ICPolarity_Rising); //CC1P=0 设置为上升沿捕获
}else //还未开始,第一次捕获上升沿
{
TIM4CH1_CAPTURE_STA=0; //清空
TIM4CH1_CAPTURE_VAL=0;
TIM_SetCounter(TIM4,0);
TIM4CH1_CAPTURE_STA|=0X40; //标记捕获到了上升沿
// TIM_OC1PolarityConfig(TIM4,TIM_ICPolarity_Falling); //CC1P=1 设置为下降沿捕获
}
}
}
TIM_ClearITPendingBit(TIM4, TIM_IT_CC1|TIM_IT_Update); //清除中断标志位
}
3.捕捉按键时间,明显偏长很多,有问题。
原子程序正常:
HIGH4:137997 us
HIGH4:146206 us
HIGH4:137640 us
HIGH4:114909 us
HIGH4:121974 us
双边捕捉非正常:
HIGH4:434366 us
HIGH4:378154 us
HIGH4:320067 us
HIGH4:465998 us
HIGH4:123394 us
HIGH4:1322349 us
HIGH4:1096060 us
HIGH4:511339 us
我来回答