OpenEdv-开源电子网

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

STM32如何捕获两路波形的时间差

[复制链接]

1

主题

5

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2017-3-8
在线时间
7 小时
发表于 2017-3-8 23:35:48 | 显示全部楼层 |阅读模式
1金钱
如题,要捕获图中两路波形中的T,求出T的宽度。
一路波形的话,可以用普通的输入捕获,两路的话要如何捕获呢?求解
无标题.jpg

最佳答案

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

开两路输入捕获,一路检验上升沿,另一路下降沿,然后获取他们的时间数再运算,就可以知道T这个时间了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

14

主题

1592

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
2622
金钱
2622
注册时间
2014-7-17
在线时间
350 小时
发表于 2017-3-8 23:35:49 | 显示全部楼层
开两路输入捕获,一路检验上升沿,另一路下降沿,然后获取他们的时间数再运算,就可以知道T这个时间了
回复

使用道具 举报

32

主题

883

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4036
金钱
4036
注册时间
2015-11-14
在线时间
545 小时
发表于 2017-3-9 09:50:58 | 显示全部楼层
2楼说得对,一个上升沿捕获,一个下降沿捕获,也可以一个外部中断,一个输入捕获+定时器计数,同样两个外部中断+定时器计数也是可以的,随便你怎么使用,最后一种方式可以在定时器紧张的时候使用定时器6和7,因为只要计数就可以了。
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2017-3-8
在线时间
7 小时
 楼主| 发表于 2017-3-9 19:48:58 | 显示全部楼层
FantaSy_ 发表于 2017-3-9 09:47
开两路输入捕获,一路检验上升沿,另一路下降沿,然后获取他们的时间数再运算,就可以知道T这个时间了

谢谢你提供的思路,我现在用TIM2的CH1/CH2两个通道开启捕获,参照单路捕获,代码如下:u8  TIM_CAPTURE_STA=0;                                           
u16        TIM_CAPTURE_VAL;       
void TIM2_IRQHandler(void)
{
        if((TIM_CAPTURE_STA&0X80)==0)
        {
                if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
                {            
                        if(TIM_CAPTURE_STA&0X40)
                        {
                                if((TIM_CAPTURE_STA&0X3F)==0X3F)
                                {
                                        TIM_CAPTURE_STA|=0X80;
                                        TIM_CAPTURE_VAL=0XFFFF;
                                }else TIM_CAPTURE_STA++;
                        }         
                }
                if(TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)
                {
                        TIM_CAPTURE_STA=0;                       
                        TIM_CAPTURE_VAL=0;
                        TIM_SetCounter(TIM2,0);
                        TIM_CAPTURE_STA|=0X40;               
                }
                if (TIM_GetITStatus(TIM2, TIM_IT_CC2) != RESET)
                {
                        if(TIM_CAPTURE_STA&0X40)               
                        {
                                TIM_CAPTURE_STA|=0X80;               
                                TIM_CAPTURE_VAL=TIM_GetCapture1(TIM2);
                        }
                }
        }
   TIM_ClearITPendingBit(TIM2, TIM_IT_CC1|TIM_IT_CC2|TIM_IT_Update); //Çå3yÖD¶Ï±ê־λ
}

-------------------------------------------------------------------------------------
main函数里面打印:
                if(TIM_CAPTURE_STA&0X80)、
                {
                        temp=TIM_CAPTURE_STA&0X3F;
                        temp*=65536;                                       
                        temp+=TIM_CAPTURE_VAL;               
                        printf("CAP:%d us\r\n",temp);       
                        TIM_CAPTURE_STA=0;                       

                }

请问这样写错在哪里吗?现在打印的结果跟我示波器看到的相差很多,实际上只有498us而程序打印了15998us。
回复

使用道具 举报

13

主题

186

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
441
金钱
441
注册时间
2016-6-30
在线时间
97 小时
发表于 2017-3-10 09:57:23 | 显示全部楼层
Electronic 发表于 2017-3-9 09:50
2楼说得对,一个上升沿捕获,一个下降沿捕获,也可以一个外部中断,一个输入捕获+定时器计数,同样两个外部 ...

跟计数器有什么关系啊?又不是计频率
回复

使用道具 举报

32

主题

883

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4036
金钱
4036
注册时间
2015-11-14
在线时间
545 小时
发表于 2017-3-10 15:56:08 | 显示全部楼层
yijinxiaoyou 发表于 2017-3-10 09:57
跟计数器有什么关系啊?又不是计频率

就算你用两个输入捕获引脚捕获,不还是一样需要用到定时器的计数功能,那怎么测量时间差
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2017-3-8
在线时间
7 小时
 楼主| 发表于 2017-3-14 18:35:54 | 显示全部楼层
kibin 发表于 2017-3-9 19:48
谢谢你提供的思路,我现在用TIM2的CH1/CH2两个通道开启捕获,参照单路捕获,代码如下:u8  TIM_CAPTURE_S ...

自己解决了,把TIM_GetCapture1(TIM2)替换成TIM_GetCounter()就可以了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-15 11:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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