OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2926|回复: 4

TIM_GetCapture1函数的返回值反应的是当捕获成功时的计数器的值,根据这个值进行换算,为什么计算得到的高电平的时间同预期的...

[复制链接]

22

主题

87

帖子

0

精华

高级会员

Rank: 4

积分
664
金钱
664
注册时间
2019-1-30
在线时间
111 小时
发表于 2019-12-4 18:02:33 | 显示全部楼层 |阅读模式
20金钱
本帖最后由 zhangxiaolin 于 2019-12-4 18:16 编辑

TIM_GetCapture1函数的意义时当捕获成功时得到计数器的值,根据设定的定时器的分频系数得到定时器的周期。定时器的周期*TIM_GetCapture1的返回值 = 捕获到的完整的高(低)电平的持续时间。但是换算得到结果同已知的高电平时间相差好多。现在粘贴部分代码如下,求大神指导。
  1. 定时器初始化
  2. void TIM1_Configure(void)
  3. {
  4.                 TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  5.                 TIM_ICInitTypeDef  TIM1_ICInitStructure;      

  6.                 /* TIM1 clock enable */
  7.                 RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
  8.     TIM_DeInit(TIM1);
  9.                 TIM_TimeBaseStructure.TIM_Period = 9999;         // 设置计数器值  1MHz/(9999+1)=100HZ  10ms
  10.                 TIM_TimeBaseStructure.TIM_Prescaler = 71;      //设置预分配频 72M/(71+1)=1MHz,1us
  11.                 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;     //
  12.                 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  13.           TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
  14.                 TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);

  15.                 /* Input Mode configuration: Channel1 */
  16.                 TIM1_ICInitStructure.TIM_Channel = TIM_Channel_1; //
  17.           TIM1_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;        //上升沿捕获
  18.           TIM1_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //
  19.           TIM1_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;         //
  20.           TIM1_ICInitStructure.TIM_ICFilter = 0x00;//
  21.           TIM_ICInit(TIM1, &TIM1_ICInitStructure);
  22. //        TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); //
  23. //        TIM_ARRPreloadConfig(TIM1, ENABLE);
  24.                
  25.                 TIM_ITConfig(TIM1,TIM_IT_Update|TIM_IT_CC1,ENABLE);//使能捕获中断
  26.                 TIM_Cmd(TIM1, ENABLE);             // TIM1 ENABLE counter
  27. }
复制代码
void TIM1_CC_IRQHandler(void)
{
        if((TIM1CH1_CAPTURE_STA&0X80)==0) //        {
                if (TIM_GetITStatus(TIM1, TIM_IT_CC1) != RESET)//                {
                  if(TIM1CH1_CAPTURE_STA&0X40)                //      
                        {
                                TIM1CH1_CAPTURE_STA|=0X80;                //
                                TIM1CH1_CAPTURE_VAL=TIM_GetCapture1(TIM1);
                                TIM_OC1PolarityConfig(TIM1,TIM_ICPolarity_Rising); //
                        }
                        else //
                        {
                                TIM1CH1_CAPTURE_STA=0;                  
                                TIM1CH1_CAPTURE_VAL=0;
                                 TIM_SetCounter(TIM1,0);
                                TIM1CH1_CAPTURE_STA|=0X40;               
                              TIM_OC1PolarityConfig(TIM1,TIM_ICPolarity_Falling);               
                        }
                }
  }
        
        TIM_ClearITPendingBit(TIM1, TIM_IT_CC1); //Çå3yÖD¶Ï±ê־λ
}

疑惑点时,当完成一次捕获中断时,根据TIM1CH1_CAPTURE_VAL=TIM_GetCapture1(TIM1);得到的TIM1CH1_CAPTURE_VAL值 ,TIM1CH1_CAPTURE_VAL*定时器的计数周期 = 高电平的脉宽。但是这个计算出来的值同已知的高电平的脉宽差值会很大。主要是TIM1CH1_CAPTURE_VAL这个值的问题。这个值貌似不能反映定时器高电平的时间,不解为什么?
求各位大神指点一下。



最佳答案

查看完整内容[请看2#楼]

TIM1CH1_CAPTURE_VAL这个值是可以反应捕捉到的高电平的脉宽,但是这个值貌似不能通过DEBUG单步调试,因为单步调试第二次再得到这个值的时候,这个值可能会变的超级大,这是不正确的。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

22

主题

87

帖子

0

精华

高级会员

Rank: 4

积分
664
金钱
664
注册时间
2019-1-30
在线时间
111 小时
 楼主| 发表于 2019-12-4 18:02:34 | 显示全部楼层
TIM1CH1_CAPTURE_VAL这个值是可以反应捕捉到的高电平的脉宽,但是这个值貌似不能通过DEBUG单步调试,因为单步调试第二次再得到这个值的时候,这个值可能会变的超级大,这是不正确的。
回复

使用道具 举报

31

主题

2183

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
14410
金钱
14410
注册时间
2018-8-3
在线时间
1156 小时
发表于 2019-12-4 18:39:25 | 显示全部楼层
参考下战舰的输入捕获例程 也是捕获高电平的持续时间的,也有视频讲解 中断逻辑在视频讲的比较清楚 可以下载去看看 在B盘
回复

使用道具 举报

6

主题

1127

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1656
金钱
1656
注册时间
2019-8-15
在线时间
102 小时
发表于 2019-12-4 21:47:00 | 显示全部楼层
帮顶                           
成功没有捷径
回复

使用道具 举报

1

主题

882

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3071
金钱
3071
注册时间
2018-2-7
在线时间
285 小时
发表于 2019-12-5 16:11:24 | 显示全部楼层
和原子的例程对比找问题
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-23 12:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表