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

news/2024/11/28 17:48:43/

文章目录

  • 前言
  • 基本知识
  • 实际使用
    • 单相离网逆变器
    • 单相并网逆变器
  • PR控制器离散化
    • 基本知识
  • DSP实现
  • 总结

前言

最近想学习一下并网逆变器,需要用到PR控制,全网找遍了许多学习资料,终于掌握的差不多了,在此做个记录,以及个人对PR(Proportional Resonant)控制的理解。

基本知识

PR控制的传递函数形式为
H ( s ) = K p + 2 K r s s 2 + ω o 2 H(s)=Kp+\frac{2Krs}{s^2+\omega_o^2} H(s)=Kp+s2+ωo22Krs
利用matlab绘制一下该传递函数的幅频响应,是在谐振频率 ω = ω o \omega=\omega_o ω=ωo的频率点增益无穷大,且没有相位滞后。
在这里插入图片描述

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

至于为什么不用传统的PID控制,其原因是PID控制器对于交流信号的控制性能差,对直流信号的跟踪性能好。因此DCDC变换中多采用PID控制,而在交流中也可以通过DQ坐标变换,将需要控制的交流信号变换为直流信号,再用直流控制器PID就可以实现很好的控制效果了。

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

实际使用

实际应用中,由于电网频率不会严格的等于50Hz,难免存在波动,因此前文提到的PR控制器在电网频率稍微偏离50Hz,性能大幅变差。为增加控制的鲁棒性,增加截止频率 ω c \omega_c ωc,改写传递函数为
H ( s ) = K p + 2 K r ω c s s 2 + 2 K r w c s + ω o 2 H(s)=Kp+\frac{2Kr\omega_cs}{s^2+2Krw_cs+\omega_o^2} H(s)=Kp+s2+2Krwcs+ωo22Krωcs

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

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

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

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

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

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\pi\times 0.1 2π×0.1 2 π × 0.5 2\pi\times 0.5 2π×0.5 2 π × 1 2\pi\times 1 2π×1,真正需要整定的参数也就只有Kp和Kr了。

单相离网逆变器

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

控制结构框图
在这里插入图片描述
资源链接
基于PR控制的单相离网逆变器

单相并网逆变器

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

控制结构框图在这里插入图片描述
资源链接

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

PR控制器离散化

基本知识

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

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

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

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

本人目前尚未学习到s域和z域之间的转换,好在有众多前人的研究基础。
在这里插入图片描述
方法很多,选哪一个种呢?在TI写的数字锁相环算法库中有说明文档详细推导各个参数的计算,其中就涉及到连续传递函数离散化的问题,TI采用的Tustin。简单期间我们也选Tustin方法了。

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

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

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

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

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

DSP实现

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

以二阶为例, Y ( z ) X ( z ) = A 0 + A 1 z − 1 + A 2 z − 2 B 0 + B 1 z − 1 + B 2 z − 2 \frac{Y(z)}{X(z)}=\frac{A_0+A_1z^{-1}+A_2z^{-2}}{B_0+B_1z^{-1}+B_2z^{-2}} X(z)Y(z)=B0+B1z1+B2z2A0+A1z1+A2z2
则离散时域表达式为 B 0 y [ n ] + B 1 y [ n − 1 ] + B 2 y [ n − 2 ] = A 0 x [ n ] + A 1 x [ n − 1 ] + A 2 x [ n − 2 ] B_0y[n]+B_1y[n-1]+B_2y[n-2]=A_0x[n]+A_1x[n-1]+A_2x[n-2] B0y[n]+B1y[n1]+B2y[n2]=A0x[n]+A1x[n1]+A2x[n2]

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

/** 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 storep->vo_2=p->vo_1;p->vo_1 = p->vo;p->vi_2 = p->vi_1;p->vi_1 = p->vi;
}
/** 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_ */

总结

