详解PR控制器

1 PR控制以及使用PR控制用于单相离/并网逆变器

1.0 前言

在一个闭环控制系统中,可分为输入参考值、闭环控制器、执行机构、输出参数,反馈系数,这几个部分。

设计一款控制器,可以让系统的输出参数跟踪输入参考值,达到了控制的目的。在直流控制系统中,常用的控制器就是比例微分积分(Proportion Integration Defferentiation,PID)控制器了。然而,在交流系统中,PID控制器由于对高频信号的跟踪性能较差,并不能满足设计要求。而PR控制器,对特定频率信号的跟踪效果是良好的。


1.1 基本知识

PR控制器原理:

系统在双闭环控制过程中通常使用传统的PI控制器,但是电网在基波处的增益是有限值,PI控制器能够实现对直流信号的无静差追踪,却并不能在正弦信号的追踪过程中实现无静差,相应产生的稳态误差会造成追踪电流在有效值幅值和相位上的误差。电流有效值幅值上的误差,可以通过增大控制器的比例系数,相应的增大基波频率的增益来实现,但是并不能完全的消除误差,仍是有差调节。在幅值误差得到有效改善的情况下,系统的误差主要表现为相位误差,需要通过控制器的改进来减小相位的误差值。

根据PR控制器在跟踪控制方面的优势,用PR控制器替代PI控制器,在系统加载冲击性负载时,可以有很好的响应速度,保证了系统良好的动态稳定性。

下面给出 PR 控制器的传递函数以及对应的基波频率处的增益:

根据(1)(2)可以看出,由于基波频率处的增益趋于无穷大,使系统在追踪固定频率正弦信号时能够实现无静差追踪。


PR控制的传递函数形式为:

利用matlab绘制一下该传递函数的幅频响应,是在谐振频率ω = ωo的频率点增益无穷大,且没有相位滞后。

根据PR控制器上述的特性,我们可以设计谐振频率等于电网的角频率,使电网基波信号增益无穷大而其他频段增益小,从而应用在交流电路的控制中。

至于为什么不用传统的PI控制,其原因是PI控制器对于交流信号的控制性能差,对直流信号的跟踪性能好,直流信号增益无穷。因此DC-DC变换中多采用PI控制,而在交流中也可以通过DQ坐标变换,将需要控制的交流信号变换为直流信号,再用直流控制器PI控制旋转坐标系下的d轴分量与q轴分量,从而间接控制交流量的效果。

总而言之,PI是直流信号控制器,PR是交流控制器


1.2 实际使用

实际应用中,虽然 PR 控制在基波频率处拥有较高 的增益,但是相角裕度较小,带宽较窄,引起系统发生振荡,容易造成控制器谐振频率的偏移,影响系统稳定。由于电网频率不会严格的等于50Hz,难免存在波动,因此前文提到的PR控制器在电网频率稍微偏离50Hz,增益大幅衰减。为增加相角裕度和带宽宽度、控制的鲁棒性,可以通过添加增益较高的低通滤波器实现,增加截止频率ωc,改写传递函数为:

修改后的PR控制器,亦称为准比例谐振控制(Quasis Proportional Resonant),在谐振频率附近的小范围内,仍然具有高增益,因此能适用电网频率波动的情况。

增加了2ωr之后,减小了谐振频率处的增益,但是却在谐振频率附近形成了一个具有较大增益的频带,由此减小频率偏移带来的影响。

你可以改变 ωrωr,通过在MATLAB中运行如下代码来亲自感受一下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
s = tf([1, 0], 1) ;

Kp = 15 ;
Kr = 2000 ;
wr = 50 * 2 * pi ;
wi = pi ;

G_PR = Kp + Kr * s / (s^2 + wr^2)
figure
bode(G_PR)

G_QPR = Kp + 2 * wi * Kr * s / (s^2 + 2 * wi * s + wr^2)
figure
bode(G_QPR)

至此,我们发现应用准谐振控制时需要整定3个参数,Kp、Kr、ωc。先回顾PID的三个参数。

  • P因子,决定响应速度。
  • I因子,决定稳态误差。
  • D因子,决定抗扰能力。

而通常在电力电子中多用PI控制,电力传动有PI也有PD。PI控制电机无静差调速,可用于舵机消除抖动。

式中:Kp,Kr,ωc 为控制器参数,ω0=314 rad/s。

PI 控制PR控制和准 PR 控制的频率特性如图所示。

