Simulação de Controle Preditivo Baseado em Modelo (MPC) para Inversor Trifásico com Filtro LC

1. Modelo Matemático do Sistema

A topolgoia de um inversor fonte de tensão de dois níveis trifásico com filtro LC conectado a uma carga é apresentada. As equações do modelo no domínio contínuo, no referencial αβ, descrevem a dinâmica das correntes do indutor do filtro (i_fαβ) e das tensões de saída (v_oαβ). Os parâmetros do filtro são a indutância (L_f), capacitância (C_f) e resistência parasita (R_f). O modelo discreto, necessário para a implementação do controlador digital, é obtido utilizando o método de Euler Forward com período de amostragem T_s.

2. Algoritmo de Controle FCS-MPC

O princípio do Controle Preditivo Baseado em Modelo com Conjunto Finito (FCS-MPC) envolve a medição do estado atual, a predição do comportamento futuro do sistema para cada um dos oito possíveis vetores de tensão do inversor (seis vetores ativos e dois vetores nulos), o cálculo de uma função de custo para cada predição e a seleção do estado de chaveamento que minimiza este custo.

Estado de Chaveamento (Sa, Sb, Sc) Vetor de Tensão Componente α Componente β
(0,0,0) V0 0 0
(1,0,0) V1 (2/3)V_dc 0
(1,1,0) V2 (1/3)V_dc (√3/3)V_dc
(0,1,0) V3 -(1/3)V_dc (√3/3)V_dc
(0,1,1) V4 -(2/3)V_dc 0
(0,0,1) V5 -(1/3)V_dc -(√3/3)V_dc
(1,0,1) V6 (1/3)V_dc -(√3/3)V_dc
(1,1,1) V7 0 0

3. Implementação da Simulação em MATLAB

3.1 Parâmetros de Simulação

% Parâmetros do sistema
tensao_dc = 500;          % Tensão do barramento CC (V)
freq_chaveamento = 20e3;  % Frequência de chaveamento (Hz)
periodo_amostragem = 1 / freq_chaveamento;
freq_referencia = 50;     % Frequência da tensão de referência (Hz)
amplitude_ref = 200;      % Amplitude da tensão de referência (V)

% Parâmetros do filtro LC
indutancia_filtro = 2.5e-3;
capacitancia_filtro = 40e-6;
resistencia_filtro = 0.1;

% Parâmetros da carga
resistencia_carga = 100;

% Parâmetros do MPC
ganho_rastreio_tensao = 1;
ganho_limitacao_corrente = 0.1;

3.2 Função do Controlador MPC

function [chave_otima, custo_minimo] = controlador_mpc(...
    corrente_indutor_alpha, corrente_indutor_beta, ...
    tensao_saida_alpha, tensao_saida_beta, ...
    corrente_carga_alpha, corrente_carga_beta, ...
    tensao_ref_alpha, tensao_ref_beta, ...
    tensao_dc, Ts, Lf, Cf, Rf, ...
    lambda_tensao, lambda_corrente)

    % Tabela de vetores de tensão
    vetores_tensao_alpha = [0; 2/3; 1/3; -1/3; -2/3; -1/3; 1/3; 0] * tensao_dc;
    vetores_tensao_beta = [0; 0; sqrt(3)/3; sqrt(3)/3; 0; -sqrt(3)/3; -sqrt(3)/3; 0] * tensao_dc;
    tabela_estados = [0 0 0; 1 0 0; 1 1 0; 0 1 0; 0 1 1; 0 0 1; 1 0 1; 1 1 1];

    custo_minimo = inf;
    chave_otima = [0 0 0];

    for idx = 1:8
        % Predição de estado (modelo discreto)
        i_f_alpha_pred = corrente_indutor_alpha + (Ts/Lf) * (vetores_tensao_alpha(idx) - Rf*corrente_indutor_alpha - tensao_saida_alpha);
        i_f_beta_pred = corrente_indutor_beta + (Ts/Lf) * (vetores_tensao_beta(idx) - Rf*corrente_indutor_beta - tensao_saida_beta);
        v_o_alpha_pred = tensao_saida_alpha + (Ts/Cf) * (corrente_indutor_alpha - corrente_carga_alpha);
        v_o_beta_pred = tensao_saida_beta + (Ts/Cf) * (corrente_indutor_beta - corrente_carga_beta);

        % Cálculo da função de custo
        erro_tensao = (tensao_ref_alpha - v_o_alpha_pred)^2 + (tensao_ref_beta - v_o_beta_pred)^2;
        modulo_corrente = sqrt(i_f_alpha_pred^2 + i_f_beta_pred^2);
        custo_corrente = max(0, modulo_corrente - 20)^2; % Limite de corrente = 20A
        custo_total = lambda_tensao * erro_tensao + lambda_corrente * custo_corrente;

        if custo_total < custo_minimo
            custo_minimo = custo_total;
            chave_otima = tabela_estados(idx, :);
        end
    end
