野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 16188|回复: 20

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

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

如果信号只是一个输入源(一根线)那采用普通的输出捕获即可
如果是两个输入源(两根线)可以采用类似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:51:55 | 显示全部楼层
本帖最后由 亽亼 于 2015-12-21 09:56 编辑

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-4-4 22:26 , Processed in 0.042740 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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