数字锁相环的FPGA实现(一)

数字锁相环的FPGA实现(一)

电赛著

开篇之前,感谢杜勇老师,和他所著的《数字通信同步技术的MATLAB与FPGA实现,Altera/Verilog版》

文章目录

  • 数字锁相环的FPGA实现(一)
    • 锁相环的环路模型
      • 锁定与跟踪
      • 环路的基本性能要求
    • 锁相环的组成
      • 鉴相器(PD)
      • 环路滤波器(LF)
      • 压控振荡器(VCO)
    • 锁相环的动态方程
      • 非线性相位模型
      • 线性相位模型
      • 环路的传递函数
    • 结语

说到锁相环,相信大家都熟悉.锁相环路(Phase Locked Loop,PLL)是一个闭环的相位控制系统.这博客分成两篇,第一篇讲锁相环的基本原理和参数设置,第二篇写实战.

锁相环的环路模型

可以先看锁相环的组成再跳回来看这里.

假设输入信号和本地振荡器的输出信号是
u i ( t ) = U i sin ⁡ [ ω i t + θ i ( t ) ] u o ( t ) = U o cos ⁡ [ ω o t + θ o ( t ) ] \begin{aligned} u_{\mathrm{i}}(t) &=U_{\mathrm{i}} \sin \left[\omega_{\mathrm{i}} t+\theta_{\mathrm{i}}(t)\right] \\ u_{\mathrm{o}}(t) &=U_{\mathrm{o}} \cos \left[\omega_{\mathrm{o}} t+\theta_{\mathrm{o}}(t)\right] \end{aligned} ui(t)uo(t)=Uisin[ωit+θi(t)]=Uocos[ωot+θo(t)]

我们通过这个来得到他们的瞬时相差和瞬时频差:
θ c ( t ) = ( ω i − ω o ) t + θ i ( t ) − θ o ( t ) = Δ ω 0 t + θ i ( t ) − θ o ( t ) θ ˙ e ( t ) = ( ω i − ω o ) + θ ˙ i ( t ) − θ ˙ o ( t ) = Δ ω 0 + θ ˙ i ( t ) − θ ˙ o ( t ) \begin{array}{c}{\theta_{\mathrm{c}}(t)=\left(\omega_{\mathrm{i}}-\omega_{\mathrm{o}}\right) t+\theta_{\mathrm{i}}(t)-\theta_{\mathrm{o}}(t)=\Delta \omega_{0} t+\theta_{\mathrm{i}}(t)-\theta_{\mathrm{o}}(t)} \\ {\dot{\theta}_{\mathrm{e}}(t)=\left(\omega_{\mathrm{i}}-\omega_{\mathrm{o}}\right)+\dot{\theta}_{\mathrm{i}}(t)-\dot{\theta}_{\mathrm{o}}(t)=\Delta \omega_{0}+\dot{\theta}_{\mathrm{i}}(t)-\dot{\theta}_{\mathrm{o}}(t)}\end{array} θc(t)=(ωiωo)t+θi(t)θo(t)=Δω0t+θi(t)θo(t)θ˙e(t)=(ωiωo)+θ˙i(t)θ˙o(t)=Δω0+θ˙i(t)θ˙o(t)

锁定与跟踪

总所周知,我们一般假设输入信号的频率和本地振荡器的初始频率(也叫作自由振荡频率)是不同的,也就是说在这种情况下两者会存在固定频差 Δ ω 0 \Delta\omega_0 Δω0,如果没有进行相位追踪的话,显然两信号的相差 θ e ( t ) \theta_e(t) θe(t)就会爆炸.如果我们可以控制固定频差在一个很小的范围,就能保证两个信号的相位差在 2 n π 2n\pi 2nπ左右一个很小的范围震荡,这个就是锁相环路的捕获过程,如下:
数字锁相环的FPGA实现(一)_第1张图片
当瞬时相差 θ e ( t ) \theta_e(t) θe(t)稳定在 2 n π 2n\pi 2nπ附近,频差接近为0的时候,称锁相环进入同步状态,或称为跟踪状态
所以我们可以定义同步态的定义为:
∣ θ ˙ e ( t ) ∣ ⩽ ε Δ ω , ∣ θ e ( t ) − 2 n π ∣ ⩽ ε θ e \left|\dot{\theta}_{\mathrm{e}}(t)\right| \leqslant \varepsilon_{\Delta \omega}, \quad\left|\theta_{\mathrm{e}}(t)-2 n \pi\right| \leqslant \varepsilon_{\theta \mathrm{e}} θ˙e(t)εΔω,θe(t)2nπεθe