end

3.3 Funções de Transformação de Coordenadas

function [x_alpha, x_beta] = clarke_direta(a, b, c)
    % Transformação de Clarke: abc -> αβ
    matriz_transformacao = (2/3) * [1, -0.5, -0.5; 0, sqrt(3)/2, -sqrt(3)/2];
    resultado = matriz_transformacao * [a; b; c];
    x_alpha = resultado(1);
    x_beta = resultado(2);
end

function [a, b, c] = clarke_inversa(x_alpha, x_beta)
    % Transformação inversa de Clarke: αβ -> abc
    matriz_inversa = [1, 0; -0.5, sqrt(3)/2; -0.5, -sqrt(3)/2];
    resultado = matriz_inversa * [x_alpha; x_beta];
    a = resultado(1);
    b = resultado(2);
    c = resultado(3);
end

3.4 Script Principal de Simulação

clear; clc; close all;

% Carregar parâmetros (exemplo simplificado)
Vdc = 500; Ts = 50e-6; Lf = 2.5e-3; Cf = 40e-6; Rf = 0.1;
R_carga = 100;
lambda_v = 1; lambda_i = 0.1;
tempo_simulacao = 0.1;
num_amostras = round(tempo_simulacao / Ts);

% Vetores para armazenamento de dados
vetor_tempo = (0:num_amostras-1)' * Ts;
tensao_saida_registrada = zeros(num_amostras, 3);
chaveamento_registrado = zeros(num_amostras, 3);

% Condições iniciais
estado_atual = struct('v_o_ab', [0,0], 'i_f_ab', [0,0], 'i_o_ab', [0,0]);
chave_anterior = [0 0 0];

for k = 1:num_amostras
    tempo_atual = vetor_tempo(k);

    % Gerar referência
    angulo = 2*pi*50*tempo_atual;
    tensao_ref_a = 200 * sin(angulo);
    tensao_ref_b = 200 * sin(angulo - 2*pi/3);
    tensao_ref_c = 200 * sin(angulo + 2*pi/3);
    [ref_alpha, ref_beta] = clarke_direta(tensao_ref_a, tensao_ref_b, tensao_ref_c);

    % Estimar corrente de carga (exemplo para carga resistiva)
    corrente_carga_alpha = estado_atual.v_o_ab(1) / R_carga;
    corrente_carga_beta = estado_atual.v_o_ab(2) / R_carga;

    % Executar controlador MPC
    [chave_selecionada, ~] = controlador_mpc(...
        estado_atual.i_f_ab(1), estado_atual.i_f_ab(2), ...
        estado_atual.v_o_ab(1), estado_atual.v_o_ab(2), ...
        corrente_carga_alpha, corrente_carga_beta, ...
        ref_alpha, ref_beta, ...
        Vdc, Ts, Lf, Cf, Rf, lambda_v, lambda_i);

    chaveamento_registrado(k, :) = chave_selecionada;

    % Simulação do modelo do inversor e filtro (próximo passo)
    tensao_saida_fase = zeros(1,3);
    for fase = 1:3
        tensao_saida_fase(fase) = (2*chave_selecionada(fase) - sum(chave_selecionada) + chave_selecionada(fase)) * Vdc / 3;
    end
    [u_alpha, u_beta] = clarke_direta(tensao_saida_fase(1), tensao_saida_fase(2), tensao_saida_fase(3));

    % Atualização do estado (integração numérica simples)
    novo_i_f_alpha = estado_atual.i_f_ab(1) + (Ts/Lf) * (u_alpha - Rf*estado_atual.i_f_ab(1) - estado_atual.v_o_ab(1));
    novo_i_f_beta = estado_atual.i_f_ab(2) + (Ts/Lf) * (u_beta - Rf*estado_atual.i_f_ab(2) - estado_atual.v_o_ab(2));
    novo_v_o_alpha = estado_atual.v_o_ab(1) + (Ts/Cf) * (estado_atual.i_f_ab(1) - corrente_carga_alpha);
    novo_v_o_beta = estado_atual.v_o_ab(2) + (Ts/Cf) * (estado_atual.i_f_ab(2) - corrente_carga_beta);

    % Atualizar estado para a próxima iteração
    estado_atual.i_f_ab = [novo_i_f_alpha, novo_i_f_beta];
    estado_atual.v_o_ab = [novo_v_o_alpha, novo_v_o_beta];

    % Registrar tensão de saída
    [v_a, v_b, v_c] = clarke_inversa(novo_v_o_alpha, novo_v_o_beta);
    tensao_saida_registrada(k, :) = [v_a, v_b, v_c];
