我最近在做一个光伏并网逆变器的Simulink仿真,方案定的是单相单级结构,带MPPT和PWM控制。前前后后踩了不少坑,从MPPT算法的收敛速度到并网电流的THD表现,都有一些值得记录的调参经验。这篇文章把这些东西整理出来,既有模型怎么搭的完整思路,也有几个我试了很长时间才搞明白的细节,希望能给正在做同样方向的朋友省点时间。
1. 为什么选单相单级拓扑:结构简化的代价与收益
单相光伏并网逆变器的拓扑方案,常见的有两级的,也有单级的。两级结构前级Boost负责升压和MPPT,后级逆变器负责并网控制,控制目标可以解耦,逻辑比较清晰。但这样做硬件器件多、损耗大、成本也高,效率做上去难度不小。
单级方案把MPPT、电压调整、并网逆变全压在逆变器一级上,省掉了前级Boost电路,整个系统结构干净很多。效率因为少了一级功率变换,其实更容易做高。
单级拓扑最大的问题是控制复杂度上来了。MPPT和并网控制在同一个功率级里互相耦合,调解的时候不存在"先把直流母线稳住再管并网电流"这种好事,两个目标得同时处理。而且MPPT本质上是让光伏阵列输出电压往最大功率点靠,这个电压本身就由逆变器的调制比决定,要动态平衡。
我做这个仿真时最直观的感受是:单级拓扑把硬件和损耗问题简化了,但把控制算法和参数调试难度拉上来了。如果你刚接触这块,建议还是先吃透单级方案的控制逻辑,再考虑要不要在硬件上做更复杂的拓扑。仿真里跑通了对理解系统行为帮助特别大。
单级系统里的功率流动路径很直接:光伏阵列产生的直流电,经过逆变桥和滤波电感,直接并到电网上。没有中间直流母线电容的二次调整过程,MPPT扰动会直接反映到并网功率上,响应速度快。
2. MPPT算法的选型和实现:扰动观察法为什么最实用
MPPT算法市面上有很多,什么扰动观察法、电导增量法、模糊逻辑、神经网络,听起来一个比一个高级。但在Simulink仿真和实际工程里,工程上真正用的最多的还是扰动观察法和电导增量法,其他的在性价比上真不占优势。
2.1 光伏阵列模型的特性曲线与仿真建模
做MPPT之前,得先把光伏阵列的模型建出来。Simulink里有现成的PV Array模块,在Simscape Electrical库里,双击可以直接配置。
建模时有几个关键参数要注意:
- 串联电池片数(Cells per string)和并联组串数(Parallel strings)
- 开路电压Voc和短路电流Isc
- 最大功率点电压Vmp和电流Imp
这些参数决定了阵列在标准测试条件(STC)下的输出特性,也是MPPT算法判断"往哪边扰动"的依据。
我用的是24V/250W级的光伏组件参数。搭建模型时在光照和温度输入口给了信号源,方便后面跑不同工况的仿真。
光伏阵列的I-V和P-V曲线在不同光照下差别很大。光照从1000W/m²降到400W/m²,最大功率点电压变化不大,但功率会成比例下降。这说明MPPT算法在光照突变时要有足够的动态响应速度。
2.2 扰动观察法的控制逻辑拆解
扰动观察法(P&O)的逻辑非常直观:周期性地给参考电压一个小的扰动,然后观察输出功率的变化方向。如果功率增加了,说明扰动方向是对的,继续往这个方向走;如果功率反而减小了,就把扰动方向反过来。
对应的Simulink状态逻辑大概是这样:
if P(k) > P(k-1) if V(k) > V(k-1) Vref(k+1) = Vref(k) + step; else Vref(k+1) = Vref(k) - step; end else if V(k) > V(k-1) Vref(k+1) = Vref(k) - step; else Vref(k+1) = Vref(k) + step; end end实现起来就是一个MATLAB Function模块或者Stateflow,输入是当前电压电流采样,输出是下一周期的参考电压。采样用零阶保持器,采样周期一般设置成开关周期的整数倍。
P&O算法的优点就是简单可靠,而且不依赖光伏阵列的具体参数,换一组光伏板标定都不用改。缺点是在稳态时会在最大功率点附近来回振荡,振荡幅度取决于扰动步长,这个后面细说。
2.3 扰动步长和采样周期的匹配:仿真调出来的经验值
这是整个MPPT仿真里最考验调试耐心的地方。扰动步长选大了,MPPT追踪速度快,但稳态振荡厉害,造成功率损耗;选小了,稳态精度高,但光照突变时半天追不上最大功率点。
我做仿真时先把步长设为1V,跟踪很快,从启动到最大功率点大概0.1秒就到位了,但稳态时功率波动有5W左右。后来把步长改到0.2V,稳态波动降到了1W附近,但初始跟踪时间拉到了0.5秒。
实际选型建议是:如果你更看重动态响应,比如要做光伏阵列局部遮挡的测试,步长给大一点没毛病;如果做的是稳态效率评估,步长就得压缩到0.2V以下。
采样周期的设置也有讲究。MPPT的采样周期不能太快,得和光伏阵列的输出电容充放电时间匹配上,否则你采到的功率不是一个稳定状态下的功率,算法会被误导。我用的采样频率是1kHz,对50Hz的电网来说,每个工频周期采样20个点,够用了。
3. 并网控制策略与PWM调制方式
并网逆变器要干的核心事情,就是把光伏阵列的直流电转换成和电网同频同相的交流电。这里面有两个层面的控制:外环管功率(MPPT的输出决定),内环管电流波形和质量。
3.1 双环控制结构:电压外环和电流内环的职责划分
单相单级光伏逆变器的控制,经典做法是双环结构:
- 电压外环:维持直流母线电压稳定(或者说是维持光伏阵列输出电压跟随MPPT给出的参考值)
- 电流内环:控制并网电流跟踪电网电压的相位和频率,实现单位功率因数并网
为什么电压外环和电流内环要做成这样?因为光伏阵列的输出特性是强非线性的,它的电压电流关系随着光照和温度漂移。如果不管MPPT,直接把阵列电压当恒定值处理,功率点根本稳不住。
我在Simulink里是这样搭的:
电压外环的输入是实际光伏电压和MPPT参考电压的误差,经过一个PI控制器,输出作为电流内环的幅值参考。这个幅值参考乘以电网电压的归一化正弦信号(锁相环输出),得到瞬时电流参考值。电流内环再对这个参考值做PI跟踪,输出调制波信号。
这里面有个小小的细节容易忽略:母线电压(也就是光伏阵列电压)的PI输出其实是电流幅值参考,这个幅值要和电网相位相乘才有意义。直接用一个恒定幅值去跟踪,出来的电流波形会相位不对,功率因数会很难看。
3.2 锁相环(PLL)在Simulink里的配置要点
并网逆变器必须知道电网电压的相位和频率,才能生成正确的调制信号。在Simulink里,三相系统直接用Simscape里的PLL模块很方便,单相系统要稍微绕一下。
单相锁相环我用的方法是构造一个正交虚拟信号。真实的单相电网电压作为α轴,然后用延时或者全通滤波器构造一个滞后90°的β轴信号,变成一个虚拟的两相系统,再用标准的SRF-PLL去锁。
Simulink搭起来不复杂,关键是虚拟正交信号的质量。我用延时法时延了5ms(50Hz系统的四分之一周期),锁定过程大概需要30ms左右能稳定。用全通滤波器构造的话,锁定速度能快一些,但滤波器参数也得多调几次。
锁相环输出的是电网电压的角频率和相位,这个相位信号同时用于两处:一个是生成电流参考的正弦波,另一个是并网电流坐标变换的参考角度。两个地方用的必须是同一个相位,不然电流跟踪会出稳态误差。
3.3 SPWM和单极性调制方式的区别及仿真表现
PWM调制方式上,单相全桥逆变器常见的是双极性SPWM和单极性SPWM。
双极性SPWM的调制波在正半周和负半周都是两个桥臂对角同时导通,输出线电压只有+Vdc和-Vdc两种电平。控制思路简单,但谐波含量大,滤波电感的体积和损耗都不好控制。
单极性SPWM在正半周时一个桥臂高频动作,另一个桥臂恒通,输出是+Vdc和0两种电平;负半周对称操作,输出是-Vdc和0。同样开关频率下,输出波形电平数多了一倍,等效开关频率翻倍,谐波明显改善。
我在仿真里对比过两种调制方式:双极性SPWM在5kHz开关频率下电流总谐波畸变率在4.5%左右,换单极性SPWM后降到2.8%左右。滤波电感都是同一个,这个提升效果还是挺明显的。
Simulink里生成单极性SPWM,用的是比较器和逻辑门。载波用三角波,调制波是正弦波,比较后得到两路信号,再用逻辑运算组合成四个开关管的驱动信号。
3.4 滤波电感参数对并网电流质量的影响
滤波电感直接决定并网电流的高频纹波大小,也影响系统的动态响应。电感越大,高频纹波越小,但动态响应变慢,电感上的压降也大;电感太小,纹波电流大,谐波畸变率就降不下来。
理论上电感设计要满足最大纹波电流的约束,公式为:
L ≥ (Vdc_max - Vgrid_peak) × D_max × Ts / ΔImax
其中Vdc_max是最大直流母线电压,Vgrid_peak是电网电压峰值,D_max是最大占空比,Ts是开关周期,ΔImax是允许的最大纹波电流峰值。
代入具体参数算一下:光伏阵列Vmp按300V算,电网电压有效值220V,峰值就是311V,纹波电流按额定电流的20%取,5kW的系统额定电流约22.7A,纹波允许4.5A,开关频率10kHz。算出来电感量大概在3-5mH范围。
我实际仿真用的4mH,纹波抑制效果不错,动态响应也没有明显变慢。电感太小接近2mH以下的话,电流波形边缘能看到明显的高频毛刺,THD飙升到6%以上。
4. 关键参数含义与MPPT核心逻辑对照
Simulink仿真里控制参数不像硬件那样有焊接了改不了的痛,但直接乱改一样会得出误导性结论。下面是几个关键参数的整理,方便照着核对。
| 参数名称 | 我的仿真取值 | 实际含义 | 调参心得 |
|---|---|---|---|
| 开关频率 | 10kHz | PWM载波频率 | 高了好处是谐波小,但损耗和仿真速度会受影响 |
| MPPT采样周期 | 1ms | MPPT算法执行间隔 | 太快误判,太慢响应迟钝 |
| MPPT扰动步长 | 0.2V | 每次调整参考电压的幅度 | 和采样周期配合,找平衡点 |
| 电压外环PI比例 | 0.2 | 调控母线电压 | 太大会让电流参考振荡 |
| 电压外环积分时间 | 0.05s | 电压误差累积消除速度 | 太慢系统启机时电流冲击大 |
| 电流内环比例 | 8 | 电流跟踪调节速度 | 一般比电压环快10倍以上 |
| 滤波电感 | 4mH | LCL/纯L滤波的电感量 | 结合纹波和动态要求选 |
5. 单相单级并网逆变器的整体Simulink模型搭建流程
模型怎么搭,很多人第一次做会手忙脚乱。我梳理一下自己的搭建步骤,按这个顺序走基本不会乱。
5.1 Simulink模型的分模块组织思路
整个模型我划分成了五个子模块:
- 光伏阵列模块(PV Array + 光照和温度输入)
- MPPT控制模块(采样、算法、输出参考电压)
- 逆变器主电路模块(全桥、滤波电感、电网等效)
- 控制信号生成模块(PLL、双环PI、SPWM调制)
- 测量与显示模块(Scope、RMS测量、THD分析)
模块之间用Goto/From标签连接,比直接连线清晰得多。特别是控制信号比较多的时候,满屏的连线自己回头都看不清。
Simscape Electrical里的逆变器主电路用Universal Bridge或者MOSFET搭全桥都行。我用MOSFET搭的,可以在里面看到每个开关管的状态。需要注意Simscape的电气网络和Simulink的数字控制信号之间要加电压电流测量模块做转换,直接用连接线接会在运行时直接报错。
5.2 Simulink中光伏逆变器模型的启动设置与初始化
模型搭完后,第一次运行遇到的问题通常出在求解器设置上。
仿真参数里求解器我选的是ode23tb,这个求解器对电力电子这种含有硬开关、信号快速跳变的系统处理比较稳。如果用ode45,遇到高频开关信号容易仿真步长缩得很小,跑半天跑不完。
仿真步长设成可变步长,相对容差设成1e-4,太严格会拖慢速度,太松则功率波形起毛刺。
还有一个容易被忽略的是电路初始条件。逆变器启动时直流母线电容是零电压状态,直接满载运行会有一个很大的冲击电流。我处理的办法是给直流母线电容设了初始电压,让它从接近开路电压的80%开始,这样启动过程平滑很多。
5.3 从模块搭建到成功运行的完整顺序
我的实际操作顺序是:先把主电路搭出来,不加MPPT,用一个固定的直流电压源代替光伏阵列,验证逆变器和并网控制的逻辑。这一步跑通了,再替换成光伏阵列模型。这样能少很多底层错误,不要把两个大系统的调试混在一起。
主电路跑通后,加MPPT模块。先断开MPPT的自动调节,手动给参考电压值,看看电压环和电流环能不能稳定跟踪。确认之后再切到自动模式,让MPPT接管参考电压的输出。
我踩过的最大的坑就是拿到一个模型就全接起来跑,出错以后根本不知道是光伏阵列模型的问题,还是MPPT的问题,还是并网电流跟踪的问题。分层调试能省下大量时间。
6. 仿真结果分析:从波形图上看MPPT和并网是否工作正常
跑完仿真后,重点看几个波形窗口的读数。
6.1 光伏功率追踪曲线和最大功率点的收敛表现
在1000W/m²光照、25°C温度下,我的光伏阵列理论最大功率是500W。启动后功率从零快速爬升,大约0.3秒后到达最大功率点附近,之后在495W到505W之间小幅度波动。这个稳态纹波对应的扰动步长是0.2V,是可以接受的范围。
改变光照从1000W/m²跳到600W/m²时,MPPT模块大约在0.2秒内重新追踪到了新的最大功率点。这个响应速度在工程上是够用的。
这里有一点值得一提:光照突变瞬间功率曲线会先掉一下,然后MPPT再追上去。如果你在真实光伏系统里看到这个跌落,不一定是故障,而是MPPT调整过程中的正常过渡。想在仿真里看到更平缓的过渡,可以适当增大MPPT采样周期,但代价是追踪速度变慢。
6.2 并网电流跟踪效果与功率因数评价
我最关心的就是并网电流和电网电压的相位关系。把两个波形放在同一个Scope窗口里对比看,电压过零时电流也过零,波形基本重合,说明锁相环和电流内环工作正常。
功率因数方面,Simulink的Powergui里可以直接看稳态的功率因数读数,我做出来的结果是0.99以上。说明电流谐波和相位误差都很小。
THD测量用了Powergui的FFT分析工具,在稳态窗口取两个周波的数据做分析,结果显示电流THD在2.8%左右,满足国内并网标准对THD小于5%的要求。
6.3 动态工况下的波形细节观察
我还特意做了两个极端情况的测试:一是光照从100%瞬间切到30%,二是负载从满载切到半载。光照突变时MPPT的追踪过程能直观看到参考电压的阶梯状变化,每一步对应一次扰动。
负载切换在并网系统里其实就是功率参考的变化,电流幅值会跟着变,但相位锁定保持稳定,不会出现电流倒灌或波形畸变的情况。
会注意到在切换瞬间MPPT的步长显得有点大,功率波动会有一两个周期的过冲。如果对动态品质要求更高,可以考虑用变步长的P&O算法:初始追踪时步长大,接近最大功率点时自动缩小。
7. 单相单级与两级方案的对比分析
有朋友看了我的方案之后会问,为什么不做两级?这里把两级和单级的差异详细列一下,方便你根据自己场景选。
| 对比维度 | 单级方案 | 两级方案 |
|---|---|---|
| 系统结构 | 光伏阵列直接接逆变器 | 光伏阵列经Boost升压再接逆变器 |
| 功率器件数量 | 少,成本低 | 多,成本高 |
| 系统效率 | 相对高(少一级变换) | 相对低(两级各有损耗) |
| 控制复杂度 | 高(MPPT和并网耦合) | 相对低(前级只管MPPT) |
| 直流母线电压范围 | 受限,需匹配电网峰值 | 可灵活调节,适应范围广 |
| 动态响应 | 快(功率传输直接) | 略慢(中间储能环节引入延迟) |
单级方案比较适合光伏阵列电压和电网侧电压比较匹配的场合。比如220V电网,光伏阵列开路电压做到380V左右,最大功率点电压在300V以上,逆变器直接SPWM调制就能输出220V交流,不需要中间升压。
如果光伏阵列电压和电网电压差得远,比如低压组件、小容量系统,就需要Boost级先把电压抬起来,这时候两级方案反而是合理选择。
从做仿真的角度,单级方案对控制算法的理解深度要求更高。两级方案控制目标解耦,相当于把一个系统拆成了两个相对独立的小系统,调试的时候可以先调Boost稳定电压,再调逆变器并网,难度分解了,但整个系统模型复杂一些。
8. MPPT仿真调试中的常见问题与解决记录
调试过程里遇到的问题一大堆,挑几个有代表性的分享一下排查思路。
8.1 启动时功率来回振荡,MPPT工作在错误工作点上
第一次跑完整模型时,光伏功率启动后一直在振荡,上蹿下跳,找不到稳定点。观察波形细节发现:振荡周期和MPPT的采样周期一致,说明算法在不断做出相反的判断。
排查过程:
- 第一步,断开MPPT自动调节,手动给定一个参考电压,看功率是否稳定。结果稳定,说明问题在MPPT算法逻辑本身。
- 第二步,检查采样电压电流信号是否有延迟。发现电流采样用的传感器在后面串了一个低通滤波器,引入了一个开关周期的延迟。MPPT采到的P和实际功率之间已经错位了。
- 第三步,去掉滤波器,直接采样,或者把MPPT采样周期加大到能够覆盖滤波器延迟的范围。
这个问题的根源在于:MPPT算法假设你采到的功率和当前施加的参考电压是同一个时刻的状态。工程上采样路径里的任何延迟都会打破这个假设,表现就是算法原地打转。
8.2 并网电流在过零点附近畸变严重
有一个阶段我发现在电流过零的地方波形明显失真,最严重的时候电流谐波含量超标。
排查后发现问题是这样的:电流内环PI输出的是调制波,调制波在正弦波过零附近非常接近零,此时PWM比较器如果遇到载波边界的情况,会出现窄脉冲丢失,导致电流波形畸变。
解决思路是限制调制波的最小占空比。具体做法是在PWM生成模块里给调制波加一个限制,让占空比不低于5%也不高于95%。虽然理论上牺牲了一点最大输出电压,但波形质量大幅改善。
还有一个辅助办法是使用单极性调制,并且让两个桥臂在过零附近交替,这样过零处的短脉冲由另一个桥臂补偿,效果会好很多。这也是为什么我最后选了单极性调制。
8.3 光照突变后MPPT追踪缓慢的问题
光照从高到低突变时,MPPT追新工作点花的比我预期的时间长很多。观察参考电压变化发现,它一直在小步长慢慢爬,没有快速切换到新工作点的趋势。
这是我前面提到的问题:固定小步长保证了稳态精度,但牺牲了动态响应。
解决办法:改成变步长扰动观察法。功率变化大的时候用大步长,接近稳定时用小步长。Simulink实现也比较简单,增加一步判断逻辑,根据两次功率差的绝对值调整步长。
8.4 仿真刚开始矩阵条件数过大,求解器报数值异常
第一次搭好主电路跑仿真,程序启动前Simulink直接报了一个求解器错误,原因是电路里存在过大的电感电流变化率。
排查后发现是我把滤波电感的初始电流设成了零,但直流母线电容的初始电压设得比较高,导致合闸瞬间电感上要承受一个瞬间的电压冲击,数值上体现为无穷大的电流斜率。
处理办法是设置合理的初始条件:电感初始电流设为和当前功率匹配的值,电容初始电压设为目标工作点附近的值。这样让电气系统在启动时就处于一个相对稳定的邻域内,求解器就不会炸了。
9. 硬件实现前的仿真验证思路和C代码生成方向
Simulink仿真跑通了,不代表万事大吉。从仿真到硬件,还有一段距离。
9.1 仿真模型验证的方法论
我一直强调的是,仿真结果只能作为硬件设计的参考,不能直接等价于硬件表现。为了保证仿真模型尽可能接近真实系统,可以检查以下几点:
- 开关管模型是否包含导通压降和开关损耗,如果都用理想开关,效率结果会偏乐观
- 滤波电感的串联等效电阻有没有设置,实际电感绕线是有电阻的,会影响系统阻尼
- 电网等效要不要带线路阻抗,测试系统在弱电网下的表现时这个很重要
我的模型里给MOSFET设了导通电阻,给滤波电感加了等效串阻,这样仿真结果更接近实际情况。效率计算出来在96%左右,和同级别硬件产品数据对得上,说明模型可信度是可以接受的。
9.2 自动代码生成到STM32的思路
Simulink模型验证没问题后,要往DSP或者单片机移植。以STM32F103为例,思路是:控制算法生成C代码,底层外设驱动由HAL库实现,二者通过接口函数对接。
具体做法是:MPPT模块和PI控制器用Embedded Coder生成C代码,PWM的底层驱动写在STM32CubeMX生成的HAL库里,PWM输出引脚通过定时器的通道映射到GPIO。
需要注意Simulink生成的C代码里包含不少动态内存分配和数学函数,这些在资源受限的MCU里可能跑不动。生成代码时要修改代码生成配置,禁用动态内存分配,数学函数改用定点的简化版本。
不过这些都是后话,先把仿真这关过了,把MPPT和并网控制逻辑吃透再谈移植问题不迟。
10. 从仿真中总结的MPPT实现要点
做了这么多天仿真,回头总结几条最值得记住的经验:
算法选型上,P&O已经能满足绝大多数单相光伏并网场景的需求。别一上来就整什么模糊控制、神经网络,那是发论文的方向,工程应用里简单可靠才是第一位的。
调试顺序上,永远遵循先开环后闭环、先固定后MPPT、先阻性负载后并网的原则。每一步都要看到预期的输出再接下一步。
参数整定上,先调内环再调外环是铁律。电流内环稳定了,电压外环才有调节基础;电流内环振荡,电压环不管怎么调都白搭。MPPT步长和采样时间的匹配关系,决定了整个系统在稳态效率和动态响应之间的平衡点。
波形验证上,别只看Scope里的波形图大概像不像,用Powergui的FFT工具量化分析THD,用RMS模块算准确的功率值,用测量模块读功率因数,拿数据说话。
下次有机会我可能会把这个模型拓展到三相或者带LCL滤波器的方案,看看在弱电网条件下的表现。目前这个单相单级系统,无论是稳态性能还是动态响应,都达到了我做仿真前的预期。