// // // PHPH.com.br - Simulação do modelo T de um transformador no MATLAB (programação OO)
All for Joomla All for Webmasters

Simulação do modelo T de um transformador no MATLAB (programação OO)

Por meio do MATLAB (linguagem e interface de desenvolvimento), que suporta a programação orientada a objetos há muitos anos, podemos desenvolver qualquer tipo de simulação computacional ou software matemático. Neste exemplo, efetuamos uma simulação simples do modelo T de um transformador por meio do método trapezoidal implícito de integração apenas para demonstrar a capacidade de programação orientada a objetos no MATLAB e exibimos alguns gráficos para demonstrar os resultados (código desenvolvido na versão 2013b).

Para a simulação desejada, desenvolvemos uma classe denominada "SimulacaoTransformador_T" com alguns parâmetros elétricos com seus valores padrão já definidos (60Hz, tensão de entrada RMS de 110V, entre outros) e os parâmetros referentes à simulação em si. Ambos os parâmetros são as propriedades da classe e em algumas linguagens de programação OO são denominados como atributos.

Conforme o código-fonte abaixo, na seção methods (métodos), temos a modelagem do comportamento do objeto a ser instanciado por meio da classe. Neste exemplo, definimos um construtor padrão e os métodos definidos visam a simulação de um curto-circuito e circuito aberto, com a respectiva geração dos gráficos. Não se preocupe com o código-fonte referente aos algoritmos de computação numérica: o mesmo foi desenvolvido dessa maneira para atender o escopo de um trabalho acadêmico: de fato, há diversas outras possibilidades melhores de solução para esse problema, inclusive a utilização direta do Simulink.

Na figura a seguir, exibimos a tensão primária, corrente primária, assim como a tensão secundária no caso de um circuito aberto, na qual percebemos que a corrente transitória de inrush é exponencialmente amortecida (modelo T simplificado): 

 circuito aberto

No caso de curto-circuito, percebemos que a corrente primária é obviamente bem maior do que em relação ao caso do circuito secundário em aberto, assim como a corrente secundária, que possui um deslocamento de fase de 180° em relação à primária:

curto circuito

A seguir, apresentamos o código-fonte orientado a objetos completo:

