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

Las aplicaciones que interactúen con la red eléctrica necesitarán sincronizarse con la misma, por tanto, conocer la fase de esta. Se analiza cómo utilizando el SRF-PLL SOGI en redes monofásicas se consigue medir además de la fase, su frecuencia y amplitud en tiempo real.

Introducción al SRF-PLL SOGI

Esquema SRF-PLL
Esquema SRF-PLL

En Sincronización con redes monofásicas se introdujo brevemente este método y la utilización del sistema SOGI para generar la señal en cuadratura que lo hace práctico. Esta entrada profundiza en el funcionamiento de este sistema y además se verá como aplicarlo de forma práctica en un sistema digital.

Generación de señal en cuadratura con un SOGI

Diagrama sistema SOGI
Diagrama sistema SOGI

Las funciones de transferencia del SOGI son las siguientes

\[ G_d=\frac{V_d}{V_g}=\frac{k \omega_0 s}{s^2+k \omega_0 s+ \omega_0^2}\]\[G_q=\frac{V_q}{V_g}=\frac{\omega_0^2}{s^2+k \omega_0 s+ \omega_0^2}\]
FDT Señal en faseFDT Señal en cuadratura

Donde ω0 es la frecuencia de sintonización o resonancia y k un parámetro de ajuste, la respuesta en frecuencia para varios valores de k es

Diagrama de Bode sistema SOGI
Diagrama de Bode sistema SOGI

El aumento de k tiene las siguientes consecuencias

  • Filtrado menos selectivo, permitiendo un ancho de banda mayor.
  • Desplazamiento de fase en el entorno de la frecuencia de resonancia más reducido.
  • Respuesta con sobrerreacción durante transitorios.
  • Se alcance un estado estacionario más rápidamente.

Frente a una entrada escalón el SOGI responde de la siguiente forma para varios valores de k.

Respuesta a entrada escalón del SOGI
Respuesta a entrada escalón del SOGI

Mediante las funciones de transferencia anteriores puede establecerse o estimarse un tiempo de asentamiento, lo cual tendrá un efecto directo sobre la selectividad del filtro y la sobrerreacción.

Llegar a un compromiso entre los 4 puntos anteriores mediante el ajuste de un solo parámetro es difícil, de ahí que se tenga que recurrir al método de ensayo-error para evitar complicaciones.

Simulación del sistema SOGI en redes monofásicas

La evaluación del SOGI como generador de señales en cuadratura se llevará a cabo con k=0.75. Para ello se enfrentará al sistema a los siguientes transitorios.

  • Inicialización
  • Incremento de amplitud (+30V)
  • Salto de fase (+30V)
  • Cambio de frecuencia (+1Hz)
  • Comportamiento frente a ruido blanco (30Vpp)

Estos hipotéticos transitorios son perturbaciones que pueden producirse en cualquier tipo de red independientemente de la fortaleza de esta, aunque se darán de forma más habitual en redes débiles, poco malladas, etc.

En las siguientes capturas se tiene en rojo la tensión de entrada al SOGI, en azul la señal directa y en verde la señal en cuadratura.


Tras un periodo de inicialización de casi dos periodos se consigue el régimen estacionario. El SOGI se recupera rápidamente antes cambios bruscos de tensión y de fase. Cuando la frecuencia de entrada no coincide con la de resonancia aparece un error tanto de seguimiento como en la generación de la señal en cuadratura. Error que no desaparece hasta que se resintoniza el sistema a la nueva frecuencia. Que el SOGI pueda resintonizarse en tiempo real es una ventaja muy interesante para aplicaciones donde puedan tenerse cambios prolongados en la frecuencia de funcionamiento.

En la última imagen puede verse como el sistema elimina de forma significativa el ruido, pero distorsiona de forma evidente la señal y no llega a extraer únicamente la componente que interesa ni genera la señal en cuadratura de forma ideal. Comportamientos así evidencian que el SOGI es sensible a señales fuera de la frecuencia de resonancia en la que se encuentra sintonizado.

Simulación del sistema SRF-PLL SOGI en redes monofásicas

Igual que se hizo de forma aislada con el SOGI, ahora se hará lo propio integrando todos los componentes del sistema SRF-PLL SOGI. De esta forma se pretende evaluar el funcionamiento de todo el conjunto frente a las mismas perturbaciones de red.


El PLL muestra una fuerte dependencia del SOGI al encontrarse errores en la estimación de fase coincidentes con los vistos en la generación de señales en cuadratura. Aun así se considerará que el error es aceptable.

Discretización del SRF-PLL SOGI

Implementar esta técnica de sincronización en un dispositivo digital obliga a la discretización del mismo. De esta forma, mediante un circuito de adaptación y un convertidor analógico-digital podría utilizarse este sistema en un microcontrolador o microprocesador.