再定义两个锁相环的参量,捕获时间和捕获带
数字锁相环的FPGA实现(一)_第2张图片

环路的基本性能要求

如上所述,锁相环路存在两种状态,捕获状态和同步状态,就两种不同的工作状态下会有不同的性能参数:

  1. 捕获状态下的捕获时间
    T p = t a − t 0 T_p = t_a -t_0 Tp=tat0
    因为捕获时间其实和 t 0 t_0 t0是有关系的,毕竟不同时间切入的瞬时相差是不一样的,在这里我们取起始频差等于 Δ ω p \Delta\omega_p Δωp的初始状态来计算最大捕获时间
  2. 环路的捕获带 Δ ω p \Delta\omega_p Δωp,即环路能通过捕获状态进入同步状态的最大固有频差 ∣ Δ ω 0 ∣ m a x |\Delta\omega_0|_{max} Δω0max
  3. 稳态相差,反映环路的跟踪精度
    θ e ( ∞ ) = ∣ θ i ( t ) − ε θ e ∣ max ⁡ \theta_{\mathrm{e}}(\infty)=\left|\theta_{\mathrm{i}}(t)-\varepsilon_{\theta e}\right|_{\max } θe()=θi(t)εθemax
  4. 对已经锁定的环路,若改变其固有频差 Δ ω 0 \Delta\omega_0 Δω0环路所能最大稳定的频率称为同步带 Δ ω H \Delta\omega_H ΔωH
    数字锁相环的FPGA实现(一)_第3张图片
    我们可以看看捕获带和同步带之间的关系,应该注意到在捕捉带外,同步带以内的频带,一旦出现失锁,是不能够重新捕获的

显然,不介绍基本结构和动态方程之前谈性能是没意义的,所以:

锁相环的组成

因为我们需要锁相环来实现相位跟踪,最终的目的是为了实现输出信号和输入信号的同步,出于此来考虑的话,我们需要这个系统的相位误差是可收敛的,即锁相环的系统模型是一个相位的负反馈控制系统,他的基本组成大家也清楚:

分别有:

  1. PD(Phase Detector)鉴相器
  2. LF(Loop Filter)环路滤波器
  3. VCO(Voltage-Controlled Oscillator,VCO)压控振荡源

鉴相器(PD)

名副其实,鉴相器就是用来进行相位比较的,
比较常用的就是我们上课所讲过的乘法器加低通滤波器所构成的正弦型特性的鉴相器:
数字锁相环的FPGA实现(一)_第4张图片

但实际上到后面实现数字锁相环的时候可能就有不一样的方法了,敬请期待.

不妨推导一下:(设乘法器增益为 K m K_m Km)
K m u i ( t ) u o ( t ) = K m U i sin ⁡ [ ω 0 t + θ 1 ( t ) ] U o cos ⁡ [ ω 0 t + θ 2 ( t ) ] = 1 2 K m U i U o sin ⁡ [ 2 ω 0 t + θ 1 ( t ) + θ 2 ( t ) ] + 1 2 K m U i U o sin ⁡ [ θ 1 ( t ) − θ 2 ( t ) ] \begin{aligned} K_{\mathrm{m}} u_{\mathrm{i}}(t) u_{\mathrm{o}}(t)=& K_{\mathrm{m}} U_{\mathrm{i}} \sin \left[\omega_{0} t+\theta_{1}(t)\right] U_{\mathrm{o}} \cos \left[\omega_{0} t+\theta_{2}(t)\right] \\=& \frac{1}{2} K_{\mathrm{m}} U_{i} U_{\mathrm{o}} \sin \left[2 \omega_{0} t+\theta_{1}(t)+\theta_{2}(t)\right] \\ &+\frac{1}{2} K_{\mathrm{m}} U_{\mathrm{i}} U_{\mathrm{o}} \sin \left[\theta_{1}(t)-\theta_{2}(t)\right] \end{aligned} Kmui(t)uo(t)==KmUisin[ω0t+θ1(t)]Uocos[ω0t+θ2(t)]21KmUiUosin[2ω0t+θ1(t)+θ2(t)]+21KmUiUosin[θ1(t)θ2(t)]

