PWM输入捕获

2019-07-24 12:16发布

本帖最后由 wgb123 于 2018-10-7 11:47 编辑

对于输入捕获事件有点疑问,程序初始化是上升沿捕获,为什么if(TIM5CH1_CAPTURE_STA&0X40)为真就是捕获到一个下降沿?不是应该先设置下降沿捕获,然后判断该位吗?才能判断是否是下降沿。
还有一个就是判断捕获事件是否发生的函数看不懂
ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT)
{
  ITStatus bitstatus = RESET;  
  uint16_t itstatus = 0x0, itenable = 0x0;
  /* Check the parameters */
  assert_param(IS_TIM_ALL_PERIPH(TIMx));
  assert_param(IS_TIM_GET_IT(TIM_IT));

  itstatus = TIMx->SR & TIM_IT;

  itenable = TIMx->DIER & TIM_IT;
  if ((itstatus != (uint16_t)RESET) && (itenable != (uint16_t)RESET))
  {
    bitstatus = SET;
  }
  else
  {
    bitstatus = RESET;
  }
  return bitstatus;
}

返回值为0或1;1表示发生捕获事件,但是上面的函数看的不大懂。


if((TIM5CH1_CAPTURE_STA&0X80)==0)//还未成功捕获       
        {          
                if (TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET)                 //更新事件
                 
                {            
                        if(TIM5CH1_CAPTURE_STA&0X40)//已经捕获到高电平了
                        {
                                if((TIM5CH1_CAPTURE_STA&0X3F)==0X3F)//高电平太长了
                                {
                                        TIM5CH1_CAPTURE_STA|=0X80;//标记成功捕获了一次
                                        TIM5CH1_CAPTURE_VAL=0XFFFF;            //不清楚这个赋值有何含义,表示定时器记满了吗?
                                }else TIM5CH1_CAPTURE_STA++;              //这里有疑问,高电平时间太长,说明会发生更新中断,中断次数应该+1;但是我觉得应该是写在上面的if里面,为什么 要写在else后面?
                        }         
                }
               if (TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET)//捕获1发生捕获事件
                {       
                        if(TIM5CH1_CAPTURE_STA&0X40)                //捕获到一个下降沿                
                        {                                 
                                TIM5CH1_CAPTURE_STA|=0X80;                //标记成功捕获到一次高电平脉宽
                                TIM5CH1_CAPTURE_VAL=TIM_GetCapture1(TIM5);
                                   TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising); //CC1P=0 设置为上升沿捕获
                        }else                                  //还未开始,第一次捕获上升沿  //这个else有疑问,为什么上面的if不成立就能判断捕获到上升沿?
                        {
                                TIM5CH1_CAPTURE_STA=0;                        //清空
                                TIM5CH1_CAPTURE_VAL=0;
                                 TIM_SetCounter(TIM5,0);
                                TIM5CH1_CAPTURE_STA|=0X40;                //标记捕获到了上升沿
                                   TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling);                //CC1P=1 设置为下降沿捕获
                        }                    
                }                                                                                  
        }

    TIM_ClearITPendingBit(TIM5, TIM_IT_CC1|TIM_IT_Update); //清除中断标志位

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
22条回答
wgb123
1楼-- · 2019-07-26 20:40
HXYDJ 发表于 2018-10-7 10:51
初始化的时候上升沿捕获,TIM5CH1_CAPTURE_STA这个值为0,当第一个上升沿来的时候,TIM5CH1_CAPTURE_STA ...

if(TIM5CH1_CAPTURE_STA&0X40)//已经捕获到高电平了
                        {
                                if((TIM5CH1_CAPTURE_STA&0X3F)==0X3F)//高电平太长了
                                {
                                        TIM5CH1_CAPTURE_STA|=0X80;//标记成功捕获了一次
                                        TIM5CH1_CAPTURE_VAL=0XFFFF;
                                }else TIM5CH1_CAPTURE_STA++;
                        }         

现在就是这个不懂了,高电平太长,不是应该执行TIM5CH1_CAPTURE_STA++么;
HXYDJ
2楼-- · 2019-07-26 21:40
 精彩回答 2  元偷偷看……
wgb123
3楼-- · 2019-07-27 00:33
HXYDJ 发表于 2018-10-8 13:00
TIM5CH1_CAPTURE_STA++是统计定时器溢出次数,定时器溢出一次这个值就加1,根据溢出的次数计算高电平的时 ...

  if((TIM5CH1_CAPTURE_STA&0X3F)==0X3F)那为什么要把低五位取出来?低五位不是放溢出次数么?我看原子的视频觉得应该是,发生一次更新中断就要执行一次  TIM5CH1_CAPTURE_STA++。
HXYDJ
4楼-- · 2019-07-27 03:16
wgb123 发表于 2018-10-8 13:59
if((TIM5CH1_CAPTURE_STA&0X3F)==0X3F)那为什么要把低五位取出来?低五位不是放溢出次数么?我看原子的 ...

定时器更新中断就是定时器溢出中断,仔细看资料和程序注释。

一周热门 更多>