跳转到内容
新建笔记

数字相位检测:异或脉宽与周期口径

相位检测必须先确定电路连接和被测周期。只有器件型号、端口名和“PD”标记,无法证明输出脉宽与相位角之间的换算公式。原记录没有附原理图,本页保留其器件与接线背景,并把可以推导的理想模型单独列出。

记录项保留的信息仍需核对
U49、U50:SN74LVC74ADR双路上升沿 D 触发器,带异步预置和清零;保留原记录的完整料号每个 D、CLK、Q、反相 Q、PRE、CLR 实际接到哪里;不能直接认定两片分别负责“整形”和“输出处理”
U51:SN74LVC86APWR四路二输入异或门使用哪几路门,输入来自原始时钟还是触发器输出,PD 是否取自某个门的直接输出
PD → PB6(TIM4_CH1)原拟定的捕获输入MCU 完整型号、封装、重映射/复用、输入电平与滤波配置
TIM2_CH1 → 2CLK原拟定的基准输入2CLK 的真实信号方向及上游时钟关系
TIM3_CH1 → 1CLK原拟定的相位输入两个定时器能否以要求的方式同步,以及实际相差是否稳定

TI 的 SN74LVC74A 功能表说明:异步 PRE、CLR 会优先影响状态,正常采样还需要满足建立、保持等时序。SN74LVC86A 功能表则规定两输入不同时输出高。器件功能表不能代替这块板的连线图。

原文把“脉宽等于相位差对应时间、脉冲周期等于输入周期、占空比等于相位角除以 360°”作为一套通用结论。它们只有在特定脉冲形成逻辑和周期定义下才可能同时成立,不能仅凭使用了 D 触发器与异或门就采用。

一个可推导的模型:两个方波直接异或

跳转到“一个可推导的模型:两个方波直接异或”

假设两个输入频率相同、周期为 TT、占空比均为 50%,电平转换理想,输出直接为 Y=A⊕BY=A\oplus B,没有前后级分频、整形或门控。把相位差折叠到 0≤θ≤180∘0\leq\theta\leq180^\circ,相应时间差为:

Δt=Tθ360∘.\Delta t=T\frac{\theta}{360^\circ}.

当 0<θ<180∘0<\theta<180^\circ 时,一个输入周期内有两段输入电平不同的区间,每段宽度都是 Δt\Delta t,相邻上升沿间隔为 T/2T/2。因此:

TPD=T2,DPD=ΔtT/2=θ180∘.T_{\mathrm{PD}}=\frac{T}{2},\qquad D_{\mathrm{PD}}=\frac{\Delta t}{T/2} =\frac{\theta}{180^\circ}.

若测到的是单个高脉冲宽度,并且另有可靠的输入周期 TT,可以用 θ=360∘Δt/T\theta=360^\circ\Delta t/T;若使用的是异或输出自身的占空比,应使用 θ=180∘DPD\theta=180^\circ D_{\mathrm{PD}}。两式的分母对应不同周期。

折叠后的相差单个高脉冲宽度异或输出周期输出占空比
0∘0^\circ无高脉冲恒低,无可捕获重复边沿0
45∘45^\circT/8T/8T/2T/225%
90∘90^\circT/4T/4T/2T/250%
180∘180^\circ恒高,不能按两个独立脉冲捕获无可捕获重复边沿100%

例如输入为 1 kHz、相差 90°时,T=1 msT=1\,\mathrm{ms},高脉冲宽度是 250 μs250\,\mu\mathrm{s},异或输出的重复周期是 500 μs500\,\mu\mathrm{s}。若 PWM 输入程序用输出周期计算 50% 占空比,再乘 360°,会误报 180°。

直接异或只给出折叠后的相差大小。90°与 270°产生相同占空比,交换两个输入也不会改变异或结果,因而不能单靠该占空比判断谁超前。输入占空比不等、频率不同或存在额外逻辑时,上面的模型也不再直接适用。

用离散模型检查周期口径

跳转到“用离散模型检查周期口径”

下面程序用每度 10 个采样点构造理想方波,并直接数高电平点、上升沿间隔和脉宽。它没有调用相位换算公式来生成“测量结果”;None 表示输出恒定,无法通过边沿取得周期或独立脉宽。

xor-phase.py
from fractions import Fraction
def xor_measurement(phase_degrees: int) -> dict:
"""Ideal equal-frequency, 50% square waves; 10 ticks per degree."""
if type(phase_degrees) is not int:
raise TypeError("phase_degrees must be an integer")
period = 3600
delay = (phase_degrees % 360) * 10
output = [
(tick < period // 2) != ((tick - delay) % period < period // 2)
for tick in range(period)
]
rises = [tick for tick in range(period)
if output[tick] and not output[(tick - 1) % period]]
duty = Fraction(sum(output), period)
if not rises:
return {"duty": duty, "pulse_width_over_T": None,
"output_period_over_T": None}
first = rises[0]
width = 0
while output[(first + width) % period]:
width += 1
next_rise = rises[1] if len(rises) > 1 else first + period
return {"duty": duty, "pulse_width_over_T": Fraction(width, period),
"output_period_over_T": Fraction(next_rise - first, period)}
if __name__ == "__main__":
for phase in (0, 45, 90, 180, 270):
print(phase, xor_measurement(phase))

90°的结果为 duty=1/2、pulse_width_over_T=1/4、output_period_over_T=1/2;270°得到相同结果。该整数角度模型用于核对理想逻辑与数学关系,不模拟传播延迟、亚稳态、毛刺或实际定时器。

接入计时器前的核对顺序

跳转到“接入计时器前的核对顺序”
  1. 补全连线。 从 1CLK、2CLK 到 PD 逐门列出网络,包括触发器异步控制、反馈和初始状态,再推导实际输出关系。若存在分频,应同时记录各级频率和边沿方向。
  2. 同时观察输入与输出。 记录输入周期、输出重复周期、单个高/低脉宽;覆盖同相、45°、90°、接近 180°和相位跨过 180°的情况。不能只看一个占空比数值就确认模型。
  3. 核对引脚和电气条件。 PB6/TIM4_CH1 只是原记录方案,需要按确切 MCU 型号验证复用关系;确认电源、地参考、输入门限、容许电压和信号方向。
  4. 设计捕获异常处理。 恒高/恒低可能没有新边沿,程序应报告超时或状态,不能持续显示上一笔周期。还要处理计数器溢出、捕获覆盖、滤波延迟和窄脉冲分辨率。
  5. 给结果标明测量口径。 若用计数值 NwN_w 和 NTN_T,应说明两者测量的是哪一条信号、哪些边沿以及是否使用同一计时基准;确认电路关系后再写换算式。

PWM 输入模式可以帮助取得周期与脉宽,但不会自动识别相位检测拓扑。若需要有符号的相位差,应测量两路对应边沿的先后关系,或使用能提供方向信息且经过验证的检测电路。

本页仅完成器件功能资料核对和理想方波计算,没有现有板卡的原理图、波形或实测结果,不能据此宣布 U49/U50/U51 的实际 PD 接口已经验证。