Está en la página 1de 6

DISEO DE UN CIRCUITO INVERSOR DE POTENCIA

ETAPA DE CONTROL DEL INVERSOR


v1.01

DE: ADAM A. MAMANI QUISPE

OBJETIVO
Construir un generador PWM que sea capaz de regenerar una seal senoidal de 50Hz utilizando un Microcontrolador.
GENERANDO LA SEAL PWM
0422 Utilizando el MATLAB
Segn el grafico el objetivo de hacer un programa en
MatLab es generar una tabla de Datos que sea capaz de
otorgar al Microcontrolador los datos necesarios para poder
generar mediante extraccin de datos de un vector tabla
nuestra seal PWM el cual nos ser til para poder excitar
al circuito de potencia.

Tabla de
Datos

01.1 Diseo del Programa en MATLAB

En el archivo PWM_VAR tenemos el programa realizado en MatLab, este programa genera las dos formas de onda
necesarias para generar nuestra seal PWM:
Sawtooth de 25KHz

Senoidal de 50Hz

Luego de hacer una comparacin entre las dos seales esta es guardada en un vector denominado vpwm
Vpwm[500]
En este vector estarn los valores que sern necesarios para poder generar nuestra seal PWM, sin embargo estos valores
se encuentran en decimales y nosotros debemos de modificarlas en un rango de 0 a 255 puesto que estos valores enteros
determinaran el ancho del tren de pulsos, por tal razn se ve la necesidad de exportar estos datos del vector a un programa
realizado en EXCEL con el nombre de Tabla.xls el cual por ser tantos valores hemos transformado el resultado final en
CSV el cual nos dara el resultado final para ser exportado al Microcontrolador.

NOTA
(1) El programa necesita ser mejorado puesto que mediante lectura de documentaciones no es necesario muestrear
toda la onda completa puesto que el semiciclo positivo de la onda senoidal es la misma que el semiciclo negativo,
sin embargo se observara las necesidades finales de nuestro sistema completo para retroceder y mejorar el
programa.
(2) **EL CODIGO DEL PROGRAMA SE ENCUENTRA EN LA PARTE FINAL DEL INFORME
0418 Utilizando el MIKROC para compilar el Programa del uC
EL programa se realizo utilizando el compilador en Mikroc for AVR el cual tomando el vector tabla de 500 valores inicializa
el generador PWM y mediante unas lneas de cdigo va tomando los valores del vector tabla y el micro transforma estos
valores en el ancho de pulso de nuestra seal PWM.
Mediante ensayos y pruebas se logro generar una seal PWM de 25Khz bajo las siguientes condiciones:
-uControlador ATMEGA16
-Generador PWM en fastmode, sin preescaler.
-Oscilador externo de 6,4 Mhz
NOTA
(1) El primer inconveniente encontrado fue que al utilizar un compilador en lenguajeC y generar una seal de 25Khz la
sincronizacin entre el cambio del ancho de pulso y la generacin de la seal PWM era muy importante, dando
como objetivo analizar los tiempos que necesita cada bucle y darle retardos ASM NOP; para que cada estructura
completa antes de sacar un nuevo ciclo de seal PWM durara 40 us.. como el siguiente ejemplo de lnea de
cdigo
---------linea de cdigo del programa-------If(t<499)
//0,78 us
{
asm nop;
//0,16 us
PWM_Set_Duty(tabla[t]);
//6,25 us
t=t+1;
//0,78 us
}
//0,31 us

Dndonos un total de 8,28 us los cuales menos 40 us el cual dura cada ciclo del tren de pulso nos da un total de
31,72 us, es de esta manera que sacamos un retardo de 30us en lenguaje C y 0,72us en asembler.
(2) Al igual que en el programa se observo que no es necesario generar todos los datos del ciclo completo de tal
forma que se pensaron dos opciones para que nuestro circuito pueda excitar el tipo puente del amplificador de la
seal.
a. La primera opciones es generar dos seales PWM el cual nos pueda generar el semiciclo positivo y el
semiciclo negativo
b. Utilizar una serie de compuertas lgicas para que en determinado tiempo se genere la seal para el
semiciclo positivo y el otro para el semicilo negativo
(3) El cdigo en MikroC se encuentra al final del documento
U1
9

