当前位置: 首页 > news >正文

PLL锁相环带宽定义,以及PI参数自动整定

PLL 带宽调整和 PI 参数设计

要将锁相环(PLL)的带宽调整到 200 Hz,我们需要重新设计 PI 控制器的参数 K PLLp K_{\text{PLLp}} KPLLp K PLLi K_{\text{PLLi}} KPLLi。下面是详细的步骤:

1. 确定锁相环的自然频率和阻尼比

对于二阶系统,闭环传递函数可以表示为:

G ( s ) = ω n 2 s 2 + 2 ζ ω n s + ω n 2 G(s) = \frac{\omega_n^2}{s^2 + 2 \zeta \omega_n s + \omega_n^2} G(s)=s2+2ζωns+ωn2ωn2

其中:

  • ω n \omega_n ωn 是自然频率
  • ζ \zeta ζ 是阻尼比

2. 将原始传递函数与标准形式对比

从你的代码中,PLL 的开环和闭环传递函数为:

开环传递函数:

G P L L K ( s ) = K P L L p s + K P L L i s 2 G_{\mathrm{PLLK}}(s) = \frac{K_{\mathrm{PLLp}} s + K_{\mathrm{PLLi}}}{s^2} GPLLK(s)=s2KPLLps+KPLLi

闭环传递函数:

G P L L B ( s ) = G P L L K ( s ) 1 + G P L L K ( s ) = K P L L p s + K P L L i s 2 + K P L L p s + K P L L i G_{\mathrm{PLLB}}(s) = \frac{G_{\mathrm{PLLK}}(s)}{1 + G_{\mathrm{PLLK}}(s)} = \frac{K_{\mathrm{PLLp}} s + K_{\mathrm{PLLi}}}{s^2 + K_{\mathrm{PLLp}} s + K_{\mathrm{PLLi}}} GPLLB(s)=1+GPLLK(s)GPLLK(s)=s2+KPLLps+KPLLiKPLLps+KPLLi

将其与标准二阶系统的传递函数对比,我们得到:

K P L L p s + K P L L i s 2 + K P L L p s + K P L L i = ω n 2 s 2 + 2 ζ ω n s + ω n 2 \frac{K_{\mathrm{PLLp}} s + K_{\mathrm{PLLi}}}{s^2 + K_{\mathrm{PLLp}} s + K_{\mathrm{PLLi}}} = \frac{\omega_n^2}{s^2 + 2 \zeta \omega_n s + \omega_n^2} s2+KPLLps+KPLLiKPLLps+KPLLi=s2+2ζωns+ωn2ωn2

3. 匹配系数,得到参数关系

比较分母,得到:

  • K P L L i = ω n 2 K_{\mathrm{PLLi}} = \omega_n^2 KPLLi=ωn2
  • K P L L p = 2 ζ ω n K_{\mathrm{PLLp}} = 2 \zeta \omega_n KPLLp=2ζωn

然而,分子部分并不完全匹配。为了简化设计,我们可以忽略 K P L L p s K_{\mathrm{PLLp}} s KPLLps 项对分子的影响(通常 K P L L p s K_{\mathrm{PLLp}} s KPLLps 在高频时起作用,但在闭环特性中,分子主要由 K P L L i K_{\mathrm{PLLi}} KPLLi 决定)。

4. 计算自然频率和阻尼比

为了使带宽为 200 Hz,首先计算自然频率 ω n \omega_n ωn

对于二阶系统,当阻尼比 ζ = 0.707 \zeta = 0.707 ζ=0.707 时,带宽 B W BW BW 与自然频率的关系近似为:

B W ≈ ω n BW \approx \omega_n BWωn

因此:

ω n = 2 π × B W = 2 π × 200 rad/s = 1256.64 rad/s \omega_n = 2\pi \times BW = 2\pi \times 200\ \text{rad/s} = 1256.64\ \text{rad/s} ωn=2π×BW=2π×200 rad/s=1256.64 rad/s

