相位检测必须先确定电路连接和被测周期。只有器件型号、端口名和“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 触发器与异或门就采用。
一个可推导的模型:两个方波直接异或
跳转到“一个可推导的模型:两个方波直接异或”假设两个输入频率相同、周期为 、占空比均为 50%,电平转换理想,输出直接为 ,没有前后级分频、整形或门控。把相位差折叠到 ,相应时间差为:
当 时,一个输入周期内有两段输入电平不同的区间,每段宽度都是 ,相邻上升沿间隔为 。因此:
若测到的是单个高脉冲宽度,并且另有可靠的输入周期 ,可以用 ;若使用的是异或输出自身的占空比,应使用 。两式的分母对应不同周期。
| 折叠后的相差 | 单个高脉冲宽度 | 异或输出周期 | 输出占空比 |
|---|---|---|---|
| 无高脉冲 | 恒低,无可捕获重复边沿 | 0 | |
| 25% | |||
| 50% | |||
| 恒高,不能按两个独立脉冲捕获 | 无可捕获重复边沿 | 100% |
例如输入为 1 kHz、相差 90°时,,高脉冲宽度是 ,异或输出的重复周期是 。若 PWM 输入程序用输出周期计算 50% 占空比,再乘 360°,会误报 180°。
直接异或只给出折叠后的相差大小。90°与 270°产生相同占空比,交换两个输入也不会改变异或结果,因而不能单靠该占空比判断谁超前。输入占空比不等、频率不同或存在额外逻辑时,上面的模型也不再直接适用。
用离散模型检查周期口径
跳转到“用离散模型检查周期口径”下面程序用每度 10 个采样点构造理想方波,并直接数高电平点、上升沿间隔和脉宽。它没有调用相位换算公式来生成“测量结果”;None 表示输出恒定,无法通过边沿取得周期或独立脉宽。
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°得到相同结果。该整数角度模型用于核对理想逻辑与数学关系,不模拟传播延迟、亚稳态、毛刺或实际定时器。
接入计时器前的核对顺序
跳转到“接入计时器前的核对顺序”- 补全连线。 从 1CLK、2CLK 到 PD 逐门列出网络,包括触发器异步控制、反馈和初始状态,再推导实际输出关系。若存在分频,应同时记录各级频率和边沿方向。
- 同时观察输入与输出。 记录输入周期、输出重复周期、单个高/低脉宽;覆盖同相、45°、90°、接近 180°和相位跨过 180°的情况。不能只看一个占空比数值就确认模型。
- 核对引脚和电气条件。 PB6/TIM4_CH1 只是原记录方案,需要按确切 MCU 型号验证复用关系;确认电源、地参考、输入门限、容许电压和信号方向。
- 设计捕获异常处理。 恒高/恒低可能没有新边沿,程序应报告超时或状态,不能持续显示上一笔周期。还要处理计数器溢出、捕获覆盖、滤波延迟和窄脉冲分辨率。
- 给结果标明测量口径。 若用计数值 和 ,应说明两者测量的是哪一条信号、哪些边沿以及是否使用同一计时基准;确认电路关系后再写换算式。
PWM 输入模式可以帮助取得周期与脉宽,但不会自动识别相位检测拓扑。若需要有符号的相位差,应测量两路对应边沿的先后关系,或使用能提供方向信息且经过验证的检测电路。
本页仅完成器件功能资料核对和理想方波计算,没有现有板卡的原理图、波形或实测结果,不能据此宣布 U49/U50/U51 的实际 PD 接口已经验证。