• 正文
  • 相关推荐
申请入驻 产业图谱

利用TIMER实现外部方波的跟随输出

04/28 15:17
502
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

作者:MilerShao

现在有这样一个需求,某STM32用户想对一外来方波信号经过STM32F446芯片处理后实现跟随输出。具体就是STM32输出的信号跟原始信号保持同频率、同占空比,而且,跟随输出要跟原始信号有一定的相位差,即跟随输出相对原始信号有一定的可调整的延时。见下图示意【红色为原始信号,蓝色为跟随输出信号】:

鉴于目前需求,我首先想到了如下方案。

将外来信号同时接到STM32F446的两个TIMER,假设分别是TIM2和TIM5,前者配置为复位从模式,用来对外来信号的脉宽和周期进行测量,后者做跟随输出。TIM5整体上工作在触发从模式,保证它的计数启动靠外来信号的边沿触发。只有在需要修改新的输出脉宽和周期时,才临时关闭TIM5的从模式并停止计数。

因为这里需要跟随输出与原始信号有输出延迟,除了调整TIM5的CCR及ARR外,还要给TIM5计数器一个合适的初始值,以保证跟随输出相对原信号的相位差。这三个数据都准备好后再将TIM5配置为触发从模式,等待外来信号的再次触发启动并实现跟随输出。

下图是实现方案的功能框图示意。其中,TIM3是用来模拟外部信号,是频率大致在20Khz~50KHz的方波。图中闪电符号表示TIMER之间的主从触发关系。

整体上看,这个方案应该说没有什么大问题。

我先是模拟验证了一遍,发现波形跟随得很好、很稳定,延时相位也可控。所谓的模拟验证,就是在代码里不时修改TIM3的脉宽及周期,之后通过代码将TIM3的新数据给到TIM5,并调整每次的启动延时。显然这个模拟过程,我直接省掉了TIM2的测试环节。

可当我做全环节实际验证时却出了问题。虽然咋看上去,跟随输出信号跟原始信号的脉宽、周期基本一致,但有个致命的问题,那就是跟随输出跟原始信号的相位不稳定,二者相对相位总是飘来飘去的,即两个信号根本做不到同步。

这是怎么回事呢?模拟验证又是OK的!?

原来是这样的。在模拟验证过程中,我只是简单地将TIM3的CCR/ARR值直接赋值给了TIM5,同一个芯片、同一个时钟源、同一种分频,导致二者工作参数一模一样,除了输出相位有差异外,真正做到了同频同占空比,最终二者总是保持稳定的同步输出。

而在全环节验证时,TIM5的工作参数不再直接来自于TIM3的寄存器,而是来自于TIM2的测试结果。不难想象,这个测试结果跟TIM3的实际工作参数总会有误差,或者说TIM2的测得的时间量化参数跟外部信号的实际时间一定是有偏差的,这样导致TIM5的ARR参数跟实际外来信号的周期总是有偏差,最终使得跟随信号的输出与原外来信号产生了漂移。

显然,测试结果与实际参数偏差较小时,发生明显漂移所需要的时间积累就长些,偏差大时,发生明显偏移的时间积累就相对短些。

插一句,关于这点可以阅读本公众号的另一篇分享文章《本来同步的信号为何有相差了?》。

好,接着聊当前方案。显然,目前方案还有待完善,怎么改呢?

想来想去,决定在目前方案基础上做些调整。再增加一个TIMER,比方TIM4,让它也被外来信号触发启动,并工作在单脉冲模式。它的作用有两个,第一个就是产生跟随信号与原始信号的输出延迟;第二个呢,就是用TIM4的更新事件去触发TIM5,TIM5工作在复位模式,做触发传递中继。

下面是改进方案的功能框图示意。其中TIM2还是专用于测量外来信号的脉宽,在捕获中断里将测得的新数据赋给TIM5。具体到这里,我们其实只需关注TIM2测得的外来信号的高电平脉宽。

下面使用STM32CubeMx工具进行相关配置,以实现上述方案。

首先是TIM3的配置,它的配置很简单,找个通道能输出PWM脉冲即可。它作用就是模拟产生外来信号。它的时基参数初始值是多少无所谓,反正代码里会经常修改。

下面是TIM2的配置,主要功能就是对外来信号进行脉宽测量。这里启用了通道2的捕获中断,它的捕获值将提供给TIM5的CCR。

下面是TIM4的配置,工作在触发从模式,产生原始信号与跟随输出的相位延迟,并基于更新事件产生触发输出。

下面是用作跟随输出的TIM5的配置。使用其CH4作PWM输出,CCR4的初始值随便写个,将来会在TIM2的捕获中断里根据TIM2-CH2的捕获结果来进行修改。至于它的ARR值,这里保持写计数量程最大值即可,毕竟TIM5总是被TIM4的更新事件触发复位的。

配置都OK后,创建工程。要添加的用户代码就很简单了。就下面几行代码,也没啥要特别注意的。

至于在TIM2-CH2的捕获中断里修改TIM5-CCR4的代码就没必要贴出来了。

实际测试时,我在代码里随机地修改TIM3的ARR和TIM3-CCR3的值,模拟外部信号脉宽及占空比的变化,然后观察TIM5 CH4的跟随输出情况,结果还是不错的。跟随很稳定,跟随输出的延时也可调可控。具体效果可以点击下方阅读原文链接查看相关视频。

上面方案的实现算是针对STM32 TIMER的一次综合演练,我使用STM32F446和STM32G474的开发板都验证过,都可以正常实现,供有兴趣的同仁参考。OK,今天的话题就分享到这里,下次再聊~!

相关推荐

登录即可解锁
  • 海量技术文章
  • 设计资源下载
  • 产业链客户资源
  • 写文章/发需求
立即登录