I am trying to control a DC to DC boost converter using FSC MPC to generate a 20 kW PV power but the MPC controller is very poorly than PI controller.

13 visualizzazioni (ultimi 30 giorni)
I am trying to control a DC to DC boost converter using FSC MPC to generate a 20 kW PV power but the MPC controller generated a maximum of 1135 W PV power and a maximum of 7184 W DC load power instead of 20 kW power. The PV voltage has a maximum of 59 V against 847 V boosted voltage with 21 A maximum PV current against a maximum of 27 A inductor current. Below is the MPC script used in the Matlab function block:
function S = MPC_Boost(iL, V_PV, Vout, iL_ref, wf_min, wf_max, Dref)
% MPC controller for boost converter with iL_ref from MPPT logic
%% System Parameters
Ts = 10e-6;
RL = 0.02;
L = 0.0199;
C = 3.1222e-04;
R_load = 18;
%% Limits
iL_max = 20;
iL_min = 0.2;
Vout_max = 420;
Vout_min = 360;
P_PV_max = 20000;
Vout_ref = 400;
%% Persistent memory
persistent S_old wf;
if isempty(S_old)
S_old = Dref;
wf = wf_min;
end
%% Sanitize Inputs
iL = abs(iL);
Vout = abs(Vout);
V_PV = max(V_PV, 50);
%% Duty Cycle Candidates
states = [Dref - 0.05; Dref; Dref + 0.05];
states = min(max(states, 0.3), 0.9); % Clamp
%% Cost Evaluation
g = zeros(length(states),1);
g_min = inf;
n_best = 1;
X_k = [iL; Vout];
for n = 1:length(states)
D = states(n);
% Discrete model
A_d = [1 - (RL * Ts / L), -(1 - D) * (Ts / L);
(1 - D) * (Ts / C), 1 - (Ts / (R_load * C))];
B_d = [Ts / L; 0];
% Predict state
X_k1 = A_d * X_k + B_d * V_PV;
iboost_k1 = X_k1(1);
Vout_k1 = X_k1(2);
P_PV_pred = V_PV * iboost_k1;
% Constraint check
if iboost_k1 < iL_min || iboost_k1 > iL_max || ...
Vout_k1 < Vout_min || Vout_k1 > Vout_max || ...
P_PV_pred <= 0 || P_PV_pred > P_PV_max || ...
isnan(iboost_k1) || isnan(Vout_k1)
g(n) = inf;
continue;
end
% Cost terms
g_iboost = (iL_ref - iboost_k1)^2;
g_vout = (Vout_ref - Vout_k1)^2;
g_sw = (D ~= S_old) * wf;
g_dref = (D - Dref)^2;
g_pv = (P_PV_pred < 100) * 1000;
% Total cost
g(n) = g_iboost + 0.1 * g_vout + g_sw + g_dref + g_pv;
if g(n) < g_min
g_min = g(n);
n_best = n;
end
end
%% Apply Selected Duty Cycle
S = states(n_best);
S = min(max(S, 0.3), 0.9); % Clamp again
% Adaptive penalty update
if S ~= S_old
wf = min(wf * 1.10, wf_max);
else
wf = max(wf * 0.90, wf_min);
end
S_old = S;
end
  1 Commento
Gloria Sitsofe
Gloria Sitsofe il 7 Mag 2025
Hi Rahul,
Your suggestions were helpful, it has improved the P_PV from 1135 W to 7764 W with the P_Load = 7184 W as before, however it could not get to 20 kW. If there is any further suggestion, I will appreciate it.
Thank you

Accedi per commentare.

Risposta accettata

Rahul
Rahul il 6 Mag 2025
Hi Gloria,
I understand you're seeing only around 1135 W PV power and 7184 W load power instead of the expected 20 kW from your boost converter controlled via MPC.
From the provided PV voltage (59 V) and inductor current (max 27 A), the available PV power is limited to about 1.6 kW, which matches the observed behavior. To achieve 20 kW at that voltage, over 300 A would be required. It may help to double-check the PV model’s irradiance, temperature, and current limits to ensure it's capable of supplying the full power.
In the provided code, the duty cycle candidates are clamped between 0.3 and 0.9, which may be limiting the controller’s flexibility. Instead, you could try relaxing this to a 0.05 - 0.95 range:
states = min(max(states, 0.05), 0.95);
The inductance value (L = 0.0199, or 19.9 mH) also seems high for a fast-switching (10 µs) high-power converter. This could slow down the current response and limit control authority, so please verify whether this value matches your hardware design.
Secondly, the cost function includes a strong penalty for low predicted PV power:
g_pv = (P_PV_pred < 100) * 1000;
This likely helps avoid low-power states, but may be too aggressive in this case. You could reduce the penalty or set it to zero temporarily during testing.
g_pv = 0
As a debugging aid, it might also help to log the predicted values and associated costs for each duty cycle candidate. For example, adding a 'fprintf' inside the loop can show what decisions the MPC is making at each step:
fprintf('D: %.2f | iL_pred: %.2f | Vout_pred: %.2f | P_PV_pred: %.2f | Cost: %.2f\n', ...
D, iboost_k1, Vout_k1, P_PV_pred, g(n));
Hope this helps!

Più risposte (0)

Categorie

Scopri di più su Electrical Block Libraries in Help Center e File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by