• Autor de la entrada:
  • Tiempo de lectura:17 minutos de lectura

El cálculo de pérdidas en inversores monofásicos es especialmente complejo debido a que la tensión e intensidad que circulan por los componentes no son constantes. Se propone un método para el cálculo de estas pérdidas y se desarrollará un software para automatizarlo.

Introducción

Los inversores monofásicos en régimen permanente presentan magnitudes senoidales que complican el cálculo de pérdidas tradicional. La entrada «Cálculo de pérdidas en transistores de potencia» analiza en detalle las magnitudes y variables a tener en cuenta para el cálculo de pérdidas. En aquella entrada se planteó que la tensión e intensidad a manejar eran constantes, a pesar de ello, para cada encendido y apagado existen transitorios complejos que deben aproximarse de forma que puedan estimarse sus efectos.

Teniendo en cuenta lo anterior se plantea el funcionamiento del inversor monofásico y modulación SPWM. En este tipo de convertidor los transistores de potencia se conmutan desde unos pocos kilohercios hasta algunas decenas, el hándicap para el cálculo de pérdidas es que esto sucede mientras tensiones e intensidades varían de forma senoidal.

Modulación SPWM
Modulación SPWM

Caso de estudio

En esta entrada se pretende resolver el cálculo de pérdidas en inversores monofásicos conectados a red. En concreto, con topología de puente completo y modulación unipolar SPWM.

Sería sencillo adaptar este estudio a modulación bipolar y puede que se haga en el futuro. Por ahora se descarta invertir tiempo en ello debido a su poca aplicación práctica, aunque académicamente es interesante.

Las pérdidas del inversor de onda cuadrada u onda senoidal modificada pueden calcularse por trozos considerando régimen continuo. No presenta las dificultades que se pretenden resolver aquí.

Método para el cálculo de pérdidas en inversores monofásicos

Partiendo de las tensiones e intensidades a los que están sometidos los transistores a una frecuencia de conmutación baja, se observan las señales durante un periodo de la tensión de red.

Formas de tensión e intensidad en interruptor de inversor monofásico y modulación unipolar
Formas de tensión (azul) e intensidad (rojo) en interruptor de inversor monofásico y modulación unipolar

En la imagen la intensidad que circula por el transistor es abrupta, pero a frecuencias de conmutación elevadas puede aproximarse a una senoidal. En este caso se calcularán las pérdidas de encendido, apagado y conducción para un transistor durante un periodo de la tensión de red. Posteriormente se extrapolará a los otros tres multiplicando por 4.

Realizar este cálculo a mano es impracticable incluso para frecuencias de conmutación reducidas, como se ve en la anterior imagen para cada encendido y apagado aplican diferentes condiciones. Si la tensión de red es 50Hz y la de conmutación 400Hz, se deben calcular 400/50 = 8 encendidos y 8 apagados. Para una frecuencia de conmutación de 20kHz se deberán tener en cuenta 1.200 cálculos teniendo en cuenta las pérdidas por conducción.

Mediante Octave® se implementará un algoritmo que realice el cálculo en función de los parámetros del transistor y del inversor de forma automática.

Algoritmo cálculo de pérdidas en inversor monofásico
Algoritmo cálculo de pérdidas en inversor monofásico

Implementación en Octave® del cálculo de pérdidas en inversores monofásicos

Generación de datos de partida

Para que un ordenador pueda llevar a cabo el cálculo debe discretizarse el algoritmo anterior. En primer lugar, los datos de partida serán arrays que contienen información temporal y puntos discretos de tensión, intensidad y estado del interruptor. En Octave® se generarán de la siguiente forma:

%Parámetros red e inversor
Vg = 230;           %Tensión de red
f_net = 50;         %Frecuencia de red
T_net = 1/f_net;
w_net = 2*pi*f_net;
Vdc = 400;        %Tensión bus de continua
P = 2000;         %Potencia inversor
I = P/Vg;         %Intensidad RMS salida
Ip = I*sqrt(2);   %Intensidad pico de salida

%Parámetros conmutación
f_sw = 20000;
T_sw = 1/f_sw;
w_sw = 2*pi*f_sw;
modulation_index = 0.6;