在去年7月准备电赛的时候偶然看到有几篇讲解数字滤波器,第一次接触传递函数离散化,深刻被数字时代的数字方式折服,改改代码,就可以实现不同的截至频率,甚至不同阶数,而模拟方式还要改元器件。当时就感觉这玩意太他妈牛逼了,很想学懂它,奈何学不会呀。后面全身心做电赛,就忘了这事儿。

直至最近学习PR控制,当初的感觉又回来了,一股劲儿吃下来了。顺带也给自己把一阶、二阶数字滤波器的库给写好了。


http://www.ppmy.cn/news/61791.html

相关文章

Maven与spring学习

目录 该如何学习Maven&#xff0c;是先该学习spring还是先学习Maven 能讲一下该如何学习Maven吗&#xff1f; 火狐浏览器有能让网页翻译成为中文的插件吗 秋田和柴犬是同一个狗吗 该如何学习Maven&#xff0c;是先该学习spring还是先学习Maven 学习Maven可以与学习Spring同…

Java高阶数据结构 并查集 最小生成树

并查集与最小生成树 文章目录 Java高阶数据结构 & 并查集 & 最小生成树1. 并查集1.1 并查集的原理1.1.1 例子&#xff1a;1.1.2 这样存储有什么好处呢&#xff1f; 1.2 并查集的代码实现1.2.1 类的定义与属性1.2.2 构造方法1.2.3 获取下标的方法1.2.4 获得根节点1.2.5 …

1. 深入理解Mysql索引底层数据库与算法

MySQL性能调优 1. 索引数据结构红黑树&#xff0c;Hash&#xff0c;B树详解1.1 什么是索引&#xff1f;1.2 二叉树1.3 红黑树1.4 B-Tree1.5 BTree(B-Tree变种)1.6 Hash索引 2. 存储引擎2.1 MyISAM索引2.2 INNODB 3. 索引最左前缀原理 本文是按照自己的理解进行笔记总结&#xf…

提高开发效率,从这些小技巧开始——5个让你爱上IDEA的增加体验小技巧

前言 如果你是一名Java开发人员&#xff0c;那么你一定会使用IntelliJ IDEA这个IDE。IntelliJ IDEA作为目前最受欢迎的Java IDE之一&#xff0c;已经成为了众多Java开发人员必备的工具之一。但是&#xff0c;你是否知道如何利用IDEA中的一些小技巧来提高你的开发效率和体验呢&a…

SpreadJS 16.1 EN + SpreadJS 16.1 CN Crack

添加仪表图以及对受密码保护的工作表的支持。 2023 年 5 月 4 日 - 16:24新版本 特征 数据透视表增强 单个字段的小计选项- 通过为单个字段添加小计选项增强了数据透视表支持。以前&#xff0c;SpreadJS 会将小计位置更改为每个字段的底部。现在您可以更改各个字段的位置。数据…

汽车电路图、原理框图、线束图、元器件布置图的识读技巧与要点

摘要&#xff1a; 想要读懂汽车电路图就必须把电的通路理清楚&#xff0c;即某条线是什么信号&#xff0c;该信号是输入信号、输出信号还是控制信号以及信号起什么作用&#xff0c;在什么条件下有信号&#xff0c;从哪里来&#xff0c;到哪里去。 一、汽车电路图的识读技巧 1.…

ASEMI代理ADI亚德诺LTC6992IS6-1#TRMPBF车规级芯片

编辑-Z LTC6992IS6-1#TRMPBF参数描述&#xff1a; 型号&#xff1a;LTC6992IS6-1#TRMPBF 输出频率&#xff1a;3.81Hz 工作电源电压范围&#xff1a;2.25 - 5.5V 通电复位电压&#xff1a;1.95V 电源电流&#xff1a;105-365A SET引脚处的电压&#xff1a;1V 频率设置电…

【C++】仅需一文速通继承

文章目录 1.继承的概念及定义继承的概念继承的定义定义格式:继承关系和访问限定符继承基类成员访问方式的变化 2.基类和派生类对象赋值转换3.继承中的作用域4.派生类的默认成员函数题目:设计出一个类A,让这个类不能被继承(继承了也没用) 5.继承与友元6.继承与静态成员7.复杂的菱…