1. UNIVERSIDAD TÉCNICA FEDERICO SANTA MARÍA
DEPARTAMENTO DE ELECTRÓNICA
Laboratorio de Electrónica Industrial
INFORME FINAL
“Modulación por ancho de pulsos
pulsos”
Experiencia
Grupo
Fecha
6
Lautaro Narvaez P.
8
Juan Vargas H.
05/10/2010
Revisado por
Nota
2. Laboratorio de Electrónica Industrial, Segundo Semestre 2010
INTRODUCCIÓN Y OBJETIVOS
Actualmente se encuentran varias posibilidades a la hora de implementar algoritmos de control,
principalmente micro controladores y plataformas como FPGA y DSP (Procesador Digital de
Señales). Cada uno de estos dispositivos posee características diferentes, las cuales permiten
discernir en su elección dependiendo de la aplicación en que se desee utilizar.
En esta experiencia se programa un DSP Texas Instruments TMS320F2407 montado sobre la
tarjeta de desarrollo eZdsp2407b, con el fin de controlar un inversor trifásico, el que a su vez,
alimenta un motor. Existen varias tipos de modulación de convertidores: Con portadora,
vectorial, eliminación selectiva de armónicas, etc. En particular, se trabajará la modulación con
portadora, que es la más utilizada en convertidores industriales.
A través del DSP se generan las señales de disparo (señales PWM) del inversor. Para ello se debe
configurar los módulos adecuados, seteando los registros y habilitando interrupciones. También
se busca poder controlar la velocidad de giro del motor de forma análoga, lo que se logra
habilitando un ADC del dispositivo.
1.
INFORME FINAL
En las siguientes secciones se detalla el desarrollo de la experiencia. Se incluyen las imágenes
más representativas, además de comentarios y conclusiones relevantes. Debido a un problema
con el almacenamiento de las capturas del osciloscopio, se debió utilizar las imágenes obtenidas
de otro grupo en la primera parte (generación de señales PWM).
1.1
Instrucciones DSP
El primer paso para la generación de señales PWM es el correcto seteo de los registros más
importantes. Para ello, se hace uso del material adecuado, como la documentación y archivos
disponibles en la web del ramo.
En el preinforme de la experiencia se nombraron y detallaron algunos registros, además de los
valores que debían adoptar sus bits. Dentro de la serie de archivos de la web, se encuentran tres
principales: main.c, interr.c y init.c. Para la primera parte, se setean los registros T1PR, ACTRA,
COMCONA, T1CON y DBTCONA, los cuales se ubican en init.c.
Cabe destacar que el oscilador del DSP utilizado es de 14.7456MHz, pero la CPU interna debe
considerarse del doble de esta frecuencia, 29.4912MHz. Luego, para poder configurar los
registros como si el reloj fuese el de 14M, se debe hacer un escalamiento x/2, el cual se realiza en
T1CON.
1
3. Laboratorio de Electrónica Industrial, Segundo Semestre 2010
El registro T1PR guarda el valor límite de la cuenta del reloj, según la frecuencia que se requiera.
En este caso, se pide tener una frecuencia aproximada de 3[kHz]. Considerando el
preescalamiento x/2 se tiene (según lo obtenido en el preinforme)
T 1PR =
T
14.7456 M
=
= 2458 ⇔ 0 x099 A
2 ⋅ Tclock
2 ⋅ 3K
Las siguientes tablas muestran los valores de cada registro con una breve explicación de la
función de los bits más relevantes. El símbolo * indica que no es necesario setear el(los) bit en
cuestión, pudiéndose asignar indistintamente 0 o 1.
Tabla 1. ACTRA = 0xF666
bit
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
valor
1
1
1
1
0
1
1
0
0
1
1
0
0
1
1
0
Función
*Uso en PWM Vectorial
Salida activa baja de CMP6
Salida activa alta de CMP5
Salida activa baja de CMP4
Salida activa alta de CMP3
Salida activa baja de CMP2
Salida activa alta de CMP1
El registro ACTRA establece las acciones de control para el registro de comparación. Permite la
definición de las señales PWM y sus cuasi-complementos.
COMCONA es el registro que controla las unidades de comparación (para el gestor de eventos
EVA).
2
4. Laboratorio de Electrónica Industrial, Segundo Semestre 2010
Tabla 2. COMCONA = 0xA6FF
bit
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
valor
1
0
1
0
0
1
1
0
1
1
1
1
1
1
1
1
Función
Comparador Habilitado
El registro de comparación CMPRx se recarga
cuando T1CNT = 0 ó T1CNT = T1PR
PWM vectorial deshabilitada
El registro de acción de control se recarga
cuando T1CNT = 0 ó T1CNT = T1PR
Salida del comparador activada
*Reservado
*Reservados
Tabla 3. T1CON = 0x0946
bit
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
valor
0
0
0
0
1
0
0
1
0
1
0
0
0
1
1
Función
*Free
*Reservados
Modo de conteo: Up/Down Continuo
Preescala reloj de entrada: x/2
T2SWT1
Timer 1 habilitado
Selección de la fuente de reloj: Interno
El registro se recarga cuando el valor del
contador es 0 o igual a T1PR
Comparador habilitado
3
5. Laboratorio de Electrónica Industrial, Segundo Semestre 2010
0
0
SELT1PR
En T1CON los bits 9-8 son muy importantes ya que definen la base del reloj. Es necesario una
correcta y consecuente elección, de modo que T1PR pueda elegirse para lograr los 3kHz, tal y
como se hizo.
Tabla 4. DBTCONA = 0xFFEB
bit
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
valor
1
1
1
1
1
1
1
1
1
1
1
0
1
0
1
1
Función
*Reservados
Periodo de la banda muerta (M=15)
Banda muerta para PWM5 y PWM6 habilitada
Banda muerta para PWM3 y PWM4 habilitada
Banda muerta para PWM1 y PWM2 habilitada
Preescala de la banda muerta (P=4)
*Reservados
Como se explicó en el preinforme, la implementación de un tiempo o banda muerta es muy
importante para evitar cortocircuitar la fuente de alimentación mientras conmutan los
semiconductores de una misma pierna. Es por esto que el registro DBTCONA es trascendental y
una correcta configuración asegura un funcionamiento inequívoco del circuito.
Teniendo en cuenta que DBTCONA[11-8] = M corresponden al periodo de la banda muerta (DB)
y DBTCONA[4-2] = x/P, donde x es el reloj del sistema y P la preescala, se tiene
DB = 2 µ s = P ⋅ M ⋅ Tclock
P ⋅ M = 2 µ ⋅ 29.4912 M ≈ 60
Por lo tanto se eligen convenientemente P y M, de modo tal que su producto sea 60. En este caso,
se eligió P = 4 y M = 15.
4
6. Laboratorio de Electrónica Industrial, Segundo Semestre 2010
Según se mencionó, todos estos registros se cargaron en el archivo init.c.
1.2
Señales PWM
Con la correcta disposición de cada uno de los registros expuestos en la parte anterior, se puede
proceder a generar señales PWM con ciclos de trabajo constantes (índice de modulación
constante). Para ello, se debe asignar valores adecuados a los comparadores CMPR1, CMPR2 y
CMPR3. Estos comparadores adoptan valores que se relacionan linealmente con T1PR,
considerando a este como un ciclo de trabajo de 100%, luego
CMPR1 = 20% ⋅ T 1PR = 492 = 0 x01EC
CMPR 2 = 40% ⋅ T 1PR = 983 = 0 x03D 7
CMPR3 = 20% ⋅ T 1PR = 1844 = 0 x0734
Utilizando el software adecuado se cargan los diferentes archivos y se procede a compilar el
proyecto. Se obtiene una imagen similar a la siguiente
Figura 1. Señales PWM y cuasi-complementarias con ciclo de trabajo 20%, 40% y 75%
A pesar de no ser la imagen original del grupo, se puede dar fe que las obtenidas en la
experiencia fueron muy similares respecto de los valores logrados.
5
7. Laboratorio de Electrónica Industrial, Segundo Semestre 2010
Comprobado el funcionamiento del módulo PWM, es pertinente apreciar si se cumple la
restricción del tiempo muerto. Para ello, basta con hacer un zoom a la conmutación de una señal
con su cuasi-complemento. Se aprecia una imagen como la siguiente
Figura 2. Banda muerta de 2[us]
Las últimas dos señales están separadas por una banda muerta de app. 2[us]. Si bien es cierto,
sólo se puede observar la característica para una señal, las otras dos contienen el mismo tiempo
ya que fueron configuradas de igual forma.
Extendiendo la idea para las señales, es posible generarlas con un índice de modulación variable,
dado por una señal sinusoidal. Luego, con la siguiente sección de código implementada en el
archivo de interrupciones (sólo lo relevante, ya que en el anexo se incluye el código completo), se
pueden obtener las señales antes mencionadas.
int A=0x04CD-50;
float freq=50.;
int offset=0x04CD;
if (t==(3000/freq)) t=0;
t=t+1;
arg=(4*Pi*freq *(t/3000));
CMPR1 = (int)(A*sin(arg))+offset;
CMPR2 = (int)(A*sin(arg+2*pi/3))+offset;
CMPR3 = (int)(A*sin(arg+4*pi/3))+offset;
Lo anterior admite una asignación variable (sinusoidal) a los comparadores de cada PWM, lo que
a su vez permite tener un índice de modulación variable. Se aprecia que existe un offset fijado
6
8. Laboratorio de Electrónica Industrial, Segundo Semestre 2010
justo en la mitad del valor de T1PR, lo que sumado a una sinusoidal de casi la misma amplitud
(se disminuye levemente el valor para poder generar las señales sin distorsión por
sobremodulación) entregan los valores de cada CMPRx. Además, se utiliza un contador t que
aumenta su cuenta cada vez que se ingresa a la interrupción y se recarga cuando alcanza el valor
de 3000/freq, que corresponde a los ciclos de portadora que calzan en un periodo de la referencia.
Con esto es posible generar una base de tiempo y así obtener las señales sinusoidales para las
referencias. Con la modificación hecha se puede cargar el código al DSP, obteniéndose una
imagen como la siguiente.
Figura 3. Señales PWM con referencia sinusoidal
Se observa un patrón que se repite cada 20[ms] ó su equivalente en frecuencia de 50[Hz].
1.3
Control a través de un potenciómetro
Ahora, para modificar la frecuencia y la amplitud de la referencia en tiempo real utilizamos el
conversor análogo digital (ADC) que posee la DSP.
Figura 4. Conexión de las señales analógicas de entrada
7
9. Laboratorio de Electrónica Industrial, Segundo Semestre 2010
El problema de la implementación que se hizo en la sección anterior es que una variación directa
de la frecuencia dentro de la sinusoide en tiempo real provocaría cambios de fase. Para
solucionarlo se implementa la frecuencia a través de la discretizacion del valor del ángulo
siguiente:
∆ߠ = ߱ ∗ ∆ݐ
Luego, se tiene la siguiente modificación del código
f=50*data/1023;
A=data*0x04CD/1023;
theta[1]=4*Pi*f/3000.+theta[0];
if(theta[1]>=2000*Pi) theta[1]=0;
theta[0]=theta[1];
CMPR1=(int)(A*sin(theta[1]))+offset;
CMPR2=(int)(A*sin(theta[1]+2.*Pi/3.))+offset;
CMPR3=(int)(A*sin(theta[1]-2.*Pi/3.))+offset;
La variable del ángulo se resetea a través del if, siendo todo lo demás un desglose de la ecuación
mostrada inicialmente. El registro data es una variable que va desde 0 a 1023 y proviene del
convertidor A/D pudiendo ser esta variable modificada a través del potenciómetro conectado.
Además de variar la frecuencia proporcionalmente variamos la amplitud: A=data*0x0999/1023.
Lo anterior, a partir de A/f = cte. que permite las variaciones proporcionales de amplitud y
frecuencia.
1.4
Conexiones
El siguiente paso fue la conexión de la DSP a un rectificador trifásico alimentado con una fuente
de poder DC y esto alimentando un motor AC. Entre el conversor AC/DC interviene un
transformador que permite el desacoplo de las tierras.
Figura 5. Interconexión de los los dispositivos
8
10. Laboratorio de Electrónica Industrial, Segundo Semestre 2010
1.5
Conexión Inversor y Motor
Por un tema de tiempo, ocupamos las conexiones del grupo vecino cambiando la DPS. Por lo
que los detalles de las conexiones no pudimos apreciarlos en su totalidad.
Una vez conectados los dispositivos, se comprobó que funcionaba correctamente el control de
la frecuencia y la amplitud de la señal de potencia, entregada al motor controlada por el
potenciómetro. Si aumentamos la frecuencia aumentamos la amplitud y si disminuimos la
frecuencia disminuimos la amplitud. La frecuencia máxima son los 50 ciclos por segundo, sin
embargo la amplitud disminuía a una tasa menor que a la que disminuía la frecuencia.
En la siguiente captura podemos apreciar el voltaje que se encuentra entre el punto medio de
una pierna y el 0 de la fuente.
Figura 6. Voltaje en un igbt y su fft
Se puede apreciar una señal de dos niveles pues el voltaje en un IGBT de la parte inferior de
una pierna puede tomar los valores Vcc y 0. Las formas oscilatorias, posiblemente se deben a
un problema de resolución de los instrumentos de medición, pues como lo indica la
transformada de Fourier que viene incluida en la captura, la frecuencia fundamental es la
frecuencia de switcheo (portadora de la PWM 3kHz).
En la siguiente captura podemos apreciar la corriente de 2 fases (verde y amarillo) y el voltaje
entre fases (morado).
9
11. Laboratorio de Electrónica Industrial, Segundo Semestre 2010
Figura 7. Voltaje entre 2 fases (morado) y corriente por 2 fases
La inductancia del motor filtra la componente de alta frecuencia y permite que la corriente sea
principalmente una señal de 50Hz, con un ligero riple, la amplitud de estas corrientes es de
203mA y su desfase es 129 grados, esto es porque las componentes armónicas ensanchan la señal
y resulta poco preciso con los punteros del osciloscopio medir el desfase.
La señal de voltaje posee 3 niveles porque es la resta de los voltajes de los IGBT de 2 piernas que
son cada una voltajes de 2 niveles como se indica en el siguiente diagrama:
Figura 8. Voltaje en los semiconductores y el voltaje entre 2 fases
10
12. Laboratorio de Electrónica Industrial, Segundo Semestre 2010
A medida que fuimos disminuyendo la frecuencia se comienza a apreciar de forma mas clara el
efecto del tiempo muerto sobre las señales.
Figura 9. Voltaje en los semiconductores y el voltaje entre 2 fases
Esto sucede porque cada vez que se invierte la polaridad de la corriente ocurre un cambio en el
voltaje positivo o negativo dependiendo de la polaridad de la corriente.
Figura 10. Efecto del tiempo muerto
Este efecto no lineal se puede compensar a través un lazo de control realimentado de corriente
11
13. Laboratorio de Electrónica Industrial, Segundo Semestre 2010
CONCLUSIONES
El desafío de esta experiencia fue implementar un algoritmo en un DSP que permitiera controlar
un inversor conectado a un motor. Para ello se configuraron señales PWM que sirvieron como
señales de disparo del inversor trifásico.
En la primera parte de la experiencia se debió establecer los valores de ciertos registros
necesarios para el funcionamiento del DSP. Dado que se contaba con los archivos “.c” necesarios
para crear un proyecto, basto con el seteo de registros para obtener señales con ciclo de trabajo
constante. En la siguiente implementación, se debió hacer variar la referencia para así lograr
controlar el índice de modulación. Para esto fue necesario el uso de interrupciones, las cuales
paralizan la ejecución normal del código para hacer una acción preajustada. Esto permite tener
una frecuencia a la salida del convertidor fijada con los parámetros del DSP. En el caso del
laboratorio, se utilizaron 50[Hz] los cuales se obtuvieron con un mínimo error.
En la segunda parte se modificó el código, para que con un potenciómetro, fuese posible variar en
tiempo real la amplitud y frecuencia de la sinusoidal que domina la referencia para las señales
PWM, de modo que estas tuviesen una relación proporcional (A/f=cte). De este modo, al conectar
el motor se pudo variar su velocidad de giro a través de un potenciómetro conectado al ADC del
DSP. Gracias a esto, se pudo observar de mejor manera los efectos producidos en la corriente y
voltaje del motor.
Un detalle importante, y que no se detalla en el informe ya que por razones de tiempo no se pudo
analizar con detención, es el uso de un transformador y optoacopladores para el aislamiento de
tierras. La principal razón es la aislación del circuito de control y de potencia, ya que una mala
implementación podría destruir el DSP.
12
14. Laboratorio de Electrónica Industrial, Segundo Semestre 2010
ANEXO
A continuación se presentan los códigos de los archivos main.c, interr.c y init.c.
main.c:
#include
"f2407_c.h"
/****************************** MAIN ROUTINE ***************************/
void main(void)
{
InitSCSr();
InitWD();
InitIOPort();
InitGPT();
InitADC();
/*** Setup the core interrupts ***/
IMR = 0x0000;
IFR = 0x003F;
IMR = 0x0001;
/* clear the IMR register */
/* clear any pending core interrupts */
/* enable desired core interrupts (_adc_isr) */
InitEVx();
/*** Enable global interrupts ***/
asm(" CLRC INTM");
/* enable global interrupts */
/*** Proceed with main routine ***/
while(1)
{asm ("
nop");
}
/* endless loop, wait for interrupt */
}
/* end of main() */
init.c:
#include
"f2407_c.h"
/*** Seteo de los registros de control de los timers,
y las unidades PWM ***/
void InitGPT(void)
{
T1PR=0x099A;
ACTRA=0xF666;
COMCONA=0xA6FF;
T1CON=0x0946;
DBTCONA=0xFFEB;
//CMPR1=0x01EC;
//CMPR2=0x03D7;
//CMPR3=0x0734;
}
/*** Seteo de los registros de control del conversor AD ***/
void InitADC(void)
{
/*Aquí coloque los registros de ajuste del ADC*/
GPTCONA= 0x0100;
ADCTRL1= 0x6480;
ADCTRL1= 0x2480;
13
15. Laboratorio de Electrónica Industrial, Segundo Semestre 2010
ADCTRL2= 0x4700;
ADCTRL2= 0x0700;
MAX_CONV=0x0000;
CHSELSEQ1=0x0000;
}
.
.
.
interr.c:
/********************** INTERRUPT SERVICE ROUTINES *********************/
#include
"f2407_c.h"
#include
<math.h>
#define Pi 3.1415926536
float data;
int z=0;
int n=0;
float t=0;
float theta[]={0,0};
int offset=0x04CD;
int A=0;
float f=0;
//int A=0x04CD-50;
//float f=50.;
interrupt void adc_isr(void)
{
/*Aquí coloque las interrupciones activadas por el ADC*/
data=RESULT0>>6;
f=50*data/1023;
A=data*0x04CD/1023;
theta[1]=4*Pi*f/3000.+theta[0];
if(theta[1]>=2000*Pi) theta[1]=0;
theta[0]=theta[1];
CMPR1=(int)(A*sin(theta[1]))+offset;
CMPR2=(int)(A*sin(theta[1]+2.*Pi/3.))+offset;
CMPR3=(int)(A*sin(theta[1]-2.*Pi/3.))+offset;
EVAIFRA=0xFFFF;
ADCTRL2=0x0700;
}
interrupt void timer1_isr(void)
{
}
interrupt void timer2_isr(void)
{
}
14