%Genera ondas intensidad, portadora y moduladora
delta = T_sw/10000;      %Intervalo entre puntos de análisis

t = 0:delta:T_net;    %Genera dominio temporal discreto
It = Ip*sin(w_net*t);
carrier = sawtooth(w_sw*t,1/2);
modula = modulation_index*sin(w_net*t);
trigger = modula>carrier;

El código anterior genera los siguientes arrays, todos tienen igual tamaño y sus datos están sincronizados.

  • t -> cada elemento representa un instante temporal dentro de un periodo de la tensión de red.
  • It -> intensidad instantánea de salida.
  • carrier -> portadora de la modulación SPWM, onda triangular de amplitud la unidad.
  • modula -> moduladora de la modulación SPWM, onda senoidal de amplitud igual al índice de modulación.
  • trigger -> indica mediante booleanos si el transistor está encendido (true) o apagado (false).

El script hace uso de la variable delta, la cual establece el intervalo temporal entre los elementos de los arrays. Se debe elegir de forma que este intervalo sea más pequeño que cualquier característica temporal involucrada. En un inversor lo más probable es que sea alguna característica del transistor como: td(on)tritd(off) y tfi.

Parámetros temporales y constantes del transistor

Los tiempos característicos del transistor también deben discretizarse, o más bien, calcular el número de elementos al que corresponde cada parámetro.

%Parámetros transistor
Ron = 128E-3;
tdon = 14E-9;
tr = 9E-9;
tdoff = 7E-9;
tf = 35E-9;
Crss = 6E-12; %Capacidad gate-drenador
Vth = 5;  %Tensión umbral conducción
Vgg = 10;  %Tensión de disparo
Gm = 20;   %Transconductacia (curva de transferencia)
Rg = 10;   %Resistencia gate

%Número deltas de parámetros del transistor
deltas_tdon = uint32(tdon/delta);
deltas_tr = uint32(tr/delta);
deltas_tdoff = uint32(tdoff/delta);
deltas_tf = uint32(tf/delta);

En el código anterior delta debe ser lo suficientemente pequeño como para que cualquiera de los parámetros sea mayor que uno, siendo deseable conseguir valores lo más elevados posibles. Un delta muy pequeño hará que se requiera mucha capacidad de cálculo, por lo que tampoco debe reducirse a la ligera.

El casting uint32(…) es necesario para que Octave® no considere el resultado de la operación un double. Estas variables discretizadas serán necesarias para iterar sobre los arrays que se han generado, por tanto deben ser números enteros.

El resto de parámetros se obtienen directamente del datasheet, para obtener Gm se remite de nuevo a la entrada «Cálculo de pérdidas en transistores de potencia«.

Algoritmo para el cálculo de pérdidas

Finalmente queda implementar un bucle que itere los arrays de datos generados evaluando cada evento.

Se crean las variables Eon, ERon y Eoff, que medirán las pérdidas de encendido, conducción y apagado respectivamente. También se crea la variable booleana sw_on, esta irá registrando el estado del transistor, de forma que se pueda consultar que tipo de pérdida debe calcularse.

sw_on = false;
Eon = 0;
ERon = 0;
Eoff = 0;

tic
i = 1;
do
  if((trigger(i) == true) && (sw_on == false))
  i = (i + deltas_tdon + deltas_tr);
  %Subida de intensidad
  i_t = abs(It(i)); %Temporal valor absoluto intensidad
  Eon = Eon + i_t*Vdc*tr/2;
  %Bajada de tensión
  deltaVds = i_t*Ron - Vdc;
  deltaVdsdt = (Vgg - ((i_t/Gm) + Vth))/(-Crss*Rg);
  tfv = (deltaVds/deltaVdsdt);
  Eon = Eon + i_t*Vdc*tfv/2;
  deltas_tfv = uint32(tfv/delta);
  i = (i + deltas_tfv);
  sw_on = true;

  elseif((trigger(i) == true) && (sw_on == true))
  %Pérdidas conducción
  ERon = ERon + (It(i)^2)*Ron*delta;
  i = (i + 1);

  elseif((trigger(i) == false) && (sw_on == true))
  i = (i + deltas_tdoff);
  i_t = abs(It(i));
  Eoff = Eoff + (i_t^2)*Ron*tdoff;
  %Subida de tensión
  deltaVds = i_t*Ron - Vdc;
  deltaVdsdt = (-Rg*i_t)/(Rg*Crss);
  trv = deltaVds/deltaVdsdt;
  Eoff = Eoff + i_t*Vdc*trv/2;
  deltas_trv = uint32(trv/delta);
  i = (i + deltas_trv);
  %Bajada de intensidad
  Eoff = Eoff + abs(It(i)*Vdc*tf/2);
  i = (i + deltas_tf);
  sw_on = false;

  else
  i = (i + 1); %Por si no se da ningún caso
  endif

