前阵子做一个光伏单相并网仿真实验项目,光是让并网电流波形变得像样,就把我耗了整整两天。用的还是最常规的PI控制器,kp和ki来回试了不知道多少组,满载工况下电流总畸变率始终压在5%附近打转,波形过零点附近总能看到一小段明显的畸变平台。后来把电流内环的PI换成模糊PI控制器,波形肉眼可见地干净了一大截,谐波降到3%以下,负载突变时的响应也顺了不少。今天就把这个基于模糊PI控制的光伏单相并网仿真案例从头拆一遍,包括主电路参数怎么定、模糊规则表怎么排、Simulink里怎么接线,以及我调试时踩过的几个坑。适合刚接触并网逆变仿真的人参考,也希望给已经在调PI但效果不理想的朋友一点新思路。
1. 为什么固定参数的PI老是压不住并网电流
1.1 并网电流为什么这么“难伺候”
单相并网电流不好调,不是控制器不够努力,而是它面对的干扰实在有点多。首先电网本身就不是理想电压源,线路阻抗、变压器漏感、附近负载带来的背景谐波都会直接叠加到电流回路上。你在仿真里看到的THD,有一部分根本不是你逆变器产生的,而是电网电压里本身就带了3次、5次谐波,电流跟踪环节只能被动地跟着它跑。
更麻烦的是单相系统固有的功率二倍频脉动。单相瞬时功率是50Hz正弦电压和50Hz正弦电流的乘积,算出来会带一个100Hz的波动分量,这个波动会通过直流母线电压耦合到控制环路里,相当于给电流指令信号叠了一层低频扰动。直流母线电容取值偏小的时候,这个100Hz分量尤其明显,电流波形看上去就像被一层薄薄的包络纹路盖住,普通PI很难把它彻底压掉。
再加上开关器件本身的非线性。逆变桥的死区时间、管压降、电流过零时的换流延迟,这些都会在交流侧制造出额外的低次谐波和过零畸变。仿真里如果用的是理想开关模型,这些问题会轻一些,但只要把死区加上,波形马上变丑。可以说,并网电流的“不乖”是多种因素叠加的结果,指望一组固定参数通吃所有情况,确实不现实。
1.2 一组固定PI参数撑不起所有工况
传统PI控制器的本质很简单:比例项负责对当前误差做出即时反应,积分项负责慢慢消除稳态误差。问题在于,同一个kp和ki,在大误差和小误差场景下表现出来的行为是矛盾的。电流刚上电或者负载突变的时候,误差能冲到好几安培,这时我们希望比例作用强一点,快速把电流拉回参考值;可到了稳态,误差只有零点几安培,如果比例作用还那么强,系统就容易振荡,噪声也会被放大。
积分项也一样。误差大的时候,积分积累太快容易超调;误差小的时候,积分又需要足够强才能把最后的偏差磨平。传统的做法是取一组折中参数:kp不敢太大,ki也不敢太强。结果是动态响应偏软,稳态精度也只能算“及格”。如果你刻意把kp调大去追求快速性,多半会看到波形在参考值附近来回抖;如果你把ki调强想消掉稳态误差,又容易在扰动后出现大范围超调。
我在仿真里做过对比,同一套标称PI参数,满载时THD大概是4.8%,半载跑到6%以上,光照突变时电流恢复要接近20个工频周期。这个表现并不是PI本身不行,而是它没有能力根据误差状态实时调整自己的行为——它永远只有一个固定的增益。
1.3 模糊PI的基本思路:让控制器学会动态调整参数
模糊PI的思路其实不神秘:保留PI控制器的主体,但让kp和ki不再是常数,而是跟随当前误差状态动态变化。具体来说,控制器实时观察两个信号:电流误差e和误差变化率ec。根据这两个量,用一组模糊规则推理出当前工况下kp和ki应该比初始值大一些还是小一些,再实时修正。
写成公式就是kp = kp0 + Δkp,ki = ki0 + Δki。kp0和ki0可以理解为基准参数,相当于一个“中等水平”的PI;Δkp和Δki是模糊控制器给出的修正量,让参数在运行过程中自动伸缩。误差大且仍在扩大时,控制器自动加大kp,加速响应;误差开始收窄时,控制器主动减小kp、加强ki,避免过冲并磨平稳态偏差。
这种设计相当于给原来的线性PI加了一层“增益调度”能力,但又不需要你像做增益调度那样针对每个工况去离线计算参数,模糊规则本身就把这些工况覆盖进去了。所以它的鲁棒性比固定PI强不少,在光伏这种工况随时变化的场景里特别合适。顺带说一句,模糊PI不是用模糊代替PID,而是在PID外面套了一层智能调节器,理解这点对后面搭模型很重要。
2. 仿真主电路和控制回路:从直流母线到并网电感的完整链路
2.1 主电路参数:量级怎么定
先看整体结构。光伏侧经过DC/DC升压之后得到一个稳定的直流母线,母线电压我取400V左右。逆变部分就是一个单相H桥,四个开关管用SPWM驱动,输出经过LCL滤波器接到220V/50Hz的单相电网上。直流母线电容取值2000uF左右,主要作用是平抑前面说的100Hz功率脉动,电容太小母线电压波动会直接反映到电流指令上。
LCL滤波器参数需要认真算一下。逆变侧电感L1取3mH,网侧电感L2取1.5mH,滤波电容Cf取4.7uF。这套参数对应的谐振频率大概在1.1kHz左右,离开关频率10kHz有一定距离,也不落在50Hz基波附近。需要注意的是,LCL在谐振频率附近有一个很尖的增益峰,如果不做阻尼处理,闭环之后很容易在这个频率附近引发持续振荡。这个问题我后面单独讲,这里先提个醒:参数定了之后,阻尼策略要一起考虑,否则仿真跑起来波形会莫名奇妙地抖。
搭建主电路时我建议直接在Simulink里用电力电子模块库搭,开关管用带缓冲的IGBT模型。电网侧用一个电压源串联等效阻抗替代,阻抗参数设成0.1Ω加上少量电感,能模拟实际电网不那么“硬”的特性。光伏侧的直流源就用可控电压源代替,专注验证电流控制部分,等波形调好了再往前接MPPT和DC/DC。
2.2 单相系统的锁相环:比想象中关键
三相并网可以直接用Clark变换把三相电压变换到两相静止坐标系,再通过Park变换得到角度。单相系统没有天然的正交分量,所以第一步必须自己构造一个虚拟的β轴分量。常用的方案有基于延时1/4周期的虚拟正交、基于Hilbert变换、以及基于SOGI的锁相环。我推荐用SOGI-PLL,结构清晰,失真情况下相位锁定精度也比较高。
SOGI的核心是一个二阶广义积分器,对输入正弦信号做滤波和正交信号生成,输出一对互差90°的信号α和β,然后交给标准的PQ锁相环去锁相。具体到Simulink里,可以搭SOGI结构并用一个PLL模块来完成闭环,也可以直接用工具箱里的现成锁相环模型。调试锁相环时,先别管电流控制,单独看它输出的频率是不是稳定在50Hz,θ是否与网压相位一致。如果PLL输出有波动,后面整个电流环都会被带偏。
锁相环的带宽设太高会让θ对电网谐波很敏感,设太低又会在电网电压相位跳变时跟踪过慢。我习惯把PLL带宽设在50rad/s左右,阻尼比取0.7,实测在5%的背景谐波下相位误差基本可以忽略。
2.3 双闭环控制结构里,模糊PI该放在哪
并网逆变器通常采用双闭环控制:外环是直流母线电压环,内环是并网电流环。电压外环的参考值设成400V,它把母线电压的误差通过PI控制器转换成电流指令的幅值;这个幅值再乘以锁相环输出的单位正弦信号,就得到了带有相位信息的瞬时电流参考值。电流内环跟踪这个参考值,输出调制波,经过SPWM生成开关管的驱动信号。
电压外环的带宽要压低,一般做到10~20Hz就够了,不能太高。原因还是那个100Hz母线波动:如果外环带宽太宽,母线电压的100Hz纹波会被当成误差去补偿,反而把100Hz分量注入到电流指令里。所以电压外环我用的还是普通PI,带宽压住,稳定可靠。模糊PI的主角放在电流内环,因为“并网电流波形难看”这个痛点主要发生在电流跟踪环节。
电流内环的基准参数可以先按标量计算法估算:kp0取逆变侧电感值乘以期望闭环带宽,我这里L1+L2大约4.5mH,希望电流环带宽在1000rad/s左右,kp0就定在4左右。ki0则决定稳态消除能力,取kp0的50到100倍,我先试了100,后面再微调。
2.4 搭建模型的先后顺序
接触这类项目的人最常犯的毛病是一上来就把模糊控制器、MPPT、PLL全部搭好,结果一出问题完全不知道是哪个环节的错误。我的建议是分四步走:先把主电路接好,用一个固定50%占空比的SPWM开环跑,确认输出电压波形基本正确;然后把SPWM加上电流闭环,用普通PI跑通,确认电流环能够盯住正弦参考值;一切正常之后再把电流内环替换成模糊PI;最后才加入电压外环和各种扰动。每一步都验证过了再往前走,排查问题的成本会低很多。
实际搭建时,电流内环的误差信号要注意单位。参考电流和反馈电流都用安培,误差经过量化因子进入模糊控制器,模糊输出经过比例因子后再和基准参数相加。反馈电流用Scope和RMS模块监视,确保极性和采样位置正确。反馈电流取错符号或者漏加单位换算,是这类仿真相当常见的低级翻车点。
3. 模糊PI控制器的设计细节:从规则表到Simulink接线
3.1 输入输出变量与论域
模糊PI控制器我选两个输入一个输出组的方式,分别对Δkp和Δki各做一个模糊推理。输入都是误差e和误差变化率ec,差别只在于输出论域和规则表不同。也可以用多输入多输出的单一模糊控制器,同时输出Δkp和Δki,但那样规则表规模会大不少,调试起来不够直观,我建议先把两个推理分开做。
e和ec都需要先做归一化处理,映射到统一的模糊论域。我常用的论域是[-3, 3],七个模糊子集分别命名为NB(负大)、NM(负中)、NS(负小)、ZO(零)、PS(正小)、PM(正中)、PB(正大)。这样规则表就是7×7,一共49条规则,典型且够用。实际误差范围要根据具体工况估算:我的模型额定电流10A,启动瞬间误差可能到5A,稳态时误差在0.2A以内。如果量化因子按最大值5A来定,稳态时误差只占论域的很小一部分,模糊子集的分辨率就不够了,这一点在后面的调试坑里细说。
3.2 隶属函数的设计
模糊子集用三角形隶属函数最简单,计算量小,调起来也直观。三角形隶属函数的顶点分别放在论域的整数点上:-3、-2、-1、0、1、2、3,两端顶点以外的部分截断。相邻子集之间要有一定重叠,通常重叠量保持在三分之一左右。重叠太少,控制器在相邻子集边界会输出跳变,电流波形可能因此出现微小抖动;重叠太多,规则之间互相稀释,模糊控制器的“智能”就体现不出来了。
输出变量的隶属函数也用七个三角形子集,但论域范围要根据Δkp和Δki的实际调整幅度来选。比如Δkp的输出论域我设在[-1.5, 1.5],Δki的设在[-50, 50]。这样经过比例因子缩放后,修正量约占基准参数的30%到50%,是一个比较合理的活动范围。一开始不少人把输出论域设得很大,结果显示屏上看着规则很多,系统却剧烈振荡,那是输出修正量远超基准参数导致的。
3.3 Δkp规则表:一张完整的7×7表
Δkp的规则设计逻辑可以概括为:误差越大,比例修正越强;误差变化率决定这个修正要不要打折扣。如果误差在朝目标方向收敛,就少加点kp,防止超调;如果误差在扩大,就多加点kp,尽快扭转局面。按照这个思路,我把Δkp规则表排成了下面这样。
| e \ ec | NB | NM | NS | ZO | PS | PM | PB |
|---|---|---|---|---|---|---|---|
| NB | PB | PB | PM | PM | PS | ZO | ZO |
| NM | PB | PM | PM | PS | PS | ZO | ZO |
| NS | PM | PM | PS | PS | ZO | NS | NS |
| ZO | PM | PS | PS | ZO | NS | NM | NM |
| PS | PS | PS | ZO | NS | NS | NM | NM |
| PM | PS | ZO | ZO | NS | NM | NM | NB |
| PB | ZO | ZO | ZO | NS | NM | NB | NB |
这张表的意思举个例子:误差为NB且误差变化率为NB,说明电流远低于目标而且还在快速偏离,此时必须大幅增加比例增益,所以输出PB。反过来,误差为ZO且误差变化率为ZO,说明系统已经接近稳态,比例修正量就取ZO,让它保持基准值就好。表格整体是从左上角到右下角的渐变结构,越靠近零误差点,Δkp越平缓,这符合并网电流系统“启动时靠比例拉回来,稳态时别让比例添乱”的直觉。
还要说明一点,这张表不是数学推导出来的唯一正确答案。不同直流电压、不同滤波参数下,最优规则可能会有细微差别,但基本逻辑不变。你完全可以拿这张表当起点,如果发现系统在某个误差区间响应过冲,就把对应位置的值降一档;如果响应偏软,就往上升一档。规则表本来就是可以调、应该调的。
3.4 Δki规则表的设计逻辑
Δki的规则和Δkp正好相反。误差大的时候,积分修正要保守,否则积分过快积累会带来明显超调;误差小的时候,积分修正要强,因为此时要靠积分把最后的稳态误差磨平。按照这个原则,Δki的关键规则可以归纳为几组:
- 当误差为NB或PB时,Δki取NS或NM,适当减弱积分作用,避免大误差下的积分饱和。
- 当误差为NS或PS时,Δki取PS或PM,开始加强积分,帮助系统收敛到零。
- 当误差为ZO且误差变化率为ZO时,Δki取PB,这是稳态消差的关键时刻,积分必须全速工作。
- 当误差变化率方向不利时,比如误差NB且ec为正,说明虽然误差还大但正在好转,此时Δki可以稍微大一点,但依然要控制住幅度。
全套Δki表我就不完整贴了,你可以照着这个逻辑自己排,很多模糊控制文献里也有现成的表可以借鉴。核心提醒是:Δki修正量一定要比Δkp更保守。积分作用天然喜欢迟到,调整过头容易让系统低频率地荡来荡去,那个感觉比比例振荡更难调。
3.5 量化因子、比例因子与Simulink接入
量化因子决定实际误差值到模糊论域的映射关系。对于误差e,量化因子Ke等于论域上限除以实际最大误差,也就是Ke = 3 / emax。另一个输入ec同理,Kec = 3 / ecmax。emax和ecmax怎么定?不能拍脑袋。我先把普通PI模型跑起来,在工作区里记录e和ec的实际变化范围,再留20%到50%余量作为emax和ecmax。你可以在Simulink里加一个MinMax模块实时观测,或者用To Workspace把信号导出来算。这样定出来的量化因子,启动瞬态和稳态都能兼顾。
比例因子则用来把模糊输出映射回物理修正量。比如模糊输出在论域[-1.5, 1.5]上,对应物理上的Δkp最大修正1.5,那比例因子就是1。如果是其他物理范围,就按“物理范围/论域范围”来换算。实际调试时,量化因子影响响应速度,比例因子影响修正强度,两者配合使用。先调量化因子,让启动时误差进入正常的模糊论域范围,再调比例因子,逐步增大看系统反应。
Simulink接线不复杂:电流误差e和误差变化率ec分别经过Gain模块乘上Ke和Kec,进入Fuzzy Logic Controller模块,输出经过Gain模块乘上比例因子,再分别和kp0、ki0做加法,得到实时的kp和ki。把这两个可变参数接到离散PI控制器模块的输入端就可以了。需要注意Fuzzy Logic Controller模块要选一致参数的FIS对象,否则会报输入维度不匹配的错误。仿真步长建议用固定步长,10kHz开关频率下步长取2e-6秒左右,变步长在开关动作点容易引入数值误差。
4. 实际调试时踩过的那几个坑,每一个都值得你看一眼
4.1 第一版规则表看着合理,跑起来却是发散
我最早搭模糊PI的时候,规则表参考的是某篇文献里的通用表,逻辑完全没毛病,但一接进模型,电流波形直接飞了。折腾半天才发现问题出在比例因子。那套文献表对应的物理修正范围是Δkp可以到±5,而我的基准kp0只有4,也就是说修正量可以达到基准参数的125%,控制器的增益瞬间就跳到原来两倍多,环路直接失稳。
这个坑的本质是:模糊PI的设计顺序应该是“先有合理基准PI,再有模糊修正”,而不是让模糊修正去承担全部控制任务。kp0和ki0必须先把系统稳定住,模糊部分只负责在大误差和小误差之间做有限调整。我后来把Δkp的输出论域改小到±1.5,比例因子对应调到合适范围,系统马上就稳定下来。调试时如果你发现换上模糊PI反而比普通PI更容易振荡,先怀疑修正量范围是不是太大了。
4.2 量化范围没归一化,导致启动瞬间表现怪异
第二个坑发生在量化因子的设定上。我一开始按稳态误差范围来定emax,觉得误差本来就零点几安培,用不着那么大的量程。结果一启动,误差瞬间冲到5A,经过量化因子后直接撞到论域上限“饱和”了。模糊控制器在很长一段时间里看到的都是NB或PB,规则表等于失效,输出一直是最大修正量,系统像一个只会开足马力的愣头青,迟迟不能进入精细调整阶段。
解决方法是把emax设成覆盖启动瞬态的范围。我的模型里启动最大误差5A,emax就用5A,Ke = 3/5 = 0.6。这样一来,启动初期误差会快速进入有效论域,稳态时0.2A的误差也仍然落在我设的模糊子集分辨率之内。如果你觉得大误差和小误差的合理映射区间冲突得比较严重,可以考虑对误差信号先做一个非线性变换再进模糊控制器,但一般工程上把emax按启动误差上限取就能用了。
4.3 LCL谐振没阻尼,波形自带一份高频振荡
这个坑与模糊PI无关,但属于并网仿真必踩的一类问题。我最初搭的LCL滤波器没有任何阻尼,空载开环时看起来一切正常,加上闭环后波形高频部分出现了一个固定频率的振荡,怎么调PI参数都不管用。后来把振荡频率一算,正好落在滤波器的谐振频率附近,实锤是LCL谐振峰被闭环增益放大导致的。
滤波器谐振不是控制器参数的问题,控制器参数怎么调都压不掉这个峰。正确做法是给LCL加阻尼。工程上常用无源阻尼(在滤波电容支路串一个小电阻)或有源阻尼(通过控制算法模拟阻尼电阻)。仿真里我建议先加无源阻尼,电容支路串一个1到2欧姆的电阻,效果直观,调试方便。加了阻尼之后,波形上的高频振荡立刻消失。尝到甜头之后再把电阻去掉,尝试用有源阻尼实现,但那已经是进阶话题了。
4.4 死区与过零钳位:仿真里也要正视的问题
很多人在仿真里不舍得加死区,觉得那是硬件才需要考虑的事,结果实际硬件调试时波形过零位置的毛刺让他一头雾水。其实哪怕在仿真里,只要你想让结果贴近真实,就要把死区时间加进去。我测试过,加上3us死区后,电流波形过零点附近出现了一个小平台,就是逆变桥换流时两个管子都不导通、电流没有续流通道形成的“零电流钳位”现象。
这个现象对波形的影响集中表现在低次谐波上,尤其是3次和5次谐波会明显增大。模糊PI能在一定程度上补偿死区带来的非线性和相位误差,但想彻底消掉过零平台,光靠控制算法不够。仿真里如果目标是对比PI和模糊PI的性能,建议保留死区设置,这样结论更有说服力;如果目标是追求极致的THD数字,可以把死区设小或暂时忽略,但要心里清楚实际硬件是怎么回事。
5. 波形对比与THD数据:模糊PI到底改善在哪
5.1 稳态波形与THD对比
在额定工况下,我用同一套主电路分别跑了普通PI和模糊PI两组仿真。普通PI按经验整定到THD最低,模糊PI用上一节设计的规则表。从示波器截图上看,最直观的区别是电流波形过零附近的畸变平台:普通PI的波形在这个区域有一个明显的小台阶,模糊PI的则平滑了不少,几乎看不出钳位的痕迹。
从FFT分析的数据看,普通PI在满载下THD约4.8%,模糊PI约2.7%。再细看谐波分布,普通PI的3次、5次、7次谐波分量突出,模糊PI把这三个低频次谐波压下去了一大截,这说明模糊PI对周期性跟踪误差的抑制能力更强,因为它通过实时调整参数,等效于一个变增益控制器,对误差的周期波动更敏感,也就更用力地把它压住。
这里补充一下FFT怎么看:建议用固定窗口取10个工频周期,也就是0.2秒的波形数据,再做FFT,频率分辨率5Hz,统计到50次谐波以内的THD。如果你只看瞬态波形就判断THD,很容易被开关纹波误导。
5.2 负载跳变时的动态响应对比
并网系统经常要面对光照突变或负载投切,动态响应的好坏直接影响电能质量。我在仿真里给电流参考指令做一个从5A到10A的阶跃,观察并网电流包络的恢复情况。普通PI的电流包络大约用了18个工频周期才重新平稳跟踪,中间还出现了一个幅度不小的过冲;模糊PI只用了大约6个周期就稳住了,过冲明显小很多。
原因就在于模糊PI在误差突然放大的瞬间自动增加了比例增益,让电流快速冲向新参考值;等电流接近新目标时,误差变化率反馈又让它主动降低kp、增大ki,所以过冲被抑制住了。这个“动态自行调整”的能力就是模糊PI价值最直观的体现。实际光伏电站里云遮和光照骤变是家常便饭,这种特性对电网的友好程度很有意义。
5.3 电网背景谐波下的鲁棒性对比
我额外做了一组实验:在电网电压源里叠加5%的5次谐波分量,分别跑两组控制器。普通PI的电流THD立刻飙升到7%以上,波形明显变形;模糊PI的电流THD仍然保持在4%左右,波形大体维持了正弦形状。这个结果符合预期,因为模糊PI的实时增益调度让它对这类外部扰动有更强的抗性。
不过也提醒一点:这组实验里模糊PI的基准参数和规则表是在无谐波工况下整定的,如果电网背景谐波特别严重,更彻底的做法是把谐波补偿算法加进控制链路,或者用准比例谐振控制器做选择性谐波抑制。模糊PI解决的是参数鲁棒性,不能替代专门针对特定频率的抑制措施。
5.4 值得注意:模糊PI不是万能的
把模糊PI吹得再好,也得说说它的边界。首先它不具备预测能力,面对大延迟系统或非常强的非线性,它也只能靠着反馈“事后补救”。其次,规则表的性能上限取决于你设计的规则质量,规则写得不好,效果可能还不如一个精心整定的普通PI。最后,模糊PI的工作前提是基准PI参数已经合理,它只是一个“修正层”,不是“救世主”。
另外,模糊控制器的计算开销虽然不大,但在硬件实现时要注意规则表查询和重心法解模糊的实时性。仿真里用Matlab自带模糊工具箱没问题,换到DSP或者FPGA上就要考虑查表法和定点化处理。做毕设或者样机验证的话,仿真阶段的结论可以直接指导硬件参数选择,这是个很大的优势。
最后分享一点个人体会
我做完这个项目最大的感受是:模糊PI真正的优势不是“智能”这两个字,而是它把工程师手动调参数的经验固化成了规则表,让控制器在不同工况下自动执行那些“大误差就该加大比例、小误差就该磨积分”的操作。如果你手动调PI已经很有经验,写这张规则表其实就是在复刻你的调整思路,所以不要把它想得多么玄。给新人的建议是:先把普通PI在这个模型上跑明白,记录误差范围,确认系统稳定,再动手做模糊化设计。这个顺序能帮你避开我现在踩的绝大多数的坑。后续如果你想继续扩展,可以试试在规则表里引入自调整机制,或者把模糊规则和滑模控制结合,这几个方向都比单纯加大PI参数有意思得多。