end

% Visualização dos resultados
figure;
subplot(3,1,1);
plot(vetor_tempo, tensao_saida_registrada(:,1), 'b', vetor_tempo, 200*sin(2*pi*50*vetor_tempo), 'r--');
title('Tensão de Saída - Fase A'); xlabel('Tempo (s)'); ylabel('Tensão (V)'); grid on;
subplot(3,1,2);
stairs(vetor_tempo, chaveamento_registrado(:,1));
title('Estado de Chaveamento - Fase A'); xlabel('Tempo (s)'); ylabel('Comando'); ylim([-0.1 1.1]); grid on;
subplot(3,1,3);
plot(vetor_tempo, tensao_saida_registrada);
title('Tensões de Saída Trifásicas'); xlabel('Tempo (s)'); ylabel('Tensão (V)'); grid on; legend('A','B','C');

4. Estratégias de MPC Avançadas

Para aprimorar o desempenho, pode-se implementar variações como MPC de múltiplos passos, onde a predição considera um horizonte de tempo estendido, ou MPC com compensação de atraso compuatcional, essencial para lidar com o atraso inerente ao processamento em tempo real em controladores digitais.

function [chave_otima, custo_minimo] = controlador_mpc_com_compensacao(...
    corrente_indutor_alpha, corrente_indutor_beta, ...
    tensao_saida_alpha, tensao_saida_beta, ...
    corrente_carga_alpha, corrente_carga_beta, ...
    tensao_ref_alpha, tensao_ref_beta, ...
    chave_atual, ...
    tensao_dc, Ts, Lf, Cf, Rf, ...
    lambda_tensao, lambda_corrente)

    % Passo 1: Compensar atraso - prever estado k+1 baseado na chave aplicada em k
    [u_alpha_atual, u_beta_atual] = chave_para_tensao(chave_atual, tensao_dc);
    estado_k1.i_f_ab(1) = corrente_indutor_alpha + (Ts/Lf) * (u_alpha_atual - Rf*corrente_indutor_alpha - tensao_saida_alpha);
    estado_k1.i_f_ab(2) = corrente_indutor_beta + (Ts/Lf) * (u_beta_atual - Rf*corrente_indutor_beta - tensao_saida_beta);
    estado_k1.v_o_ab(1) = tensao_saida_alpha + (Ts/Cf) * (corrente_indutor_alpha - corrente_carga_alpha);
    estado_k1.v_o_ab(2) = tensao_saida_beta + (Ts/Cf) * (corrente_indutor_beta - corrente_carga_beta);

    % Passo 2: Rodar MPC a partir do estado k+1 para determinar chave para k+2
    [chave_otima, custo_minimo] = controlador_mpc(...
        estado_k1.i_f_ab(1), estado_k1.i_f_ab(2), ...
        estado_k1.v_o_ab(1), estado_k1.v_o_ab(2), ...
        corrente_carga_alpha, corrente_carga_beta, ...
        tensao_ref_alpha, tensao_ref_beta, ...
        tensao_dc, Ts, Lf, Cf, Rf, lambda_tensao, lambda_corrente);
end

function [u_a, u_b] = chave_para_tensao(chave, Vdc)
    Sa = chave(1); Sb = chave(2); Sc = chave(3);
    van = (2*Sa - Sb - Sc) * Vdc/3;
    vbn = (-Sa + 2*Sb - Sc) * Vdc/3;
    vcn = (-Sa - Sb + 2*Sc) * Vdc/3;
    [u_a, u_b] = clarke_direta(van, vbn, vcn);
end

5. Análise de Desempenho e Considerações

A simulação demonstra a capacidade do FCS-MPC de rastrear uma referência sinusoidal com baixa distorção harmônica total (THD) e rápida resposta dinâmica, mesmo na presença de cargas não-lineares. Os principais desafios incluem o custo computacional associado à avaliação de todos os vetores de tensão possíveis e a sensibilidade do desempenho a erros nos parâmetros do modelo do filtro LC. Técnicas como redução do número de candidatos baseada na localização do vetor de referência, sintonia adaptativa de pesos na função de custo e identificação on line de parâmetros são abordagens para mitigar esses desafios em aplicações práticas.

Tags: controle-preditivo inversor-trifásico filtro-lc matlab-simulink modulação-por-vetor-espacial

Publicado em 6-21 02:43