近来在做一个脉冲计数的东西。前面与朋友探讨stm32脉冲计数的能力问题,同时也问了一些AI工具,一般认为stm32F103系列的计数频率范围应该不会太高,1MHz左右已是极限。如某AI回答如下:
在这里插入图片描述
实际情况到底如何?我利用手头现成的两块stm32F103平台的电路板,一块模拟脉冲信号,一块脉冲计数,将两者配合进行试验,结果如下:
在这里插入图片描述在这里插入图片描述
单片机理论输出脉冲频率24MHz,示波器测试如图,连续20次计数,20个数据仅个位有一个差值变化。对于一个两千四百万多的数据,仅个位数在1、2间跳动,可以认为其数据完全相同,说明对24MHz脉冲的计数非常稳定,同时也说明stm32输出的脉冲频率也极其稳定。计数值比理论值多151,对应的理论时间为6.3us。一个原因是中断程序执行时间应在微秒级,进入1秒定时中断程序计数硬件仍在运行;也有可能两个电路的主频可能存在极微小的差异。
在这里插入图片描述
在这里插入图片描述
18MHz的脉冲计数,基本情况完全一致,只是计数值与理论值的偏差略小,仅115。表明24MHz及其以下频率完全可以准确计数。

再看36MHz的情况,计数值与理论值及示波器检测值均有较大差异。首先stm32的36MHz脉冲输出,由于频率过高及寄生、耦合电容电感影响,脉冲形状变形大,幅度明显变小,示波器显示为35.71MHz,计数值为34.5~34.9Mcps间波动,说明丢失计数较多,最大近4%的丢失率。若1)用标准方波信号源,2)大幅缩短信号线长度;3)优化电路布板等,估计丢失率会有较大减少。
在这里插入图片描述在这里插入图片描述
整体上讲,stm32f103的计数能力可以达到24MHz的准确计数;但36MHz不太稳定,偏差在4%以内,对于要求不高的场合可能也可以,已不推荐。
实现高频脉冲计数,突破1MHz的常识瓶颈,主要是设计过程中避免频繁中断。stm32的定时器为16位,单次计数上限为65535,以72MHz计最短耗时910us,以1秒时计数则中断上千次,严重占耗CPU资源。所以不能直接使用中断响应来完成高频的脉冲计数,必须想办法靠硬件方式解决。
stm32的定时器有主从级联的工作模式,通过初始化设置,以主定时器的计数溢出事件直接驱动从定时器计数,启动后主从定时器计数无需软件控制,计数动作完全由硬件完成,计数范围可从单定时器的65535扩展到2^32(约43亿)。具体实现方法,参见我的另一篇文章:《利用stm32两个定时器级联实现32位计数

试验平台:Geehy APM32E103VET6

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