Universidad Autnoma de Ciudad Jurez
Sistemas con Microprocesador
Dr. Juan de Dios Cota
Miembros del equipo:
Karen Alejandra Ortega 103667
Ral Ruiz 98940
Proyecto Final
27 de noviembre del 2013
Teora
Uno de los principios utilizados en el proyecto es la transmisin serial, la cual nos
permite visualizar en pantalla el resultado que es arrojado por el microprocesador.
La comunicacin serial consiste en el envo de un bit de informacin de manera
secuencial, esto es, un bit a la vez y a un ritmo acordado entre el emisor y el
receptor. Especficamente el AT89LP6440 utiliza un Receptor Transmisor
Asncrono Universal (UART). Se usa para la transmisin de datos asncronos
entre DTE (equipo de terminal de datos) y el DCE (equipo de comunicacin de
datos).
Este utiliza una funcin de recibir - almacenar, lo que significa que puede
comenzar a recibir un segundo byte antes de un byte recibido previamente ha sido
ledo desde el registro de recepcin. El puerto serie tambin es capaz de recibir y
transmitir registros a la vez activando la Funcin Especial Registrar en SBUF.
Para la trasmisin de estos datos en hardware se utiliz El MAX232 el cual es un
controlador / receptor dual que incluye un generador de tensin capacitiva para
suministrar niveles de tensin TIA/EIA-232-F desde una sola fuente de 5 V. Cada
receptor convierte las entradas TIA/EIA-232-F a 5-V niveles TTL / CMOS.
Para realizar el censado de temperatura se utiliz el LM35 el cual es un sensor de
temperatura con una precisin calibrada de 1C. Su rango de medicin abarca
desde -55C hasta 150C. Su salida es lineal y cada grado centgrado equivale a
10mV. Debido a que este voltaje es pequeo se implement un seguidor y un
amplificador diferencial no inversor con una ganancia 3.3V, ya que este es el valor
mximo de voltaje utilizado en el microprocesador.
Como actuador se utiliz el 2n7000 el cual est diseado para minimizar la
resistencia en el estado, al mismo tiempo proporciona un rendimiento de
conmutacin robusta, fiable y rpida. Se puede utilizar en la mayora de las
aplicaciones que requieren hasta 400 mA de CC y pueden entregar corrientes
pulsadas hasta 2A. Es especialmente adecuado para la baja tensin, las
aplicaciones de baja corriente como pequeo control servo motor, controladores
de puerta MOSFET de potencia, y otras aplicaciones de conmutacin.
Para poder manipular los datos entrantes al microprocesador se implement un
ADC, el objetivo bsico de un ADC es transformar una seal elctrica anloga en
un nmero digital equivalente. Esta funcin exige que los pasos intermedios se
realicen de forma ptima para no perder informacin. Segn el tipo de
componente y su aplicacin existen distintos parmetros que lo caracterizan, stos
pueden ser: la velocidad de conversin, la resolucin, los rangos de entrada, etc
el AT89LP6440 tiene una resolucin de 10 bits con 6.5 ms de tiempo de
conversin con 8 canales multiplexados o 4 Canales Diferenciales, entre otras
caractersticas.
Hardware
- 10 resistencias de 1K
- AT89LP6440
- 2 capacitores cermicos 15 pF
- 1 cristal 12 Mhz
- 1 capacitor electroltico 10 F
- 1 Dipswitch
- 4 capacitores 1F
- 1 max 232N
- 1 2n7000
- 2 resistencia 100
- 1 lm324
- 1 lm35
- 1 resistencia 2.2 K
- 1 cable para transmisin
serial
Desarrollo
En este proyecto final se desarrolla un sistema de lazo cerrado utilizando el sensor
de temperatura LM35. El objetivo del proyecto es hacer que se regule la
temperatura de una resistencia utilizando el PWM.
Fig. 1
Como primer paso, leemos el valor del Set-point que se encuentra ubicado en el
Dip-switch(8) en la parte derecha del protoboard. Para leer el valor de este switch,
se utiliz el puerto 1 del microcontrolador AT89LP6440.
Fig. 2
Fig. 3
Para poder convertir el valor en temperatura se realiz una simple regla de 3,
donde el valor de 255 es de 100C. Dando como resultado la siguiente ecuacin.
Donde a es el valor del set-point y cod es el valor ledo en binario del puerto 1.
Para realizar esto, se utiliz la siguiente parte del cdigo.
//Aqui se hace la parte del Setpoint
x=P1;
preparar(x);
retardo();
enviar();
limpiar();
void preparar(unsigned int cod)//recibe el valor del ADC
{
float a;
a=cod/2.55;
Setpoint=a;
a=a*100;
De=a/1000;
U=(a/100)- De*10;
d=(a/10)-De*100-U*10;
Fig. 4 Fig. 5
c=a-De*1000-U*100-d*10;
De1=De+48;
U1=U+48;
d1=d+48;
c1=c+48;
}
void enviar(void)//transmitir a la pc
{
unsigned char c;
for (c=0;Set[c]!='\0';c++)
{
while(!TI){} // esperando que TI sea 1
SBUF=Set[c];
TI=0;
}
//Enviando el valor de D
while(!TI){} // esperando que TI sea 1
SBUF=De1;
TI=0;
//Enviando el valor de U
while(!TI){} // esperando que TI sea 1
SBUF=U1;
TI=0;
//Enviando el punto
while(!TI){} // esperando que TI sea 1
SBUF='.';
TI=0;
//Enviando el valor de d
while(!TI){} // esperando que TI sea 1
SBUF=d1;
TI=0;
//Enviando el valor de c
while(!TI){} // esperando que TI sea 1
SBUF=c1;
TI=0;
for (c=0;grados[c]!='\0';c++)
{
while(!TI){} // esperando que TI sea 1
SBUF=grados[c];
TI=0;
}
//TAB
while(!TI){} // esperando que TI sea 1
SBUF=9;
TI=0;
}
La siguiente parte del proyecto fue el acondicionamiento del sensor LM35.
Sabiendo que el LM35 es un sensor lineal, pudimos sacar fcilmente la ganancia
que necesitamos con la siguiente ecuacin:
Donde V
max
ADC= 3.3 V y Vs
max
= S
sensor
*Temp
max
= (10mV)(100C)=1
Para poder implementarlo, utilizamos dos OPAMPS, el primero fue para utilizarlo
como seguidor de voltaje para que el pequeo voltaje que reciba del sensor LM35
no sufra modificaciones por la corriente. En el segundo OPAMP, utilizamos la
configuracin del no inversor para llegar a la ganancia que necesitbamos.
Anexamos una resistencia en serie de 100 Ohms a la que tenamos de 2.2KOhms
para que los clculos nos salieran exactos. La salida del segundo OPAMP iba
conectada al P0_1 del AT89LP6440.
Sensor
Resistencias
de 100
Ohms y 2.2
KOhms
Resistencia
De 1 KOhm
Seguidor de
voltaje
Fig. 6
Como en la parte anterior, para poder convertir el valor en temperatura se realiz
una simple regla de 3, donde el valor de 1023 es de 100C. Dando como resultado
la siguiente ecuacin.
Donde Tempera1 es el valor en C de la temperatura y value es el valor arrojado
por el ADC. Para realizar esta parte se utiliz la siguiente parte del cdigo.
if (ADC_Data_Ready)//Comienza la parte del ADC
{
unsigned int aux;
aux = DADH+2;//se convierte a signed
value=aux*256+DADL; //Get the new unsigned output digital code
Tempera=(value*100);
Tempera1=(Tempera/BU);
prepararLM(Tempera1);
retardo();
enviarLM();
.
void prepararLM(float cod)//recibe el valor del ADC
{
unsigned int a;
a=cod*100;
De=a/1000;
U=(a/100)-De*10;
d=(a/10)-De*100-U*10;
c=a-De*1000-U*100-d*10;
De1=De+48;
U1=U+48;
d1=d+48;
c1=c+48;
}
void enviarLM(void)//transmitir a la pc
{
unsigned char c;
for (c=0;Temp[c]!='\0';c++)
{
while(!TI){} // esperando que TI sea 1
SBUF=Temp[c];
TI=0;
}
//Enviando el valor de D
while(!TI){} // esperando que TI sea 1
SBUF=De1;
TI=0;
//Enviando el valor de U
while(!TI){} // esperando que TI sea 1
SBUF=U1;
TI=0;
//Enviando el punto
while(!TI){} // esperando que TI sea 1
SBUF='.';
TI=0;
//Enviando el valor de d
while(!TI){} // esperando que TI sea 1
SBUF=d1;
TI=0;
//Enviando el valor de c
while(!TI){} // esperando que TI sea 1
SBUF=c1;
TI=0;
for (c=0;grados[c]!='\0';c++)
{
while(!TI){} // esperando que TI sea 1
SBUF=grados[c];
TI=0;
}
//TAB
while(!TI){} // esperando que TI sea 1
SBUF=9;
TI=0;
}
En el siguiente paso, se implement la parte del PWM, aqu utilizamos una
resistencia de 100 Ohms de 1 Watt de potencia para disipar calor. El objetivo de
esta fase era controlar la temperatura de la resistencia. Si la temperatura del set-
point era mayor a la que lea el sensor LM35, la resistencia empezaba a
calentarse aumentando el ciclo de trabajo del PWM. En caso contrario, si la
temperatura que lea el sensor era mayor que el set-point, entonces el ciclo de
trabajo se reduca haciendo que la resistencia dejara de disipar calor.
Para implementarlo en el protoboard, se utiliz un FET 2N7000. Para energizar la
resistencia de 1 Watt de potencia se le metieron 8.6 Volts, ya que debido a la
frmula de potencia:
Lo suficiente para calentar la resistencia, pero no para quemarla.
Para poder realizar la implementacin final, se utilizaron las siguientes lneas de
cdigo:
// Comienza la parte del PWM//////////////////
if (Tempera1>Setpoint)
{
//Baja PWM
tempStart();
tempDown();
}
else if(Tempera1==Setpoint)
{
//Se queda igual
tempStop();
}
else
{
//Sube PWM
tempStart();
tempUp();
}
DutyC= (RH0*100);
DC= (DutyC/BU);
//Calculando el Duty Cycle
//DC=((100)*(RH0/1023));
PWM(DC);
retardo();
Resistencia de 1 KOhm
2N7000
Salida del P3_4
del PWM,
conectada al
2N7000
Resistencia de 1
Watt pegada al
LM35
Fig. 7
enviarDuty();
void enviarDuty(void)//transmitir a la pc
{
unsigned char c;
for (c=0;Set[c]!='\0';c++)
{
while(!TI){} // esperando que TI sea 1
SBUF=Duty[c];
TI=0;
}
//Enviando el valor de D
while(!TI){} // esperando que TI sea 1
SBUF=De1;
TI=0;
//Enviando el valor de U
while(!TI){} // esperando que TI sea 1
SBUF=U1;
TI=0;
//Enviando el punto
while(!TI){} // esperando que TI sea 1
SBUF='.';
TI=0;
//Enviando el valor de d
while(!TI){} // esperando que TI sea 1
SBUF=d1;
TI=0;
//Enviando el valor de c
while(!TI){} // esperando que TI sea 1
SBUF=c1;
TI=0;
//TAB
while(!TI){} // esperando que TI sea 1
SBUF='%';
TI=0;
//TAB
while(!TI){} // esperando que TI sea 1
SBUF=10;
TI=0;
while(!TI){} // esperando que TI sea 1
SBUF=13;
TI=0;
}
void tempUp(void)
{
if(RH0<0XFF)
{ RH0++;
var=RH0;
retardo();
}
else
{ RH0=0xFF;
var=RH0;
}
}
void tempDown(void)
{
if(RH0>0X01)
{ RH0--;
var=RH0;
retardo();
}
else
{
RH0=0X01;
var=RH0;
}
}
void tempStop(void)
{
TCONB=0X00;
P3_4=0;
if(RH0!=0)
{ var=RH0;
}
RH0=0x00;
}
void tempStart(void)
{ TCONB=0X40;
P3_4=1;
RH0=var;
}
void PWM(unsigned int cod)
{
float a;
a=cod/2.55;
a=a*1000;
De=a/1000;
U=(a/100)- De*10;
d=(a/10)-De*100-U*10;
c=a-De*1000-U*100-d*10;
De1=De+48;
U1=U+48;
d1=d+48;
c1=c+48;
}
Por ltimo la comunicacin de Microcontrolador a PC se realiz con el puerto serial, utilizamos un
cable con conector DB9 Hembra, las computadoras de la escuela y el programa hyperterminal en
su versin de evaluacin para Windows 7. Se utiliz el MAX 232 para poder ajustar los niveles de
voltaje que utiliza el microcontrolador.
Software
#include <at89lp6440.h>
//Funciones
void Initialization(void);
void retardo(void);
//Funciones comunicacion serie------------
void limpiar(void);
void preparar(unsigned int valor);
void enviar(void);
void prepararLM(float cod);
void enviarLM(void);
void enviarDuty(void);
//Funciones PWM
void PWM(unsigned int cod);
void tempUp(void);
void tempDown(void);
void tempStop(void);
void tempStart(void);
//Variables
bit ADC_Data_Ready;
unsigned int BU,T;
unsigned int De, U, d,c, De1, U1, d1, c1, variable ;
Fig. 8
float V,R,Tempera,Tempera1,DutyC,DC,Setpoint;
unsigned char var;
unsigned char Set[]="Set-Point ";
unsigned char Temp[]="Temperatura:";
unsigned char Duty[]="Duty Cycle:";
unsigned char grados[]="C";
void main(void)
{
unsigned int x, value;
Initialization();
while(1)
{
//Aqui se hace la parte del Setpoint
x=P1;
preparar(x);
retardo();
enviar();
limpiar();
if (ADC_Data_Ready)//Comienza la parte del ADC
{
unsigned int aux;
aux = DADH+2;//se convierte a signed
value=aux*256+DADL; //Get the new unsigned output digital code
Tempera=(value*100);
Tempera1=(Tempera/BU);
prepararLM(Tempera1);
retardo();
enviarLM();
// Comienza la parte del PWM//////////////////
if (Tempera1>Setpoint)
{
//Baja PWM
tempStart();
tempDown();
}
else if(Tempera1==Setpoint)
{
//Se queda igual
tempStop();
}
else
{
//Sube PWM
tempStart();
tempUp();
}
ADC_Data_Ready=0;
DADC |=0x40; //Starts a new conversion
}
DutyC= (RH0*100);
DC= (DutyC/BU);
//Calculando el Duty Cycle
//DC=((100)*(RH0/1023));
PWM(DC);
retardo();
enviarDuty();
}
}
void Initialization(void)
{
V=3.2; //Voltaje del circuito
R=0.00312;
BU=1023;//numero de bits del ADC
P1=0;
ADC_Data_Ready=0;
//P1 as only input
P1M0=0xFF;
P1M1=0x00;
//P0 as only input
P0M0=0xFF;
P0M1=0x00;
//Enable the ADC interrupt
EA =1; // bit EA is set (IE.7)
IE2 |=0x08;
//Configure the ADC
DADI=0x80; //
DADC=0x50; //
//-------------------------
//Serial communication
PCON &=0X7F;
SCON=0X52; //Mode 1:8-bit data,1 stop bit, variable Baud rate asynchronous
TMOD |=0X20; // Timer 1 in mode 2 (8-bit auto-reload).
TH1=0xD9; //9615 BR
TL1=TH1;
TR1=1; // runs the timer1
ES=0; //Interrupt not enabled.
//PWM
TCONB|=0X40;
P3M1=0XFC;
P3M0=0X00; //P3_0 y P3_1 configurado como quasi bidireccional, las demas como push
pull
TMOD|=0x01;
RH0=0X7F;//inicializando el valor
RL0=0XFF;
TR0=1;
}
//Funciones comunicacion serie------
void limpiar( void)
{
De1=0;
De=0;
U=0;
U1=0;
d=0;
d1=0;
c=0;
c1=0;
}
void preparar(unsigned int cod)//recibe el valor del ADC
{
float a;
a=cod/2.55;
Setpoint=a;
a=a*100;
De=a/1000;
U=(a/100)- De*10;
d=(a/10)-De*100-U*10;
c=a-De*1000-U*100-d*10;
De1=De+48;
U1=U+48;
d1=d+48;
c1=c+48;
}
void enviar(void)//transmitir a la pc
{
unsigned char c;
for (c=0;Set[c]!='\0';c++)
{
while(!TI){} // esperando que TI sea 1
SBUF=Set[c];
TI=0;
}
//Enviando el valor de D
while(!TI){} // esperando que TI sea 1
SBUF=De1;
TI=0;
//Enviando el valor de U
while(!TI){} // esperando que TI sea 1
SBUF=U1;
TI=0;
//Enviando el punto
while(!TI){} // esperando que TI sea 1
SBUF='.';
TI=0;
//Enviando el valor de d
while(!TI){} // esperando que TI sea 1
SBUF=d1;
TI=0;
//Enviando el valor de c
while(!TI){} // esperando que TI sea 1
SBUF=c1;
TI=0;
for (c=0;grados[c]!='\0';c++)
{
while(!TI){} // esperando que TI sea 1
SBUF=grados[c];
TI=0;
}
//TAB
while(!TI){} // esperando que TI sea 1
SBUF=9;
TI=0;
}
//------------------------------------------
void prepararLM(float cod)//recibe el valor del ADC
{
unsigned int a;
a=cod*100;
De=a/1000;
U=(a/100)-De*10;
d=(a/10)-De*100-U*10;
c=a-De*1000-U*100-d*10;
De1=De+48;
U1=U+48;
d1=d+48;
c1=c+48;
}
void enviarLM(void)//transmitir a la pc
{
unsigned char c;
for (c=0;Temp[c]!='\0';c++)
{
while(!TI){} // esperando que TI sea 1
SBUF=Temp[c];
TI=0;
}
//Enviando el valor de D
while(!TI){} // esperando que TI sea 1
SBUF=De1;
TI=0;
//Enviando el valor de U
while(!TI){} // esperando que TI sea 1
SBUF=U1;
TI=0;
//Enviando el punto
while(!TI){} // esperando que TI sea 1
SBUF='.';
TI=0;
//Enviando el valor de d
while(!TI){} // esperando que TI sea 1
SBUF=d1;
TI=0;
//Enviando el valor de c
while(!TI){} // esperando que TI sea 1
SBUF=c1;
TI=0;
for (c=0;grados[c]!='\0';c++)
{
while(!TI){} // esperando que TI sea 1
SBUF=grados[c];
TI=0;
}
//TAB
while(!TI){} // esperando que TI sea 1
SBUF=9;
TI=0;
}
// 10 ES ENTER RETRUN CARRY ES 13
void enviarDuty(void)//transmitir a la pc
{
unsigned char c;
for (c=0;Set[c]!='\0';c++)
{
while(!TI){} // esperando que TI sea 1
SBUF=Duty[c];
TI=0;
}
//Enviando el valor de D
while(!TI){} // esperando que TI sea 1
SBUF=De1;
TI=0;
//Enviando el valor de U
while(!TI){} // esperando que TI sea 1
SBUF=U1;
TI=0;
//Enviando el punto
while(!TI){} // esperando que TI sea 1
SBUF='.';
TI=0;
//Enviando el valor de d
while(!TI){} // esperando que TI sea 1
SBUF=d1;
TI=0;
//Enviando el valor de c
while(!TI){} // esperando que TI sea 1
SBUF=c1;
TI=0;
//TAB
while(!TI){} // esperando que TI sea 1
SBUF='%';
TI=0;
//TAB
while(!TI){} // esperando que TI sea 1
SBUF=10;
TI=0;
while(!TI){} // esperando que TI sea 1
SBUF=13;
TI=0;
}
void tempUp(void)
{
if(RH0<0XFF)
{ RH0++;
var=RH0;
retardo();
}
else
{ RH0=0xFF;
var=RH0;
}
}
void tempDown(void)
{
if(RH0>0X01)
{ RH0--;
var=RH0;
retardo();
}
else
{
RH0=0X01;
var=RH0;
}
}
void tempStop(void)
{
TCONB=0X00;
P3_4=0;
if(RH0!=0)
{ var=RH0;
}
RH0=0x00;
}
void tempStart(void)
{ TCONB=0X40;
P3_4=1;
RH0=var;
}
void PWM(unsigned int cod)
{
float a;
a=cod/2.55;
a=a*1000;
De=a/1000;
U=(a/100)- De*10;
d=(a/10)-De*100-U*10;
c=a-De*1000-U*100-d*10;
De1=De+48;
U1=U+48;
d1=d+48;
c1=c+48;
}
void ADC_Interrupt (void) interrupt 10
{
ADC_Data_Ready=1;
}
void retardo(void)
{
unsigned int z;
for(z=0;z<25000;z++)
{
}
Conclusiones
Alejandra: En esta prctica aprend a configurar el micro como I
2
C master para
conectar otros dispositivos, en este caso fueron pcf, esto nos sirve para
transmisin y recepcin en red, esto asignndole una direccin. No tuvimos
problemas para ello, ya que slo eran dos dispositivos.
Ral: En conclusin aprendimos a disear desde cero un sistema de lazo
cerrado. Para el diseo tuvimos que investigar cada uno de los componentes a
utilizar e ir checando con los clculos que tenamos si eran compatibles con
nuestro sistema. Reforzamos lo aprendido durante todo el semestre ya que
tuvimos que utilizar muchas de las caractersticas aprendidas del AT89LP6440. El
proyecto no fue un simple copy-paste de las prcticas anteriores, ya que si no se
conoca bien el funcionamiento de los registros, no funcionaba el sistema, como
por ejemplo modificar en la configuracin inicial el PWM en el timer 0 y el Baud
Rate en el timer 1. Este proyecto fue un buen reto para nuestras habilidades, ya
que tuvimos que resolver muchos problemas tanto en hardware como en software.
Bibliografia
- Datasheet AT89LP6440
- I
2
C. Wikipedia. Consultado el 27/10/2013. Consultado en:
http://es.wikipedia.org/wiki/I%C2%B2C