一、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 <math.h>

// 准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)中!!!

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