En este nuevo ejemplito vamos a utilizar el circuito integrado LM35A que es capaz de servirnos una tensión de 10 mV por cada grado centígrado de temperatura a partir de 0º que nos dá correspondientemente 0V a la salida.
Datasheet del LM35AEn este caso particular hago uso del siguiente circuito conectado al PORTA del 16F628:
Como puede verse la LDR esta conectada como divisor de tensión a RA0. El LM35A está conectado a RA1. Y a RA2 y RA3 estan conectados los cursores de dos potenciómetros entre VCC y GND. Éste último, el que se conecta a RA3, lo uso para ajustar la tensión de referencia VREF para realizar la converisón Analógico-Digital de la salida del LM35A.
Como en mi habitación hay a proximadamente 23 o 24 grados centígrados por lo que el LM35A va a darme unos 230 ó 240 mV, así que he ajustado el potenciómetro R18 hasta conseguir exactamente 1V (1000 mV) en RA3, si mi Fluke no me engaña (marca exactamente 1,000 V).
Realizo una conversión AD cada vez que envío mediante la RS232 el comando "t", entonces realiza un muestreo de RA0, la LDR, y de RA1, el LM35A. A continuación envío el resultado de nuevo al RS232.
En mi hardaware tengo también una resistencia conectada electricamente a RB5 (no aparece en el esquemático anterior) y que fisicamente esta junto al LM35A. Esto hace que al activar RB5 se caliente esta resistencia y podamos así testear cómo sube la temperatura en el mismo.
Vía RS232 puedo tambíen mandar los comandos "1" y "0" que conectan o desconectan respectivamente el calefactor al LM25A.
El programa CCS C (v.2.150) queda así:
Codigo:
#include <16f876a.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT
#use delay(clock=4000000)
#use standard_io(b)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
int adc_luminosidad=0x00;
int adc_temperatura=0x00;
int grados_temperatura=0;
char Keypress=" ";
#int_rda
void rda_isr() {
Keypress=0x00;
if(kbhit()){
Keypress=getc();
}
}
void toma_adc_y_transmite(void){
// Lectura del canal 0 -> AN0 LDR
set_adc_channel(0);
delay_ms(1);
adc_luminosidad=read_adc();
delay_ms(1);
// Lectura del canal 1 -> AN1 LM35a
set_adc_channel(1);
delay_ms(1);
adc_temperatura=read_adc();
delay_ms(1);
grados_temperatura = (int) ((adc_temperatura * 391) / 1000);
printf(" L = %u T = %u (adc= %u)
",adc_luminosidad,grados_temperatura,adc_temperatura );
}
void main() {
setup_adc(ADC_CLOCK_INTERNAL);
setup_adc_ports(RA0_RA1_ANALOG_RA3_REF);
output_low(PIN_B5);
enable_interrupts(int_rda);
enable_interrupts(global);
printf("
AD - LM35a - Monitor
" );
do {
if(Keypress!=0x00){
switch(Keypress){
case "t": toma_adc_y_transmite();
break;
case "0": output_low(PIN_B5);
printf(" 0 - Calentador OFF
" );
break;
case "1": output_high(PIN_B5);
printf(" 1 - Calentador ON
" );
break;
}
Keypress=0x00;
}
} while (TRUE);
}
Y por fín los resultados de la correspondiente prueba en mi terminal serie sobre el PC:
T=24 significa que tengo 24ºC en el LM35A,
lo que corresponde a un valor AD adc=62.
Lo que es compatible con VREF - > 1000 mv / 256 = 3,90625 mV por cada Ud AD.
Luego 62 * 3,90625 mV = 242,1875 mV en RA1 y como tenemos 10 mv por grado
Entonces 242,1875 mV / 10 mVº = 24,21875. CSQD (Como Se Quería Demostrar)
Y eso es todo (por ahora).