经过LPF滤除 2 ω 2\omega 2ω的高频分量之后,得到:
u d ( t ) = 1 2 K m U i U o sin ⁡ [ θ 1 ( t ) − θ 2 ( t ) ] = U d sin ⁡ θ e ( t ) u_{\mathrm{d}}(t)=\frac{1}{2} K_{\mathrm{m}} U_{\mathrm{i}} U_{\mathrm{o}} \sin \left[\theta_{1}(t)-\theta_{2}(t)\right]=U_{\mathrm{d}} \sin \theta_{\mathrm{e}}(t) ud(t)=21KmUiUosin[θ1(t)θ2(t)]=Udsinθe(t)
其中:
U d = 1 2 K m U i U o U_d = \frac12 K_m U_i U_o Ud=21KmUiUo

环路滤波器(LF)

环路滤波器具有低通特性,一方面起着LPF的作用,另一方面是调节锁相环的参数的重要环节之一.对环路滤波器来说,他是一个线性电路,所以在时域分析中可用一个传输算子 F ( p ) F(p) F(p)来表示,其实p是微分算子,在频域中就可以用 F ( s ) F(s) F(s)来表示:
e

在这里我们不妨直接举一个我们都熟知的又有源比例积分滤波器:
数字锁相环的FPGA实现(一)_第5张图片
可用较为轻松地算出他的传输算子:
F ( p ) = − A 1 + p τ 2 1 + p τ 1 F(p)=-A \frac{1+p \tau_{2}}{1+p \tau_{1}} F(p)=A1+pτ11+pτ2
其中:
τ 1 = ( R 1 + A R 1 + R 2 ) C , τ 2 = R 2 C \tau_{1}=\left(R_{1}+A R_{1}+R_{2}\right) C, \quad \tau_{2}=R_{2} C τ1=(R1+AR1+R2)C,τ2=R2C
其中A为运放开环增益,假设非常大,那么我们可用代入进行一些近似:
F ( p ) = − A 1 + p τ 2 1 + p τ 1 ≈ − A 1 + p τ 2 1 + p A R 1 C ≈ − A 1 + p τ 2 p A R 1 C = − 1 + p τ 2 p R 1 C \begin{aligned} F(p) &=-A \frac{1+p \tau_{2}}{1+p \tau_{1}} \approx-A \frac{1+p \tau_{2}}{1+p A R_{1} C} \\ \approx-A \frac{1+p \tau_{2}}{p A R_{1} C} &=-\frac{1+p \tau_{2}}{p R_{1} C} \end{aligned} F(p)ApAR1C1+pτ2=A1+pτ11+pτ2A1+pAR1C1+pτ2=pR1C1+pτ2
所以经过近似后,我们可用得到:
F ( p ) = − 1 + p τ 2 p τ 1 F(p)=-\frac{1+p \tau_{2}}{p \tau_{1}} F(p)=pτ11+pτ2
其中:
τ 1 = R 1 C , τ 2 = R 2 C \tau_{1}=R_{1} C, \quad \tau_{2}=R_{2} C τ1=R1C,τ2=R2C
这个简化模型,特别如果有 R 1 C > > 1 R_1 C >> 1 R1C>>1的时候,性能会接近无源比例积分滤波器

压控振荡器(VCO)

