PR控制(含代码)

您所在的位置:网站首页 p121控制器 PR控制(含代码)

PR控制(含代码)

2024-07-12 14:35| 来源: 网络整理| 查看: 265

`转csdn的‘ xx健’,原文链接如下: 比例谐振PR控制器的学习记录 和博客园里‘Hao的杂货店’的文章。原文链接: 比例谐振的一种实现 写的都蛮好,非常感谢。 再贴一篇百度里的: 比例谐振控制算法分析 下面贴一下我自己改动过的代码,哈哈哈写的比较乱也就我勉强看的懂了。 根据控制理论只是,我们取谐振峰增益衰减到3dB处的频率作为频带宽。也就是增益值为0.707倍。经过推导,可以得到两个频率点的计算公式: 在这里插入图片描述 具体可以见下面那张图。 因此,可以看出,频带宽只和wc有关。 从数学的角度来分析,PR控制器传递函数相当于在PI控制器的传递函数的jw轴上加入了两个闭环极点,这两个极点的频率固定,并且会在此频率上发生谐振,此频率处的增益也会很大。因此PR控制器可以用来跟踪正弦指令信号,从数学的本质上讲,比例谐振控制器中的谐振频率相当于同步旋转的角速度,而传统的PI控制则由于少利用了一个角速度条件,因此系统会出现静态误差。

%s = tf([1, 0], 1) ;%等效于s=tf('s'); s=tf('s'); Kp = 4 ; Kr = 100 ; wr = 50 * 2 * pi ; wi = pi ; Ki=Kr; Kd=10 G_PI=Kp+Ki/s;%PI % bode(G_PI) % hold on; G_PR = Kp + Kr * s / (s^2 + wr^2);%谐振 % bode(G_PR) % hold on; G_QPR = Kp + 2*wi * Kr * s / (s^2 + 2* wi * s + wr^2);%准谐振 % bode(G_QPR) % hold on; G_QPRD = Kp + 2*wi * Kr * s / (s^2 + 2* wi * s + wr^2)+Kd*s;%准谐振微分 % bode(G_QPRD) % hold on; %matlab code %s = tf([1, 0], 1) ;%等效于s=tf('s'); s=tf('s'); Kp = 15 ; Kr = 2000 ; wr = 50 * 2 * pi ; wi = pi ; G_QPR = Kp + Kr * s / (s^2 + wr^2) bode(G_QPR) hold on; G_QPR1 = Kp + wi * Kr * s / (s^2 + wi * s + wr^2) bode(G_QPR1) hold on; G_QPR2 = Kp + 0.5* wi * Kr * s / (s^2 + 0.5* wi * s + wr^2) bode(G_QPR2) hold on; G_QPR3 = Kp + 2 * (2*wi) * Kr * s / (s^2 + 2 * (2*wi) * s + (wr)^2) bode(G_QPR3) hold on; for alpha=1:0.3:1.9 G_QPR1 = Kp + alpha* wi * Kr * s / (s^2 + alpha* wi * s + wr^2) bode(G_QPR1) hold on; end G_PR = Kp + Kr * s / (s^2 + wr^2) figure bode(G_PR) hold on;

在这里插入图片描述 分析PR控制器参数调节以及各个参数对所对控制器的影响。 Kp:谐振控制器在特定的谐振频率处可以获得很大的开环增益,但是在 Kr=256,wi=pi的时候,不同的Kp的PR控制器的bode图: 在这里插入图片描述 不同Kr下的bode图: 在这里插入图片描述 可以看出,当其他因素不变时,Kr增大,系统带宽不变,但控制器的增益会随之增大,且与Kr成正比。 在这里插入图片描述 wc主要是控制系统带宽,当然,更高的带宽会降低系统增益,因此带宽不能过大。 总结一下就是: wc值的确定,主要与系统截止频率的带宽需求有关; Kr值的确定,主要是根据系统所需要的峰值增益大小来确定; Kp的确定,主要是以对比例增益的要求的大小来确定; C语言实现: 记录一下项目中具体实现时的方法: 首先进行控制参数的初始化:

/************************************************************ ** 控制系数初始化 准谐振控制 G(s)=(2*wi*Kr*s)/(s^2+2*wi*s+w0^2); tustin离散化 G(z)= (4*Kr*Ts*wi*z^2 - 4*Kr*Ts*wi)/((Ts^2*w0^2 + 4*wi*Ts + 4)*z^2 + (2*Ts^2*w0^2 - 8)*z + Ts^2*w0^2 - 4*wi*Ts + 4) 系数: b0 = (4*Kr*Ts*wi)/(Ts^2*w0^2 + 4*wi*Ts + 4); b2 = -b0; a1 = (2*Ts^2*w0^2 - 8)/(Ts^2*w0^2 + 4*wi*Ts + 4); a2 = (Ts^2*w0^2 - 4*wi*Ts + 4)/(Ts^2*w0^2 + 4*wi*Ts + 4); 其中,wi=1.5*pi; ************************************************************/ EpsVoltCon_Reg.f32VoltCoff.a1 = -1.999439;//-1.9995648; EpsVoltCon_Reg.f32VoltCoff.a2 = 0.9996859;//0.9998115; EpsVoltCon_Reg.f32VoltCoff.b0 = 0.06020359;//0.04020359 // gain=256 wi = 1.5pi Ts= 1/20k EpsVoltCon_Reg.f32VoltCoff.b1 = 0; EpsVoltCon_Reg.f32VoltCoff.b2 = -0.06020359;//-0.04020359 // 改变Kr时改变b0和b2就可以,且正比关系;

PR控制器:

/* 计算R控制器 */ #define CNTL_RC_F_C(v, c, x) \ v.errn2 = v.errn1; \ v.errn1 = v.err; \ v.err = x; \ \ v.outn2 = v.outn1; \ v.outn1 = v.out; \ v.out = (c.b0 * v.err + c.b2 * v.errn2) \ - (c.a1 * v.outn1 + c.a2 * v.outn2);

具体实现:

// PR控制 CNTL_RC_F_C( EpsVoltCon_Reg.f32VoltCNTL, EpsVoltCon_Reg.f32VoltCoff, EpsVoltCon_Reg.f32VoltInstant_Ref - (ADValue.f32VINV));

加比例环节:

CNTL_RC_F_C( EpsVoltCon_Reg.f32VoltCNTL, EpsVoltCon_Reg.f32VoltCoff, EpsVoltCon_Reg.f32VoltInstant_Ref - (ADValue.f32VINV)); // EpsVoltCon_Reg.f32PIOut += (EpsVoltCon_Reg.kvp + EpsVoltCon_Reg.kvi) * EpsVoltCon_Reg.f32VoltCNTL.err // - EpsVoltCon_Reg.kvp * EpsVoltCon_Reg.f32VoltCNTL.errn1; EpsVoltCon_Reg.f32PIOut = (EpsVoltCon_Reg.kvp) * EpsVoltCon_Reg.f32VoltCNTL.err; EpsVoltCon_Reg.f32CurrRef = EpsVoltCon_Reg.f32PIOut + EpsVoltCon_Reg.f32VoltCNTL.out;

上述是直接根据离散化的方法来进行离散化,还有一种方法是可以将比例谐振控制器拆分成简单的积分组合,引进中间变量,以便于算法实现: 在这里插入图片描述



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3