ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

鉴相器深度解析:从锁相环原理到PFD与电荷泵工程实践

鉴相器深度解析:从锁相环原理到PFD与电荷泵工程实践 鉴相器这东西说起来不算复杂但你要是真在锁相环里栽过跟头就会发现它才是整个环路的灵魂。环路滤波器和VCO再精心调鉴相器一旦拉胯锁定就是空谈。很多初学者总喜欢先研究VCO的压控曲线或者花大把时间算环路滤波器带宽却容易忽略最前端这个负责“比较相位”的部件。我见过不少工程师花了几个礼拜调环路最后发现问题的根源是鉴相器输出纹波太大或者三态输出存在死区环路根本没进入正常的负反馈状态。这篇文章就专注解决一个问题把鉴相器彻底讲透。我会从锁相环的闭环逻辑讲起把几种主流鉴相器的原理、数学模型、实现方式、性能指标逐项拆开再附上FPGA实现PFD的完整代码、霍尔传感器角锁相环的真实工程案例以及一套可执行的排查清单。适合正在做PLL设计的硬件工程师、准备秋招的通信/电子方向学生还有想用锁相环做电机控制却不知从何下手的嵌入式开发者。1. 先掰开揉碎鉴相器在锁相环里到底干了什么1.1 锁相环的闭环逻辑与鉴相器的“翻译官”角色锁相环本质上是一个相位负反馈系统。参考信号进来VCO的输出经过分频再回来两者在鉴相器里做比较输出一个与相位差有关的误差信号。这个误差信号经过环路滤波器滤除高频分量变成直流或者准直流控制电压去调整VCO的频率。VCO频率一变反馈信号的相位又跟着变整个环路不断循环直到参考信号与反馈信号的相位差稳定在一个固定值我们称之为“锁定”。在这个闭环里鉴相器扮演的是“翻译官”的角色——把两个信号在时间轴上的先后、快慢、超前滞后关系翻译成电路能处理的电压或电流量。VCO和环路滤波器做的事情其实很机械VCO把电压变成频率环路滤波器只负责决定哪些误差成分能通过哪些要滤掉。唯独鉴相器要做的是“比较”这个动作它决定了环路能分辨多小的相位差、能工作在多高的频率上、能在多大范围内锁定。这几条恰恰是PLL设计中最核心的三个约束。1.2 鉴相器必须满足的三个底层要求一个能用的鉴相器无论是什么类型都必须满足几个基本要求否则锁相环整个就不工作。第一是单调性。输出信号必须随相位差呈单调变化——相位差增大时输出要么一直增大要么一直减小中间不能出现先增后减的山峰。如果鉴相特性有非单调区间环路就会在错误的相位点稳住造成错锁或者无法锁定的问题。第二是线性度。我们不要求鉴相器的整体传输曲线绝对线性但在环路稳定工作点附近通常相位误差很小必须有一个可定义、可计算的斜率K_d也就是鉴相增益。K_d直接进环路增益公式如果它不稳定整个环路的带宽、相位裕度都会偏离设计值。第三是足够的鉴相范围。环路捕获过程中初始相位差可能很大如果鉴相范围太窄环路就无法在自然频率下收敛。这也是为什么在频率未知的场合工程师们更倾向使用PFD鉴频鉴相器而不是简单的乘法器——因为PFD的线性范围能达到±2π甚至更宽而且天然具备频率捕获能力。提示判断一个鉴相器能不能用先看这三条够不够再看噪声和死区。很多“看起来能工作”的方案往往栽在第三条上。2. 主流鉴相器结构逐个拆解2.1 模拟乘法器型正弦鉴相器适合连续波系统的经典方案模拟乘法器型鉴相器是最古老也最直观的一种结构本质就是一个混频器。参考信号(V_{ref}A_1\sin(\omega t\theta_1))反馈信号(V_{fb}A_2\cos(\omega t\theta_2))两者相乘后[ V_{out}A_1A_2\sin(\omega t\theta_1)\cos(\omega t\theta_2) \frac{A_1A_2}{2}\left[\sin(2\omega t\theta_1\theta_2)\sin(\theta_1-\theta_2)\right] ]等式右边第一项是二倍频分量被后面的环路滤波器滤掉第二项(\frac{A_1A_2}{2}\sin(\theta_1-\theta_2))才是我们要的相位误差信号。在相位差很小的情况下(\sin(\theta_e)\approx\theta_e)鉴相器近似线性鉴相增益(K_d A_1A_2/2)V/rad。这种方案的最大优势是工作频率极高在射频锁相环里可以在数GHz甚至数十GHz频段工作因为乘法器本质上就是Gilbert单元或者无源混频器。它的劣势也很明显输出的误差信号里叠加了巨大的二倍频纹波需要环路滤波器有很深的衰减能力而且它的鉴相范围只有±(\pi/2)超出这个范围增益就逐渐下降到±(\pi)时增益归零。此外非线性太强输入信号幅度稍有变化K_d就会跟着漂所以系统里通常需要加AGC。2.2 异或门型鉴相器最快上手但占空比敏感如果你的信号是方波做数字PLL最简单的方法就是用一个异或门。两路50%占空比的方波经过异或后输出方波的占空比恰好反映两路信号的相位差。平均输出电压与相位差的关系是一个三角形[ V_{avg} V_H \cdot \frac{\theta_e}{\pi}, \quad 0\theta_e\pi ] [ V_{avg} V_H \cdot \left(2-\frac{\theta_e}{\pi}\right), \quad \pi\theta_e2\pi ]异或门鉴相器的工作频率很高只要有数字门电路就能搭成本极低响应也快。但有两个麻烦。第一它对输入信号的占空比特别敏感非50%占空比会让输出中点偏移锁定点漂移。第二输出纹波频率是输入信号的二倍频这意味着环路滤波器必须做得很窄不然VCO会被反复调制。它还有一个特点锁定点是90°相移而不是0°所以如果你需要真正的同相锁定后面要补一个固定的90°移相。2.3 RS触发器型边缘触发的基础形态RS触发器型鉴相器比异或门多了一点“参与感”。参考信号触发S端反馈信号触发R端触发器的Q输出平均值反映两路信号的相位差。输出特性也是三角形的但其斜率是异或门的2倍也就是说鉴相增益更高一倍。RS触发器型鉴相器的飞反正也明显它对脉冲宽度和噪声触发非常敏感一个毛刺就可能把触发器翻转到错误状态导致环路瞬间失锁。而且它不具备频率捕获能力在频率差很大的情况下可能捕获不到。实际工程中RS触发器更多是作为一个教学过渡让人理解“边沿触发比电平触发抗噪性强”这个道理。2.4 三态鉴相器与电荷泵组合数字PLL中的绝对主力工程上用得最多的是三态鉴相器PFD配合电荷泵的组合。这是目前单片PLL芯片、FPGA内部PLL以及绝大多数频率合成器中的标准方案。三态PFD由两个D触发器构成D端固定接高电平。参考信号上升沿到来第一个触发器输出UP反馈信号上升沿到来第二个触发器输出DOWN。当UP和DOWN同时为高时经过一个与门产生复位信号把两个触发器同时清零回到零状态。因此UP和DOWN输出的脉冲宽度之差就是两路信号的相位差。这三态指的是UP有效、DOWN有效、以及两者都无效高阻输出。配合电荷泵就有三种工作状态充电、放电、以及既不充电也不放电也就是高阻态。PFD最厉害的地方在于它同时具备鉴相和鉴频的能力。如果参考信号频率高于反馈信号UP就会连续输出宽脉冲DOWN基本没有输出电荷泵持续充电VCO频率被抬升反之持续放电VCO频率下降。正是这种频率捕获能力让PLL不需要额外的频率辅助捕获电路也能从大频差状态拉入锁定。三态PFD的鉴相范围理论上能达到±2π线性度也远好于模拟乘法器。但它有一个著名的毛病——死区。当相位差非常小的时候UP或DOWN脉冲宽度极窄电荷泵里的开关管还没来得及完全开启复位信号就到了输出为零。这就相当于在零点附近出现了不敏感区环路在锁定点附近失去了作用相位噪声和杂散会显著恶化。解决死区的标准手段是给复位路径增加一个延迟。UP和DOWN同时为高后不是立刻清零而是让两个输出保持一个最小脉冲宽度比如几百皮秒到几纳秒确保电荷泵每次开启都能充分导通。这样一来输出电荷量与相位差在零点附近继续保持线性关系死区被压缩掉。代价是电荷泵会产生一个固定的“空转电流”在输出端引入额外的参考杂散所以延迟宽度要仔细权衡。2.5 数字鉴相器的现代变体从过零采样到全数字TDC除了上述经典结构现代数字PLL里还有一些新的鉴相实现思路。比如过零检测型鉴相器直接检测信号过零点的时间差用计数器精确量化这个时间差分辨率远高于传统模拟方案。在高速串行收发器、毫米波频率合成器里甚至会用TDC时间数字转换器直接把相位差数字化省去电荷泵和模拟环路滤波器这就是全数字PLLADPLL的基本形态。ADPLL里的鉴相器本质上是一个时间数字转换器它把参考时钟沿和反馈时钟沿之间的时间间隔量化成数字码。这个数字码经过数字环路滤波器再去控制DCO数控振荡器的调谐字。好处是面积小、可移植性强、没有电容电阻工艺偏差问题。坏处是量化噪声需要靠提高TDC分辨率来压制通常需要结合ΔΣ调制和抖动注入来改善杂散。2.6 几种结构的关键指标横向对比为了帮你快速选型我把上面几种鉴相器的核心指标整理成一张表结构类型鉴相范围纹波频率频率捕获死区风险最高工作频率典型应用模拟乘法器±π/22×f_ref无无数十GHz射频本振同步、解调器异或门±π/22×f_ref无无数百MHz简单数字PLLRS触发器±π1×f_ref无小数百MHz教学、低速同步三态PFD电荷泵±2π不规则脉冲有有需消除数GHz频率合成器、时钟倍频TDC全数字±2π以上量化噪声有无数GHzADPLL、SerDes选型时先问自己三个问题频率多高要不要频率捕获相位噪声指标苛刻吗答案出来结构基本就定了。3. 鉴相器实现全流程从原理到能跑的代码3.1 用FPGA实现PFDVerilog参考代码与关键时序三态PFD在FPGA里实现非常常见尤其是做数字锁相环或者电机控制角度跟踪的时候。下面是一份我实际使用过的Verilog代码结构清晰可以直接跑module pfd ( input wire clk_ref, // 参考信号作为时钟 input wire clk_fb, // 反馈信号作为时钟 input wire rst_n, output reg up, // 充电脉冲 output reg down // 放电脉冲 ); reg up_s, down_s; wire reset_n; always (posedge clk_ref or negedge rst_n) begin if (!rst_n) up_s 1b0; else up_s 1b1; end always (posedge clk_fb or negedge rst_n) begin if (!rst_n) down_s 1b0; else down_s 1b1; end assign reset_n ~(up_s down_s); always (posedge reset_n or negedge rst_n) begin if (!rst_n) begin up_s 1b0; down_s 1b0; end else begin up_s 1b0; down_s 1b0; end end always (*) begin up up_s; down down_s; end endmodule注意这个代码的关键时序点up_s和down_s都是时钟沿触发的寄存器输出不是组合逻辑直接产生。这一点非常重要——如果用组合逻辑直接对两个时钟沿做判断生成UP/DOWN很容易触发FPGA内部的竞争冒险导致脉宽不确定甚至产生毛刺。寄存器输出的好处是干净、可预测复位信号用异步复位同步释放的思路保证状态机在任何情况下都能回到零状态。3.2 电荷泵与环路滤波器的连接细节PFD输出的UP/DOWN脉冲不能直接去控制VCO中间必须经过电荷泵和环路滤波器。电荷泵的典型结构是两个电流源一个上拉电流源给环路滤波器充电一个下拉电流源给环路滤波器放电。UP信号控制上拉管DOWN信号控制下拉管。实际电路里我有几个经验电流匹配。充电电流和放电电流必须严格匹配。失配会在输出端产生周期性纹波频率等于PFD比较频率这会在VCO输出端产生参考杂散。用电流镜做匹配时NMOS和PMOS的沟道长度调制效应往往是失配的主要来源采用Cascode结构能明显改善。开关时序。为了避免充电管和放电管同时导通通常需要在UP和DOWN之间插入一个固定延迟让一路先关断另一路再开通。这个延迟通常几十到几百皮秒太大也会引入额外噪声。环路滤波器的输入阻抗。环路滤波器的电容在瞬态切换时会产生电流毛刺建议在电荷泵输出端到滤波器之间加一个小的RC缓冲把高频开关噪声就地吸收掉。环路滤波器本身通常是一个二阶或三阶的无源滤波器其中一个零点用于保证环路的相位裕度多个极点用于抑制鉴相器纹波。典型的三阶环路滤波器拓扑是电荷泵输出接一个大电阻R1R1串联一个稍小的电容C1构成零点然后并联一个小电容C2落地形成第一级极点R1和C1的串联再接到一个RC低通网络形成第二级极点。这种结构配合三态PFD效果稳。以2.4GHz频率合成器为例PFD参考频率10MHz电荷泵电流1mA目标环路带宽100kHz相位裕度50°。我通常先用环路设计工具比如TI的PLLatinum Sim Tool或者ADI的ADIsimPLL迭代出一组初始值C1约220pFR1约5.6kΩC2约22pF。C2的大小决定了高频衰减能力太小压不住2×PFD纹波太大又会吃掉相位裕度。3.3 鉴相增益K_d的测量与计算K_d是整个环路增益计算的基础。对于三态PFD电荷泵结构K_d的单位不再是V/rad而是A/rad因为输出是电荷泵电流。当相位误差为(\theta_e)时UP和DOWN的平均电流差为[ I_{avg} \frac{I_{cp}}{2\pi}\cdot \theta_e ]所以(K_d I_{cp}/(2\pi))A/rad。如果电荷泵电流设成1mAK_d约为159μA/rad。这个值乘上环路滤波器的阻抗再乘上VCO的压控增益K_vco单位Hz/V再除以分频比N就构成了环路的开环增益。环路带宽计算公式里K_d是线性比例项直接按比例缩放。模拟乘法器型鉴相器的K_d则需要实测。方法很简单固定一个输入频率改变两路输入信号的相位差用示波器平均功能测量输出直流电压然后画一条“电压-相位差”曲线。在过零点附近取切线斜率就是K_d。实测时注意输入信号幅度要保持稳定因为K_d和幅度平方成正比。注意K_d的测量不能只看直流输出电压一定要把参考地电平考虑进去。双电源运放和单电源运放的输出参考点完全不同直接读数容易偏。4. 霍尔传感器角锁相环一份真实的工程案例4.1 为什么霍尔信号需要锁相环很多做电机控制的工程师对锁相环的第一印象可能不是来自射频电路而是来自转子位置检测。无刷直流电机BLDC或永磁同步电机PMSM里三个霍尔传感器输出的是离散的位置信号每个电周期只有6个跳变沿相当于60°电角度的分辨率。直接用霍尔跳变沿做速度估计速度波动非常大换相噪声也明显。这时候用一个角锁相环把霍尔传感器的过零沿和内部一个数控振荡器NCO的相位锁定就能在两次霍尔跳变之间内插出连续、平滑的角度信号。锁定后NCO的相位就代表当前转子位置频率就代表转速。这等效于把6步的粗位置信号“细分”成了高分辨率的连续角度同时滤掉了霍尔信号的换相毛刺。4.2 基于鉴相器的角位置跟踪实现硬件上我用的是TI的F280049C DSP霍尔信号经过去毛刺滤波进去用PFD的结构做相位比较。注意霍尔信号是电平信号而不是方波时钟信号所以需要先做一下处理把三路霍尔信号按照换相逻辑编码成6个扇区状态每次扇区切换产生一个上升沿作为PFD的参考信号。反馈信号则来自NCO输出NCO的相位累加器比较这个边沿。PFD的比较逻辑和3.1节里的Verilog代码完全一致。UP/DOWN脉冲经过数字环路滤波器输出一个频率控制字给NCO。锁定后NCO的相位累加值就是转子的连续角度。核心代码如下// 三态PFD的状态机基于霍尔扇区沿更新 typedef enum {STATE_IDLE, STATE_UP, STATE_DOWN} pfd_state_t; void pfd_update(uint32_t hall_edge, uint32_t nco_edge, int32_t *out_pulse) { static pfd_state_t state STATE_IDLE; static uint32_t state_clk 0; if (hall_edge) { if (state STATE_DOWN) *out_pulse -1; // 释放一个放电脉冲 else state STATE_UP; } if (nco_edge) { if (state STATE_UP) *out_pulse 1; // 释放一个充电脉冲 else state STATE_DOWN; } // 输出经过环路滤波器后控制NCO频率字 }这套结构跑起来后角度估计的平滑度比直接查表好很多。速度从500RPM到6000RPM锁相环都能稳定跟踪相位误差在稳态时小于1°电角度换相噪声被环路滤波器完全吸收。关键的一点是环路带宽的取值。霍尔信号跳变频率随着转速变化范围很大低速时只有几十赫兹高速时几十千赫兹。如果你把环路带宽设成固定值低速时相位裕度可能崩塌。解决方法是让环路带宽跟随转速估算值做一个线性映射——转速高的时候带宽自动放宽转速低的时候带宽收窄。我用一个简单的查表实现效果立竿见影。4.3 霍尔角锁相环的调参经验环路滤波器用PI结构就够Kp和Ki的比例大约是3:1到5:1过大容易引发角度振荡。在霍尔信号上并联一个小电容纳法级做硬件滤波能有效避免换相毛刺干扰PFD的触发器。NCO的频率字位宽建议不低于28bit否则低速时角度分辨率不够会看到角度在抖。5. 常见问题与排查技巧实录5.1 锁定失败与误锁定锁相环最常见的问题就是压根锁不上。先看参考信号和反馈信号有没有到鉴相器——用示波器接到PFD的两个输入时钟脚确认频率和幅度正常。然后看PFD的输出有没有脉冲没有脉冲说明比较逻辑没跑起来。如果脉冲有但不稳定检查复位信号PFD的复位必须能在任何状态下工作一旦复位信号被毛刺干扰整个状态机就乱了锁不上。输入信号的信噪比也很关键参考时钟抖动太大会导致PFD输出杂乱边沿触发型鉴相器尤其敏感。建议先给输入信号过一级施密特触发器做整形保证边沿干净。5.2 锁定后相位噪声和杂散依然超标锁相环锁定后相位噪声超标通常有两个来源环内噪声VCO本身和环外噪声鉴相器、参考时钟。怎么区分呢看一眼相位噪声曲线的形状——在环路带宽内如果噪声平台随参考频率变化明显说明鉴相器是主要贡献者。这时优先检查电荷泵电流是否匹配、死区补偿是否到位。参考杂散的问题则多和电荷泵失配以及PFD微小偏移有关。你把电荷泵的充电电流和放电电流精度调到1%以内通常能压掉5~10dB的杂散。再有就是减小环路滤波器上靠近PFD那个极点对应的电容杂散也会改善。5.3 数字PFD在FPGA/单片机里的坑用FPGA实现PFD的时候我最常遇到的问题是触发器的建立/保持时间不满足。因为PFD的两个时钟输入本来就是异步的综合工具在做时序分析时容易给出违例。解决办法是给这两个时钟脚加false path约束明确告知工具这两个时钟不同步不要做跨时钟域时序检查。否则综合器可能会自动插入缓冲链反而引入更多延迟。在单片机上做纯软件PFD还有一个常见问题霍尔信号边沿检测中断和NCO相位累加中断的优先级设置不当会造成相位比较不及时。建议把边沿检测中断设成最高优先级NCO中断设成次高两个中断之间不要插入其他耗时操作。5.4 一份实测检查清单我把多年的调试经验整理成了一张清单遇到锁相环问题按顺序排查基本能解决80%的状况序号检查项工具/方法期望结果1参考信号幅度、频率、占空比示波器幅度在鉴相器输入范围内占空比接近50%2PFD两个输入时钟沿是否干净示波器高分辨率模式无多余毛刺3UP/DOWN脉冲是否随相位差变化示波器观察脉冲宽度相位差增大时脉宽单调变化4电荷泵充电/放电电流匹配度静态电流测量偏差小于1%5环路滤波器极点值频谱分析仪观测杂散峰杂散低于指标要求6死区补偿是否有效相位差接近0时观察电荷泵输出仍有最小脉冲输出7VCO控制电压纹波示波器AC耦合纹波远小于VCO调谐灵敏度允许值5.5 一个容易被忽视的细节电源和地每个鉴相器电路无论数字还是模拟都对电源噪声极其敏感。PFD的电源纹波会直接串到输出脉冲的宽度上呈现为抖动。电荷泵的电源纹波则会直接调制环路滤波器的充电电流产生杂散。所以鉴相器区域的电源去耦一定要做足至少放0.1μF和10μF两个电容靠近引脚放置地回路要独立、短粗。我见过一个案子所有环路参数都算得好好的最终就是电源去耦不够杂散压不下去加了电容后立刻干净。鉴相器调试中的几个“反直觉”经验做了这么多年锁相环我最想分享的其实不是某个具体的电路结构而是一些反直觉的经验。第一环路带宽不是越宽越好。宽带宽能让锁定更快但它同时会把鉴相器噪声和纹波直接灌到VCO上。在很多高性能场合环路带宽通常要设计成参考频率的1/10甚至1/20。你看着锁定慢了几百微秒换来的却是输出频谱干净了几个数量级。第二死区补偿不是什么场合都要加。对于射频本振这类信号纯净度极高的应用死区补偿虽然能消除零点附近的非线性但代价是固定空转电流带来的杂散。如果你锁的是固定频率不变频的场合死区影响可能没那么大反而杂散更让人头疼。第三鉴相器不是越“先进”越好。我见过不少初学者一上手就用TDC做全数字PLL结果量化噪声处理不好性能反而赶不上一个经典的三态PFD加电荷泵方案。选结构之前先搞清楚自己的瓶颈在哪——是频率捕获、相位噪声、还是杂散。瓶颈匹配的才是好方案。最后再分享一个小技巧调试鉴相器的时候强烈建议把环路带宽临时拉开一个数量级迫使环路处于欠阻尼甚至振荡的状态。在这种状态下观察VCO控制电压的振荡波形你能非常直观地看到环路增益对不对、相位裕度够不够、鉴相增益是否符合预期。看明白了再收窄带宽比盲调效率高得多。
返回列表