kp=10,ki = kr = 100;

图中,PI 控制器在基波频率处的增益几乎为零,而PR控制器与准PR 控制器在基波频率处的增益却很大, 且具有相似的频率特性,可以在指定的频率下对稳态误差 进行有效的消除,故可利用准PR控制器来代替PI控制器,从而在消除幅值误差的同时消除相位误差,做到对指 定信号的准确追踪,消除了稳态误差。

波特图详细对比

下图是当Kp分别取为1、10、100,Ki=10时PI控制器的波特图(蓝色是Kp=1,绿色是Kp=10,红色是Kp=100)。

附上实现代码:

1
2
3
4
5
6
7
8
9
10
11
% this is Matlab code:
Ki=10;
Kp=1;
PIs1=tf([Kp,Ki],[1,0])
Kp=10;
PIs2=tf([Kp,Ki],[1,0])
Kp=100;
PIs3=tf([Kp,Ki],[1,0])
bode(PIs1,PIs2,PIs3)
title('Bode Diagram of PI: Kp=1,10,100. Ki=10')
grid on

下图是当Kp=1,Ki分别取为1、10、100时PI控制器的波特图(蓝色是Ki=1,绿色是Ki=10,红色是Ki=100)。

附上实现代码:

1
2
3
4
5
6
7
8
9
10
11
Kp=1
Ki=1
PIs1=tf([Kp,Ki],[1,0])
Ki=10
PIs2=tf([Kp,Ki],[1,0])
Ki=100
PIs3=tf([Kp,Ki],[1,0])
figure(2)
bode(PIs1,PIs2,PIs3)
grid on
title('Bode Diagram of PI: Kp=1. Ki=1,10,100')

可以看到,PI控制器对高频信号的增益会较低,而对低频信号会有较大的放大作用。假如使用PI控制器对50Hz及以上(角频率314rad/sec)的正弦波进行跟踪,系统的跟踪特性会较差。而且会把低频噪声放大。

下图是当Kp分别取为1、10、100,Kr=1时理想的PR控制器的波特图(蓝色是Kp=1,绿色是Kp=10,红色是Kp=100)。

附实现代码:

1
2
3
4
5
6
7
8
9
10
Kr=1;
Kp=1;
PR_ideal1 = Kp + tf([Kr,0],[1,0,wo^2])
Kp=10;
PR_ideal2 = Kp + tf([Kr,0],[1,0,wo^2])
Kp=100;
PR_ideal3 = Kp + tf([Kr,0],[1,0,wo^2])
bode(PR_ideal1,PR_ideal2,PR_ideal3)
grid on
title('Bode Diagram of ideal PR: Kp = 1,10,100. Kr = 1')

下图是当Kp=1,Kr分别取为1、10、100时理想的PR控制器的波特图(蓝色是Kr=1,绿色是Kr=10,红色是Kr=100)。

附实现代码:

1
2
3
4
5
6
7
8
9
10
11
Kp=1;
Kr=1;
PR_ideal1 = Kp + tf([Kr,0],[1,0,wo^2])
Kr=10;
PR_ideal2 = Kp + tf([Kr,0],[1,0,wo^2])
Kr=100;
PR_ideal3 = Kp + tf([Kr,0],[1,0,wo^2])
figure(4)
bode(PR_ideal1,PR_ideal2,PR_ideal3)
grid on
title('Bode Diagram of ideal PR: Kp = 1. Kr = 1,10,100')

上面理想PR的波特图,可以看到就算调整PR的参数,波形也没什么大的变化。在实际使用中,可能进行实时调参的。图像变化这么小,跟踪效果也不会好。

接下来看看实际使用的PR控制器的波特图。

下图是当Kp分别取为1、10、100,Kr=1时实际的PR控制器的波特图(蓝色是Kp=1,绿色是Kp=10,红色是Kp=100)。

附实现代码:

1
2
3
4
5
6
7
8
9
10
Kr=1;
Kp=1;
PR1=Kp+tf([2*Kr*wc,0],[1,2*wc,wo^2])
Kp=10;
PR2=Kp+tf([2*Kr*wc,0],[1,2*wc,wo^2])
Kp=100;
PR3=Kp+tf([2*Kr*wc,0],[1,2*wc,wo^2])
bode(PR1,PR2,PR3)
grid on
title('Bode Diagram of actual PR: Kp = 1,10,100. Kr = 1')

