OpenEdv-开源电子网

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

初学者定时器输入捕获问题

[复制链接]

3

主题

12

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2013-8-12
在线时间
0 小时
发表于 2013-9-6 21:08:48 | 显示全部楼层 |阅读模式
请问下,现在我就有一个定时器空闲但是有两路信号要进行输入捕获,并且要计算高电平宽度(超声波测距),能按照原子哥教的方法先捕获高电平上升沿,然后触发中断,在中断中改为下降沿捕获,以此计算高电平宽度嘛(一个定时器的两个通道都要捕获,并不互相影响)!我是个初学者,就是在想原子哥教的方法中断中好像涉及到定时器的寄存器以及中断清零,已开启下一次捕获,但是这样,一旦一个捕获完成而另一个还在计数,完成的各种清零,是不是会影响到未完成的的计数!一直都是跟着原子哥的,中断里的写法参见原子哥开发指南!不知道我是否将问题描述清楚,这种方式下,也只能这样表示下感谢了!希望原子哥或大神能给点指点,当然最好能把中断中的处理给简单的写下!再次感谢……
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

12

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2013-8-12
在线时间
0 小时
 楼主| 发表于 2013-9-6 21:21:21 | 显示全部楼层
附上原子哥的高电平输入捕获中断处理函数:

u8 TIM2CH1_CAPTURE_STA=0;
u16 TIM2CH1_CAPTURE_VAL; 

void TIM2_IRQHandler(void)
{
    if((TIM2CH1_CAPTURE_STA&0x80)==0)     
    {
        if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET)
        {
            if(TIM2CH1_CAPTURE_STA&0x40)     
            {
                if((TIM2CH1_CAPTURE_STA&0x3f)==0x3f)   
                {
                    TIM2CH1_CAPTURE_STA=0x80;         
                    TIM2CH1_CAPTURE_VAL=0xffff; 
                }
                else TIM2CH1_CAPTURE_STA++;
             }
        }
    }
    if(TIM_GetITStatus(TIM2,TIM_IT_CC1)!=RESET)
    {
        if(TIM2CH1_CAPTURE_STA)             
        {
            TIM2CH1_CAPTURE_STA|=0x80;    
            TIM2CH1_CAPTURE_VAL=TIM_GetCapture1(TIM2);
            TIM_OC1PolarityConfig(TIM2,TIM_ICPolarity_Rising); 
        }
    else
    {
            TIM2CH1_CAPTURE_STA=0;
        TIM2CH1_CAPTURE_VAL=0;
        TIM_SetCounter(TIM2,0);
        TIM2CH1_CAPTURE_STA=0x40;           
        TIM_OC1PolarityConfig(TIM2,TIM_ICPolarity_Falling);
    }
    }
    TIM_ClearITPendingBit(TIM2,TIM_IT_CC1|TIM_IT_Update);  
}

求指导,谢谢……
回复 支持 反对

使用道具 举报

3

主题

12

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2013-8-12
在线时间
0 小时
 楼主| 发表于 2013-9-6 21:30:56 | 显示全部楼层
比如:
TIM_SetCounter(TIM2,0);
这一句是不是就是对整个定时器2的操作呢,如果是的话不就影响另一路输入信号的捕获了吗?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-9-6 21:41:57 | 显示全部楼层
回复【3楼】初学者1:
---------------------------------
这句就把CNT清零了。
你要做多路PWM的输入捕获,那么就不应该对CNT进行清零,而是要统计CNT的计数。这就需要一个全局变量,来统计CNT的溢出次数。
然后结合这个全局变量和CNT的当前值,来判断每一路输入捕获的实际CNT值。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

12

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2013-8-12
在线时间
0 小时
 楼主| 发表于 2013-9-6 23:49:26 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
请问原子哥,我就仅仅捕获超声波的返回信号,计算高电平脉宽,能只使用一个定时器对两路信号捕获并计算宽度吗?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-9-7 15:38:15 | 显示全部楼层
可以。软件麻烦点而已。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2013-12-15
在线时间
0 小时
发表于 2014-5-20 14:21:56 | 显示全部楼层
回复【2楼】初学者1:
---------------------------------
解决了吗?我也遇到类似问题了
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-7 20:07

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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