Documentos de Académico
Documentos de Profesional
Documentos de Cultura
D.G.I.T
ASIGNATURA:
APLICACIONES DE MICROCONTROLADORES
PRÁCTICA 8:
MEDIDOR DE TEMPERATURA CONTROL ON - OFF.
PRESENTAN:
Castro Hernández Cesar Gerardo – 07560051.
López López Juan Ramiro - 07560553.
Rosas Villa Esmeralda - 07560419.
EXPLICACIÓN.
Para la medición de la temperatura se utilizara el sensor LM35 que tiene una sensibilidad de
10 mV /°C, implementaremos un amplificador y un filtro pasa bajas para obtener una buena
señal que el microcontrolador la acepte y se obtenga un valor real y para observar el control
ocuparemos un ventilador como se muestra en la Figura 1.
5V
VCC
VDD
D-4
4 15
PTA5 PTB0 D-5
5 M
PTA4 14 D-6 Vo
C PTB1
8 6
PTA3 D-7
8 11
H PTB2
9
PTA2 C RS E R/ W GND
9 10
12 PTB3
0
PTA1 8
Q 7
13 PTB4
B
PTA0 8 6
PTB5
3
PTB6
GND
ADC 2
2
PTB7 3.3kΩ 3.3kΩ 3.3kΩ 3.3kΩ
Ventilador
GND
PTB0
PTB1
PTB2
PTB3
+Vc
RL
1 KΩ
Amplificador FPL
con Ganancia
15 Hz
de 2
LISTA DE MATERIAL:
• 1 - DisplayLCD.
• 1-Potenciómetro 10 KΩ.
• Teclado matricial.
• Microcontrolador MC68HC908QB8.
• 2 - Resistencias 4.7 kΩ.
• 1 - Resistencias 75 kΩ.
• 2 - OPAMP 741.
• 1 - Sensor de temperatura LM35.
• 1 - Ventilador.
• 3 – Capacitores 100nF.
• 1- Relevador.
• 1 - Transistor.
EQUIPO:
DESARROLLO.
Estos son los pasos que se llevaron a cabo para la elaboración y comprobación del buen
funcionamiento de nuestro programa, que realiza el muestreo de la temperatura actual y
realizaremos un control ON - OFFde un ventilador con los rangos tecleados por el usuarios el
límite minino es DOWN que debe ser 1°C menor al límite superior UP.
Se utilizaron los pines PTB (0-3) para la comunicación de datos con la LCD, solo se utilizaron
los datos D (4-7) del bus de datos de la LCD, Rs será controlada con PTB 4, eneableE será
manipulada con PTB 5, solo se escribirá en la LCD por esto el pin cinco estará en GND. Se
utilizara el canal 2 del ADC del microcontrolador, este está en el PTA 4.
La LCD: La parte principal visible del circuito, se utilizaron display LCD de dos líneas con diez y
seis espacios cada una, como se muestra en la Figura 3, en estos se observara el tecleo de los
dos valores para realizar alguna operación, también se mostrara que operación se está
realizando y se mostrara un mensaje de error cuando sobrepase el limite predicho.
Del bus de datos de la LCD se utilizaron solo D (4-7) que van conectados al microcontrolador
en los pines PTB (0-3) y al teclado.
Con el pin3 de la LCD Vo se controlara el contraste de la pantalla con la ayuda de un
potenciómetro, Rs será manipulada con el PTB 4 del microcontrolador, el pin 5 será
conectado a GND pues solo requerimos escribir no leer en la LCD, el eneableE será
manipulado con PTB 5. Los pines 15 y 16 son opcionales de conectar, estos nos brindan una
luz azul con la lámpara o LED que es encendida al conectar estos pines correctamente.
LED
K A DB-7 6 5 4 3 2 1 DB-0 E R/ W RS Vo VDD GND
Vamos a diseñar el filtro pasa bajas (FPL) a una frecuencia de corte alrededor de los 15Hz
como se muestra en la Figura 6, estas fórmulas utilizadas se encuentran en cualquier libro de
diseño de filtros.
Para hacer la selección del capacitor tomamos un valor dentro de este rango:
0.707 0.707
𝑅𝑅1 = = = 75𝑘𝑘Ω 𝐶𝐶1 = 2𝐶𝐶2 = 200𝑛𝑛𝑛𝑛 𝑅𝑅2 = 𝑅𝑅1
2𝜋𝜋𝐹𝐹𝑐𝑐 𝐶𝐶1 (2𝜋𝜋)(15𝐻𝐻𝐻𝐻)(100𝑛𝑛𝑛𝑛)
Ahora diseñaremos el amplificador por dos unidades como se muestra en la Figura 7, el cual
utilizamos un amplificador con configuración no inversor y la cual su fórmula se muestra a
continuación:
𝑅𝑅4
𝑉𝑉0 = 𝑉𝑉𝑖𝑖 � + 1� = 2𝑉𝑉𝑖𝑖
𝑅𝑅3
Figura 9. Ventilador.
Relevador: Para el control ON – OFF del ventilador se utilizó un relevador, como se muestra
en la Figura 10, lo controlaba el microcontrolador, puesto que le mandaba un 1 de activación
cuando era necesario encender y un 0 para apagarlo.
unsigned int cad, adc4, adaux, up, dwn,a, adc42=0, val1; Declaración de variables.
unsigned char menuUP, menuDWN, nt, menu, tec;
sep=(lcdint/10000)+0x30;
if(sep!='0'){
lcd_datos(sep);
nc=1;
}
sep=((lcdint/1000)%10)+0x30;
if(nc==1||sep!='0'){
lcd_datos(sep);
nc=1; Subrutina para desplegar enteros de
} máximo 5 cifras, explicada
anteriormente.
sep=((lcdint/100)%10)+0x30;
if(nc==1||sep!='0'){
lcd_datos(sep);
nc=1;
}
sep=((lcdint/10)%10)+0x30;
if(nc==1||sep!='0'){
lcd_datos(sep);
nc=1;
}
sep=(lcdint%10)+0x30;
lcd_datos(sep);
void tec_matriz(void){
tec='H';
for(pb=1;pb<=8;pb*=2){
PTB&=0xF0;
PTB|=pb;
pa=PTA&0x0F;
if(pb==1){
if(pa==0){
tec='H';
}
Subrutina explicada
else if(pa==1){ anteriormente.
tec=7; break;
}
else if(pa==2){
tec=8; break;
}
else if(pa==4){
tec=9; break;
}
else if(pa==8){
tec='C'; break;
}
}//llave de pb===1
else if(pb==2){
if(pa==0){
tec='H';
}
else if(pa==1){
tec=4; break;
}
else if(pa==2){
tec=5; break;
}
else if(pa==4){
tec=6; break;
}
else if(pa==8){
tec='U'; break; //B=66
}
} // llave de pb==2
else if(pb==4){
if(pa==0){
tec='H';
}
else if(pa==1){
tec=1; break;
}
else if(pa==2){
tec=2; break;
}
else if(pa==4){
tec=3; break;
}
else if(pa==8){
tec='D'; break;
}
} // llave de pb==4
else if(pb==8){
if(pa==0){
tec='H';
}
else if(pa==1){
tec='F'; break;
}
else if(pa==2){
tec=0; break;
}
else if(pa==4){
tec='E'; break;
}
else if(pa==8){
tec='X'; break;
}
} // llave de pb==8
void msj_gral(void){
Subrutina de mensaje general:
limpia_lcd();
“UP: DWN:
lcd_com(0x80); // UP: TEMP: “.
lcd_datos('U');
lcd_datos('P');
lcd_datos(':');
lcd_com(0x89); // DWN:
lcd_datos('D');
lcd_datos('W');
lcd_datos('N');
lcd_datos(':');
Subrutina de mensaje general:
lcd_com(0xC4); “UP: DWN:
lcd_datos('T'); TEMP: “.
lcd_datos('E');
lcd_datos('M');
lcd_datos('P');
lcd_datos(':');
void msj_UP(void){
lcd_com(0x80);
lcd_datos('S');
lcd_datos('E');
lcd_datos('L');
lcd_datos('E');
lcd_datos('C');
lcd_datos('C'); Subrutina de mensaje de UP:
lcd_datos('I'); “SELECCIONA UP: “.
lcd_datos('O');
lcd_datos('N');
lcd_datos('A');
lcd_datos(' ');
lcd_datos('U');
lcd_datos('P');
lcd_datos(':');
}
void msj_DWN(void){
lcd_com(0x80);
lcd_datos('S');
lcd_datos('E');
lcd_datos('L');
lcd_datos('E'); Subrutina de mensaje de DWN:
lcd_datos('C'); “SELECCIONA DWN: “.
lcd_datos('C');
lcd_datos('I');
lcd_datos('O');
lcd_datos('N');
lcd_datos('A');
lcd_datos(' ');
lcd_datos('D');
lcd_datos('W');
lcd_datos('N');
lcd_datos(':');
}
void limpia_lcd(void){
lcd_com(0x80);
for(a=0;a<=15;a++){
lcd_datos(' ');
}
Subrutina de limpiar display.
lcd_com(0xC0);
for(a=0;a<=15;a++){
lcd_datos(' ');
}
}
EnableInterrupts;
ADSCR = 0x62 ;
delay(50);
Primero se habilitaron las interrupciones
lcd_com(0xC9);
y se configuro el display con un retardo
lcd_int(adc4); de reacción, después se manda en el
lcd_com(0xCC); display la temperatura leída
lcd_datos(0xDF); acompañada de los caracteres “ºC”.
lcd_datos('C'); Deshabilitando las interrupciones se
DisableInterrupts; respalda la temperatura leída, se vuelve
a habilitar interrupciones con un retardo
adc42 = adc4; de reacción.
EnableInterrupts;
delay(50);
if((adc42!=adc4)){
lcd_com(0xC9);
for(a=0;a<=2;a++){
lcd_datos(' ');
}
DisableInterrupts;
}
if (cad<21){
adaux += (ADR/4); Aquí se mando leer 20 veces el ADC y se
cad++; saco el promedio de la temperatura, en
} donde en cada medición se dividió entre
4 pues la resolución del uC es de 5mV y
else if (cad == 21){ la señal entrante lleva la resolución de
adc4= (adaux/20); 20mV proveniente del amplificador de 2
cad=0; unidades, y la resolución del LM35 es de
adaux = 0; 10mV/ºC.
void main(void) {
CONFIG1=0x31;
CONFIG2=0x80;
OSCSC=0x20;
DDRB=0xFF; Se abrió main y configurar el micro en
ADCLK=0x74; donde el ADC se programo con alta
PTB=0; velocidad, señal de reloj interna y entre
delay(500); 4, a 10 bits justificado a la derecha,
corto tiempo de conversión. Sacando
lcd_com(0x33);
por el puerto B un cero para
lcd_com(0x32);
asegurarnos el buen inicio. De esta
lcd_com(0x28); manera se configura el display.
lcd_com(0x0C);
lcd_com(0x01);
lcd_com(0x06);
delay(1000);
for(;;) {
while(menu==0){
lcd_com(0x83); En menú iguala a 0 se visualizan los
lcd_int(up); valores de up y dwn y se manda llamar
lcd_com(0x8D); la subrutina del despliegue de la
lcd_int(dwn); temperatura en la segunda línea.
rut_adc();
if(adc4>up){
PTB_PTB6=1; Estando en menú igual a 0 si la
} temperatura fue mayor a up se
enciende el ventilador en PTSB6, si fue
if(adc4<dwn){ menor a dwn se apaga.
PTB_PTB6=0;
}
if (tec == 'U'){
delay(35000);
menu = 1; Si se presiono U (up), se da un retardo
limpia_lcd(); de tolerancia, se hace menu=1, se limpia
msj_UP(); la lcd, se muestra el msj up, y se
lcd_com(0xCD); posiciona el cursor en la segunda línea.
}// $menu==0
while(menu==1){
tec_matriz();
if((up<101)&&(up>dwn)){
menu = 0;
msj_gral(); Si se presiono E, up se iguala a val1, se
} hace menu = 0, con un candado para
que up sea menor a 101 y mayor que
lcd_com(0xCD); down, y se borra el val1 tecleado.
for(a=0;a<3;a++){
lcd_datos(' ');
}
lcd_com(0xCD);
while(menu==2){
tec_matriz();
if(tec>=0 && tec<=9){
if(nt==0){
val1=tec;
nt=1;
lcd_int(tec);
} Estando en menú = 2 (dwn), se manda
else if(nt==1){ leer el teclado, y si se presiono un
val1 = (val1*10)+ tec; número lo va guardando en val1 junto
lcd_int(tec); con su retardo de tolerancia, con opción
nt=2; hasta poder insertar 3 digitos. Esto fue
} explicado anteriormente en otros
else if(nt==2){ programas.
val1 = (val1*10)+ tec;
lcd_int(tec);
nt=3;
}
delay(35000
}
if((dwn>=0)&&(dwn<up)){
menu = 0; Si se presiono E, dwn se iguala a val1, se
hace menu = 0, con un candado para
msj_gral();
que dwn sea mayor o igual a 101 y
}
menor que down, y se borra el val1
tecleado.
lcd_com(0xCD);
for(a=0;a<3;a++){
lcd_datos(' ');
}
lcd_com(0xCD);
}
} // $ for inf
} // $ llave main
Con la ayuda de la tarjeta Bunker y el puerto serial – USB como se muestra en la Figura 12, se
pudo cargo el programa al MC68HC908QB8.
4. Pruebas:
En el circuito armado se realizaron diferentes pruebas tales como, cada subrutina hecha para
comprobar su buen funcionamiento y así ir avanzando hasta no tener ningún detalle en la
programación y este código funcione como se quiere.
CONCLUSIONES
ejecutar las señales de salida y señales de salida. Para la lectura del transductor se coloco
después del transductor un diseño de un amplificador de dos unidades para que la señal
pudiera ser promediada en el código en el programa, y después se le coloco un filtro pasa
bajas diseñado a 15 Hz, esto para eliminar ruidos de la fuente y ruidos provenientes de las
señales de alimentación. El programa consistió en un programa que leía la temperatura
actual y contenía un límite inferior y superior denominados UP y DOWN, el cual nos sirvió
como referencia para un límite de histerisis, cuando aumentaba la temperatura mayor al
valor de UP, que tanto UP y DOWN podían ser tecleados siempre UP siendo mayor que
DOWN, por la aplicación de calor o por la temperatura ambiente encendía un ventilador
como representación de enfriamiento, y este debería apagarse hasta bajar el limite DOWN
también tecleado por el usuario siempre indicando en pantalla que valor de temperatura
actual se tenía.
conexiones necesarias extras como el transistor y el relevador para acoplar las señales, el
microcontrolador controlaba al ventilador en su momento mandaba encenderlo con un 1 y
apagarlo cuando estuviera por debajo del límite inferior DOWN para que se pudiera
restablecer la temperatura.
En la hora de cargar el programa hubo detalles como que el voltaje medido en el sensor no
correspondía a la temperatura medida.