频率、周期与脉宽测量:用已知时钟给未知信号「打拍子」
更新时间:2026-09-24。本文是「集成电路大类 · 芯片设计」入门层(beginner) 数字逻辑基础的一篇。前面用 计数器 生成时间,这一篇反过来——测时间:外部信号多久来一个沿(频率/周期)、高电平持续多久(脉宽)。它是 PWM 读回、超声波测距、转速测量的共同基础,也呼应了 正交编码器的 M/T 测速。
本文要回答的问题
- 怎么用数字逻辑测一个信号的频率?闸门计数的 ±1 误差从哪来?
- 测频法(M 法)和测周法(T 法)为什么一个适合高频、一个适合低频?
- 「等精度/倒数频率计」凭什么在全频段误差恒定?
- 输入捕获(input capture)单元在硬件上自动做了什么?两次沿之差为什么就是周期?
- 测异步信号为什么要先同步?计数器溢出、脉宽超量程怎么处理?
一、先把要测的四个量说清
一个周期数字信号只有两类信息值得测:它多久重复一次,以及每个周期里高电平占多久。由此派生出四个量:
- 频率 f:每秒多少个周期,单位赫兹(Hz)。1 kHz 就是每秒 1000 个周期;
- 周期 T:一个周期持续的秒数,
T = 1/f。1 kHz 对应 T=1 ms,市电 50 Hz 对应 T=20 ms; - 脉宽 Ton:高电平(或指定电平)持续时间。超声波模块的回波脉宽典型几十到几万微秒;
- 占空比 D:
D = Ton/T,用百分数表示。PWM 调光信号常见 0~100%。
实际工程里这四个量无处不在:电机每转一圈编码器给出 100 个脉冲,1 秒内数到 500 个,就是 5 转/秒、300 rpm;红外遥控的 NEC 协议靠 0.56 ms 与 1.69 ms 两种脉宽区分 0 和 1,解码过程见 红外 NEC 协议解码;超声波测距中回波脉宽 58 μs,按声速 343 m/s 算往返,距离 = 343 × 58μs ÷ 2 ≈ 10 mm。
这些场景的共同点是:手里有一个频率精确已知的时钟,要去度量一个频率或时间未知的信号。 所有数字测频方法都是这个套路,区别只在于「数谁的脉冲、在多长的窗口里数」。
顺带说一句频率和周期的关系:数学上 f=1/T 测谁都一样,但测量行为并不对称。频率是把很多个周期平均起来,单个周期的抖动被摊薄,适合看信号长期准不准;周期(脉宽)是逐个测量,能看到每个周期的长短变化,比如电机转动稳不稳、传感器回波有没有抖动。仪器面板上的频率计给一个稳定读数,逻辑分析仪式的逐周期测量给一串跳动的数——选型时先想清楚要的是平均值还是每一拍的值。
二、测频法(M 法):在已知闸门里数脉冲
最直观的办法是准备一个精确已知宽度 Tgate 的闸门(由定时器对基准时钟 分频 产生,比如整 1 秒),闸门有效期间,另一个计数器专门对外部信号的有效沿(比如上升沿)累加:
图上的数据流分两路:基准时钟经分频得到「尺子」Tgate,外部信号在闸门这把尺子下面被数个数。闸门内数到 N 个脉冲,结果就是 f ≈ N / Tgate。
误差来自计数的 ±1 量化:闸门的开启和关闭时刻与外部沿完全无关,开头、结尾各可能错判半个脉冲,合起来最多差一个。相对误差约为 1/N,代入具体数字感受最明显:
- 闸门 1 秒、被测 1 MHz:N≈1,000,000,相对误差约 0.0001%;
- 闸门 1 秒、被测 50 Hz:N=50,相对误差约 2%——1 个脉冲的出入就是 2%;
- 把闸门缩到 0.1 秒换取更快更新,50 Hz 下 N 只有 5 个,误差升到 20%,基本不可用。
结论很直接:同一闸门内脉冲数 N 越大越准,所以 M 法适合高频信号;想让低频也准,只能把闸门拉长,代价是结果更新变慢。
±1 之外还有两个容易被忽略的误差源。其一,闸门本身的宽度也是晶振给的,晶振偏 50 ppm,Tgate 就偏 50 ppm,结果 f 整体跟着偏同样比例——尺子不准,数得再仔细也没用,这一项只能靠换更好的时基解决。其二是触发误差:外部信号边沿若带着噪声、上升缓慢,可能在阈值附近来回抖动,被计数器当成好几个沿,实际表现为读数偶发跳变,硬件上通常给输入加施密特触发(有滞回的整形器)先把信号整成干净的方波再测。
三、测周法(T 法):用高频时钟填充一个周期
低频信号用 M 法吃亏,那就把测量关系倒过来:不再用长闸门数稀少的外部脉冲,而是用一个远高于被测信号的已知时钟 fc 去填充「外部信号的一个周期」。一个外部周期内数到 M 个高频时钟,则:
T = M / fc , f = fc / M还是拿 50 Hz 举例。fc=100 MHz 时,一个 20 ms 周期里填得下 M = 100,000,000 × 0.02 = 2,000,000 个时钟,±1 误差的相对值只有 5×10⁻⁷,比 M 法的 2% 好了四个数量级。反过来测 1 MHz 信号,M 只有 100,相对误差 1%——频率越高,一个周期里塞得下的时钟越少,T 法越差。所以 T 法适合低频。
测脉宽是同一思路的「半截版本」:只在高电平区间数高频时钟,Ton = Mhi / fc;再测整个周期的 M,占空比就是 D = Mhi / M。读 PWM 接收机、舵机控制信号(脉宽通常 1~2 ms)用的都是这个办法,配合 PWM 生成 正好凑成一对收发。
| 方法 | 数谁的脉冲 | 窗口 | 公式 | 适合频段 | 相对误差 |
|---|---|---|---|---|---|
| 测频 M 法 | 外部脉冲 N | 固定闸门 Tgate | f = N/Tgate | 高频 | ≈1/N,频率升高更准 |
| 测周 T 法 | 高频时钟 M | 一个外部周期 | f = fc/M | 低频 | ≈1/M,频率降低更准 |
两者本质都是「用一个已知频率去量另一个频率」,只是巧妙地把 ±1 误差放到频率高、脉冲多的那一侧。实际频率计据此自动换挡:低频切 T 法、高频切 M 法,让被计数的 N 或 M 始终足够大。
四、等精度(倒数)频率计:全频段误差恒定
换挡方案在切换点附近仍不完美:M 法的误差随频率变化,低频段再怎么换挡也受更新率限制。更好的办法是等精度测量(reciprocal counter,倒数频率计),它改造的是闸门本身。
普通闸门固定 1 秒、与被测信号毫不相干;等精度法先预置一个大致闸门时间(如 1 秒),但闸门的真正开启和关闭都对齐到被测信号的有效沿。于是闸门内的被测脉冲数 Nx 永远是整数,对被测信号不存在 ±1 误差。闸门的实际时长 T 并不严格等于 1 秒,没关系——同时用一路高稳标准时钟 fc 在同一闸门内计数,得到 Nc,则:
T = Nc / fc , f_x = Nx / T = Nx · fc / Nc误差只剩两个来源:标准时钟计数的 ±1/Nc(fc 高达几十到上百 MHz,Nc 以千万计,误差极小)和基准晶振本身的频率准确度(普通晶振约 ±50 ppm,温补/恒温晶振更好)。关键在于这个误差与被测频率无关,全频段相对误差恒定,「等精度」由此得名。现代台式频率计和高档 MCU 的测频外设普遍采用同步闸门 + 高频时基;晶振、片上振荡器这些时基从哪来,可以回头看 环形振荡器、晶振与 PLL。
等精度也不是没有代价:标准时钟要在整个闸门期间持续高频计数,闸门 1 秒、fc 100 MHz 时 Nc 达到一亿,计数器位宽和内部走线都比 M 法更宽;预置闸门越长,Nc 越大、±1/Nc 越小,但读数更新越慢。所以芯片里实现它,实际上是两个计数器(一个数被测脉冲、一个标准时钟)同时开关、成对读出,逻辑量不大,却是入门数字设计里少见的「双通道同步测量」结构,值得对照时序图自己走一遍。
五、输入捕获:硬件在沿上「打时间戳」
M/T 法回答「平均频率」,但很多场景要的是单个周期或单段脉宽:这一个回波多宽、这一帧红外每位多长。让 CPU 不断轮询引脚、看到跳变再去读定时器,既不准(响应延迟抖动直接变成测量误差)又白白占满 CPU。定时器的**输入捕获(input capture)**单元就是为这件事加的硬件:
- 一个自由运行的定时器持续累加,谁也不停;
- 配置捕获通道监听指定沿(上升沿、下降沿或双边沿);
- 沿到来的那个时钟周期,硬件自动把定时器当前值锁存进捕获寄存器,并可触发中断或 DMA;
- CPU 事后读寄存器即可,锁存动作与 CPU 什么时候响应完全无关。
这张图把测脉宽的数据流画全了:定时器是公共的时间轴,边沿判别逻辑决定在什么时刻「拍照」,上升沿和下降沿各拍一张。有了两个时间戳:
- 高电平脉宽:
Ton = (cap_fall − cap_rise) / fc; - 周期:连续两次上升沿(或两次下降沿)的捕获值之差除以 fc,占空比随之可得;
- 超声波飞行时间:发波时刻与回波沿各打一个时间戳,差值就是声波往返时间。
它本质上是 边沿检测与脉冲同步 加寄存器锁存的硬件化,区别只在于捕获寄存器存的是「时间」这个多 bit 的数,而不是 1 bit 的事件标志。用 Verilog 描述其核心不过几行:
// 概念:双边沿打时间戳(省略了两级同步)
always_ff @(posedge clk) begin
sig_q <= sig_in; // 同步后的外部信号
if ( sig_q & ~sig_d) cap_rise <= timer; // 上升沿锁存
if (~sig_q & sig_d) cap_fall <= timer; // 下降沿锁存
sig_d <= sig_q;
end频繁的捕获事件适合交给中断或 DMA 批量搬走,机制上的取舍见 中断与 DMA 入门。
六、异步、溢出与量程:工程上的三个坑
原理之外,真正把测量电路做可靠,要处理三件事。
先同步,再测量。 外部信号与本地时钟没有任何相位关系,属于异步信号,直接进寄存器可能碰上亚稳态。惯例是先过两级触发器(同步器)再做边沿判别。同步会引入一两个时钟周期的固定延迟,但测周期、测脉宽都是两个时间戳相减,延迟在相减中抵消,不影响结果。另外时钟再快也有极限:被测信号频率超过采样时钟一半就无法可靠辨认(类似奈奎斯特极限),高频信号要先经预分频器降下来再测。
溢出要显式处理。 自由定时器位宽有限(常见 16 位),fc=100 MHz 时每 655.36 μs 回绕一次,而舵机脉宽有 2 ms——一次测量中间要跨过 3 次回绕。办法有两个:只回绕一两次的短间隔,可直接按无符号数求差,Δ = cap_now − cap_old 在硬件上自动得到正确的回绕差值,不用软件判断谁大谁小;间隔更长时再维护一个溢出计数器给定时器扩位宽,回绕中断里次数加 1,最后用「次数×满量程 + 捕获值」拼成完整时间戳。还要注意读时间戳时溢出中断可能恰好在同一瞬间发生,稳妥做法是先关中断、成对读取、确认无新溢出后再恢复。
精度与更新率永远要折中。 M 法靠拉长闸门提高 N,但闸门越长,结果越「迟钝」,被测频率快速变化时测出来的是平均值而非瞬时值;T 法靠提高 fc 增加 M,但 fc 受工艺和功耗限制。选型时先问自己:要的是一段时间的平均频率,还是每个周期的瞬时值?更新多快才够?再决定闸门长度、时基频率和要不要上等精度方案。
这一篇在知识体系里的位置
本篇属于芯片设计入门层的数字时序逻辑,回答「定时器怎么反向用于测量」。向基础读,它建立在 计数器/移位寄存器 、分频与时钟使能 之上,并复用了 边沿检测/同步器 的处理手法;向应用读,可与 正交编码器 M/T 测速 、PWM 生成与读回 、红外 NEC 解码 对照,它们都是「打时间戳 + 求差」的变体;向精度读,时基质量决定测量上限,见 环形振荡器、晶振与 PLL ,事件搬运见 中断与 DMA 。
总结
数字测频率/周期本质是用一个已知频率去量另一个频率:测频法(M 法)在已知闸门 Tgate 内数外部脉冲 N,f=N/Tgate,相对误差约 1/N,适合高频;测周法(T 法)用高频时钟填充一个外部周期数到 M,f=fc/M,频率越低 M 越大越准,适合低频,仪器据此自动换挡;等精度倒数频率计让闸门与被测沿同步、门内脉冲恒为整数,再用高稳时钟测闸门实际时长,误差只取决于时基、全频段恒定;测周期、脉宽、占空比则靠输入捕获在硬件上沿沿自动锁存自由计数值,两次同向沿之差为周期、升降沿之差为脉宽,不劳 CPU 轮询;工程上外部信号先两级同步、用溢出计数扩位宽并按无符号回绕求差、过高频率先预分频,并在闸门长度(精度)与更新率之间做折中。