RESET

13
12
40
39
38
37
36
35
34
33

A
B
C

PA0/ADC0
PA1/ADC1
PA2/ADC2
PA3/ADC3
PA4/ADC4
PA5/ADC5
PA6/ADC6
PA7/ADC7

1
U1(PB3/AIN1/OC0)
2
3
4
5
6
7
8

PC0/SCL
PC1/SDA
PC2/TCK
PC3/TMS
PC4/TDO
PC5/TDI
PC6/TOSC1
PC7/TOSC2

XTAL1
XTAL2

PD0/RXD
PD1/TXD
PD2/INT0
PD3/INT1
PD4/OC1B
PD5/OC1A
PD6/ICP1
PD7/OC2

PB0/T0/XCK
PB1/T1
PB2/AIN0/INT2
PB3/AIN1/OC0
PB4/SS
PB5/MOSI
PB6/MISO
PB7/SCK

AREF
AVCC

22
23
24
25
26
27
28
29
14
15
16
17
18
19
20
21

32
30

ATMEGA16

C1(2)

R1
3k

C1
1uF

0422 Utilizando el MIKROC para compilar el Programa del uC


Con las observaciones del anterior circuito se han modificado las lneas de cdigo del programa C para tratar de resolver de
las dos maneras.
RESULTADOS
Cuando se intent utilizar dos generadores PWM se tropez con el problema bsico de la frecuencia de 25kHz y las lneas
de cdigo en C, por falta de tiempo y el propsito de ingresar al circuito Amplificador de Potencia, se opt por la segunda
opcin por motivos de simulacin del CIRCUITO DE DISPARO.
U1
VA

VA

U2

13
12

A
B

AND

U4

VB

U3

NOT

VB

C12(2)

R12
3k

AND

40
39
38
37
36
35
34
33
1
2
3
4
5
6
7
8

RESET
XTAL1
XTAL2
PA0/ADC0
PA1/ADC1
PA2/ADC2
PA3/ADC3
PA4/ADC4
PA5/ADC5
PA6/ADC6
PA7/ADC7
PB0/T0/XCK
PB1/T1
PB2/AIN0/INT2
PB3/AIN1/OC0
PB4/SS
PB5/MOSI
PB6/MISO
PB7/SCK
ATMEGA16

C12
1uF

PC0/SCL
PC1/SDA
PC2/TCK
PC3/TMS
PC4/TDO
PC5/TDI
PC6/TOSC1
PC7/TOSC2
PD0/RXD
PD1/TXD
PD2/INT0
PD3/INT1
PD4/OC1B
PD5/OC1A
PD6/ICP1
PD7/OC2

AREF
AVCC

22
23
24
25
26
27
28
29
14
15
16
17
18
19
20
21

32
30

ANEXO
PROGRAMA EN MATLAB

%-------------GENERADOR DE SEAL PWM-----------------------%


clc;
%limpia la pantalla del comand window
clear all;
%limpia los valores del workspace
close all;
%cierra todas las ventanas antes abiertas
%----------------------------------------------------------%
%Variables utlizados en el PROGRAMA
Fm=50
%input('Frecuencia del Modulador=');
Fp=25000
%input('Frecuencia de la Portadora=');
A=5;
%Variable que se le asigna a la Amplitud de la Seal
fs=1000000
%Numero de muestras que se tomaran en un segundo
%Tambien nos dara la resolucion de la seal ya que
%este Generador soporta hasta una frecuencia de
%25Khz de seal portadora.
t=(0:1/fs:1);
%vector tiempo de 0 a 1 segundo
%-----------------------%
mt=20000
%Variable que muestra un determinado rango de
%tiempo en otras palabras nos va a muestrear
%un rango menor al delimitado anteriormente
%-----------------------%
%---------------GENERADOR DE SEAL SENOIDAL---------------%
m=A*0.9*sin(2*pi*Fm*t); %la amplitud del mod debe ser < a la portadora
subplot(3,1,1);
plot(t(1:mt),m(1:mt));
xlabel('Tiempo');
ylabel('Amplitud');
title('Seal Modulante');
grid on;
%---------------GENERADOR DE SEAL SAWTOOTH---------------%
p=A*sawtooth(2*pi*Fp*t);
subplot(3,1,2);
plot(t(1:mt),p(1:mt));
xlabel('Tiempo');
ylabel('Amplitud');
title('Seal Portadora');
grid on;
%--------------GENERADOR DE SEAL PWM---------------------%
for i=1:mt
if (m(i)>=p(i))
pwm(i)=1;
else
pwm(i)=0;
end
end

