> 技术文档 > 离散PR控制器及逆变闭环性能验证(开源)_pr控制差分方程

离散PR控制器及逆变闭环性能验证(开源)_pr控制差分方程


一、PR控制原理及离散化实现(C语言实现)

理想的PR控制器在共振频率(如50Hz或60Hz)处具有无限增益,但在数字控制系统中,这会引发数值不稳定、无法完全离散化共振项以及频率偏差和延时等问题。

为解决这些挑战,提出了准PR控制器(Quasi-PR或带限PR控制器),通过引入有限带宽近似实现共振效果,兼顾系统的可控性与可实现性。PR控制器可实现正弦参考信号的无静差跟踪,广泛应用于电力电子变换器控制中。

嵌入式(STM32、DSP28335)中,要使用PR控制器需要将其离散化(C语言实现),因此本文将详细给出离散化的详细步骤、代码、开源的仿真模型。

1、准PR控制器传递函数

式中,Kp为比例系数Kr谐振系数,ω0为谐振角频率(目标频率,rad/s),ωc为截止带宽(rad/s),决定谐振峰宽度。

在单相逆变器应用中,ω0=2πfgfg为电网频率即50Hzωc=(0.55)%×ω0KpKr通常采取试凑法。

2、离散化实现(差分方程)

采用双线性变换(Tustin)离散化,将下式带入GQPR(s)。

式中 Ts是采样周期。将GQPR(s)中 s替换后,就可以得到准PR控制器的差分形式,如下式

式中系数为

实际实现中通常使用归一化系数,将准PR控制器差分形式变为:

式中系数为

因此,可得到准PR控制器的差分方程为:

式中,e[k]为当前误差(参考值 - 反馈值),yr[k]为谐振部分输出,u[k]为控制器总输出

在嵌入式(STM32DSP)中,可以根据上述PR控制器的差分方程编写离散化PR控制器的C语言代码。

3、PR控制的C语言实现

#include // 准PR控制器结构体typedef struct { // 参数 float Kp; // 比例系数 float Kr; // 谐振系数 float w0; // 谐振角频率 (rad/s) float wc; // 截止带宽 (rad/s) float Ts; // 采样周期 (s) // 离散化系数 float b0_prime; float b2_prime; float a1_prime; float a2_prime; // 状态变量 float e_prev1; // e[k-1] float e_prev2; // e[k-2] float yr_prev1; // yr[k-1] float yr_prev2; // yr[k-2]} QPRController;// 初始化控制器void QPR_Init(QPRController *ctrl,  float Kp, float Kr,  float w0, float wc,  float Ts) { ctrl->Kp = Kp; ctrl->Kr = Kr; ctrl->w0 = w0; ctrl->wc = wc; ctrl->Ts = Ts; // 计算中间变量 float a = 2.0f / Ts; float a_sq = a * a; float w0_sq = w0 * w0; float b0 = 2.0f * Kr * wc * a; // 计算分母系数 float a0 = a_sq + 2.0f * wc * a + w0_sq; float a1 = -2.0f * a_sq + 2.0f * w0_sq; float a2 = a_sq - 2.0f * wc * a + w0_sq; // 归一化系数 ctrl->b0_prime = b0 / a0; ctrl->b2_prime = -b0 / a0; // b2 = -b0 ctrl->a1_prime = a1 / a0; ctrl->a2_prime = a2 / a0; // 初始化状态 ctrl->e_prev1 = 0.0f; ctrl->e_prev2 = 0.0f; ctrl->yr_prev1 = 0.0f; ctrl->yr_prev2 = 0.0f;}// 执行控制计算float QPR_Update(QPRController *ctrl, float ref, float fdb) { // 计算当前误差 float e = ref - fdb; // 计算谐振部分输出 float yr = ctrl->b0_prime * e  + ctrl->b2_prime * ctrl->e_prev2 - ctrl->a1_prime * ctrl->yr_prev1 - ctrl->a2_prime * ctrl->yr_prev2; // 比例部分 + 谐振部分 float u = ctrl->Kp * e + yr; // 更新状态变量 ctrl->e_prev2 = ctrl->e_prev1; ctrl->e_prev1 = e; ctrl->yr_prev2 = ctrl->yr_prev1; ctrl->yr_prev1 = yr; return u;}

4、 使用示例

int main() { QPRController pr_ctrl; // 初始化参数 (示例:50Hz系统) float Kp = 0.5f; // 比例系数 float Kr = 10.0f; // 谐振系数 float f0 = 50.0f; // 谐振频率 (Hz) float w0 = 2 * M_PI * f0; // 角频率 float wc = 5.0f; // 截止带宽 (rad/s) float Ts = 0.001f; // 1kHz采样 QPR_Init(&pr_ctrl, Kp, Kr, w0, wc, Ts); // 实时控制循环 while(1) { float ref = ...; // 获取参考值 float fdb = ...; // 获取反馈值 float u = QPR_Update(&pr_ctrl, ref, fdb); // 应用控制量u到被控对象 ... delay(Ts); // 等待下一个采样周期 }}

二、仿真验证

图1展示了所搭建的单相逆变器闭环控制仿真模型,控制器采用PR控制策略,涵盖了基于模块搭建的PR控制器C语言实现的PR控制器两种方式。

图2和图3分别给出了模块搭建的PR控制器C语言实现的PR控制器的仿真结果。结果表明,两种实现方式在控制效果上一致,逆变器输出电感电流能够准确跟踪给定值,验证了C语言实现的PR控制器的有效性与可行性。

图 1 仿真模型截图

图 2 采用模块搭建的PR控制器的仿真结果

图 3 采用C语言实现的PR控制器的仿真结果

公众号“电源海盗船”中,回复“PR_Singlephase_inverter”我将发出这个仿真文件,包括单相逆变器闭环控制仿真模型、模块搭建的PR控制器、C语言实现的PR控制器。

C语言实现的PR控制器可直接移植到嵌入式(STM32DSP28335)中!!!

新昌苗木网