下图是当Kp=1,Kr分别取为1、10、100时实际的PR控制器的波特图(蓝色是Kr=1,绿色是Kr=10,红色是Kr=100)。

附实现代码:

1
2
3
4
5
6
7
8
9
10
Kp=1;
Kr=1;
PR1=Kp+tf([2*Kr*wc,0],[1,2*wc,wo^2])
Kr=10;
PR2=Kp+tf([2*Kr*wc,0],[1,2*wc,wo^2])
Kr=100;
PR3=Kp+tf([2*Kr*wc,0],[1,2*wc,wo^2])
bode(PR1,PR2,PR3)
grid on
title('Bode Diagram of actual PR: Kp = 1. Kr = 1,10,100')

PI和PR的Kp作用类似,都是增大开环增益,增加控制精度。

Ki和Kr作用类似:降低系统稳态误差。

准PR控制器的设计

通过对准PR控制器的传递函数的分析,可以明确在 控制器参数的设计过程中,主要是对 Kp ,Kr,ωc 进行选 择,所以本文首先使用控制变量的方法来对各个参数的作用进行分析。

首先令 Kp2 =0,ωc =1,同时使 Kr 不断变化,对应的频 率特性如图 4 所示。
Kr1=10
Kr2=100
Kr3=1000
Kr4=10000

由图 可知,在参数 Kr 的变化过程中,只有控制器的增益相应的进行变化,并且随着 Kr 的增大,控制器的增益 增大的同时,稳定性不断加强,但却不会对控制器的带宽 造成影响。然而 Kr 增大到一定程度就会引起谐波分量的放大,所以要合理的选择参数 Kr,既满足基波频率处有较 大的增益,又能具有一定的衰减性。

令 Kp=0,Kr=1,ωc 进行不断变化,对应的频率特性如图所示。
Wc =1,
Wc =5,
Wc =15,
Wc =30,
Wc =50,

从图 5 中可得,在参数ωc 变化过程中,控制器的增益与带宽同时发生变化,说明ωc 对两者都存在相关性,虽然 随着ωc 的增大,控制器基波频率处的增益未发生改变,但 控制器非基波频率处的增益和带宽却同时变大,所以参数 ωc 的选择需要根据频率的波动和控制器带宽的需求共同决定。

在分析 Kp变化之前,先令 Kp =0,并将 jω=s 带入到H(s)中,得到

令上式中的ω0/2ωc=Q,则 Q 看作 PR 控制器谐振环节 的品质系数。
设电网允许的频率波动是±0.5 Hz,此时的控制器带 宽为 d=1 Hz,
,在 |Q (ω/ω0 -ω0/ ω) | =1 时可得频率之间相差带宽为 d = ωc /2πQ = ωc/ π,对应的ωc =3.14。

最后令 Kr=100,ωc =3.14,Kp 进行变化,对应的频率特性如图 所示
kp= 0.1 ,
kp= 1 ,
kp= 10,

根据上图 的变化,控制器的增益与带宽都受到 Kp变化的影响,但是随着 Kp 的增大,控制器增益在基波频率处的增益并未发生改变,只在非基波频率处增益相应的增 大,对应的带宽随着 Kp的增大而减小。所以随着 Kp 的 不断增大,使系统的抗干扰能力不断增强,但是并不能无 限增大,若 K p 2 过大会造成系统的振荡而影响其稳定性。计根据对控制器各个参数的分析,准 PR 控制参数的设 一般需要按照以下步骤设计[1 3]:
1)ωc值的确定,此值主要与系统截止频率的带宽需求有关(ωc可以调节谐振频段宽度,同时调节谐振峰值增益,ω0就是谐振频率点);
2)Kr值的确定,此值主要根据系统所需的峰值增益 的大小来进行取值(Kr可以调节谐振峰值增益,同时调节谐振频段宽度);
3)Kp值的确定,此值主要根据系统对比例增益的要求来选择最佳的Kp 值(Kp可以调节PR控制器的整体增益)。
按照上述步骤设计的控制器参数,使准 PR 控制器系 统具有很强的稳定性与抗干扰性,系统的控制效果达到最佳。根据本系统实际实验过程的需要,选择的准 PR 控制 参数如下:Kp=6.5,Kr =120,ωc=8,得到的准PR控制器 Bode 图如图 所示。

准 PR 控制的谐波补偿环