%Generar un vector PWM con los datos del primer ciclo


%en funcion a mt, se compara las dos seales

subplot(3,1,3);
plot(t(1:mt),pwm(1:mt));
xlabel('Time');
ylabel('Amplitude');
title('plot of PWM');
grid on;
%-----------Guardar PWM EN EL VECTOR vpwm-----------%
q=1;
j=1;
for i=1:mt-1
vpwm(q,1)=j;

xor(pwm(i),pwm(i+1));
if(ans==1)
q=q+1;
j=0;
end
j=j+1;
end
vpwm(q,1)=j;
contador=1;
vect=1;
for i=1:q
if(contador==1)
vpwm1(vect,1)=vpwm(i,1);
vect=vect+1;
contador=contador-1;
else
contador=contador+1;
end
end

%----------Importar datos del Vector vpwm----------%


%se importaran los datos existentes de vpwm al programa diseado en excel
%para generar la tabla para el microcontrolador.

xlswrite('Tabla.xls',vpwm1,'VPWM','C6');

PROGRAMA 01 DE MIKOC
//GENERADOR DE SEAL PWM - 25kHZ//

//------------------------------------------------------------------//
//Determinar las variables
unsigned int t;
char
tabla[500]={134,134,134,134,140,140,140,140,140,147,147,147,147,153,153,147,153,153,159,159,159,159,166,159,166,16
6,166,172,172,172,166,172,179,179,179,179,185,185,185,185,185,191,191,191,191,191,185,198,198,198,198,198,204,204
,204,198,204,204,210,210,204,210,210,204,217,217,217,217,217,217,217,223,223,223,223,228,229,230,232,233,234,235,
237,238,239,240,242,243,244,245,247,248,249,250,252,253,254,255,257,258,
242,242,242,236,242,242,242,242,242,242,236,242,242,236,242,242,242,242,242,236,236,242,242,242,242,242,236,242,2
42,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,236,236,236,236,236,23
6,236,236,236,236,236,230,230,230,230,230,230,230,230,230,223,223,223,223,223,223,223,223,217,217,217,217,217,210
,210,210,210,210,210,210,210,204,204,198,204,204,198,198,198,
198,198,198,191,191,185,185,185,185,185,185,185,185,179,179,179,179,179,172,172,166,172,172,166,166,166,159,159,1
59,159,159,159,153,153,153,153,153,140,140,140,140,140,140,140,140,140,134,134,134,134,128,128,121,121,121,121,12
1,121,121,115,115,115,115,108,108,108,108,108,102,102,102,102,102,96,96,96,96,89,89,89,89,89,83,83,83,83,83,77,77,7
7,77,77,70,70,70,70,70,64,64,64,
64,64,64,57,57,57,57,57,51,51,51,51,51,51,51,45,45,45,45,45,45,38,38,38,38,38,38,38,38,32,32,32,32,32,32,26,32,32,26,2
6,26,26,26,26,26,26,26,26,26,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,13,19,19,19,19,19,19,19,19,19,19,
19,19,19,19,19,19,19,19,19,13,19,19,19,19,19,19,19,19,19,19,13,
19,13,26,26,26,26,26,26,26,26,19,26,19,32,26,32,32,32,32,32,32,32,38,32,38,32,38,32,38,45,45,45,45,45,45,45,51,51,51,5
1,45,51,57,57,57,57,57,57,64,64,64,64,57,70,70,70,70,70,70,77,77,77,77,70,83,77,83,77,89,89,89,89,89,96,89,96,89,96,96,
102,96,102,108,108,108,108,108,115,115,108,115,115,121,115,121,121,128,128,128,128
};
//Inicializar el programa
void main()
{

DDB3_bit=1;

//inicializa el PB3 como salida de la seal PWM

PWM_Init(_PWM_FAST_MODE, _PWM_PRESCALER_1, _PWM_NON_INVERTED,0);


PWM_Stop();
while(1)
{
PWM_Start();
while(1)
{
if(t<499)
{
asm nop;
PWM_Set_Duty(tabla[t]);
t=t+1;
}
else
{
PWM_Set_Duty(tabla[t]);
t=0;
asm nop;asm nop;asm nop;asm nop;asm nop;asm nop;asm nop;
}
Delay_us(30);
}
}
}
PROGRAM EN MIKROC 02

