¿Cómo resolver un circuito de refuerzo (o cualquier circuito RLC conmutado) en el dominio del tiempo?

Necesito modelar un circuito boost con la siguiente topología:

esquemático

simular este circuito : esquema creado con CircuitLab

Estoy interesado en el voltaje de la resistencia, así que encontré la ecuación diferencial de cada estado y los resolví por el método implícito de Euler, alternando la ecuación a resolver a medida que cambiaba el estado.

Comparé los resultados con un simulador de circuito. Cada ecuación diferencial es correcta por sí sola, pero cuando las pongo juntas, una tras otra, formando la dinámica conmutada de refuerzo, el resultado es incorrecto.

Estos son mis pasos:

Ecuación diferencial de 'estado ON' (solo la descarga del capacitor)

d V o tu t d t = V o tu t R C

Ecuación diferencial de 'estado APAGADO'

d 2 V o tu t d t 2 + 1 R C d V o tu t d t + 1 L C V o tu t = V i norte L C

Este es mi código (MATLAB):

R = 10; 
L = 1e-5; 
C = 1e-4;
Vin = 10; 

h = 1e-6;   % time step
sizeVector = 10000; % number of steps
t = 0:h:sizeVector*h-h;  % time vector

Vout = zeros(1,sizeVector); % output voltage vector
dVout = zeros(1,sizeVector); % first derivative vector

freqSw = 5e3; % switching frequency
D = zeros(1,sizeVector); % State of switch for each simulation step (duty cycle = 0.5)
D = sign(cos(2*pi*freqSw.*t + pi/2 + 0.001));
D(D<0) = 0;

for k=2:sizeVector
    if D(k) == 0
        % Off state
        Vout(k) = (Vout(k-1) + h*((dVout(k-1) + (h/(L*C))*Vin)/(1 + h/(R*C))))/(1 + (h^2/(L*C))/(1 + h/(R*C)));
        dVout(k) = (dVout(k-1) + h*(Vin/(L*C) - Vout(k)/(L*C)))/(1 + h/(R*C));
    end
    if D(k) == 1
        % On state
        Vout(k) = Vout(k-1)/(1+h/(R*C));
        dVout(k) = (Vout(k)-Vout(k-1))/h; % just for convenience
    end

end


figure(1)
plot(t,Vout)
xlabel('Time (s)')
ylabel('Voltage (V)')
hold on

Estas son las comparaciones entre los resultados de PSIM (rojo) y mi código en MATLAB (azul). (Para la descarga del capacitor consideré en ambos casos una tensión inicial de 10V)

Estado abierto:

ingrese la descripción de la imagen aquí

Estado cerrado:

ingrese la descripción de la imagen aquí

Boost convertidor como en el código anterior:

ingrese la descripción de la imagen aquí

Nunca puedo obtener un voltaje de estado estable superior a mi voltaje de entrada (10 V, en este caso), pero la forma de onda parece ser consistente con cada una de las formas de onda de los estados por separado.

¿Debe haber un error en mi código o me estoy perdiendo algún punto importante? ¿Es posible este tipo de resolución?

Editado después de las respuestas:

Siguiendo las sugerencias, cambié la ecuación diferencial de segundo orden en un sistema de dos ecuaciones de primer orden, para calcular la corriente del inductor, lo cual es necesario porque cuando comienza el 'estado apagado', la corriente del inductor debe ser una condición inicial. En el modelo anterior, no estaba considerando el cambio actual en el 'estado activado'.

El sistema 'fuera del estado':

[ d V o tu t d t d I i norte d d t ] = [ 1 R C 1 C 1 L 0 ] × [ V o tu t I i norte d ] + [ 0 V i norte L ]

El sistema 'en estado': (en realidad no es un sistema, pero lo mantengo matricial por simplicidad)

[ d V o tu t d t d I i norte d d t ] = [ 1 R C 0 0 0 ] × [ V o tu t I i norte d ] + [ 0 V i norte L ]

Todavía hay un problema. De esta manera, no puedo evitar que la corriente del inductor sea negativa en el 'estado apagado', por lo que inserté una declaración if en cada iteración del 'estado apagado'. Si I i norte d < 0 , resolver el sistema nuevamente imponiendo I i norte d = 0 . Esto se puede hacer simplemente poniendo a cero los elementos relacionados con I i norte d en la matriz.

A continuación se muestra la comparación de resultados (PSIM, primero, MATLAB segundo) y el código.

ingrese la descripción de la imagen aquí

R = 10; 
L = 1e-3; 
C = 1e-4;
Vin = 10; % DC input voltage

h = 1e-7;                % step
sizeVector = 120000;     % number of steps
t = 0:h:sizeVector*h-h;  % time vector

