野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11481|回复: 20

怎么检测两个上升沿的时间差?

[复制链接]
发表于 2015-12-18 21:18:03 | 显示全部楼层 |阅读模式
求大神指点
回复

使用道具 举报

发表于 2015-12-18 21:25:51 | 显示全部楼层
你可以参考一下计时器一节的内容啊。
回复 支持 反对

使用道具 举报

发表于 2015-12-19 10:24:38 | 显示全部楼层
中断  +   计时器
回复 支持 反对

使用道具 举报

发表于 2015-12-19 10:25:06 | 显示全部楼层
本帖最后由 亽亼 于 2015-12-19 12:00 编辑

如果信号只是一个输入源(一根线)那采用普通的输出捕获即可
如果是两个输入源(两根线)可以采用类似PWM输入模式,求计数器差值
实际上,如果精度要求不是非常高,可以直接使用外部中断+定时器(或系统定时器)组合更简单
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-12-19 19:00:05 | 显示全部楼层
亽亼 发表于 2015-12-19 10:25
如果信号只是一个输入源(一根线)那采用普通的输出捕获即可
如果是两个输入源(两根线)可以采用类似PWM输入 ...

求一个pwm输入捕获的例程,学习学习,谢谢!
回复 支持 反对

使用道具 举报

发表于 2015-12-21 08:36:15 | 显示全部楼层
这是F4的程序,你看看F1的兼不兼容
然后在中断服务函数中使用TIM_GetCapture1、TIM_GetCapture2获取计数值
  1. static void TIM_PWMINPUT_Config(void)
  2. {
  3.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  4.         TIM_ICInitTypeDef  TIM_ICInitStructure;
  5.        
  6.         // 开启TIMx_CLK,x[1,8]
  7.   RCC_APB2PeriphClockCmd(ADVANCE_TIM_CLK, ENABLE);

  8.   TIM_TimeBaseStructure.TIM_Period = 0xFFFF-1;        
  9.         // 高级控制定时器时钟源TIMxCLK = HCLK=180MHz
  10.         // 设定定时器频率为=TIMxCLK/(TIM_Prescaler+1)=100KHz
  11.   TIM_TimeBaseStructure.TIM_Prescaler = 1800-1;       
  12.   // 计数方式
  13.   TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;       
  14.         // 初始化定时器TIMx, x[1,8]
  15.         TIM_TimeBaseInit(ADVANCE_TIM, &TIM_TimeBaseStructure);
  16.        
  17.         /* IC1捕获:上升沿触发 TI1FP1 */
  18.   TIM_ICInitStructure.TIM_Channel = ADVANCE_IC1PWM_CHANNEL;
  19.   TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
  20.   TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
  21.   TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
  22.   TIM_ICInitStructure.TIM_ICFilter = 0x0;
  23.   TIM_PWMIConfig(ADVANCE_TIM, &TIM_ICInitStructure);
  24.        
  25.         /* IC2捕获:下降沿触发 TI1FP2 */       
  26.         TIM_ICInitStructure.TIM_Channel = ADVANCE_IC2PWM_CHANNEL;
  27.   TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;
  28.   TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_IndirectTI;
  29.   TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
  30.   TIM_ICInitStructure.TIM_ICFilter = 0x0;
  31.   TIM_PWMIConfig(ADVANCE_TIM, &TIM_ICInitStructure);
  32.        
  33.         /* 选择定时器输入触发: TI1FP1 */
  34.   TIM_SelectInputTrigger(ADVANCE_TIM, TIM_TS_TI1FP1);               

  35.   /* 选择从模式: 复位模式 */
  36.   TIM_SelectSlaveMode(ADVANCE_TIM, TIM_SlaveMode_Reset);
  37.   TIM_SelectMasterSlaveMode(ADVANCE_TIM,TIM_MasterSlaveMode_Enable);

  38.   /* 使能高级控制定时器 */
  39.   TIM_Cmd(ADVANCE_TIM, ENABLE);

  40.   /* 使能捕获/比较2中断请求 */
  41.   TIM_ITConfig(ADVANCE_TIM, TIM_IT_CC1, ENABLE);
  42. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-12-21 09:37:48 | 显示全部楼层
亽亼 发表于 2015-12-21 08:36
这是F4的程序,你看看F1的兼不兼容
然后在中断服务函数中使用TIM_GetCapture1、TIM_GetCapture2获取计数值 ...

好像不行,先谢谢你!我可不可以用捕获火哥高电平时间的例子,然后在中断服务函数中加个标志位,捕获两次高电平后,从头再捕获?
回复 支持 反对

使用道具 举报

发表于 2015-12-21 09:51:55 | 显示全部楼层
本帖最后由 亽亼 于 2015-12-21 09:56 编辑

如果信号只是一个输入源(一根线)那采用普通的输出捕获即可
可以参考:TIM—输入捕获(测量脉宽)
如果你是一根信号线的,比例程还简单
QQ截图20151221095552.png
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-12-21 10:26:34 | 显示全部楼层
亽亼 发表于 2015-12-21 09:51
如果信号只是一个输入源(一根线)那采用普通的输出捕获即可
可以参考:TIM—输入捕获(测量脉宽)
如果你 ...

谢谢你!今天才知道有官方例程可以看,非常感谢!我先试试,又学习了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-12-21 10:40:36 | 显示全部楼层
亽亼 发表于 2015-12-21 09:51
如果信号只是一个输入源(一根线)那采用普通的输出捕获即可
可以参考:TIM—输入捕获(测量脉宽)
如果你 ...

单片机能捕获的上升沿的幅值是多少呢?我用信号发生器试一下。
回复 支持 反对

使用道具 举报

发表于 2015-12-21 11:40:09 | 显示全部楼层
搞了这么久连个幅值都不知道,stm32一般不就是3v3吗
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-12-21 12:24:28 | 显示全部楼层
亽亼 发表于 2015-12-21 11:40
搞了这么久连个幅值都不知道,stm32一般不就是3v3吗

不是说检测上升沿么,就不知道这是啥了,还有,大神,我将pwm输出例程的文件添加到工程里了,然后仿真没有输出,为什么呢?
回复 支持 反对

使用道具 举报

发表于 2015-12-21 16:44:39 | 显示全部楼层
仿真没用过,用示波器看,没有输出就是程序问题
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-12-22 16:22:49 | 显示全部楼层
亽亼 发表于 2015-12-21 16:44
仿真没用过,用示波器看,没有输出就是程序问题

void TIM2_IRQHandler(void)
{
  if(TIM_GetITStatus(TIM2, TIM_IT_CC2) == SET)
  {
   
    TIM_ClearITPendingBit(TIM2, TIM_IT_CC2);
        {
    if(CaptureNumber == 0)
    {
   
      IC2ReadValue1 = TIM_GetCapture2(TIM2);
      CaptureNumber = 1;
    }
    else if(CaptureNumber == 1)
    {
      //Get the Input Capture value
      IC2ReadValue2 = TIM_GetCapture2(TIM2);
      
      // Capture computation
      if (IC2ReadValue2 > IC2ReadValue1)
      {
        Capture = (IC2ReadValue2 - IC2ReadValue1);
      }
      else
      {
        Capture = ((0xFFFF - IC2ReadValue1) + IC2ReadValue2);
      }
    }
  }
                                if(Capture!=0)
                        {
         DutyCycle = (TIM_GetCapture1(TIM2) * 100) / Capture;
                           Frequency = 72000000 / Capture;
         CaptureNumber = 0;
                       
               printf("\r\n ¼ÆêyÖμÎa£o %d\r\n",Frequency);
               printf("\r\n DutyCycle: %d\r\n",DutyCycle);
       
               Delay(10000);
                        }
        }
       
}这个为什么打印的频率和占空比不对呢?谢谢大神耐心指教了那么多问题
回复 支持 反对

使用道具 举报

发表于 2015-12-22 17:11:28 | 显示全部楼层
测占空比和频率我们不是有例程吗,参考例程就好了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-12-24 10:59:40 | 显示全部楼层
亽亼 发表于 2015-12-22 17:11
测占空比和频率我们不是有例程吗,参考例程就好了

我是想用两个上升沿的计数值计算频率的,但是得到的计数值不对。。
回复 支持 反对

使用道具 举报

发表于 2015-12-24 11:25:49 | 显示全部楼层
觉得你还没看明白定时器相关内容,在啃啃stm32技术手册吧
你只是计算频率,使用普通的上升沿触发输入捕获模式即可
还有一个点需要注意的:需要根据外部信号频率大致范围,确定预分频数
定时器一般是16位计数,最大值为65535,假设定时器频率为10MHz,而假设你的信号源大概为1Hz,这样的情况是测量不准确的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-12-25 11:03:33 | 显示全部楼层
亽亼 发表于 2015-12-24 11:25
觉得你还没看明白定时器相关内容,在啃啃stm32技术手册吧
你只是计算频率,使用普通的上升沿触发输入捕获 ...

嗯嗯,我再好好看看手册。开始我想的是检测到两个上升沿,每次得一个计数值,后一次的减上一次的就可以得出计数差,然后再由时钟频率计算两个上升沿的时间,结果得到的数值也不正确。。。谢谢大神回答了我那么多问题。非常感谢!圣诞快乐!
回复 支持 反对

使用道具 举报

发表于 2015-12-25 11:07:58 | 显示全部楼层
每次得一个计数值就可以直接结合定时器时钟计算得到频率,不需要“后一次的减上一次的就可以得出计数差
回复 支持 反对

使用道具 举报

发表于 2015-12-25 11:09:07 | 显示全部楼层
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-12-25 11:48:10 | 显示全部楼层
亽亼 发表于 2015-12-25 11:09
http://www.firebbs.cn/thread-10568-1-1.html
参考这个文档理解

谢谢你!Merry Christmas !
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2025-1-11 07:49 , Processed in 0.052025 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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