显然,对压控振荡器来说,他的本征方程是:
ω v ( t ) = ω 0 + K 0 u c ( t ) \omega_{\mathrm{v}}(t)=\omega_{0}+K_{0} u_{\mathrm{c}}(t) ωv(t)=ω0+K0uc(t)
其中 ω v ( t ) \omega_{\mathrm{v}}(t) ωv(t)表示输出瞬时角频率, K 0 K_0 K0为控制灵敏度或增益系数,单位是 r a d / s ⋅ V rad/s \cdot V rad/sV

我们可以轻松看出,他的控制特性依然是线性的.
而压控振荡器输出到鉴相器中,我们所需要考虑的是他所变化的相位情况,即:
∫ 0 t ω v ( τ ) d τ = ω 0 t + K 0 ∫ 0 t u c ( τ ) d τ θ 2 ( t ) = K 0 ∫ 0 t u c ( τ ) d τ = K 0 p u c ( t ) \begin{array}{l}{\int_{0}^{t} \omega_{\mathrm{v}}(\tau) \mathrm{d} \tau=\omega_{0} t+K_{0} \int_{0}^{t} u_{\mathrm{c}}(\tau) \mathrm{d} \tau} \\ {\theta_{2}(t)=K_{0} \int_{0}^{t} u_{\mathrm{c}}(\tau) \mathrm{d} \tau=\frac{K_{0}}{p} u_{\mathrm{c}}(t)}\end{array} 0tωv(τ)dτ=ω0t+K00tuc(τ)dτθ2(t)=K00tuc(τ)dτ=pK0uc(t)

所以我们可以看出鉴相器输出的相位误差信号和压控振荡器的电压控制信号中存在一个积分关系,而这个积分关系自然而然是在压控振荡源中完成的,对锁相环整体的性能也有比较大的影响.

锁相环的动态方程

现在要把刚刚介绍的三个部分综合起来一个系统来看了

非线性相位模型

锁相环在时域上的传输流程是这样的
g
在考虑相位模型前,我们可以先反过来考虑稳态相差的问题,因为这涉及到锁相环稳定的可能性.显然在锁相环捕获的时候 ω v ( t ) \omega_v(t) ωv(t)会逐步接近 ω i ( t ) \omega_i(t) ωi(t)到同步状态的时候有 ω v ( t ) = ω i ( t ) \omega_v(t) = \omega_i(t) ωv(t)=ωi(t),但是两个信号间存在稳态误差(相位)使得控制电压 u c ( t ) u_c(t) uc(t)不为0,从而使输出频率在输入频率间震荡.但实际上对理想二阶环(A无穷大)来说,当环路锁定时,稳态相差理论上为0.但具体的分析还看后头

从上述模型中不难得出:
θ e ( t ) = θ 1 ( t ) − θ 2 ( t ) \theta_e(t) = \theta_1(t)-\theta_2(t) θe(t)=θ1(t)θ2(t)
θ 2 ( t ) = K 0 U d F ( p ) p s i n θ e ( t ) \theta_2(t) = K_0U_d\frac{F(p)}{p}sin \theta_e(t) θ2(t)=K0UdpF(p)sinθe(t)

代入得锁相环路动态方程的一般形式:
(*) p θ e ( t ) = p θ 1 ( t ) − K 0 U d F ( p ) sin ⁡ θ e ( t ) p \theta_{\mathrm{e}}(t)=p \theta_{1}(t)-K_{0} U_{\mathrm{d}} F(p) \sin \theta_{\mathrm{e}}(t)\tag{*} pθe(t)=pθ1(t)K0UdF(p)sinθe(t)(*)
不妨定义环路增益
K = K 0 U d K = K_0U_d K=K0Ud
显然这个环路增益表示的是VCO的最大频偏量,因为 U d U_d Ud是误差信号的最大值, K 0 K_0 K0是增益系数(见上)