为了增强系统的抗干扰能力,在准 PR 控制器中增加各个主要频次谐波的谐振补偿环,使系统在谐波频率点处产生较大的增益,同时保证系统有足够的相角裕度和良好的动态性能。根据实际中谐振补偿方式的需要合理进行选择,谐振补偿环的传递函数为:

下面以 3 次谐波为例,如图所示。在准 PR 控制器 中添加 3 次谐波补偿环,并画出对应的 Bode 图。添加了谐波补偿环后,对应的谐波频率处产生了很大增益,实现了对应谐波的无静差追踪,同时抑制了谐波对系统电能质量的影响。一般情况下,通过添加特定次数的谐波补偿环,在实现对基波成分跟踪的同时,还能对特定次数的谐 波成分进行跟踪,实现对特定次数谐波的消除,从而减小了谐波造成的污染,提高了逆变器系统的电能质量。


为了观察准比例谐振控制器中三个参数的影响,同样用MATLAB绘制bode图,控制变量法来看。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
figure()
subplot(1,3,1)
Kp=1;Kr=100;wc=0.5*2*pi;wo=100*pi;PRs1=Kp+tf([2*Kr*wc,0],[1 2*wc wo*wo]);bode(PRs1);hold on;
Kp=10;Kr=100;wc=0.5*2*pi;wo=100*pi;PRs1=Kp+tf([2*Kr*wc,0],[1 2*wc wo*wo]);bode(PRs1);hold on;
Kp=100;Kr=100;wc=0.5*2*pi;wo=100*pi;PRs1=Kp+tf([2*Kr*wc,0],[1 2*wc wo*wo]);bode(PRs1);hold on;
legend('KP=1','KP=10','KP=100');title('变KP')
subplot(1,3,2)
Kp=1;Kr=10;wc=0.5*2*pi;wo=100*pi;PRs1=Kp+tf([2*Kr*wc,0],[1 2*wc wo*wo]);bode(PRs1);hold on;
Kp=1;Kr=100;wc=0.5*2*pi;wo=100*pi;PRs1=Kp+tf([2*Kr*wc,0],[1 2*wc wo*wo]);bode(PRs1);hold on;
Kp=1;Kr=1000;wc=0.5*2*pi;wo=100*pi;PRs1=Kp+tf([2*Kr*wc,0],[1 2*wc wo*wo]);bode(PRs1);hold on;
legend('Kr=10','Kr=100','Kr=1000');title('变Kr')
subplot(1,3,3)
Kp=1;Kr=100;wc=0.1*2*pi;wo=100*pi;PRs1=Kp+tf([2*Kr*wc,0],[1 2*wc wo*wo]);bode(PRs1);hold on;
Kp=1;Kr=100;wc=0.5*2*pi;wo=100*pi;PRs1=Kp+tf([2*Kr*wc,0],[1 2*wc wo*wo]);bode(PRs1);hold on;
Kp=1;Kr=100;wc=1*2*pi;wo=100*pi;PRs1=Kp+tf([2*Kr*wc,0],[1 2*wc wo*wo]);bode(PRs1);hold on;
legend('wc=0.1','wc=0.5','wc=1.0');title('变wc')

由bode图可知,Kp越大,其他低频段和高频段的增益越大;Kr越大,谐振点的增益越大,但附近周围频带的增益也相应有所增大;wc越大,周围频带的增益也相应有所增大

而参数wc可以任意取一个较小的数,2 π × 0.1、2 π × 0.5、2 π × 1,因此真正需要整定的参数也就只有Kp和Kr了。


1.3 传递函数推导

从Bode图中可以发现,比例谐振控制器与二阶欠阻尼谐振系统极为相似,典型二阶系统的传递函数为。

当ζ取不同值时,其Bode图为

将Bode图中的两条幅频曲线相减,即可得到PR Controller,Bode图中相减即实际增益的相除,即传递函数相除。

令 ζ1 ( 0.01 ) ) < ζ2 ( 0.5 ),计算两个二阶系统传递函数相除

对应Bode图为

得到的传递函数和Bode图就是比例谐振控制器,对系数进行替换即可得到本文开头的比例谐振控制器传递函数。

当串联使用时,一般可将比例Kp设置为1,通过调节谐振增益的幅值和频宽设计合适的谐振控制器,通过双线性Z变换得到离散的控制器参数。

此外,当谐振频率变化时,比如开头提到的AC交流频率在45Hz~65Hz变化时,可以根据变化的频率,更新ωo,通过Z变换的系数关系式,实时刷新谐振控制器的离散控制系数。


