OpenEdv-开源电子网

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

STM32定时器如何测量多个上升沿间隔时间

[复制链接]

2

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2016-6-16
在线时间
16 小时
发表于 2016-7-13 10:37:14 | 显示全部楼层 |阅读模式
10金钱
本帖最后由 loosens111 于 2016-7-13 10:40 编辑

用了原子的例程,是测量高电平时间的,现在有一个高低电平时间不定的波形需要测量周期,想要每个5个上升沿测量一次时间 QQ截图20160713103934.png
这是原子例程
[mw_shl_code=applescript,true]void TIM5_IRQHandler(void)
{

         if((TIM5CH1_CAPTURE_STA&0X80)==0)//»1Î′3é1|2¶»ñ        
        {         
                if (TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET)
                 
                {            
                        if(TIM5CH1_CAPTURE_STA&0X40)//òѾ-2¶»ñμ½¸ßμçÆ½áË
                        {
                                if((TIM5CH1_CAPTURE_STA&0X3F)==0X3F)//¸ßμçÆ½ì«3¤áË
                                {
                                        TIM5CH1_CAPTURE_STA|=0X80;//±ê¼Ç3é1|2¶»ñáËò»′Î
                                        TIM5CH1_CAPTURE_VAL=0XFFFF;//2¶»ñÖμ
                                }else TIM5CH1_CAPTURE_STA++;
                        }         
                }
        if (TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET)//2¶»ñ1·¢éú2¶»ñê¼t
                {        
                        if(TIM5CH1_CAPTURE_STA&0X40)                //2¶»ñμ½ò»¸öϽμÑØ                 
                        {                                 
                                TIM5CH1_CAPTURE_STA|=0X80;                //±ê¼Ç3é1|2¶»ñμ½ò»′ÎéÏéyÑØ
                                TIM5CH1_CAPTURE_VAL=TIM_GetCapture1(TIM5);
                                   TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising); //CC1P=0 éèÖÃÎaéÏéyÑØ2¶»ñ
                        }else                                                                  //»1Î′¿aê¼,μúò»′Î2¶»ñéÏéyÑØ
                        {
                                TIM5CH1_CAPTURE_STA=0;                        //Çå¿Õ
                                TIM5CH1_CAPTURE_VAL=0;
                                 TIM_SetCounter(TIM5,0);
                                TIM5CH1_CAPTURE_STA|=0X40;                //±ê¼Ç2¶»ñμ½áËéÏéyÑØ
                                   TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling);                //CC1P=1 éèÖÃÎaϽμÑØ2¶»ñ
                        }                    
                }                                                                                    
         }

    TIM_ClearITPendingBit(TIM5, TIM_IT_CC1|TIM_IT_Update); //Çå3yÖD¶Ï±ê־λ

}[/mw_shl_code]

下面是我的修改
[mw_shl_code=applescript,true]void TIM5_IRQHandler(void)
{

         if((TIM5CH1_CAPTURE_STA&0X80)==0)//»1Î′3é1|2¶»ñ        
        {         
                if (TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET)
                 
                {            
                        if(t<5)//ò&#209;&#190;-2&#182;&#187;&#241;μ&#189;&#184;&#223;μ&#231;&#198;&#189;á&#203;
                        {
                                if((TIM5CH1_CAPTURE_STA&0X3F)==0X3F)//&#184;&#223;μ&#231;&#198;&#189;ì&#171;3¤á&#203;
                                {
                                        TIM5CH1_CAPTURE_STA|=0X80;//±ê&#188;&#199;3é1|2&#182;&#187;&#241;á&#203;ò&#187;′&#206;
                                        TIM5CH1_CAPTURE_VAL=0XFFFF;//2&#182;&#187;&#241;&#214;μ
                                }else TIM5CH1_CAPTURE_STA++;
                        }         
                }
        if (TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET)//2&#182;&#187;&#241;1·¢éú2&#182;&#187;&#241;ê&#194;&#188;t
                {        
                        if(t==0)
                                {
                          TIM5CH1_CAPTURE_STA|=0X40;
                                TIM_SetCounter(TIM5,0);
                                TIM5CH1_CAPTURE_VAL=0;
                                t++;
                                TIM5CH1_CAPTURE_STA&=!0X80;
                                }
                        if(t<5&&t>0)
       {t++;}
                        if(t==5)
                        {
                                TIM5CH1_CAPTURE_STA|=0X80;
                                TIM5CH1_CAPTURE_VAL=TIM_GetCapture1(TIM5);
                                TIM5CH1_CAPTURE_STA&=!0X40;
                                t=0;
                        }
                }                                                                                    
         }

    TIM_ClearITPendingBit(TIM5, TIM_IT_CC1|TIM_IT_Update); //&#199;&#229;3y&#214;D&#182;&#207;±ê&#214;&#190;&#206;&#187;

}[/mw_shl_code]

怎么也得不出正确时间,焦头烂额两天了,请各位指教一下。非常感谢!

最佳答案

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

开启定时器自由计数, 输入作为中断,上升沿触发。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

58

主题

6296

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11603
金钱
11603
注册时间
2014-4-1
在线时间
1327 小时
发表于 2016-7-13 10:37:15 | 显示全部楼层

开启定时器自由计数,
输入作为中断,上升沿触发。


回复

使用道具 举报

2

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2016-6-16
在线时间
16 小时
 楼主| 发表于 2016-7-13 10:59:50 | 显示全部楼层
xuande 发表于 2016-7-13 10:44
开启定时器自由计数,
输入作为中断,上升沿触发。

您的意思我大致明白了,就是每次上升沿的时候记录下当前计数值,几次上升沿之后计算差值,原子的高电平测量时间的例程好像也是这样的,我程序也是按照这个思路写的,我感觉是计算定时器溢出的时候出现了问题。
回复

使用道具 举报

3

主题

22

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
233
金钱
233
注册时间
2016-4-24
在线时间
62 小时
发表于 2017-3-8 10:34:45 | 显示全部楼层
   最后调试的怎么样了,调试通了吗
回复

使用道具 举报

2

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2016-6-16
在线时间
16 小时
 楼主| 发表于 2017-5-2 16:48:16 | 显示全部楼层
circle 发表于 2017-3-8 10:34
最后调试的怎么样了,调试通了吗

最后通了
回复

使用道具 举报

2

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2016-6-16
在线时间
16 小时
 楼主| 发表于 2017-5-2 16:48:47 | 显示全部楼层
大致就是每隔5个上升沿记录一次有效
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-8-21 20:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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