因为经过环路滤波器之后输出的误差信号是直流的,所以稳态误差很容易就可以解出:
θ e ( ∞ ) = arcsin ⁡ Δ ω 0 K F ( j 0 ) \theta_{\mathrm{e}}(\infty)=\arcsin \frac{\Delta \omega_{0}}{K F(j 0)} θe()=arcsinKF(j0)Δω0
这时考虑环路滤波器的传递因子 F ( p ) F(p) F(p),当A>>0时,有下列近似
F ( p ) = − 1 + p τ 2 p τ 1 F(p)=-\frac{1+p \tau_{2}}{p \tau_{1}} F(p)=pτ11+pτ2
其中:
τ 1 = R 1 C , τ 2 = R 2 C \tau_{1}=R_{1} C, \quad \tau_{2}=R_{2} C τ1=R1C,τ2=R2C

所以容易得 F ( j 0 ) = ∞ F(j0) = \infty F(j0)=,这也是刚刚所说的理想二阶环没有稳态误差的来源.
但是实际上,因为A不可能无穷大,上式也只是近似得来的,所以上面的式子成立的可能性几乎也为0…

不妨将 F ( p ) F(p) F(p)代入锁相环的动态方程:
p 2 τ 1 θ e ( t ) = p 2 τ 1 θ 1 ( t ) − K ( 1 + p τ 2 ) sin ⁡ θ e ( t ) p^{2} \tau_{1} \theta_{\mathrm{e}}(t)=p^{2} \tau_{1} \theta_{1}(t)-K\left(1+p \tau_{2}\right) \sin \theta_{\mathrm{e}}(t) p2τ1θe(t)=p2τ1θ1(t)K(1+pτ2)sinθe(t)
因为环路滤波器只有一个极点,传输算子是一阶的,所以相应的环路动态方程是二阶非线性微分方程,所以这种锁相环路称为二阶锁相环路.本博客缺少了对RC积分滤波器和无源比例积分滤波器的分析,有兴趣的pong友可以自行回去看书

线性相位模型

线性相位模型就是将 非线性相位模型 近似得出的,因为显然动态方程是一个高阶的非线性微分方程(特别是加上噪声之后),而又由于瞬时相差一般是很小的,回顾一下高等数学的等价无穷小,我们容易想到sin(x)~x:
数字锁相环的FPGA实现(一)_第6张图片
也就是说,我们可以把正弦换成:
u d ( t ) = U d sin ⁡ θ e ( t ) K d = d u d ( t ) d θ c ( t ) ∣ θ e = 0 = U d cos ⁡ θ e ( t ) ∣ θ e = 0 = U d ( V / r a d ) \begin{array}{c}{u_{\mathrm{d}}(t)=U_{\mathrm{d}} \sin \theta_{\mathrm{e}}(t)} \\ {K_{\mathrm{d}}=\left.\frac{\mathrm{d} u_{\mathrm{d}}(t)}{\mathrm{d} \theta_{\mathrm{c}}(t)}\right|_{\theta_{e}=0}=U_{\mathrm{d}} \cos \theta_{\mathrm{e}}\left.(t)\right|_{\theta_{e}=0}=U_{\mathrm{d}}(\mathrm{V} / \mathrm{rad})}\end{array} ud(t)=Udsinθe(t)Kd=dθc(t)dud(t)θe=0=Udcosθe(t)θe=0=Ud(V/rad)
斜率是 K d K_d Kd的直线代替,代入 ( ∗ ) (*) ()式得:
p θ e ( t ) = p θ 1 ( t ) − K 0 K d F ( p ) θ e ( t ) p \theta_{\mathrm{e}}(t)=p \theta_{1}(t)-K_{0} K_{\mathrm{d}} F(p) \theta_{\mathrm{e}}(t) pθe(t)=pθ1(t)K0KdF(p)θe(t)
再令环路增益:
K = K 0 K d K =K_0 K_d K=K0Kd
则得到线性模型:
p θ c ( t ) = p θ 1 ( t ) − K F ( p ) θ e ( t ) p \theta_{\mathrm{c}}(t)=p \theta_{1}(t)-K F(p) \theta_{\mathrm{e}}(t) pθc(t)=pθ1(t)KF(p)θe(t)

环路的传递函数

事先说明一点就是,这里对环路传递函数的建模是基于线性模型的,也就是说他同样存在上述的等价无穷小代换问题,所以不适应瞬时相差过大的情况.