Debido a la importancia de que el sistema discretizado respete la respuesta en frecuencia del sistema original, se usará el método bilineal o ‘tustin’ para el SOGI. El integrador del PI se discretizará mediante un método simple tipo Euler adelanto/retraso.

El SOGI discretizado será el siguiente.

\[H_d(z)=\frac{b_0+b_1z^{-1}+b_2z^{-2}}{a_0-a_1z^{-1}-a_2z^{-2}}\]\[H_q(z)=k\frac{c_0+c_1z^{-1}+c_2z^{-2}}{a_0-a_1z^{-1}-a_2z^{-2}}\]
\[\left.
\begin{array}{rcl}
     b_0&=&\frac{x}{x+y+4}
  \\ b_1&=&0
  \\ b_2&=&-b_0
\end{array}
\right\}
;\left.
\begin{array}{rcl}
     a_0&=&1
  \\ a_1&=&\frac{2(4-y)}{x+y+4}
  \\ a_2&=&\frac{x-y-4}{x+y+4}
\end{array}
\right\}\]
\[\left.
\begin{array}{rcl}
     c_0&=&\frac{y}{x+y+4}
  \\ c_1&=&2c_0
  \\ c_2&=&c_0
\end{array}
\right\}
;\left.
\begin{array}{rcl}
     a_0&=&1
  \\ a_1&=&\frac{2(4-y)}{x+y+4}
  \\ a_2&=&\frac{x-y-4}{x+y+4}
\end{array}
\right\}\]
\[x=2k\omega_0 T;y=\omega^2_0T^2\]\[x=2k\omega_0 T;y=\omega^2_0T^2\]
Discretización FDT SOGI directoDiscretización FDT SOGI cuadratura

Simulación del SRF-PLL discretizado mediante Octave

Mediante un script en Octave se simula el sistema discretizado frente a variaciones de tensión, fase y frecuencia. Una vez generada la señal senoidal con las perturbaciones necesarias, se introduce en el SRF-PLL SOGI y finalmente se pintan las señales de salida. Las estimaciones que realiza el SRF-PLL son fase y frecuencia, no siendo complicado obtener también una estimación de amplitud.

Vg = 230;           %Tensión de red
f_net = 50;         %Frecuencia de red
T_net = 1/f_net;
w_net = 2*pi*f_net;

f_sample = 50000;
T_sample = 1/f_sample;

t = 0:T_sample:3*T_net;

%Para visualizar en plot
y_dout = zeros(1, length(t));
y_qout = zeros(1, length(t));
theta_out = zeros(1, length(t));
f_out = zeros(1, length(t));

%Genera senoide de prueba
%Señal de red a simular
ug1 = Vg*sqrt(2)*sin(w_net*t);
ph1 = zeros(1, length(t));
for n=2:length(t)
  ph1(n) = (T_sample*w_net ) + ph1(n-1);
  if(ph1(n) > 2*pi)
    ph1(n) = 0;
  endif
endfor
f1 = f_net*ones(1, length(t));

%Salto tensión
ug2 = (Vg*sqrt(2)+30)*sin(w_net*t);
ph2 = zeros(1, length(t));
for n=2:length(t)
  ph2(n) = (T_sample*w_net ) + ph2(n-1);
  if(ph2(n) > 2*pi)
    ph2(n) = 0;
  endif
endfor
f2 = f_net*ones(1, length(t));

%Salto fase
ug3 = (Vg*sqrt(2)+30)*sin(w_net*t+(pi/6));
ph3 = zeros(1, length(t));
ph3(1) = pi/6;
for n=2:length(t)
  ph3(n) = (T_sample*w_net ) + ph3(n-1);
  if(ph3(n) > 2*pi)
    ph3(n) = 0;
  endif
endfor
f3 = f_net*ones(1, length(t));

%Salto frecuencia
ug4 = (Vg*sqrt(2)+30)*sin((w_net+2*pi)*t+(pi/6));
ph4 = zeros(1, length(t));
ph4(1) = pi/6;
for n=2:length(t)
  ph4(n) = T_sample*(w_net+2*pi)+ph4(n-1);
  if(ph4(n) > 2*pi)
    ph4(n) = 0;
  endif
endfor
f4 = (f_net+1)*ones(1, length(t));

ug = [ug1, ug2, ug3, ug4];
ph = [ph1, ph2, ph3, ph4];
f = [f1, f2, f3, f4];

t = 0:T_sample:4*3*T_net+3*T_sample;

%Parámetro k del SOGI
k = 0.75;

x = 2*k*w_net*T_sample;
y = w_net*w_net*T_sample*T_sample;

