简介:这份资源面向风电控制与新能源仿真方向的学生、科研人员及工程技术人员,提供小型风力发电系统MPPT的Simulink完整仿真模型,可直接运行出结果,建议使用MATLAB 2010b及以上版本打开。压缩包共31个文件,约2MB,包含mdl模型文件、m脚本、mat数据、pdf说明文档,以及dll动态库、htm与css网页说明、gif示意图和txt说明文本,覆盖风力机、DC-DC变换电路、MPPT控制等完整电路环节,另附风速模拟、双馈异步发电机控制、电机、减速及变桨等多个风电Simulink子模块,便于按模块拆解学习与二次开发。目前已有5121人学习下载,适合用于课程设计、毕业设计或科研入门,帮助读者快速理解MPPT算法实现思路、掌握风电系统建模流程,并在此基础上开展参数调试与算法改进。
1. 小型风力发电系统MPPT仿真:为什么你的风机模型一接负载就“趴窝”
很多人第一次搭小型风力发电系统MPPT的Simulink仿真,都会遇到一个反直觉的现象:风机模型空载时转速、电压都漂漂亮亮,一旦接上负载和整流桥,输出功率立刻塌下去,转速也跟着掉。这不是模型搭错了,而是最大功率点跟踪(MPPT)没介入之前,风机根本没工作在最佳叶尖速比上。小型风电和光伏不一样,光伏的MPPT是调占空比找最大功率点,风电的MPPT核心是控转速——风速变了,最优转速也跟着变,转速不对,风能利用系数Cp就掉出峰值区。这套仿真要解决的就是:给定一个变化的风速,怎么让发电机侧的等效负载跟着变,把转速拉到当前风速对应的最优值,从而把功率抠出来。适合正在做风电控制、微电网、储能互补课题的工程师和学生,尤其是手里有MATLAB但不知道怎么把“风机+MPPT+变换器”串成闭环的人。
2. 风机、传动链与MPPT:仿真里到底谁在控谁
2.1 从风速到Cp:先搞清楚功率是从哪一步丢掉的
小型风电系统的气动功率公式是绕不开的起点:
$$P_m = \frac{1}{2}\rho A v^3 C_p(\lambda, \beta)$$
其中ρ是空气密度,A是风轮扫掠面积,v是风速,Cp是风能利用系数。Cp不是常数,它是叶尖速比λ和桨距角β的函数。小型机组通常是定桨距,β固定,所以Cp只随λ变。λ的定义是:
$$\lambda = \frac{\omega R}{v}$$
ω是风轮角速度,R是风轮半径。问题就出在这里:风速v一变,如果ω不跟着变,λ就偏离最优值λ_opt,Cp从最大值掉下来。很多仿真里功率上不去,不是发电机效率低,而是Cp已经掉到0.2以下了。
我一般会在Simulink里用一个查表模块实现Cp(λ)曲线,而不是用那个经典的近似公式。近似公式虽然方便,但在λ偏离最优值较远时误差很大,会让MPPT的收敛判断变得模糊。查表数据可以来自风机厂商的实测曲线,也可以自己用叶素动量理论算一组。表格的λ范围建议覆盖0到12,步长0.1,Cp峰值一般在λ=6到8之间,具体看你的机组设计。
传动链部分,小型机组常用直驱或者一级齿轮箱。仿真里如果忽略传动损耗和惯量,转速响应会快得不真实,MPPT的PI参数就会调得过于激进,一上真实模型就振荡。我的做法是至少加一个等效惯量J和阻尼系数B,用下面这个方程:
$$J\frac{d\omega}{dt} = T_m - T_e - B\omega$$
T_m是气动转矩,T_e是发电机电磁转矩。这个方程在Simulink里用一个积分器加加减法就能搭出来,但J和B的取值要合理。小型机组J一般在0.5到5 kg·m²量级,B取0.01到0.1 N·m·s/rad。J取太小,转速对转矩变化过于敏感,MPPT会抖;J取太大,转速跟不上风速变化,功率响应滞后。
2.2 为什么选扰动观察法而不是查表法
MPPT算法在风电里常见的有三类:叶尖速比法、功率信号反馈法、扰动观察法。叶尖速比法需要测风速,而小型机组的风速传感器往往装不准,机舱后的风速和风轮前的风速差很多,所以实际产品里用得少。功率信号反馈法需要知道最优功率曲线,对机组参数依赖强。扰动观察法不需要风速信息,只靠测量转速和功率,通过主动扰动转速指令来搜索最大功率点,鲁棒性最好,也是仿真里最容易跑通的。
扰动观察法的逻辑很直白:每隔一个控制周期,给转速参考值加一个小扰动Δω,然后看功率是增是减。如果功率增了,说明扰动方向对,下次继续同方向扰动;如果功率减了,说明扰过头了,下次反方向。这个逻辑在Simulink里用一个MATLAB Function块或者Stateflow就能实现。
但这里有个坑:风速变化快的时候,扰动观察法会把风速变化引起的功率变化误判成自己扰动引起的,导致方向判断错误。解决办法是让控制周期远小于风速变化的时间尺度。仿真里风速用阶跃或者组合正弦,控制周期取0.01到0.05秒,基本能避开这个误判。如果风速用真实湍流谱,控制周期还要再小。
2.3 把气动、传动、MPPT串成闭环的最小步骤
下面是我搭这套仿真时的顺序,每一步都能单独验证,不要一口气全连上再调。
第一步,先搭风速源和Cp查表,输出气动转矩T_m。风速可以用Signal Builder或者From Workspace,先给一个阶跃:0到2秒是6 m/s,2到4秒是8 m/s,4到6秒是10 m/s。Cp查表的输入是λ,λ由转速和风速实时计算。这一步验证的是:给定转速,T_m算得对不对。
% 气动转矩计算函数,放在MATLAB Function块里 function Tm = aero_torque(v, omega, R, rho, A, cp_table) % v: 风速 m/s % omega: 风轮角速度 rad/s % R: 风轮半径 m % rho: 空气密度 kg/m^3 % A: 扫掠面积 m^2 % cp_table: 两列,第一列lambda,第二列Cp lambda = omega * R / v; lambda = min(max(lambda, 0), 12); % 限幅,防止查表越界 Cp = interp1(cp_table(:,1), cp_table(:,2), lambda, 'linear', 0); Pm = 0.5 * rho * A * v^3 * Cp; Tm = Pm / max(omega, 0.1); % 防止除零 end这段代码的关键在限幅和除零保护。λ在转速接近零时会趋于零,查表返回的Cp可能为负,所以interp1的外插要设成0。omega做分母时加一个下限,否则仿真启动瞬间会报Inf。
第二步,加传动链惯量和阻尼,把T_m和T_e接进去,输出转速ω。T_e先给一个固定值,比如0,看转速能不能在风速阶跃下合理变化。这时候没有MPPT,转速会一直加速直到T_m和阻尼平衡,功率会偏离最优。
第三步,加发电机和整流器简化模型。小型风电常用永磁同步发电机,仿真里如果只做MPPT验证,可以用一个等效的转矩-转速关系代替,T_e = k * ω * d,d是占空比或者等效负载系数。这样就把控制量简化为一个系数,MPPT调的就是这个系数。如果要看电流电压波形,再换成详细的PMSG模型加三相整流桥。
第四步,把扰动观察法接进去,控制周期用0.02秒,扰动步长先取0.5 rad/s。观察转速和功率波形,如果功率在最优值附近来回跳,说明步长太大;如果收敛太慢,说明步长太小。小型机组的转速范围一般在0到30 rad/s,步长取0.1到1 rad/s比较合适。
第五步,把风速换成组合正弦或者实际录制的风速序列,看MPPT能不能跟上。这一步最容易暴露控制周期和风速变化速率的匹配问题。
3. 扰动观察法MPPT的Simulink实现:从模块到参数
3.1 用MATLAB Function块写MPPT核心逻辑
Simulink里实现扰动观察法,最灵活的方式是MATLAB Function块,不要用自带的MPPT模块,因为风电的扰动对象是转速不是占空比,自带模块往往对不上。
function [omega_ref, delta_next] = mppt_perturb(omega, P, delta, P_prev, omega_prev) % 扰动观察法,每个控制周期调用一次 % omega: 当前转速 % P: 当前功率 % delta: 当前扰动步长(带方向) % P_prev: 上一周期功率 % omega_prev: 上一周期转速 persistent initialized if isempty(initialized) initialized = true; omega_ref = omega; delta_next = delta; return; end dP = P - P_prev; dOmega = omega - omega_prev; if dP * dOmega >= 0 % 功率和转速同向变化,继续同方向扰动 delta_next = delta; else % 方向反了,反向 delta_next = -delta; end omega_ref = omega + delta_next; % 转速限幅,防止参考值飞出合理范围 omega_ref = min(max(omega_ref, 0), 35); end这段代码的核心是dP和dOmega的乘积判断。乘积大于等于零,说明当前扰动方向让功率增加了,下次继续;乘积小于零,说明扰过头了,反向。这里用乘积而不是分别判断dP和dOmega的符号,是为了避免风速变化引起的误判——如果风速和转速同时变化,乘积判断比单独看dP更稳。
参数方面,delta的初始值建议取0.3到0.8 rad/s。太小收敛慢,太大稳态振荡。如果风速变化剧烈,可以在dP符号连续两次不变时把delta放大1.2倍,检测到方向反转时把delta缩小0.5倍,这就是变步长扰动观察法,能兼顾速度和稳态精度。
3.2 控制周期和仿真步长的匹配
Simulink的仿真步长和MPPT控制周期是两回事。仿真步长决定数值积分精度,控制周期决定MPPT多久动作一次。很多人把两者设成一样,结果要么仿真慢得跑不动,要么MPPT动作太频繁导致转速抖。
我的习惯是:仿真步长用变步长ode23tb或者定步长1e-4秒,MPPT控制周期用0.02秒,用一个Rate Transition或者Triggered Subsystem来降频调用MPPT函数。这样数值积分够细,控制动作又不会太密。
如果风速序列里有高频成分,控制周期还要再降,0.01秒左右。但控制周期太小,扰动观察法容易把风速的快速波动当成自己的扰动效果,方向判断会乱。这时候要么加低通滤波,要么换更鲁棒的算法。
3.3 发电机侧等效负载怎么设
仿真里如果不想搭完整的PMSG和整流器,可以用一个受控电流源或者受控电阻来等效。MPPT输出的omega_ref送给转速PI控制器,PI输出的是电磁转矩参考T_e_ref,T_e_ref再除以一个系数得到等效负载。
% 转速PI控制器,输出电磁转矩参考 function Te_ref = speed_pi(omega_ref, omega, Kp, Ki, Ts) persistent integral if isempty(integral) integral = 0; end error = omega_ref - omega; integral = integral + error * Ts; % 积分限幅,防止饱和 integral = min(max(integral, -50), 50); Te_ref = Kp * error + Ki * integral; % 转矩限幅,保护发电机 Te_ref = min(max(Te_ref, 0), 30); endKp和Ki的取值要看惯量J。J越大,Kp和Ki越小。一个粗略的起点是Kp = 0.5到2,Ki = 0.1到0.5,然后根据转速响应调。如果转速超调大,降Kp;如果稳态有静差,升Ki。积分限幅一定要加,否则风速突变时积分饱和,转速会飞。
4. 避坑与排查:仿真跑不通时先看这五条
4.1 转速发散或者功率一直为零
现象:仿真启动后转速指数上升或者直接报Inf,功率输出始终是零。
原因:最常见的是气动转矩计算里omega除了零,或者Cp查表外插出了负值,导致T_m变成负的,转速反向。另一个可能是传动链方程里T_e的符号搞反了,电磁转矩变成了驱动转矩。
解决:在aero_torque里给omega加下限,interp1的外插值设成0。检查T_e的符号,发电机电磁转矩应该阻碍旋转,所以传动方程里是减T_e。如果用的是受控电流源,确认电流方向。
4.2 MPPT收敛后功率还在大幅振荡
现象:转速稳定在某个值附近,但功率波动超过10%,波形像锯齿。
原因:扰动步长delta太大,或者控制周期太短,MPPT在最优值两侧来回过冲。另一个可能是风速本身在变化,MPPT把风速变化误判成扰动效果。
解决:先把delta减半,看振荡是否减小。如果减小了但收敛变慢,改用变步长策略。如果风速变化快,加一个一阶低通滤波在功率测量上,截止频率取控制频率的1/5到1/10。
4.3 风速阶跃时转速跟不上
现象:风速从6 m/s跳到10 m/s,转速要好几秒才爬到新最优值,期间功率一直偏低。
原因:传动链惯量J太大,或者转速PI的Kp太小。也可能是MPPT的delta太小,搜索速度慢。
解决:先确认J是否合理,小型机组J一般不超过5 kg·m²。如果J没问题,把Kp提高20%到50%,同时观察超调。MPPT的delta可以适当放大,但不要超过1 rad/s,否则稳态振荡。
4.4 仿真速度慢到跑不完
现象:仿真时间设10秒,实际跑了好几分钟还没完。
原因:仿真步长太小,或者用了变步长但容差设得太严。MATLAB Function块里如果有循环或者查表,也会拖慢速度。
解决:定步长改成1e-3秒先跑通逻辑,确认没问题再降到1e-4。变步长用ode23tb,相对容差1e-3。MATLAB Function里的查表用interp1的'linear'方法,不要用'spline',后者慢很多。
4.5 波形对但数值和理论对不上
现象:趋势都对,但功率数值比手算的Cp0.5rhoAv^3小很多。
原因:单位搞错了。风速用m/s,半径用m,空气密度用kg/m^3,但有人把半径写成mm,或者把转速单位rpm当成rad/s直接代入。
解决:在Simulink里给每个关键信号加单位标注,转速统一用rad/s,如果发电机模型输出rpm,记得乘2pi/60转换。空气密度取1.225 kg/m^3,扫掠面积是piR^2,不是2piR。
5. 进阶技巧:用变步长和风速前馈把MPPT响应再压快一倍
基础版扰动观察法跑通之后,如果想让风速突变时的功率跌落更小、恢复更快,有两个改动性价比最高。
第一个是变步长扰动。逻辑是:当dP的符号连续两个周期不变,说明还在同一个搜索方向上,把delta乘以1.3;当dP符号反转,说明越过了峰值,把delta乘以0.5。这样在远离最优值时搜索快,接近最优值时步子小,稳态振荡能压到2%以内。实现上只需要在mppt_perturb里加两个persistent变量记录符号和步长。
function [omega_ref, delta_next] = mppt_variable_step(omega, P, delta, P_prev, omega_prev) persistent sign_prev count if isempty(sign_prev) sign_prev = 0; count = 0; end dP = P - P_prev; dOmega = omega - omega_prev; current_sign = sign(dP * dOmega); if current_sign == sign_prev count = count + 1; if count >= 2 delta = delta * 1.3; count = 0; end else delta = delta * 0.5; count = 0; end sign_prev = current_sign; delta = min(max(delta, 0.05), 2.0); % 步长限幅 omega_ref = omega + sign_prev * delta; omega_ref = min(max(omega_ref, 0), 35); delta_next = delta; end步长限幅很重要,下限0.05防止步长缩到零后不再搜索,上限2.0防止风速大跳时转速参考飞出去。
第二个是风速前馈。如果能测到风速(仿真里风速是已知的),可以用v和最优叶尖速比λ_opt直接算一个前馈转速ω_ff = λ_opt * v / R,把这个前馈加到MPPT输出的omega_ref上。这样风速一变,转速参考立刻跟着变,扰动观察法只需要做小范围的修正。前馈的权重可以取0.7到0.9,剩下的靠反馈补。这个改动在风速阶跃场景下能把恢复时间缩短一半以上。
但前馈有个前提:λ_opt要准。如果λ_opt偏了,前馈会把转速拉到一个错误的工作点,反馈要花更大力气拉回来。所以前馈权重不要取1.0,留一点给反馈修正。我一般取0.8,实测在组合正弦风速下功率波动比纯反馈小40%左右。
最后说一个验证习惯:每次改完参数,不要只看功率波形,把Cp、λ、转速三条曲线一起画出来。功率对不代表工作点对,有时候功率看着还行,但λ已经偏到5以下了,换个风速就会露馅。把λ控制在λ_opt的正负0.5以内,这套MPPT才算真正立住了。希望帮到你。
本文还有配套的精品资源,点击获取