数字锁相环学习笔记(MATLAB仿真)

该文介绍了使用MATLAB进行锁相环控制的仿真过程,包括数字鉴相器、数字环路滤波器和数字压控振荡器的运用。通过设定输入频率、采样周期和系统参数,对相位进行跟踪并调整输出。在仿真中,还模拟了输入信号扰动对系统的影响。
摘要由CSDN通过智能技术生成

锁相环控制框图

通过数字鉴相器、数字环路滤波器、数字压控振荡器实现锁相环

鉴相器

在这里插入图片描述

环路滤波器

在这里插入图片描述

压控振荡器

在这里插入图片描述

小信号模型

在这里插入图片描述

在这里插入图片描述

MATLAB仿真及代码

  • 仿真结果在这里插入图片描述

  • 仿真代码

clear;clc;
%相位跟踪
%输入vi

f=50;           %Hz
w= 2*pi*f;      %输入角速度
T= 1/10e3;      %采样周期
vg = 6;         %输入电压最大值
Voffset =0.1;
phase=5*pi/2;   

t=0:T:0.5;

vi = zeros(size(t));
vi(1)=vg*sin(w*t(1)+phase);
vo = zeros(size(t));
vo(1)=0;

err_pd=0;%鉴相器输出信号
old_err_pd =0;%前一步鉴相器输出信号
v_err =0;%估计电压信号
elecTheta =0;%当前交流源角度输出
old_elecTheta =0;%前一个交流源角度输出
v_lowpass =0;%滤波器输出
old_v_lowpass =0;%前一个滤波器输出
wg =0;%估算角速度


pll_damping =0.707;%滤波器阻尼
pll_wn = 2*pi*15;%滤波器带宽
pll_kp =2*pll_damping*pll_wn/vg;
pll_Ti =pll_damping/pll_wn;

for i = 2:numel(t)
    %增加的扰动
    if i==2.5e3
        phase = 7*pi/2;
    end
    
    %输入信号
    vi(i)= vg*cos(w*t(i)+ phase);
    
    %估计的电压信号
    v_err = cos(elecTheta);
    
    %鉴相器计算
    err_pd = vi(i)*v_err;
    
    %低通滤波器计算
    v_lowpass = old_v_lowpass + (pll_kp+pll_kp*T/pll_Ti)*err_pd - pll_kp*old_err_pd;
    old_err_pd = err_pd;
    old_v_lowpass = v_lowpass;
    
    %加入前馈补偿
    wg = v_lowpass + w;
    
    %积分
    elecTheta = old_elecTheta + T*wg;
    old_elecTheta = elecTheta;
    
    %输出
    vo(i) = vg*sin(elecTheta) +Voffset;
    
end

subplot(1,1,1);
plot(t,vi,'b',t,vo,'r');


数字锁相环Matlab仿真代码如下: ```matlab %% Parameters fs = 1e6; % Sampling frequency fc = 10e3; % Carrier frequency fd = 500; % Input frequency N = 10000; % Number of samples f_out = zeros(1, N); % Output frequency phase_out = zeros(1, N); % Output phase error_out = zeros(1, N); % Phase error loop_filter_out = zeros(1, N); % Loop filter output %% Loop filter parameters Kp = 1; Ki = 1; Kd = 1; Tf = 1/(2*pi*fc); Nf = Tf*fs; %% Loop variables phase = 0; freq = fc; K1 = Kp+Ki/Nf+Kd*Nf; K2 = -Kp-2*Kd*Nf; K3 = Kd*Nf; integ = 0; prev_err = 0; %% Loop for n = 1:N % Generate input signal x = cos(2*pi*fc*(n-1)/fs+pi/3)+cos(2*pi*fd*(n-1)/fs); % Multiply by local oscillator y = x.*cos(2*pi*fc*(n-1)/fs+phase); % Lowpass filter ylp = lowpass(y, fd, fs); % Hilbert transform yht = hilbert(ylp); % Phase detector err = angle(yht); % Loop filter integ = integ+Ki/Nf*err+Kd*Nf*(err-prev_err); loop_filter_out(n) = Kp*err+integ; % Voltage controlled oscillator freq = fc+loop_filter_out(n); phase = phase+2*pi*freq/fs; % Output frequency f_out(n) = freq; % Output phase phase_out(n) = phase; % Output phase error error_out(n) = err; % Save previous error prev_err = err; end %% Plot results t = (0:N-1)/fs; figure; subplot(4,1,1); plot(t, f_out/1e3); xlabel('Time (s)'); ylabel('Frequency (kHz)'); title('Output frequency'); subplot(4,1,2); plot(t, phase_out); xlabel('Time (s)'); ylabel('Phase (rad)'); title('Output phase'); subplot(4,1,3); plot(t, error_out); xlabel('Time (s)'); ylabel('Error (rad)'); title('Phase error'); subplot(4,1,4); plot(t, loop_filter_out); xlabel('Time (s)'); ylabel('Output (V)'); title('Loop filter output'); ``` 注意,此代码仅用于演示数字锁相环的工作原理和效果。实际应用中,需要根据具体的系统要求进行参数调整和优化。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木龠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值