//GENERADOR DE SEAL PWM - 25kHZ//

//------------------------------------------------------------------//
//Determinar las variables
unsigned int t;
char
tabla[500]={134,134,134,134,140,140,140,140,140,147,147,147,147,153,153,147,153,153,159,159,159,159,166,159,166,16
6,166,172,172,172,166,172,179,179,179,179,185,185,185,185,185,191,191,191,191,191,185,198,198,198,198,198,204,204
,204,198,204,204,210,210,204,210,210,204,217,217,217,217,217,217,217,223,223,223,223,228,229,230,232,233,234,235,
237,238,239,240,242,243,244,245,247,248,249,250,252,253,254,255,257,258,
242,242,242,236,242,242,242,242,242,242,236,242,242,236,242,242,242,242,242,236,236,242,242,242,242,242,236,242,2
42,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,236,236,236,236,236,23
6,236,236,236,236,236,230,230,230,230,230,230,230,230,230,223,223,223,223,223,223,223,223,217,217,217,217,217,210
,210,210,210,210,210,210,210,204,204,198,204,204,198,198,198,
198,198,198,191,191,185,185,185,185,185,185,185,185,179,179,179,179,179,172,172,166,172,172,166,166,166,159,159,1
59,159,159,159,153,153,153,153,153,140,140,140,140,140,140,140,140,140,134,134,134,134,128,128,121,121,121,121,12
1,121,121,115,115,115,115,108,108,108,108,108,102,102,102,102,102,96,96,96,96,89,89,89,89,89,83,83,83,83,83,77,77,7
7,77,77,70,70,70,70,70,64,64,64,
64,64,64,57,57,57,57,57,51,51,51,51,51,51,51,45,45,45,45,45,45,38,38,38,38,38,38,38,38,32,32,32,32,32,32,26,32,32,26,2
6,26,26,26,26,26,26,26,26,26,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,13,19,19,19,19,19,19,19,19,19,19,
19,19,19,19,19,19,19,19,19,13,19,19,19,19,19,19,19,19,19,19,13,
19,13,26,26,26,26,26,26,26,26,19,26,19,32,26,32,32,32,32,32,32,32,38,32,38,32,38,32,38,45,45,45,45,45,45,45,51,51,51,5
1,45,51,57,57,57,57,57,57,64,64,64,64,57,70,70,70,70,70,70,77,77,77,77,70,83,77,83,77,89,89,89,89,89,96,89,96,89,96,96,
102,96,102,108,108,108,108,108,115,115,108,115,115,121,115,121,121,128,128,128,128

};
//Inicializar el programa
void main()
{
DDB3_bit=1;

//inicializa el PB3 como salida de la seal PWM

DDB0_bit=1;

//Activa puerto PB0 como Salida de control

PWM_Init(_PWM_FAST_MODE, _PWM_PRESCALER_1, _PWM_NON_INVERTED,0);


PWM_Stop();
while(1)
{
PWM_Start();
while(1)
{
if(t<249)
{
PORTB.B0=1;
asm nop;asm nop;asm nop;asm nop;asm nop;
asm nop;asm nop;asm nop;asm nop;asm nop;
PWM_Set_Duty(tabla[t]);
t=t+1;
}
else if(t<499)
{
PORTB.B0=0;
asm nop;
PWM_Set_Duty(tabla[t]);
t=t+1;
}
else
{
PORTB.B0=0;
PWM_Set_Duty(tabla[t]);
t=0;
asm nop;asm nop;asm nop;asm nop;asm nop;asm nop;asm nop;
}
Delay_us(25);
asm nop;asm nop;asm nop;asm nop;asm nop;
asm nop;asm nop;asm nop;asm nop;asm nop;
asm nop;asm nop;asm nop;asm nop;asm nop;asm nop;asm nop;asm nop;asm nop;asm nop;
}
}
}

También podría gustarte