classdef SimulacaoTransformador_T < handle
    %   Simulação de um transformador pelo modelo equivalente T
    %   Detailed explanation goes here
    
    properties
        %% Parâmetros Elétricos
        V0=110;                  % tensao eficaz
        frequencia_nominal=60;   % frequencia nominal
        R1_primario=6;           % resistencia primario
        R2_secundario_referida=5;% resistencia secundario referida
        L_magnetizante=0.2639;   % indutancia magnetizante
        L1_dispersao=0.0135;     % dispersao primario
        L2_dispersao=0.0135;     % dispersao secundario referida
        
        %% Parâmetros Simulação (inicializados no construtor)
        V_entrada;
        V_saida;
        I_entrada;
        I_saida;
        tempo;
        funcao_entrada;
        
        t_inicial_s=0;           % tempo inicial
        t_final_s=0.15;        % tempo final
        num_pontos=1000;         % numero de pontos
    end
    
    methods
        %% Construtor Padrão
        function obj = SimulacaoTransformador_T() %% construtor padrão                           
            obj.V_entrada=zeros(obj.num_pontos,1); % inicializacao das variaveis
            obj.V_saida=zeros(obj.num_pontos,1);
            obj.I_entrada=zeros(obj.num_pontos,1);
            obj.I_saida=zeros(obj.num_pontos,1);
            obj.tempo=zeros(obj.num_pontos,1); 

            obj.funcao_entrada = @(t) sqrt(2)*obj.V0*sin(2*pi*obj.frequencia_nominal*t); % tensao inicial            
        end
        
        %% Simulação de circuito aberto
        function simularCircuitoAberto(obj)
            I_entrada_derivada=zeros(obj.num_pontos,1);
            
            % Configuração da integração
            obj.tempo(1)=obj.t_inicial_s;    % tempo inicial
            obj.I_entrada(1)=0;    % corrente inicial
            obj.V_entrada(1)=sqrt(2)*obj.V0*sin(2*pi*obj.frequencia_nominal*obj.tempo(1)); % tensao inicial
            I_entrada_derivada(1)=(obj.V_entrada(1)-obj.R1_primario*obj.I_entrada(1))/(obj.L1_dispersao+obj.L_magnetizante); % derivada corrente instante inicial
            
            passo=(obj.t_final_s-obj.t_inicial_s)/obj.num_pontos;
            
            for n=1:obj.num_pontos
              tolerancia=10; % tolerancia para convergencia do processo
              obj.V_saida(n)=obj.L_magnetizante*I_entrada_derivada(n); % tensao secundaria instantanea
              obj.tempo(n+1)=obj.t_inicial_s+n*passo; % tempo atual n+1
              obj.V_entrada(n+1)=sqrt(2)*obj.V0*sin(2*pi*obj.frequencia_nominal*obj.tempo(n+1)); % tensao fonte instante n+1
              corrente_estimada_n1=obj.I_entrada(n)+passo*I_entrada_derivada(n);   % estimativa da corrente (Euler)
              while tolerancia > 1e-6
                i1Ln1=(obj.V_entrada(n+1)-obj.R1_primario*corrente_estimada_n1)/(obj.L1_dispersao+obj.L_magnetizante); % modelo instante n+1
                corrente_entrada_n1=obj.I_entrada(n)+passo*(I_entrada_derivada(n)+i1Ln1)/2; % metodo trapezoidal
                tolerancia=abs(corrente_entrada_n1-corrente_estimada_n1); % calcula precisao/tolerancia
                corrente_estimada_n1=corrente_entrada_n1;
              end
              obj.I_entrada(n+1)=corrente_entrada_n1; % corrente no instante n+1
              I_entrada_derivada(n+1)=(obj.V_entrada(n+1)-obj.R1_primario*obj.I_entrada(n+1))/(obj.L1_dispersao+obj.L_magnetizante); % modelo instante n+1
              obj.V_saida(n+1)=obj.L_magnetizante*I_entrada_derivada(n+1); % tensao secundaria instante n+1
            end
        end
        
        %% Simulação de circuito fechado
        function simularCurtoCircuito(obj)
            I1_entrada_derivada=zeros(obj.num_pontos,1); 
            I2_saida_derivada=zeros(obj.num_pontos,1); 
            
            % Configuração da integração
            obj.tempo(1)=obj.t_inicial_s;    % tempo inicial 
            obj.I_entrada(1)=0;    % corrente inicial 
            obj.I_saida(1)=0;    % corrente inicial 
            % cálculo da tensão de entrada senoidal - função anonymous
            obj.V_entrada(1) = obj.funcao_entrada(obj.tempo(1));
            
            % a = 1/(L1+Lm) para facilitar os cálculos
            a = 1/(obj.L1_dispersao + obj.L_magnetizante); % variável de auxílio
            
            % Derivadas em n = 1
            I1_entrada_derivada(1)=(1-obj.L_magnetizante^2*a^2)^(-1)*(a*(obj.V_entrada(1)-obj.R1_primario*obj.I_entrada(1)) + ...
                    obj.R2_secundario_referida*obj.I_saida(1)*obj.L_magnetizante*a^2); % derivada corrente instante inicial
            I2_saida_derivada(1)=(1-obj.L_magnetizante^2*a^2)^(-1)*(-obj.L_magnetizante*a^2*(obj.V_entrada(1)-obj.R1_primario*obj.I_entrada(1)) + ...
                    -obj.R2_secundario_referida*obj.I_saida(1)*a); % derivada corrente instante inicial
            
            % Cálculo do passo h
            passo_h=(obj.t_final_s-obj.t_inicial_s)/obj.num_pontos; 
            
            %% Loop
            for n=1:obj.num_pontos-1
              tolerancia=10; % tolerancia para convergencia do processo 
              
              % t(n) = to + nh - item a)
              obj.tempo(n+1)=obj.t_inicial_s+n*passo_h; % tempo atual n+1 
              
              % cálculo da tensão de entrada senoidal - função anonymous
              obj.V_entrada(n+1) = obj.funcao_entrada(obj.tempo(n+1));
               
              % i1_estimada(n+1) = i1(n) + h.i1_derivada(n)
              corrente_estimada_entrada=obj.I_entrada(n)+passo_h*I1_entrada_derivada(n);   % estimativa da corrente (Euler) = OK
              
              % i2_estimada(n+1) = i2(n) + h.i2_derivada(n)
              corrente_estimada_saida=obj.I_saida(n)+passo_h*I2_saida_derivada(n);   % estimativa da corrente (Euler) = OK
              
              while tolerancia > 1e-10
                %% Cálculo das derivadas em n+1 - item d
                % di1/dt = (1-Lm².a²)^(-1)(a(v1-R1.i1) + R2.i2.Lm.a²)
                derivada_corrente_entrada_n_1=(1-obj.L_magnetizante^2*a^2)^(-1)*(a*(obj.V_entrada(n+1)-obj.R1_primario*corrente_estimada_entrada) + ...
                    obj.R2_secundario_referida*corrente_estimada_saida*obj.L_magnetizante*a^2); % derivada corrente entrada
                
                % di2/dt = (1-Lm².a²)^(-1)(-Lm.a².(v1-R1.i1) - R2.i2.a)
                derivada_corrente_saida_n_1=(1-obj.L_magnetizante^2*a^2)^(-1)*(-obj.L_magnetizante*a^2*(obj.V_entrada(n+1)-obj.R1_primario*corrente_estimada_entrada) + ...
                    -obj.R2_secundario_referida*corrente_estimada_saida*a); % derivada corrente saída
                
                %% Método Trapezoidal - item e
                corrente_entrada_n_1=obj.I_entrada(n)+passo_h*(derivada_corrente_entrada_n_1+I1_entrada_derivada(n))/2; % metodo trapezoidal
                corrente_saida_n_1=obj.I_saida(n)+passo_h*(derivada_corrente_saida_n_1+I2_saida_derivada(n))/2; % metodo trapezoidal
                
                %% Teste de Convergência |i1(n+1)-i1_estimado(n+1)| < eps
                tolerancia=abs(corrente_entrada_n_1-corrente_estimada_entrada); % calcula precisao/tolerancia
                corrente_estimada_entrada=corrente_entrada_n_1;
              end
              obj.I_entrada(n+1)=corrente_entrada_n_1; % corrente entrada no instante n+1 
              obj.I_saida(n+1)=corrente_saida_n_1; % corrente saída no instante n+1 
              
              I1_entrada_derivada(n+1)=(1-obj.L_magnetizante^2*a^2)^(-1)*(a*(obj.V_entrada(n+1)-obj.R1_primario*obj.I_entrada(n+1)) + ...
                    obj.R2_secundario_referida*obj.I_saida(n+1)*obj.L_magnetizante*a^2); % derivada corrente entrada
              I2_saida_derivada(n+1)=(1-obj.L_magnetizante^2*a^2)^(-1)*(-obj.L_magnetizante*a^2*(obj.V_entrada(n+1)-obj.R1_primario*obj.I_entrada(n+1)) + ...
                    -obj.R2_secundario_referida*obj.I_saida(n+1)*a); % derivada corrente saída
            end
        end
        
        %% Gráficos - Circuito Aberto
        function gerarGraficosCircuitoAberto(obj)   
            set(gcf,'Color','white');
            axes;
            
            
            subplot(3,1,1); % abre e divide tela grafica
            plot(obj.tempo,obj.V_entrada,'LineWidth',2); % desenha grafico tensao entrada
            title('Análise de Circuito Aberto - Circ. Equivalente T', 'FontSize',14);
            grid on;
            xlabel('tempo (s)');
            ylabel('Tensao primária (V)');

            % Gráfico - Corrente Primária
            subplot(3,1,2); % divide tela grafica
            plot(obj.tempo,obj.I_entrada,'LineWidth',2,'Color','green'); % desenha grafico corrente entrada
            grid on;
            xlabel('tempo (s)');
            ylabel('Corrente primária (A)');

            % Gráfico - Tensão Secundária
            subplot(3,1,3) % divide tela grafica
            plot(obj.tempo,obj.V_saida,'LineWidth',2,'Color','red') % desenha grafico tensao saída
            grid on;
            xlabel('tempo (s)');
            ylabel('Tensao secundária (V)');
        end
        
                
        %% Gráficos - Curto Circuito Primária
        function gerarGraficosCurtoCircuito(obj) 
            set(gcf,'Color','white');
            axes;

            subplot(3,1,1); % abre e divide tela grafica
            plot(obj.tempo,obj.V_entrada,'LineWidth',2); % desenha grafico tensao entrada
            set(gca,'YTick',[-200 -150 -100 -50 0 50 100 150 200]);
            axis([obj.t_inicial_s obj.t_final_s -200 200]);
            title('Análise de Curto-Circuito - Circ. Equivalente T', 'FontSize',14);
            grid on;
            xlabel('tempo (s)');
            ylabel('Tensao primária (V)');

            % Gráfico - Corrente Primária
            subplot(3,1,2); % divide tela grafica
            plot(obj.tempo,obj.I_entrada,'LineWidth',2,'Color','green'); % desenha grafico corrente entrada
            set(gca,'YTick',[-15 -10 -5 0 5 10 15]);
            axis([obj.t_inicial_s obj.t_final_s -15 15]);
            grid on;
            xlabel('tempo (s)');
            ylabel('Corrente primária (A)');

            % Gráfico - Tensão Secundária
            subplot(3,1,3) % divide tela grafica
            plot(obj.tempo,obj.I_saida,'LineWidth',2,'Color','red') % desenha grafico corrente saída
            set(gca,'YTick',[-15 -10 -5 0 5 10 15]);
            axis([obj.t_inicial_s obj.t_final_s -15 15]);
            grid on;
            xlabel('tempo (s)');
            ylabel('Corrente secundária (A)');
        end
    end   
end

Deixe um comentário

Certifique-se de preencher os campos indicados com (*). Não é permitido código HTML.