OpenEdv-开源电子网

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

输入捕获高电平时,如果高电平捕获之后,定时器重装值,然后到达低电平,这个捕获的高电平时间不是错误了吗?

[复制链接]

78

主题

271

帖子

0

精华

高级会员

Rank: 4

积分
695
金钱
695
注册时间
2013-10-20
在线时间
36 小时
发表于 2013-11-14 16:25:03 | 显示全部楼层 |阅读模式
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

78

主题

271

帖子

0

精华

高级会员

Rank: 4

积分
695
金钱
695
注册时间
2013-10-20
在线时间
36 小时
 楼主| 发表于 2013-11-15 12:31:21 | 显示全部楼层
回复【6楼】倒拔萝卜:
---------------------------------
谢谢 了解了 设置一个溢出标志,防止在高低电平之间出现了计数器重装值这种神奇的事情发生。
回复 支持 1 反对 0

使用道具 举报

5

主题

154

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
205
金钱
205
注册时间
2013-6-8
在线时间
2 小时
发表于 2013-11-15 12:16:06 | 显示全部楼层

首先:定时器的CNT从0向上计数到指定值后,又从0开始向上计数,如此循环,每一次溢出都会响应一次中断,置位TIM_FLAG_Update

捕获:当定时器的捕获脚检测一个边沿时,会置位TIM_FLAG_CCx,同时TIMx->CCRx记录下此时CNT的值,并把它记录在cap_start变量中;当再有一个边沿时,又会置位TIM_FLAG_CCx,TIMx->CCRx又记录下此时CNT的值,并把它记录在cap_end变量中;这时cap_end和cap_start的差值就是高电平的时间了;

如果CNT已经溢出了好几次了怎么算呢?
CNT每次响应溢出中断时,再定义一个溢出变量overflow++就行了

根据cap_start,cap_end,overflow和定时器的ARR寄存器值就可以算出高电平时间了

以下是参考程序:
void TIM2_IRQHandler(void)
{
      static u16 cap_start=0, cap_end=0, cap_sta=0, cap_tim=0;
      static u32 overflow=0;

      if (TIM2->SR & TIM_FLAG_Update)//溢出中断
      {
               overflow++;

       }

       if (TIM2->SR & TIM_FLAG_CC1)//捕获中断
       {
               if (cap_sta==0)//捕获到了上升沿
               {
                       cap_start = TIM2->CCR1;
                       cap_tim = overflow;
                       xxxx;//设置成下降沿中断
                       cap_sta=1;//下一次进入下降沿判断

                }
                else if (cap_sta ==1)//补货到了下降沿
                {
                       cap_end = TIM2->CCR1;
                       xxxx;//设置成上升沿中断,为下一次准备
                       cap_sta=0;//进入下一次的上升沿判断

                        if(overflow == cap_tim)//两次捕获间,CNT没有溢出
                               pulse_time = cap_end - cap_start;
                        else   //CNT溢出了(overflow-cap_tim)次
                               pulse_time =  cap_end+(TIM2->ARR+1-cap_start)+
                                                   (overflow-1-cap_tim)*(TIM2->ARR+1);

                 }

       }

}

即使爬到最高的山上,一次也只能脚踏实地地迈一步。
回复 支持 0 反对 1

使用道具 举报

5

主题

154

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
205
金钱
205
注册时间
2013-6-8
在线时间
2 小时
发表于 2013-11-14 16:28:53 | 显示全部楼层
捕获一个上升沿,再补货一个下降沿,不就是高电平时间了么
即使爬到最高的山上,一次也只能脚踏实地地迈一步。
回复 支持 反对

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2013-11-15 10:43:07 | 显示全部楼层
为什么不用上升沿下降沿捕获?
回复 支持 反对

使用道具 举报

78

主题

271

帖子

0

精华

高级会员

Rank: 4

积分
695
金钱
695
注册时间
2013-10-20
在线时间
36 小时
 楼主| 发表于 2013-11-15 10:50:21 | 显示全部楼层
回复【2楼】倒拔萝卜:
---------------------------------
上升沿捕获,记录了此时计数器寄存器的值,但是再捕获下降沿之前,计数器就重装值了。。。那么下降沿捕获的计数器值减去上升沿计数器值不就是计算错误的了吗。。。。
回复 支持 反对

使用道具 举报

78

主题

271

帖子

0

精华

高级会员

Rank: 4

积分
695
金钱
695
注册时间
2013-10-20
在线时间
36 小时
 楼主| 发表于 2013-11-15 10:50:33 | 显示全部楼层
回复【2楼】倒拔萝卜:
---------------------------------
上升沿捕获,记录了此时计数器寄存器的值,但是再捕获下降沿之前,计数器就重装值了。。。那么下降沿捕获的计数器值减去上升沿计数器值不就是计算错误的了吗。。。。
回复 支持 反对

使用道具 举报

0

主题

56

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2015-10-15
在线时间
39 小时
发表于 2017-5-3 00:31:02 | 显示全部楼层
l692519765 发表于 2013-11-15 12:31
回复【6楼】倒拔萝卜:
---------------------------------
谢谢 了解了 设置一个溢出标志,防止 ...

楼主你是真的了解了吗,我感觉你说的还是不清楚
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-8-21 19:22

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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