a1 = (2*(4-y))/(x+y+4);
a2 = (x-y-4)/(x+y+4);
b0 = x/(x+y+4);
c0 = y/(x+y+4);

kp = 100;
ki = 50000;

yd = [0, 0, 0];
yq = [0, 0, 0];
u = [0, 0, 0];
ud = [0, 0];
pi_out = [0, 0];
theta = [0, 0];
omega = [0, 0];

for n=1:length(ug)
 %Simula captura del ADC
  u(1) = ug(n);
  %Calcula salida del SOGI
  yd(1) = a1*yd(2) + a2*yd(3) + b0*(u(1) - u(3));
  yq(1) = a1*yq(2) + a2*yq(3) + k*c0*(u(1) + 2*u(2) + u(3));

  %Transformada park
  ud(1) = yd(1)*cos(theta(1)) + yq(1)*sin(theta(1));

  %PI Fordward
  pi_out(1) = pi_out(2) + kp*ud(1) + (ki*T_sample-kp)*ud(2);

  %Frecuencia de red
  omega(1) = w_net + pi_out(1);

  %Fase de red (integrador)
  theta(1) = theta(2) + T_sample*omega(2); %Forward

  if(theta(1) > (2*pi))
    theta(1) -= 2*pi;
    pi_out(1) = 0;
  endif

  f_out(n) = omega(1)/(2*pi);
  theta_out(n) = theta(1);
  y_dout(n) = yd(1);
  y_qout(n) = yq(1);

  omega(2) = omega(1);  %Actualiza omega(n-1)
  theta(2) = theta(1);  %Actualiza theta(n-1)
  pi_out(2) = pi_out(1);  %Actualiza pi_out(n-1)
  ud(2) = ud(1);  %Actualiza ud(n-1)
  yd(3) = yd(2);  %Actualiza yd(n-2)
  yd(2) = yd(1);  %Actualiza yd(n-1)
  yq(3) = yq(2);  %Actualiza yq(n-2)
  yq(2) = yq(1);  %Actualiza yq(n-1)
  u(3) = u(2);    %Actualiza u(n-2)
  u(2) = u(1);    %Actualiza u(n-1)
endfor

figure(1)
plot(t, f_out, "marker", 'o', "markersize", 0.5)
axis([min(t), max(t), min(f_out), max(f_out)])
xlabel("Tiempo(s)")
ylabel("Frecuencia(Hz)")
grid on

figure(2)
plot(t, ph, "marker", 'o', "markersize", 0.5,
     t, theta_out, "marker", 'o', "markersize", 0.5)
axis([min(t), max(t), min(ph), max(ph)])
xlabel("Tiempo(s)")
ylabel("Fase(rad)")
h = legend("Fase ideal", "Fase medida")
set (h, "fontsize", 15);
grid on

figure(3)
uo = sin(theta_out);
plot(t, uo, "marker", 'o', "markersize", 1,
     t, theta_out/max(theta_out), "marker", 'o', "markersize", 0.6);
xlabel("Tiempo(s)")
ylabel("Señal sincronizada y fase (p.u.)")
h = legend("Sincronización", "Fase medida")
legend (h, "location", "southeast");
set (h, "fontsize", 15);
grid on
axis([min(t), max(t), min(uo), max(uo)*1.001])

figure(4)
subplot(3, 1, 1)
plot(t, uo, "marker", 'o', "markersize", 0.5, "color", 'k',
     t, theta_out/max(theta_out), "marker", 'o', "markersize", 0.5, "color", 'b')
axis([min(t), max(t), min(uo), max(uo)*1.001])
xlabel("Tiempo(s)")
ylabel("Señal sincronizada y fase (p.u.)")
h = legend("Sincronización", "Fase medida")
legend (h, "location", "southeast");
grid on

subplot(3, 1, 2)
plot(t, ph, "marker", 'o', "markersize", 0.5,
     t, theta_out, "marker", 'o', "markersize", 0.5)
axis([min(t), max(t), min(ph), max(ph)])
xlabel("Tiempo(s)")
ylabel("Fase(rad)")
h = legend("Fase ideal", "Fase medida")
legend (h, "location", "southeast");
grid on

subplot(3, 1, 3)
plot(t, f_out, "marker", 'o', "markersize", 0.5)
axis([min(t), max(t), min(f_out), max(f_out)])
xlabel("Tiempo(s)")
ylabel("Frecuencia(Hz)")
grid on
Simulación con Octave del SRF-PLL SOGI en redes monofásicas
Simulación con Octave del SRF-PLL SOGI en redes monofásicas

Con las pruebas realizadas hasta ahora se puede ver que el funcionamiento de este PLL parece muy bueno. Falta probarlo en una red monofásica real, lo cual puede verse en la entrada: Medir fase de red con arduino