5. 计算 PI 控制器参数

  • 积分增益:

    K P L L i = ω n 2 = ( 1256.64 ) 2 ≈ 1.58 × 1 0 6 K_{\mathrm{PLLi}} = \omega_n^2 = (1256.64)^2 \approx 1.58 \times 10^6 KPLLi=ωn2=(1256.64)21.58×106

  • 比例增益:

    K P L L p = 2 ζ ω n = 2 × 0.707 × 1256.64 ≈ 1776.96 K_{\mathrm{PLLp}} = 2 \zeta \omega_n = 2 \times 0.707 \times 1256.64 \approx 1776.96 KPLLp=2ζωn=2×0.707×1256.641776.96

6. 更新代码

将计算得到的参数替换到你的代码中:

clc
KPLLp = 1776.96; % 更新后的比例增益
KPLLi = 1.58e6;  % 更新后的积分增益% 频率向量
fvec = logspace(0, 4, 10000);
GPLLB = zeros(1, length(fvec)); % 预分配空间for k = 1:length(fvec)fre1 = fvec(k);s = 1i * 2 * pi * fre1; % 复频率GPLLK = (KPLLp * s + KPLLi) / s^2; % 开环传递函数GPLLB(k) = GPLLK / (1 + GPLLK);    % 闭环传递函数
end% 绘制幅值和相位图(保持原有代码)
subplot(2, 1, 1);
semilogx(fvec, 20 * log10(abs(GPLLB)), 'k', 'LineWidth', 1.5);
grid on;
xlabel('Frequency (Hz)');
ylabel('Magnitude (dB)');subplot(2, 1, 2);
semilogx(fvec, angle(GPLLB) * 180 / pi, 'k', 'LineWidth', 1.5);
grid on;
xlabel('Frequency (Hz)');
ylabel('Phase (degrees)');

7. 验证带宽

运行代码并观察幅频响应图,确认在 200 Hz 处幅值下降了 3 dB,确保设计满足要求。

8. 调整阻尼比(可选)

如果对系统的超调量或响应速度有特定要求,可以调整阻尼比 ζ \zeta ζ 并重新计算 K P L L p K_{\mathrm{PLLp}} KPLLp

  • 增加 ζ \zeta ζ 会提高系统的阻尼,减少超调,但可能降低响应速度。
  • 减小 ζ \zeta ζ 会降低系统的阻尼,增加超调,但可能提高响应速度。

结论

通过上述步骤,我们使用正确的 PLL 开环和闭环传递函数,重新计算了 PI 控制器的参数,使得锁相环的带宽调整为 200 Hz。请根据实际需求,运行代码并进行进一步的验证和调整。

完整代码