until(i>=length(t))
toc

Una vez ejecutado el bucle anterior, se tienen las pérdidas para un ciclo de la tensión de red, basta multiplicar por la frecuencia para obtener las pérdidas en watios. Por último, para extrapolar las pérdidas a todo el convertidor, se multiplicará por cuatro.

Won = 4*Eon*f_net
WRon = 4*ERon*f_net
Woff = 4*Eoff*f_net
Wtotal = Won+WRon+Woff

El script completo puede descargarse aquí:

Probando el script en Octave®

El script se probará con el siguiente caso práctico de inversor monofásico.

El script disponible en el capítulo anterior tiene introducidos los valores para este caso de estudio, los resultados que se obtienen son los siguientes:

  • Elapsed time: 154 seconds (en i7-11800H)
  • Won: 2.5739 (W)
  • WRon: 19.972 (W)
  • Woff: 1.6477 (W)
  • Wtotal: 24.194 (W)

Mediante la herramienta United SiC®: FET-Jet Calculator™ se coteja el resultado obtenido mediante este método y el de dicha calculadora.

Herramienta FET-Jet Calculator™ de United SiC®
Herramienta FET-Jet Calculator™ de United SiC®

El resultado de esta herramienta devuelve lo siguiente:

Resultado herramienta FET-Jet Calculator™ de United SiC®
Resultado herramienta FET-Jet Calculator™ de United SiC®

Esto es 350mW por transistor más que por el método propuesto, aproximadamente un error del 6%. Con total probabilidad la herramienta de United SiC® es mucho más precisa, tendrá en cuenta el diodo intrínseco y otros parámetros que no se han tenido en cuenta aquí.

Tiempo de ejecución del cálculo de pérdidas en inversores monofásicos

Para obtener el tiempo transcurrido en Octave® se ha utilizado el siguiente código:

%Medida de tiempo en Octave
tic
%{Código a medir}
toc

El tiempo de ejecución en Octave® es muy lento (154 segundos), algo propio de lenguajes puramente interpretados. Solucionarlo requiere crear un software en algún lenguaje como C. Sin embargo, el tiempo de ejecución de una aplicación como esta no es crítico, y es mucho más interesante la portabilidad. Por ello se decidió migrar el script a Java, que además ofrece la posibilidad de crear una interfaz gráfica de forma sencilla.

Cálculo de pérdidas en inversores monofásicos con Java

Se crea una aplicación de escritorio con Java y se migra el script. Siguiendo buenas prácticas de programación se separa la parte gráfica de la aplicación. El programa consta de dos ficheros:

  • InverterLossesEstimator_GUI.java
  • InverterLossesEstimator.java
Cálculo de pérdidas en inversores monofásicos con Java
Cálculo de pérdidas en inversores monofásicos con Java

El tiempo de ejecución es ~750ms, muy inferior a los 154 segundos del script original.

En esta aplicación se muestra la siguiente información:

  • Pon: Pérdidas debidas a conmutación por encendido.
  • Poff: Pérdidas debidas a conmutación por apagado.
  • Pron: Pérdidas debidas a conducción.
  • Pone: Pérdidas en un solo transistor.
  • P.Tot: Pérdidas en todo el puente del inversor.

El código puede encontrarse en el siguiente repositorio de GitHub

https://github.com/abrahanlp/InverterLossesEstimator/