1题目
开环传递函数 G(s)= 2/(s(0.5s+1)) ,采样周期 T=0.5 秒,设计单位速度输入下的最小拍控制器
1.1 方法1
根据课本中的步骤,最小拍控制器的设计步骤如下:
1. 确定对象的离散传递函数G(z),并确定其零极点。
2. 确定输入信号类型,确定误差传递函数Φ_e(z)需要包含的因子。例如,对于速度输入,Φ_e(z)必须包含(1 - z^{-1})^2。
3. 确定Φ_e(z)的形式,考虑对象的零极点:
a. Φ_e(z)必须包含G(z)中单位圆外的零点作为零点。
b. Φ_e(z)必须包含G(z)中单位圆外的极点作为零点。
c. Φ_e(z)必须包含(1 - z^{-1})^m,其中m是输入信号类型(阶跃为1,速度2,加速度3等)。
4. 确定Φ(z) = 1 - Φ_e(z),其中Φ(z)必须包含G(z)中单位圆外的极点作为零点,以及可能的延迟项。
5. 解出Φ_e(z)和Φ(z),使得系统方程满足,并解出控制器D(z)。
1.2 方法2
最小拍控制器的设计步骤如下:
1. 确定被控对象G(z)的零点和极点,以及是否存在单位圆外的零极点,这可能会影响稳定性,需要特殊处理。
2. 根据输入类型,确定误差传递函数E(z)的结构。对于单位速度输入,E(z)必须包含(1 - z^{-1})^2的因子。
3. 设计闭环传递函数Φ(z) = 1 - E(z),使得闭环系统稳定且在有限拍内达到稳态。
4. 通过Φ(z)和G(z)求出控制器D(z) = Φ(z)/(G(z) * E(z))。不过可能更具体的公式可能需要调整。
或者,更准确地说,控制器D(z) = Φ(z)/(G(z)*(1 - Φ(z))),因为闭环传递函数Φ(z) = D(z)G(z)/(1 + D(z)G(z)),所以D(z) = Φ(z)/(G(z)(1 - Φ(z)))。
1.3 方法3:于微波教材法
2代码
按照于老师教材设计
2.1 传递函数的零阶保持器的离散化GZ
% 系统参数
T = 0.5; % 采样周期
s = tf('s');
% 连续时间开环传递函数
Gc = 2/(s*(0.5*s + 1));
% 使用零阶保持法将连续传递函数转换为离散传递函数
Gd = c2d(Gc, T, 'zoh');
% 显示离散传递函数
disp('离散化后的开环传递函数 G(z):');
Gd
Gd = 0.3679 z + 0.2642 ---------------------- z^2 - 1.368 z + 0.3679 采样时间: 0.5 seconds 离散时间传递函数。
2.2 闭环传递函数phiz
% 定义Φ(z)和Φ_e(z)
Phi = tf([0 2 -1], [1], T, 'Variable', 'z^-1'); % Φ(z) = 2z^{-1} - z^{-2}
Phi_e = tf([1 -2 1], [1], T, 'Variable', 'z^-1'); % Φ_e(z) = (1 - z^{-1})^2
% 计算控制器D(z)
D = Phi / (G_discrete * Phi_e)
% 简化控制器传递函数
D = minreal(D); % 消除公共零极点
% 显示控制器传递函数
disp('最小拍控制器 D(z):');
D
2.3 数字控制器DZ
D =
5.437 - 10.15 z^-1 + 5.718 z^-2 - z^-3
------------------------------------------
1 - 1.282 z^-1 - 0.4366 z^-2 + 0.7183 z^-3
采样时间: 0.5 seconds
离散时间传递函数。
我没有对其因数分解!
2.4 仿真分析
单位速度分析
% 验证闭环系统性能
closed_loop = feedback(D*G_discrete, 1)
t = 0:T:10; % 时间向量
r = t; % 单位速度输入
[y, t_out] = lsim(closed_loop, r, t);
% 绘制输入输出响应
figure;
plot(t_out, r, 'r--', t_out, y, 'b-');
xlabel('时间 (秒)');
ylabel('幅值');
legend('输入信号', '输出响应');
title('单位速度输入下的闭环响应');
grid on;
% 显示稳态误差
steady_state_error = r(end) - y(end);
disp(['稳态误差: ', num2str(steady_state_error)]);
我认为单位速度响应还不错,但教材说不行!
单位阶跃响应
[y, t] = step(closed_loop, 10); % 计算10秒内的脉冲响应
figure
stem(t/T, y, 'filled');
xlabel('采样周期')
ylabel('响应y(k)')
% 单位速度输入的Z变换
z = tf('z', T); % 声明 z 变量
Rz = T * z/(z - 1)^2