不妨对线性模型做拉普拉斯变换:
s θ e ( s ) = s θ 1 ( s ) − K F ( s ) θ e ( s ) s \theta_{\mathrm{e}}(s)=s \theta_{1}(s)-K F(s) \theta_{\mathrm{e}}(s) sθe(s)=sθ1(s)KF(s)θe(s)

  1. 考虑开环状态下(无反馈支路),输入相位 θ 1 ( t ) \theta_1(t) θ1(t)驱动所引起的输出相位 θ 2 ( t ) \theta_2(t) θ2(t)的响应:
    s ( θ 1 ( s ) − θ 2 ( s ) ) = s θ 1 ( s ) − K F ( s ) θ 1 ( s ) s (\theta_{\mathrm{1}}(s)-\theta_{\mathrm{2}}(s))=s \theta_{1}(s)-K F(s) \theta_{\mathrm{1}}(s) s(θ1(s)θ2(s))=sθ1(s)KF(s)θ1(s)
    解得:
    H 0 ( s ) = θ 2 ( s ) θ 1 ( s ) ∣ o p e n l o o p = K F ( s ) s H_0(s) = \frac{\theta_2(s)}{\theta_1(s)}\big |_{open loop} = K\frac{F(s)}{s} H0(s)=θ1(s)θ2(s)openloop=KsF(s)
  2. 考虑闭环状态下,输入相位 θ 1 ( t ) \theta_1(t) θ1(t)驱动所引起的输出相位 θ 2 ( t ) \theta_2(t) θ2(t)的响应:
    s ( θ 1 ( s ) − θ 2 ( s ) ) = s θ 1 ( s ) − K F ( s ) ( θ 1 ( s ) − θ 2 ( s ) ) s (\theta_{\mathrm{1}}(s)-\theta_{\mathrm{2}}(s))=s \theta_{1}(s)-K F(s) (\theta_{\mathrm{1}}(s)-\theta_{\mathrm{2}}(s)) s(θ1(s)θ2(s))=sθ1(s)KF(s)(θ1(s)θ2(s))

H ( s ) = θ 2 ( s ) θ 1 ( s ) ∣ c l o s e l o o p = K F ( s ) s + K F ( s ) H(s) = \frac{\theta_2(s)}{\theta_1(s)}\big |_{close loop} = \frac{K F(s)}{s+K F(s)} H(s)=θ1(s)θ2(s)closeloop=s+KF(s)KF(s)

  1. 考虑闭环状态下,输入相位 θ 1 ( t ) \theta_1(t) θ1(t)驱动所引起的误差相位 θ e ( t ) \theta_e(t) θe(t)的响应:
    s θ e ( s ) = s θ 1 ( s ) − K F ( s ) θ e ( s ) s \theta_{\mathrm{e}}(s)=s \theta_{1}(s)-K F(s) \theta_{\mathrm{e}}(s) sθe(s)=sθ1(s)KF(s)θe(s)
    H e ( s ) = θ e ( s ) θ 1 ( s ) ∣ c l o s e l o o p = s s + K F ( s ) H_e (s) = \frac{\theta_e(s)}{\theta_1(s)}\big |_{close loop} = \frac{s}{s+K F(s)} He(s)=θ1(s)θe(s)closeloop=s+KF(s)s

不妨将不同的环路滤波器的传递函数代入得下表:
数字锁相环的FPGA实现(一)_第7张图片

显然此时的二阶系统经线性化后变成二阶线性系统,这个的话我们在学校学的知识就已经足以应付了(特别是电路),此时定义描述二阶线性系统的两个系统常量:无阻尼振荡频率 ω n \omega_n ωn和阻尼系数 ξ \xi ξ来描述系统的响应,对应关系见下表:
数字锁相环的FPGA实现(一)_第8张图片

结语

这里先省略锁相环的性能分析,搞这个有点累,放到下一篇(或下几篇)博客再讨论,或者边实战边讨论吧.因为电赛这次做得题目最多就做一个位同步而已,根本就没有这么多的东西要看.我也只是先做一点基础铺垫,以免后面出问题.

赞赏通道

你可能感兴趣的:(fpga,DSP)