Академический Документы
Профессиональный Документы
Культура Документы
UNIVERSIDAD NACIONAL DE
QUILMES
INGENIERA EN AUTOMATIZACIN Y
CONTROL INDUSTRIAL
Control de
Temperatura del
Invernadero
Profesor:
Jurez, Jos
Alumnos:
PEPA, Hernn Carlos
LIO, Guillermo Gustavo
Pgina 1 de 30
Sistemas Digitales
Introduccin
El proyecto consiste en un control de
temperatura de un invernadero. En el mismo
se
trata
de
controlar
la
temperatura
mediante un sistema de calefaccin y otro de
enfriamiento. El sistema de calefaccin
consta de tres lmparas de 150 watts, las
cuales son controladas (la potencia aplicada
a las mismas ) con modulacin de fase por
medio de una seal PWM .El sistema de
enfriamiento consta de un motor de corriente
continua con una hlice acoplada a su eje ,
el cual es el encargado de extraer el aire
que
se
encuentra
en
el
interior
del
invernadero produciendo una circulacin de
aire de recambio que genera una disminucin
de la temperatura. La actuacin sobre las
lmparas esta gobernada mediante una accin
PWM . Esta accin PWM, de muy baja
frecuencia,
es
posible
de
implementar
gracias a la utilizacin de un optotriac que
posee un circuito de deteccin de cruce por
cero, el cual se encarga de interfasear la
modulacin por ancho de pulso con la
modulacin de fase que se necesitara para
controlar potencia en corriente alterna. El
mismo optotriac actuar sobre un triac que
ser
quien
alimente
finalmente
a
las
lmparas.
Sobre el motor del extractor se aplicar un
PWM de baja frecuencia. Esta seal PWM es la
encargada de excitar un optoacoplador, el
mismo actuar sobre un mosfet que ser la
interfaz de alimentacin hacia el motor .
Se usarn dos sensores de temperatura y se
acondicionar la seal para poder usar el
conversor A/D del micro en todo su rango
Pgina 2 de 30
Sistemas Digitales
Pgina 3 de 30
Sistemas Digitales
FLUJO DEL
PROGRAMA
INICIALIZACION
GENERAL
MEDICION
TEMPERATURA
BARRER
TECLADO
CAMBIO
TECLAS?
NO
SI
ESTA EN MANUAL
O AUTOMATICO?
SUBIR O BAJAR SP
TECLAS = $01 => SUBIR SP
TECLAS = $02 => BAJAR SP
(FIJARSE QUE ESTE ENTRE 00-FF)
TECLAS = $03 => CAMBIAR A MANUAL
Pgina 4 de 30
Sistemas Digitales
ESTA EN MANUAL
O AUTOMATICO?
PI
% POTENCIA
=> LAMPARAS
NEG(% POTENCIA)
=> EXTRACTOR
MUESTRO
% POTENCIA
MUESTRO
TEMPERATURA
MUESTRO
SET POINT
Pgina 5 de 30
Sistemas Digitales
Diagrama En Bloques
Pgina 6 de 30
Sistemas Digitales
Entradas-Salidas
*2
entradas
analgicas
conectadas
conversor
A/D
del
micro
(sensor
temperatura).
al
de
Sistemas Digitales
Teclas_Nuevo =
pulsador Man/Auto
Man_Auto
Se
pulso
el
Pgina 8 de 30
Sistemas Digitales
Pgina 9 de 30
Sistemas Digitales
break;
}
case Decrementa:
{
//DECREMENTA EL SP O %POT
if(Fase == Manual)
{
Decre_Pot();//DECREMENTAR POTENCIA
}
else
{
Decre_Sp();//DECREMENTAR SP
}
break;
}
}
Funciones
Decre_Pot
Incre_Sp,
Decre_Sp,
Incre_Pot,
Sistemas Digitales
SP++;
}
Aux01 = Aux01_Valor;
}
}
void Decre_Sp(void) //DECREMENTA SP
{
Aux01--;
if(Aux01 == 0)
{
//Filtro por la velocidad del micro
if (SP != 0x00)
{
//Se fija que no me pase de $00
SP--;
}
Aux01 = Aux01_Valor;
}
}
Subrutina Barrido
En el archivo teclas se creo una subrutina
de assembler dedicada a leer el puerto de
los
pulsadores.
Se
logr
mezclar
el
assembler con el c para obtener un
cdigo mixto. Esta subrutina se la llam
desde el main de la siguiente forma:
//Declaracin
extern void Barrido(void);
//Barrido_Teclas();
Barrido();
Pgina 11 de 30
Sistemas Digitales
flanco.
_Barrido
_Ini_Var_ASM
PortC
Msk_PortC
PortC_Viejo
Ret_Tec
Ret_Tec_Val
Teclas_Viejo
_Teclas_Nuevo
PortC_Nuevo
Ret_Tec2
Ret_Tec2_Val
_Ini_Var_ASM:
ldaa
staa
ldaa
staa
ldaa
staa
Ret_Tec_Val
Ret_Tec
Ret_Tec2_Val
Ret_Tec2
#$FF
PortC
rts
;************************************
;BARRIDO DE TECLADO CON FILTRO
;DETECTA FLANCO SUBIDA
_Barrido:
;***************************************
;FILTRO TECLAS
ldaa
cmpa
beq
ldaa
staa
ldaa
staa
bra
PortC
PortC_Viejo
Barrido_10
Ret_Tec_Val
Ret_Tec
PortC
PortC_Viejo
Barrido_20
Pgina 12 de 30
Este
tiempo
Sistemas Digitales
Barrido_10:
dec
bne
ldaa
staa
ldaa
staa
Ret_Tec
Barrido_20
PortC_Viejo
PortC_Nuevo
Ret_Tec_Val
Ret_Tec
Barrido_20:
;***************************************
;***************************************
;DETECCION FLANCO SUBIDA
ldaa Teclas_Viejo
coma
staa Teclas_Viejo
ldaa PortC_Nuevo
coma
anda
Msk_PortC
anda Teclas_Viejo
staa _Teclas_Nuevo
ldaa PortC_Nuevo
coma
anda
Msk_PortC
staa Teclas_Viejo
;***************************************
;SUBIR Y BAJAR RAPIDO
;SOLO PARA ESTOS PULSADORES
;NO SE APLICA A CAMBIO DE FASE
ldaa
coma
cmpa
beq
cmpa
beq
bra
PortC_Nuevo
#$02
Barrido_30
#$04
Barrido_30
Barrido_40
Barrido_30:
dec Ret_Tec2
bne Barrido_40
staa _Teclas_Nuevo
Pgina 13 de 30
Sistemas Digitales
ldaa Ret_Tec2_Val
staa Ret_Tec2
Barrido_40:
;***************************************
rts
;***************************************
PortC:
Msk_PortC:
PortC_Viejo:
Ret_Tec: dc.b
Ret_Tec_Val:
Teclas_Viejo:
PortC_Nuevo:
Ret_Tec2: dc.b
Ret_Tec2_Val:
equ
equ
dc.b
$00
equ
dc.b
dc.b
$02
equ
$1006
$07
;3 PRIMEROS BITS
$00
;FILTRO POR REVOTE TECLAS
$01
$00
$00
;SUBIR Y BAJAR MAS RAPIDO
$01
Subrutina Ini_Var_ASM
Lo que hace esta subrutina es inicializar
las variables de assembler. Es llamada desde
el main de la siguiente manera:
//Declaracin
extern void Ini_Var_ASM(void);
//Inicio variables en assembler
Ini_Var_ASM();
_Ini_Var_ASM:
ldaa
staa
ldaa
staa
ldaa
staa
Ret_Tec_Val
Ret_Tec
Ret_Tec2_Val
Ret_Tec2
#$FF
PortC
rts
Pgina 14 de 30
Sistemas Digitales
Variables globales
Se creo un archivo variables_c para
contener todas las variables globales de mi
proyecto.
///////VARIABLES C////////
pausa_cls=0x1000;
pausa_lcd=0x0020;
char
datos_lcd[3];
char prom_conv=0;
char
conversion1=0,conversion2=0;
Control
Se llam a la funcin desde el cuerpo
principal del programa. Se fija la fase del
programa, si esta en Manual deja el %Pot
para que se modifique con los pulsadores. Si
esta en Auto lo que hace es calcular la
distancia de la variable de proceso con el
SetPoint y aplicar un %Pot proporcional a
esa distancia. En prom_conv tenemos el el
valor de la temperatura promediado. En SP
el SetPoint fijado.
Error= SP - prom_conv;
Pgina 15 de 30
Sistemas Digitales
0%
100%
Pgina 16 de 30
Sistemas Digitales
Pgina 17 de 30
Sistemas Digitales
RTI
//void rutina(void)
@interrupt void rutina(void) //Interrupcion de tiempo real
{
TFLG2=0x40;
//Barrido_Teclas();
Barrido();
cuenta--;
if(cuenta == 0)
{
//Conversor;
CAPTURA_CONVERSORAD();
Enviar();
control();
cuenta = 33;
}
switch(Teclas_Nuevo) //SWITCH CASE PRINCIPAL
{
......
}
}
Pgina 18 de 30
Sistemas Digitales
Conversor A/D
Los sensores de temperatura entran al
conversor A/D que esta configurado de modo
multiple y single scan.
Este conversor esta sincronizado con la RTI,
o sea que se llama a la rutina de conversin
desde dentro de la rutina de la RTI.
Configuracin del conversor A/D:
OPTION=0x80;
ADCTL=0x10;
Sistemas Digitales
{
ADCTL|=0x80;
while((ADCTL & 0x80)==0)//ESPERAR FIN DE CONVERSION
{
}
}
Conversin ASCII
La conversin
de los datos a ASCII se
realiza para enviar los datos al lcd.
Los datos de potencia , porcentaje de
actuacin, variable de setpoint y variable
medida de temperatura son cargadas a un
array datos_lcd[i] y mediante la funcin
que vemos a continuacin son convertidas a
ASCII
void ascci(char var_asci)
{
char i=3, resto=0;
datos_lcd[2] = var_asci/100; //guardamos la centena en
el vector
resto = var_asci-(datos_lcd[2]*100);
datos_lcd[1]=resto/10;//guardamos la decena
datos_lcd[0]= resto-(datos_lcd[1]*10);//guardamos
unidad
//convertimos a ascci
Pgina 20 de 30
la
Sistemas Digitales
while(i!=0)
{
i--;
datos_lcd[i]=datos_lcd[i] + 48;
}
}
Pgina 21 de 30
Sistemas Digitales
{
PAUSA(pausa_cls);
}
}
//*******************
// habilitar el lcd
//*******************
void ENABLE_LCD(void)
{
PORTF ^= 0x01;
PORTF &= 0xFE;
}
//************************
//pausa comandos lcd
//************************
void PAUSA(int b)
{
while(b!=0)
{
b--;
}
}
Envo al LCD
Las
funciones
que
se
describen
a
continuacin son utilizadas cada vez que el
refresco del display , o sea cada vez q
entro
en
la
rutina
de
servicio
de
interrupcin de la RTI , que fue configurada
previamente
para
actualizar
los
datos
aproximadamente cada 1000 milisegundos.
Con la siguiente funcin se enva un dato al
lcd, que previamente fue convertido a ASCII:
void Envio_Dato(char a)
{
PORTF ^= 0x04; //RS=1
PORTF &= 0xFD; //R/W=0
PORTA = a;
ENABLE_LCD();
PAUSA(pausa_lcd);
PORTF &= 0xF8; //
}
Pgina 22 de 30
Sistemas Digitales
void Enviar(void)
{
char i=3, aux;
Cursor(0x80);//Linea de Arriba
Envio_Dato('T');
Envio_Dato(' ');
//Acondiciono la Temp y convierto a ASCII
//Acondiciono la Temp y convierto a ASCII
aux = (char)((60*prom_conv)/255);
ascci(aux);
while(i != 0)
{
i--;
Envio_Dato(datos_lcd[i]);
}
Cursor(0xC0);//Linea de abajo
if(Fase == Manual)
{
Envio_Dato('P');
Envio_Dato(' ');
i=3;
//Acondiciono la Pot y convierto a ASCII
aux = (char)((100*Pot)/255);
ascci(aux);
while(i != 0)
{
i--;
Envio_Dato(datos_lcd[i]);
}
Pgina 23 de 30
Sistemas Digitales
//Envio_Dato(' ');
//Envio_Dato('%');
}
else
{
Envio_Dato('S');
Envio_Dato('P');
Envio_Dato(' ');
i=3;
//Acondiciono el SP y convierto a ASCII
aux = (char)((60*SP)/255);
ascci(aux);
while(i != 0)
{
i--;
Envio_Dato(datos_lcd[i]);
}
}
}
PWM
Se configuraron dos TOC para crear dos PWM.
while(1)
{
if((TFLG1&0x40)!=0)
{
TFLG1=TFLG1|0x40;
if(estado==0)//estadobajo)
{
TCTL1=TCTL1&(~0x40);
estado=1;//estadoalto;
TOC2=TOC2 + 10*Pot;
}
else
{
TCTL1=TCTL1|0x40;
estado=0;//estadobajo;
TOC2=TOC2 + (Periodo - 10*Pot);
}
}
//*****************************
//pwm lamparas de calefaccion
//*****************************
if((TFLG1&0x20)!=0)
{
Pgina 24 de 30
Sistemas Digitales
Pgina 25 de 30
Sistemas Digitales
Software de Desarrollo
Archivo LINKER:
#
#
#
Pgina 26 de 30
Sistemas Digitales
Pgina 27 de 30
Sistemas Digitales
S123026E0AF7001A860A3DE702E604E002F7001920126A0318CE0019E60
3183A18E600CB1D
S123028E3018E700E60326EAAE0038393C3C3018CE1000181C3080181F3
080FB18E6314F23
S12302AEED0018E632E300BD036E02FB00158900BD036E02F7001538383
9393C373630F676
S12302CE0027A6013DEB07F70018F6001EEB01F7001EF60026B6001E3DF
B0018F70018E6B6
S12302EE01F00021B600253DFB0018F70018F100242305F600242008F10
0232406F60023CA
S123030EF70018E601F70021F600183838397A000B260FF6000A5C27037
C000AF6000CF747
S123032E000B397A000B260EF6000A27037A000AF6000CF7000B397A000
B260FF6000D5CAA
S123034E27037C000DF6000CF7000B397A000B260EF6000D27037A000DF
6000CF7000B39F1
S123036E3C364D2A028D1830EE03EE008F164F8F028F306C0426026C036
D0031382A04403D
S123038E508200393C364D2A028DF430EE03EE008F164F8F0220DB18383
C373020061838DC
S11603AE3C3730368F308F18E00082008F35ED00186E015F
S903FFFFFE
Pgina 28 de 30
Sistemas Digitales
Conclusiones
Este proyecto nos permiti usar un lenguaje
poderoso como es el C para programar el
micro. Se pudo hacer un cdigo mixto, o sea,
parte en C y parte en assembler.
Se tuvieron problemas de falta de memoria lo
que provoc que no se modularise tanto como
se pretenda. Se termino grabando parte en
RAM y parte en ROM al ltime.
Pgina 29 de 30
Sistemas Digitales
Pgina 30 de 30