X = zeros(2,sizeVector); % state vector 

A = [-1/(R*C) 1/C ; -1/L 0]; % off state matrix
b = [0; Vin/L];              % off state vector

Aaux = [-1/(R*C) 0 ; 0 0];   % off state auxiliar matrix
baux = [0 ; 0];              % off state auxiliar vector

A2 = [-1/(R*C) 0; 0 0];      % on state matrix
b2 = [0; Vin/L];             % on state vector

freqSw = 5e3;               % switching frequency
D = zeros(1,sizeVector); % State of switch for each simulation step (duty cycle = 0.5)
D = sign(cos(2*pi*freqSw.*t + pi/2 + 0.001));
D(D<0) = 0;

for k=2:sizeVector

    if D(k) == 0 % off state 
        X(:,k) = (inv(eye(length(A)) - h*A))*(X(:,k-1) + h*b);
        if X(2,k) < 0 % avoid Iind < 0
            X(:,k) = (inv(eye(length(Aaux)) - h*Aaux))*(X(:,k-1) + h*baux);
        end

    end
    if D(k) == 1 % on state
        X(:,k) = (inv(eye(length(A2)) - h*A2))*(X(:,k-1) + h*b2);
    end
end


figure(1)
plot(t,X(1,:))
hold on
plot(t,X(2,:))
xlabel('Time (s)')
ylabel('Voltage (V)\Current(A)')
legend('V_{out}','I_{in}')
ylim([-6 36])
grid
hold on
Bienvenido a EE.SE. ¿Cuál es el valor de 'L'? ¿Olvidó que con el interruptor cerrado, L se carga como un campo magnético y descarga su carga como un "impulso" cuando el interruptor está abierto? Normalmente, un mosfet es el interruptor que funciona a decenas de KHZ, y L es 10uH o ​​más. 'C' filtra la ondulación para que la carga vea un voltaje de CC uniforme. El diodo es del tipo de alta velocidad.
Debe tener una ecuación para lo que sucede con la corriente del inductor en el "estado encendido".
En este ejemplo, L = 0.01 H. Como solo estoy interesado en el voltaje de salida, me perdí por completo la carga del inductor en el 'estado encendido'. Entendí el punto, ahora solo necesito pensar cómo tener en cuenta la energía del inductor cada vez que se alcanza el 'estado apagado'. ¡Muchas gracias, Sparky256 y The Photon!
Sí, cuando está ejecutando la parte de "estado apagado" de la simulación, debe comenzar con la corriente del inductor no cero sino igual a donde la dejó el "estado encendido". El desafío es cómo expresar ese IC (condición inicial) a su simulación (Matlab).

Respuestas (2)

Puedo ver al menos una cosa mal con sus ecuaciones (no he revisado su código):

  • Debe haber una ecuación que describa la evolución de la corriente del inductor durante el "estado encendido".

Probablemente mantendría un sistema de dos ecuaciones de primer orden en lugar de tratar de escribir una ecuación de segundo orden. Matlab no tardará más en resolverlo de esa manera.

Una forma de analizar la conversión de impulso es calcular la energía almacenada en el inductor en función del tiempo del interruptor, la tonelada, la corriente, la inductancia I, L cuando el interruptor está cerrado y luego equipararlo con la energía disipada en la carga en un bucle regulado.

P_in = 0,5 * L I²/T (energía/tiempo cuando el interruptor está encendido)
Pout = 0,5 * I * Vin * Toff/T (salida de alimentación)
Suponiendo que
la tensión de salida de conmutación no tenga pérdidas V o = V i norte k R L T o norte 2 L para 0< k< 1 con bucle regulado

Tal vez no enfaticé, pero necesito una representación del voltaje en el dominio del tiempo, incluido su transitorio. Estoy trabajando en un algoritmo para manejar retrasos entre pasos en tiempo real que ocurren en simulaciones de circuitos conmutados. Este modelo es para evaluar el algoritmo y se supone que se ejecuta en un entorno integrado, con el objetivo de una simulación en tiempo real.
Entonces tus motivos ciertamente no están claros. ¿Reinventar la rueda? o mejorar los modelos y simuladores existentes?
Mi propósito es estudiar algoritmos que manejen retrasos de conmutación en simulaciones en tiempo real. En una primera aproximación, intentaré reproducir los resultados de algunos trabajos sobre este tema, como este: link . El modelo boost se utilizará como caso de estudio para evaluar el rendimiento de los algoritmos.
Así que quieres comparar EMT, ATP, PSCAD, etc...
Tal vez lo que necesita en su lugar es el software PLECS plexim.com/sites/default/files/flyers/flyer_smps_letter.pdf