Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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
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
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
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
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;
//------------------------------------------------------------------//
//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;
DDB0_bit=1;