

mppt代码如下:
function Uref = MPPT_ImprovedCond_Strict(Upv, Ipv)
% 严格遵循流程图逻辑的改进型变步长电导增量法
% 输入:Upv=光伏电压(V),Ipv=光伏电流(A)
% 输出:Uref=MPPT参考电压(V)
persistent U_prev I_prev P_prev Uref_prev % 保存k-1时刻的状态
DeltaUref = 0.1; % 电压调整步长,文献中为0.5V
eps = 1e-3; % 判断为零的阈值
% 光伏板参数
Uoc = 44.2; % 开路电压(V)
Umpp_min = 32; % MPPT电压下限
%% 1. 第一次调用时初始化
if isempty(U_prev)
U_prev = Upv;
I_prev = Ipv;
P_prev = Upv * Ipv;
Uref_prev = 0.7*Uoc; % 初始参考电压设为0.7倍开路电压
end
%% 2. 计算流程图中的变量
DeltaU = Upv - U_prev; % ΔU(k)
DeltaI = Ipv - I_prev; % ΔI(k)
P = Upv * Ipv; % P(k)
DeltaP = P - P_prev; % ΔP(k)
% 计算G(k)和S(k) - 仅在ΔU≠0时有意义
if abs(DeltaU) > eps
G = Ipv/Upv + DeltaI/DeltaU; % G(k) = I/U + ΔI/ΔU
Ipv_nom = 4.95; % 文献表1中光伏板最大功率点电流Im(关键!用于归一化)
if abs(Ipv) < 0.1 % 避免电流过小时分母为0(光照极低场景)
S = 0;
else
% 文献逻辑:S(k) = |ΔP/ΔU| / (Ipv × Ipv_nom) × 10 (10为缩放系数,保证步长范围)
S = (abs(DeltaP / DeltaU) / (Ipv * Ipv_nom)) * 10;
S = max(0, min(S, 1)); % 强制S(k)在0~1之间(文献图6中S(k)最大为1)
end
else
% ΔU=0时G和S无意义,赋默认值
G = 0;
S = 0;
end
%% 3. 严格按照流程图的分支逻辑
if abs(DeltaU) < eps % ΔU(k) = 0 的情况
if abs(DeltaI) < eps % ΔI(k) = 0
Uref = Uref_prev; % 保持Uref不变
else % ΔI(k) ≠ 0
if DeltaI > 0 % ΔI(k) > 0
Uref = Uref_prev + DeltaUref; % 增加Uref
else % ΔI(k) < 0
Uref = Uref_prev - DeltaUref; % 减少Uref
end
end
else % ΔU(k) ≠ 0 的情况
if abs(G) < eps % G(k) = 0
Uref = Uref_prev; % 保持Uref不变
else % G(k) ≠ 0
if G > 0 % G(k) > 0
Uref = Uref_prev + S * DeltaUref; % 增加Uref,步长为S×ΔUref
else % G(k) < 0
if S < 1 % S(k) < 1
Uref = Uref_prev - S * DeltaUref; % 减少Uref,步长为S×ΔUref
else % S(k) ≥ 1
Uref = Uref_prev - DeltaUref; % 减少Uref,步长为固定ΔUref
end
end
end
end
%% 4. 对Uref进行限幅(防止超出合理范围)
Uref = max(Umpp_min, min(Uref, 0.8*Uoc));
%% 5. 更新历史状态
U_prev = Upv;
I_prev = Ipv;
P_prev = P;
Uref_prev = Uref;
end
其中boost电路参数和pi参数均参照文献是正常的,不用mppt+pi的时候给定恒定占空比运行正常,加上mppt+pi就不能正常控制达到最大功率点,pi输出0 1显然被限幅了,mppt代码有问题还是设置有问题?希望真人回答不要ai

