你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

当有一外部信号(上升和下降沿触发),用timer计测脉冲间隔的问题,要给采用那种触发:ITRx、Gate、还是其它那种方式最好,响应最快,谢谢

[复制链接]
zhjb1 提问时间:2025-3-17 12:50 / 未解决

收藏 评论7 发布时间:2025-3-17 12:50

举报

7个回答
xmshao 回答时间:2025-3-17 16:18:01
如果你是想测量外部脉冲宽度,采用TIMER的输入捕获功能比较合适。


测量连续两次的时间差,这个时间差用内部定时器两次捕获的差值来获得。


下面有篇文章介绍基于STM32 定时器做脉宽测量的内容,你可以参考下。

基于定时器捕获测量脉宽的应用示例
zhjb1 回答时间:2025-3-17 12:54:46

问题如题。采用STM32F401芯片,想用内部时钟计数外部脉冲间隔(可以是沿到沿或两上升沿之间),采用那种方式最好。

希望响应速度快,丢码率低,重复可靠。

有样板工程最好。

先谢谢了

zhjb1 回答时间:2025-3-17 12:55:27
问题如题。采用STM32F401芯片,想用内部时钟计数外部脉冲间隔(可以是沿到沿或两上升沿之间),采用那种方式最好。
希望响应速度快,丢码率低,重复可靠。
有样板工程最好。
先谢谢了


zhjb1 回答时间:2025-3-17 16:58:25

谢谢[ xmshao]

看了您的文章,有点不太明白,估计需要细琢磨一下。我按照您的文章的CubeMX配置开始尝试。主要的问题是STM32F401RCT6右3个Timer可以设置,有两个已经用作PWM输出,只有一个TIMER2作为外部捕获测量,思路是用TIMER4或11记录内部时钟(已经设为80MHz)这没有关系,我的思路与您这个稍稍有点不同时:用TIMER4或11内部Clock定时器时间间隔触发TIMER2开始进入外部信号测量计数过程,由TIMER4或11第二个脉冲终止TIMER2的计数,进入计算阶段,计算完毕,重新开始此循环。

再次感谢回复和您的文章,谢谢谢谢

butterflyspring 回答时间:2025-3-17 17:54:17
如果速度快的脉冲,可以考虑下面的方式


同一定时器的两个通道。



使能第二个通道的中断,


这样在这个捕获中断中就可以同时处理两个捕获值,计算间隔。

当然,速度慢一些就不合适了。
xmshao 回答时间:2025-3-17 22:27:04

zhjb1 发表于 2025-3-17 16:58
谢谢[ xmshao]</p>
<p>看了您的文章,有点不太明白,估计需要细琢磨一下。我按照您的文章的CubeMX配置开始尝 ...

[md]说实在的,对你的需求还不是看得很明白。

整体上讲,测量脉冲宽度我们可以给予一个通道,也可以基于两个通道。从你的描述来看,测量的起止有额外的同步动作?没关系,总会有办法的。

你可以把你的需求用图文的形式表述或许更清晰。

zhjb1 回答时间:2025-3-20 17:12:54

这个问题暂时解决了。首先感谢 xmshao的一篇推荐文章,翻阅后对从CUBEMX开始设置项目,其中tim的选设有了一定了解,有东西大家分享吧。

按照文章中的选设(文中是TIM4,本人采用的是STM32F401RCxx只有T1-T3有外部触发其余的tim只能内部触发)设定Timer2为外部触发产生事件。T1,T3一已在系统中设定为PWM,当然曾考虑到T2具有32为分辨率作为外部触发计数具有独到优势。

具体设置可以参考 xmshao 给的文档此处不再重复,仅仅将我在试验中的测试结果做一描述。先声明,绝对不是最佳方案,仅仅是实现了需要的功能,如此而已。当让后边还会描述进一步想做何用,急需的实验抽空再做了。

本实验希望能对外部信号进行中断计数,“单位”时间数脉冲数,能读一次即可多测更好!

CubeMX设置完成后并不能立即实现需要做一些代码设置。

我的MCU是STM32F401RCxx,主频最高支持84MHz最后设在了外部25MHz晶振,PLL设置到Core Clock为84MHz,许多计算按照文章带入实际上不准确,误差非常大——不是一倍几倍,只能采用测试的方法——当然与找不到这款芯片的用户手册有关——官网和许多技术网站只能搜到几乎一样的技术手册。想搜相关的F4系列的用户手册也无果,这是诟病。

首先设置main前部的time2的初始代码:

HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1); HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_2); __HAL_TIM_ENABLE_IT(&htim2,TIM_IT_UPDATE); __HAL_TIM_CLEAR_FLAG(&htim2,TIM_FLAG_TRIGGER);

后两句也可以先不写。

接着设置tim.c中TIM2中的一句进行测式:

sSlaveConfig.InputTrigger =TIM_TS_TI2FP2;

这一句实在CubeMX设置完成后自动生成的,我用了两个Tim4,Tim11想用他们来产生TI2FP2信号,结果无果,既然这种方式不行,那么就采用自己触发采样计数,遍历TIM_TS_TI2FP2,结果搜到了触发定义变量(有用的2个):

TIM_TRGO_OC1;

TIM_TRGO_UPDATE;

经过测试两个都能触发tim2进行计数,相对而言前一个函数误差最小。于是更改stm32f4xx_it.c函数中关于time2的中断向量函数,原始如下:

/**

  • @brief This function handles TIM2 global interrupt. / void TIM2_IRQHandler(void) { / USER CODE BEGIN TIM2_IRQn 0 */
  • / USER CODE END TIM2_IRQn 0 / HAL_TIM_IRQHandler(&htim2); / USER CODE BEGIN TIM2_IRQn 1 /

/ USER CODE END TIM2_IRQn 1 / }

只需要在用户代码中加入一段中断处理函数即可,本思路是:第一个出发沿开始计数,之到第二个触发沿终止计数,为了省事和技术准确(不因中断二占用计数时间),在中断函数中永远累加计数,在中断处理中完成求此时间间隔的计数值,结果效果比预想的好,加入的代码如下:

/ USER CODE END TIM2_IRQn 1 /

if(__HAL_TIM_GET_FLAG(&htim2,TIM_FLAG_UPDATE)!=RESET){

//__HAL_TIM_CLEAR_IT(&htim2,TIM_IT_UPDATE); __HAL_TIM_CLEAR_FLAG(&htim2,TIM_FLAG_TRIGGER); t2Cnt++;if(t2Cnt>1){t2Cnt=0;kk=ttc;ttc=0;} } ttc++;

/ USER CODE END TIM2_IRQn 0 / HAL_TIM_IRQHandler(&htim2); / USER CODE BEGIN TIM2_IRQn 1 /

其中ttc是tim2每产生一次沿中断,ttc累加一次;

代码首次运行t2Cnt=0;中断处理函数是首次沿中断,将ttc清0,t2Cnt++;(此时为1)

带第二次沿中断,t2Cnt+1>1,

将ttc的值赋予kk,同时ttc清0;。kk是送LCD显示和计算的计数值。

经过测试,在测试99.99KHz以及1KHz的赔率下的误差都小于1/1000。

美中不足的是,多次循环采样中LCD现实的数据会有个位数的小跳变。当然与偷懒有关——kk开作为按键的测试值显示在LCD上。

证明此方案技术可用。

再次感谢 [xmshao](https://shequ.stmicroelectronics.cn/space-uid-1105.html

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版