% 目标带宽
f_BW_target = 200;  % Hz
% 阻尼比
zeta = 0.707;
% 频率范围
frequencies = logspace(0, 4, 1000);  % 从 10 Hz 到 100 kHz
% 初始化变量
omega_n_guess = 2*pi*f_BW_target;  % 初始猜测
tolerance = 1e-6;  % 容差
error = 1;
max_iter = 100;
iter = 0;
while error > tolerance && iter < max_iteriter = iter + 1;% 计算 KPLLp 和 KPLLiKPLLp = 2*zeta*omega_n_guess;KPLLi = omega_n_guess^2;% 定义频率向量fvec = frequencies;% 计算闭环传递函数在每个频率下的值GPLLB = zeros(1, length(fvec));for k = 1:length(fvec)fre1 = fvec(k);s = 1i*2*pi*fre1; % 复频率GPLLB(k) = (KPLLp*s + KPLLi) / (s^2 + KPLLp*s + KPLLi);end% 计算幅度(以 dB 为单位)和相位(以度为单位)mag_db = 20 * log10(abs(GPLLB));phase_deg = angle(GPLLB) * 180 / pi;% 找到幅值下降 -3 dB 的频率[~, idx] = min(abs(mag_db + 3));f_BW_actual = frequencies(idx);% 计算误差error = abs(f_BW_actual - f_BW_target) / f_BW_target;% 调整 omega_n_guessomega_n_guess = omega_n_guess * (f_BW_target / f_BW_actual);
end
if iter >= max_iterwarning('迭代未能在最大次数内收敛。');
end
fprintf('计算得到的参数:\n');
fprintf('KPLLp = %f\n', KPLLp);
fprintf('KPLLi = %f\n', KPLLi);
fprintf('实际带宽 = %f Hz\n', f_BW_actual);
% 获取目标带宽和实际带宽处的幅值和相位
% 在频率数组中找到最接近目标带宽和实际带宽的索引
[~, idx_target] = min(abs(frequencies - f_BW_target));
[~, idx_actual] = min(abs(frequencies - f_BW_actual));
% 对应的幅值和相位
mag_target = mag_db(idx_target);
phase_target = phase_deg(idx_target);
mag_actual = mag_db(idx_actual);
phase_actual = phase_deg(idx_actual);
% 绘制幅频响应和相频响应
figure;
% 绘制幅频响应
subplot(2,1,1);
semilogx(frequencies, mag_db, 'b');
title('传递函数的幅频响应');
xlabel('频率 [Hz]');
ylabel('幅值 [dB]');
grid on;
hold on;
% 在目标带宽和实际带宽处添加标记点
plot(f_BW_target, mag_target, 'ro', 'MarkerSize', 4, 'LineWidth', 2, 'DisplayName', ['目标带宽 = ' num2str(f_BW_target) ' Hz']);
plot(f_BW_actual, mag_actual, 'gs', 'MarkerSize', 4, 'LineWidth', 2, 'DisplayName', ['实际带宽 = ' num2str(f_BW_actual, '%.2f') ' Hz']);
% 添加 -3 dB 水平线
yline(-3, 'k--', '-3 dB 点', 'LineWidth', 1);
legend('幅频响应', '目标带宽', '实际带宽', '-3 dB 点');
hold off;
% 绘制相频响应
subplot(2,1,2);
semilogx(frequencies, phase_deg, 'b');
title('传递函数的相频响应');
xlabel('频率 [Hz]');
ylabel('相位 [度]');
grid on;
hold on;
% 在目标带宽和实际带宽处添加标记点
plot(f_BW_target, phase_target, 'ro', 'MarkerSize', 4, 'LineWidth', 2, 'DisplayName', ['目标带宽 = ' num2str(f_BW_target) ' Hz']);
plot(f_BW_actual, phase_actual, 'gs', 'MarkerSize', 4, 'LineWidth', 2, 'DisplayName', ['实际带宽 = ' num2str(f_BW_actual, '%.2f') ' Hz']);
legend('相频响应', '目标带宽', '实际带宽');
hold off;

http://www.mrgr.cn/news/56521.html

相关文章:

  • 银行客户贷款行为数据挖掘与分析
  • 排序算法 —— 快速排序(理论+代码)
  • MySQL之CRUD(下)
  • 【LaTeX和Word版】写论文时如何调整公式和文字的间距
  • “新物种”即将上线,极氪MIX是近几年最“好玩”的新车?
  • QT开发:详解Qt样式表(QSS):美化界面的应用
  • 如何重置你的 MySQL 或 MariaDB 的 root 密码
  • 开源图像超分ECBSR项目源码分析
  • 【系统规划与管理师】【公式计算题】(共21项)
  • 文件处理新纪元:微信小程序的‘快递员’与‘整理师’
  • 从关键新闻和最新技术看AI行业发展(第三十三期2024.9.23-10.13) |【WeThinkIn老实人报】
  • 序列操作基础与切片
  • AIGC:开启智能创造的璀璨新篇章
  • 神经网络模型内部
  • 一个用Python编写的自动化安装openGauss数据库方法和代码(3)
  • 六、Linux 服务器搭建专业指南
  • 人工智能技术的应用前景与生活工作变革
  • C++类和对象 - 下【匿名对象,友元,static成员】
  • 五、Shell 脚本编程:从基础至实用实例
  • ST7789读取ID错误新思路(以STC32G为例)
  • 架构师之路-学渣到学霸历程-28
  • Python程序设计 内置函数 日志模块
  • 数据类型的通用操作
  • Standard_Matrix
  • libaom-all-intra参数说明
  • 渗透测试实战—教育攻防演练中突破网络隔离