1.4 单相离网逆变器

离网逆变器是把DC逆变出来的AC直接使用,输出接负载,控制对象是输出电压,力争低THD,幅值可控。

控制结构框图:

资源链接:

基于PR控制的单相离网逆变器
DSP工程


1.5 单相并网逆变器

并网逆变器是把DC逆变出来的AC电送入另一个交流系统,输出端接电网,控制对象是输出电流,力争低THD,幅值可控,且与电网电压同相位。

控制结构框图:

资源链接:

基于PR控制的单相并网逆变器控制


1.6 PR控制器离散化

目前而言,同一种控制方式有3种表达形式:

  • 时域,有连续时域和离散时域之分。
  • 复频域,又称s域。
  • z域。

在大学之前的学习一直都是时域下的,也是最容易理解的。大学期间接触到拉氏变换是由连续时域到复频域的变换,z变换是离散时域到z域的变换。

在连续时域下,描述不同时间点的方程称为微分方程

在离散时域下,描述不同时间点的方程称为差分方程

传递函数离散化后,函数中消掉了拉普拉斯算子“s”,同时出现了“z”。有一个公式需要认识。

以上公式,转化为单片机或DSP可以执行的命令为:

在前人研究基础上:

方法很多,选哪一个种呢?在TI写的数字锁相环算法库中有说明文档详细推导各个参数的计算,其中就涉及到连续传递函数离散化的问题,TI采用的Tustin。简单起见我们也选Tustin方法了。

看起来比较简单的方法是Forward Euler、Backward Euler、Trapezoid(Tustin)这三种了。直接把公式代入,用z消掉s就好了。

MATLAB也提供了传递函数离散化的内置函数c2d。

1
2
3
4
5
6
7
Ts=1/25000;
Kp=1;
Kr=100;
wc=0.5*2*pi;
wo=100*pi;
c=Kp+tf([2*Kr*wc,0],[1 2*wc wo*wo]);
d=c2d(c,Ts,'tustin');

但是好像不能用MALTAB计算出准谐振一般表达式的离散化结果,索性直接带入化简得了。

过程略,结果如下。

在当初学习的时候会思考离散化里面的T到底是什么。我的理解就是,相邻两次以离散化的方式实现连续传递函数的时间间隔。在DSP中的控制一般写在中断中,那么对应的T即中断时间间隔。而在Simulink中,Powergui和模型设置这两个地方都能设置步长,到底哪个才是真正的呢?目前没有想明白,若想要验证的话设置为相同的步长即可。

当时学习的时候也有一个疑问,为什么在学习PID控制器的时候没有所谓的离散化步骤。怎么就直接把PID的C语言实现给写出来了呢?是因为PID的连续时域表达式简单,很容易就能推导出离散时域表达式,用的微积分的思想。而在学习PR控制器的时候,是先得到他的传递函数,即s域表达式,可以直接从s域到z域变换。

那实现数字一阶滤波器的时候呢?也是先根据模拟RC电路推导传递函数,再变到连续时域的一阶微分方程,离散时域。那稍微复杂一点的二阶甚至高阶滤波器呢,就是直接从s域到z域到离散时域的。

总之,当我们用数字方式实现控制时,根本目的是得到他的离散时域表达式


1.7 离散化练习题

在Matlab中验证结果:

1
2
3
Kp=1;Ki=2;Kd=3;Ts=1e-3;
PID=tf([Kd,Kp,Ki],[1,0])
c2d(PID,1e-3,'tustin')

可得到:

Sampling time: 0.001

和计算结果一致。

同时Matlab的c2d()函数总共支持五种离散方法。

1
2
3
4
5
6
7
8
9
10
 
SYSD = C2D(SYSC,TS,METHOD) computes a discrete-time model SYSD with
sampling time TS that approximates the continuous-time model SYSC.
The string METHOD selects the discretization method among the following:
'zoh' Zero-order hold on the inputs
'foh' Linear interpolation of inputs
'impulse' Impulse-invariant discretization
'tustin' Bilinear (Tustin) approximation.
'matched' Matched pole-zero method (for SISO systems only).
The default is 'zoh' when METHOD is omitted.

使用Matlab离散PR控制器

1
2
3
4
5
6
Kp=1;
Kr=10;
wc=2*pi*5;
wo=2*pi*50;
PRs=Kp+tf([2*Kr*wc,0],[1,2*wc,wo^2])
PRz = c2d(PRs,1e-3,'tustin')

