具备VSG功能的逆变器仿真模型,虚拟同步发电机,构网型逆变器,基于MATLAB/Simulink建模仿真。 具备一次调频,惯性阻尼,一次调压。 可以运行于离网模式和并网模式。 仿真模型使用MATLAB 2017b搭建,仅用于学习交流使用。

最近在研究虚拟同步发电机(VSG)相关的内容,和大家分享一下我用MATLAB/Simulink搭建具备VSG功能的逆变器仿真模型的过程。这个模型可是能实现构网型逆变器的诸多重要功能哦,而且能运行于离网和并网两种模式。

功能实现概述

这个仿真模型主要实现了一次调频、惯性阻尼以及一次调压这几个关键功能。

一次调频

一次调频是通过模拟传统同步发电机的频率调节特性来实现的。简单来说,当系统频率发生变化时,逆变器能够自动调整输出功率,以维持频率稳定。

惯性阻尼

惯性阻尼功能的加入,使得逆变器在面对功率波动时,能够像传统同步发电机一样,利用自身的“虚拟惯性”来抑制频率的快速变化,增强系统的稳定性。

一次调压

一次调压则是确保在不同的负载情况下,逆变器输出电压能保持在合理范围内。

模型搭建与代码分析

整个仿真模型是基于MATLAB 2017b搭建的,注意哦,此模型仅用于学习交流使用。

离网模式部分

在离网模式下,我们要构建一个能独立提供稳定电能的系统。这里以搭建一个简单的LC滤波电路为例(这在逆变器输出环节很常用),在Simulink中,我们可以很方便地调用相关模块。比如,使用“Series RLC Branch”模块来构建LC滤波器的电感和电容部分。

具备VSG功能的逆变器仿真模型,虚拟同步发电机,构网型逆变器,基于MATLAB/Simulink建模仿真。 具备一次调频,惯性阻尼,一次调压。 可以运行于离网模式和并网模式。 仿真模型使用MATLAB 2017b搭建,仅用于学习交流使用。

代码方面(这里主要指S函数等可自定义代码部分,如果有),以一个简单的控制算法为例,假设我们要实现一个基于PI控制器的电压调节。

function [sys,x0,str,ts] = PI_controller(t,x,u,flag)
    switch flag,
        case 0,
            [sys,x0,str,ts]=mdlInitializeSizes;
        case 2,
            sys=mdlUpdate(t,x,u);
        case 3,
            sys=mdlOutputs(t,x,u);
        case {1,4,9}
            sys=[];
        otherwise
            error(['Unhandled flag = ',num2str(flag)]);
    end
end
function [sys,x0,str,ts]=mdlInitializeSizes
    sizes = simsizes;
    sizes.NumContStates  = 1;
    sizes.NumDiscStates  = 0;
    sizes.NumOutputs     = 1;
    sizes.NumInputs      = 2;
    sizes.DirFeedthrough = 1;
    sizes.NumSampleTimes = 1; 
    sys = simsizes(sizes);
    x0  = [0]; 
    str = [];
    ts  = [0 0]; 
end
function sys=mdlUpdate(t,x,u)
    sys = x; 
end
function sys=mdlOutputs(t,x,u)
    kp = 0.5;
    ki = 0.1;
    error = u(1)-u(2);
    x(1) = x(1)+ki*error;
    sys(1) = kp*error + x(1);
end

在这段代码里,我们定义了一个简单的PI控制器。mdlInitializeSizes函数用于初始化控制器的状态、输入输出等参数。mdlOutputs函数里,我们根据设定的比例系数kp和积分系数ki,计算出控制量。这里的error是实际电压与参考电压的差值,通过PI控制算法不断调整,让输出电压尽可能接近参考电压。

并网模式部分

并网模式相对复杂一些,需要考虑与电网的同步问题。我们需要检测电网的电压、频率等信息,然后调整逆变器的输出,使其满足并网条件。在Simulink中,可以使用“Phase - Locked Loop (PLL)”模块来实现锁相环功能,检测电网电压的相位和频率。

代码分析上,以一个简化的并网电流控制代码为例。

function [sys,x0,str,ts] = grid_current_control(t,x,u,flag)
    switch flag,
        case 0,
            [sys,x0,str,ts]=mdlInitializeSizes;
        case 2,
            sys=mdlUpdate(t,x,u);
        case 3,
            sys=mdlOutputs(t,x,u);
        case {1,4,9}
            sys=[];
        otherwise
            error(['Unhandled flag = ',num2str(flag)]);
    end
end
function [sys,x0,str,ts]=mdlInitializeSizes
    sizes = simsizes;
    sizes.NumContStates  = 1;
    sizes.NumDiscStates  = 0;
    sizes.NumOutputs     = 1;
    sizes.NumInputs      = 2;
    sizes.DirFeedthrough = 1;
    sizes.NumSampleTimes = 1; 
    sys = simsizes(sizes);
    x0  = [0]; 
    str = [];
    ts  = [0 0]; 
end
function sys=mdlUpdate(t,x,u)
    sys = x; 
end
function sys=mdlOutputs(t,x,u)
    kp = 1;
    ki = 0.5;
    error = u(1)-u(2);
    x(1) = x(1)+ki*error;
    sys(1) = kp*error + x(1);
end

这段代码和之前的PI控制器类似,不过这里是针对并网电流的控制。通过检测并网电流的实际值和参考值的误差error,利用PI控制算法调整输出,使得并网电流满足要求,实现稳定并网。

总结

通过在MATLAB/Simulink中搭建这个具备VSG功能的逆变器仿真模型,我们可以深入理解虚拟同步发电机以及构网型逆变器的工作原理和控制策略。无论是离网模式下的独立供电,还是并网模式下与电网的协同工作,每个功能的实现都离不开精心设计的算法和模块搭建。希望这篇博文能给同样在研究这方面内容的小伙伴一些启发,大家一起交流学习呀。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