OpenEdv-开源电子网

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

捕捉上升沿的问题,请大神不吝赐教

[复制链接]

17

主题

91

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2016-3-29
在线时间
96 小时
发表于 2018-12-18 17:35:30 | 显示全部楼层 |阅读模式
10金钱
我想捕捉上升沿,连续捕捉,每捕捉一次上升沿给一个控制信号,但进过测试发现在每次下降沿也会给一个控制信号,请大神帮忙解决一下这个问题,只想捕捉上升沿。用捕捉的方法处理上升沿的问题,不用外部中断。代码如下:捕捉引脚配置程序:

[mw_shl_code=c,true]void TIM2_Cap_Init(u16 arr,u16 psc)
{                 
        RCC->APB1ENR|=1<<0;           //TIM2 时钟使能
        RCC->APB2ENR|=1<<2;            //PORTA时钟使能
         
        GPIOA->CRL&=0XFFFFFFF0;
        GPIOA->CRL|=0X00000008;        //PA0 输入  
        GPIOA->ODR|=0<<0;                //PA0 下拉
          
        TIM2->ARR=arr;                  //设定计数器自动重装值
        TIM2->PSC=psc;                  //预分频器

        TIM2->CCMR1|=1<<0;                //CC1S=01         选择输入端
        TIM2->CCMR1|=0<<4;                 //不滤波
        TIM2->CCMR1|=0<<10;         //IC2PS=00         不分频

        TIM2->CCER &=~(1<<1);                 //CC1P=0        上升沿捕获
        TIM2->CCER|=1<<0;                 //CC1E=1         允许捕获计数器
        TIM2->DIER|=1<<1;           //允许捕获中断
        TIM2->DIER|=1<<0;           //允许更新中断
        TIM2->CR1|=0x01;            //使能定时器2
        MY_NVIC_Init(2,0,TIM2_IRQn,2);
}
[/mw_shl_code]



中断服务程序:
[mw_shl_code=c,true]void TIM2_IRQHandler(void)
{                     
        u16 tsr;
        tsr=TIM2->SR;
        TIM2->CCER &=~(1<<1);
        if((TIM2CH1_CAPTURE_STA&0X40)==0)//未捕获成功
        {  
                if(tsr&0x02)  //捕获1发生
                {                               
                        TIM2CH1_CAPTURE_STA=0X40;                //捕获上升沿标记
                }                                                                                   
        }
        TIM2->SR=0;//清楚中断标志
}
[/mw_shl_code]

主函数:
[mw_shl_code=c,true]int main(void)
{                         
        u32 temp_one=0,temp_two=0;         
        Stm32_Clock_Init(9);       
        uart_init(72,9600);                
        delay_init(72);                           
        LED_Init();                         
        TIM2_Cap_Init(0XFFFF,72-1);
           while(1)
        {         
                if(TIM2CH1_CAPTURE_STA&0X40)//捕获一次上升沿
                {
                        temp_two++;
                        temp_one = temp_two;
                        if(temp_one==1)
                        {
                                  LED0 = 0;
                                 delay_ms(5);
                                 LED0 = 1;
                                  temp_two=0;
                        }

                        TIM2CH1_CAPTURE_STA=0;                        //开启下一次捕获
                }
        }
}

[/mw_shl_code]

最佳答案

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

哦,我算错了。 不好意思 你试试把这个延时去掉,或者降低信号频率,再试试看?
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-12-18 17:35:31 | 显示全部楼层
scx2006114 发表于 2018-12-20 13:29
50Hz信号,周期是20ms,每个上升沿的间隔是20ms,延时5ms时间长了?我设置的捕捉上升沿,但是为啥它每次下 ...

哦,我算错了。
不好意思

你试试把这个延时去掉,或者降低信号频率,再试试看?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-12-19 02:27:22 | 显示全部楼层
信号频率是多高?是否超过20Hz了?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-12-19 02:27:25 | 显示全部楼层
信号频率是多高?是否超过20Hz了?
回复

使用道具 举报

17

主题

91

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2016-3-29
在线时间
96 小时
 楼主| 发表于 2018-12-19 08:18:59 | 显示全部楼层
正点原子 发表于 2018-12-19 02:27
信号频率是多高?是否超过20Hz了?

原子哥,信号是50Hz的方波信号
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-12-20 02:19:52 | 显示全部楼层
scx2006114 发表于 2018-12-19 08:18
原子哥,信号是50Hz的方波信号

50hZ,  那你在while里面延迟5ms就肯定出问题了
你延迟的时候,第二个上升沿就来到了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

17

主题

91

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2016-3-29
在线时间
96 小时
 楼主| 发表于 2018-12-20 13:29:38 | 显示全部楼层
正点原子 发表于 2018-12-20 02:19
50hZ,  那你在while里面延迟5ms就肯定出问题了
你延迟的时候,第二个上升沿就来到了。

50Hz信号,周期是20ms,每个上升沿的间隔是20ms,延时5ms时间长了?我设置的捕捉上升沿,但是为啥它每次下降沿也捕捉,然后输出一个低电平,不应该是捕捉到上升后才输出一个低电平吗?
回复

使用道具 举报

33

主题

159

帖子

0

精华

高级会员

Rank: 4

积分
527
金钱
527
注册时间
2017-1-21
在线时间
192 小时
发表于 2018-12-21 08:06:10 | 显示全部楼层
寄存器位不太记得了,反正就是3步:1、设置对应引脚模式,一般悬空输入啊,上拉,下拉输入啊,这些。2、设置引脚是否直连,你用TIM2是PA0 PA1,如果只需要但引脚检测上升沿,则引脚都配置成直接连接即可。3、设置你要的那一路定时器捕获为上升沿捕获。开始工作。
回复

使用道具 举报

17

主题

91

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2016-3-29
在线时间
96 小时
 楼主| 发表于 2018-12-21 09:08:17 | 显示全部楼层
正点原子 发表于 2018-12-21 02:46
哦,我算错了。
不好意思

好,我试试,谢谢原子哥
回复

使用道具 举报

17

主题

91

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2016-3-29
在线时间
96 小时
 楼主| 发表于 2018-12-21 09:10:16 | 显示全部楼层
oyixi001 发表于 2018-12-21 08:06
寄存器位不太记得了,反正就是3步:1、设置对应引脚模式,一般悬空输入啊,上拉,下拉输入啊,这些。2、设 ...

哦哦,我把引脚的配置再看看,谢谢啦
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-22 17:20

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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