可得到,离散化后,数字实现的C语言为:



1.8 逆变器仿真模型中使用PR闭环控制器

Matlab/Simulink搭建了模型:

电气主回路中参数:滤波电感Lf=47uH,滤波电容Cf=1uF,负载Lf1=30欧姆。

控制回路:

PR控制器实现框图:

经过参数优化后,Kp=1000,Kr=100;wc=2*pi*5;wo=2*pi*50

上图中,error = Vref - Vout/311。Vref为频率50Hz、幅值为1的正弦波。Vout是逆变器输出。可以看到闭环系统中误差可降到1mV *311=0.331V之内(1mV为error波形的幅值,311为电压标幺化基准值)。


1.9 DSP实现

有了Z域下的表达式,可以直接得到离散时域表达式,即差分方程。

以二阶为例:

则离散时域表达式为:

因此可以根据前面推导的PR控制器在Z域下的通用表达式,写出它的通用离散时域表达式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
/*
* myPR.c
*
* Created on: 2023年4月25日
* Author: EnglishName
*/

#include <myAPP/myPR/myPR.h>

PR pr_v_ac = { 0 };
PR pr_i_ac = { 0 };

void PR_init(PR *p,float32 Kp,float32 Kr,float32 Ts,float32 wc, float32 wo)
{
float temp = 0;
p->Ts=Ts;
p->Kp=Kp;
p->Kr=Kr;
p->wc=wc;
p->wo=wo;
temp = 4 / p->Ts / p->Ts + 4 * p->wc / p->Ts + p->wo * p->wo;

p->B0 = (4 * p->Kp / p->Ts / p->Ts + 4 * p->wc * (p->Kp + p->Kr) / p->Ts
+ p->Kp * p->wo * p->wo) / temp;
p->B1 = (-8 * p->Kp / p->Ts / p->Ts + 2 * p->Kp * p->wo * p->wo) / temp;
p->B2 = (4 * p->Kp / p->Ts / p->Ts - 4 * p->wc / p->Ts * (p->Kp + p->Kr)
+ p->Kp * p->wo * p->wo) / temp;
p->A1 = (-8 / p->Ts / p->Ts + 2 * p->wo * p->wo) / temp;
p->A2 = (4 / p->Ts / p->Ts - 4 * p->wc / p->Ts + p->wo * p->wo) / temp;
/*PRpr;
* 差分方程
* y[n]+A1[n-1]+A2[n-2]=B0x[n]+B1x[n-1]+B2[n-2]
*/
}

void PR_calc(PR *p)
{
p->vo = -p->A1 * p->vo_1 - p->A2 * p->vo_2 + p->B0 * p->vi + p->B1 * p->vi_1
+ p->B2 * p->vi_2;

// update and store
p->vo_2=p->vo_1;
p->vo_1 = p->vo;
p->vi_2 = p->vi_1;
p->vi_1 = p->vi;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/*
* myPR.h
*
* Created on: 2023年4月25日
* Author: EnglishName
*/

#ifndef MYAPP_MYPR_MYPR_H_
#define MYAPP_MYPR_MYPR_H_

#include "F28x_Project.h"

typedef struct
{
float Kp;
float Kr;
float wo;
float wc;
float Ts;
float A0, A1, A2, B0, B1, B2;
float vo, vo_1, vo_2;
float vi, vi_1, vi_2;
} PR;

extern PR pr_v_ac;
extern PR pr_i_ac;

void PR_init(PR *p, float32 Kp, float32 Kr, float32 Ts, float32 wc, float32 wo);
void PR_calc(PR *p);

#endif /* MYAPP_MYPR_MYPR_H_ */

之前一直以为我把应用PR于单相逆变器的代码也上传了。代码可以移步这里
单相逆变器,单台运行、并联运行以及并联并网


1.10 C语言的一种实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/************************************************************
** 控制系数初始化
准谐振控制 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就可以,且正比关系;
1
2
3
4
5
6
7
8
9
10
/* 计算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);
1
2
// PR控制
CNTL_RC_F_C(EpsVoltCon_Reg.f32VoltCNTL, EpsVoltCon_Reg.f32VoltCoff, EpsVoltCon_Reg.f32VoltInstant_Ref - (ADValue.f32VINV));
1
2
3
4
5
6
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;

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