TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: underwol2 en 19 de Abril de 2010, 17:02:31
-
hola le estoy dando vueltas al tema de conversión adc con lm35
lo que quiero saber es como hace para convertir los 10mv por grado centígrado al enviarlo al pic 16f873a y como es que logra mostrar el mismo valor en lcd como es el proceso de conversión tanto adc y binario o como hace el pic para mostrar el mismo resultado que da el lm35 en pantalla lcd
temper=medicion*(0.48875); //Pasa binario a °C
el "0.48875" sale de dividir 5/1023 y el resultado de eso multiplicarlo por 100
el 5 sale de los 5 voltios aplicado a el voltaje de referencia, los 1023 salen
de los 10 bit de revolución del conversor analógico digital que seleccionamos.
Si utilizáramos la resolucion de 8 bist del conversor analógico digital, la
formula fuera (5/255)*100 ya que con 8 bits el numero máximo posible es de 0-255
ese es el proceso que hace el ejemplo con el pic 16f873a quiero saber como lo convierte a binario o como hace el calculo para que en pantalla lcd se vea el resultado de 35grados
ejemplo
sila salida es de 35grados en milivoltios seria 350mv según el ejemplo lo multiplica por 0.47588
350mv*0.48875=0.1710625
0.1710625 a partir de este resultado como lo convierte en 35grados y lo muestra por el lcd
#include <16f873a.h>
#device adc=10 //Usa resolución de 10 bits
#use delay(clock=4000000)
#fuses xt,nowdt,noput,nobrownout,nolvp,noprotect
#define LCD_ENABLE_PIN PIN_C2
#define LCD_RS_PIN PIN_C0
#define LCD_RW_PIN PIN_C1
#define LCD_TYPE 2
#include <lcd.c>
#use standard_io (D)
void main (void)
{
float temper,medicion;
lcd_init(); //Inicia LCD
lcd_putc(" Termometro\n"); //Saca texto
lcd_putc(" con LM35"); //Saca texto
delay_ms(2000);
lcd_putc("\f"); //Limpia pantalla
lcd_putc("Temperatura\n"); //Saca texto
lcd_putc("actual"); //Saca texto
delay_ms(1000);
lcd_gotoxy(14,2); //Acomoda cursor LCD
lcd_putc("oC");
while (1)
{
lcd_gotoxy(8,2); //Acomoda cursor LCD
lcd_putc(" "); //Limpia ese sector de pantalla
lcd_gotoxy(8,2); //Acomoda cursor LCD
setup_adc (adc_clock_internal);
setup_adc_ports (all_analog);
set_adc_channel (0); //Elige canal a medir RA0
delay_us (20);
medicion=read_adc (); //Hace conversión AD
setup_adc (adc_off); //Apaga ADC
temper=medicion*(0.48875); //Pasa binario a °C
//////////////////////////////////////////////////////////////////////////////////
// el "0.48875" sale de dividir 5/1023 y el resultado de eso multiplicarlo por 100
// el 5 sale de los 5 voltios aplicado a el voltage de referencia, los 1023 salen
// de los 10 bit de resolucion del conversor analogico digital que seleccionamos.
// Si utlizaramos la resolucion de 8 bist del conversor analogico digital, la
// formula fuera (5/255)*100 ya que con 8 bits el numero maximo posible es de 0-255
//////////////////////////////////////////////////////////////////////////////////
printf(lcd_putc,"%02.1f",temper); //xxx.x °C
delay_ms (1000);
}
}
-
En realidad lo que multiplicas por ese valor es el resultado de la conversion realizada, que es un numero entre 0 y 1023 si el A/D esta configurado para 10 bits.
Para el caso de 35 grados los 350 mV seran 71 o 72 cuentas, por lo tanto el valor multiplicado por ese coeficiente te da:
72 * 0,48875 = 35.19 que en realidad se mostraran como un flotante de 35,2 ºC
-
gracias por la respuesta podría pedirte el favor si me explicas como fue que sacaste el calculo Para el caso de 35 grados los 350 mV serán 71 o 72 cuentas, por lo tanto el valor multiplicado por ese coeficiente te da:
72 * 0,48875 = 35.19 que en realidad se mostraran como un flotante de 35,2 ºC
según el comentario del código esta a 2 elevado a 8 bit = 256
-
Si lees el programa encontraras esta linea de codigo:
#device adc=10 //Usa resolución de 10 bits
Que fuerza al ADC a trabajar en 10 bits, por lo tanto el rango del conversor va de 0 a 1023 cuentas.
350 mV sobre los 5000 mV de alimentacion son:
350 * 1024 / 5000 = 71,68 cuentas, que por supuesto son redondeadas hacia arriba porque superan media cuenta
Por eso comente que puede mostrar 71 o 72 cuentas.
¿Se entiende la explicacion??
-
gracias por la respuesta :-/
-
Si te sirve de algo.
Yo he utilizado un voltage de referencia de 1.023 Volts para no tener que realizar operaciones. Es decir en el caso que mencionas, esos 350 mv con ese valor en la referencia me da 350 del conversor y lo unico que hago es aparecer el punto decimal para que quede 35.0 °C solo si no obtienes valores mayores al Vref+. Lo hago en Hi-Tech.
-
hola le estoy dando vueltas al tema de conversión adc con lm35
lo que quiero saber es como hace para convertir los 10mv por grado centígrado al enviarlo al pic 16f873a y como es que logra mostrar el mismo valor en lcd como es el proceso de conversión tanto adc y binario o como hace el pic para mostrar el mismo resultado que da el lm35 en pantalla lcd
temper=medicion*(0.48875); //Pasa binario a °C
el "0.48875" sale de dividir 5/1023 y el resultado de eso multiplicarlo por 100
el 5 sale de los 5 voltios aplicado a el voltaje de referencia, los 1023 salen
de los 10 bit de revolución del conversor analógico digital que seleccionamos.
Si utilizáramos la resolucion de 8 bist del conversor analógico digital, la
formula fuera (5/255)*100 ya que con 8 bits el numero máximo posible es de 0-255
ese es el proceso que hace el ejemplo con el pic 16f873a quiero saber como lo convierte a binario o como hace el calculo para que en pantalla lcd se vea el resultado de 35grados
ejemplo
sila salida es de 35grados en milivoltios seria 350mv según el ejemplo lo multiplica por 0.47588
350mv*0.48875=0.1710625
0.1710625 a partir de este resultado como lo convierte en 35grados y lo muestra por el lcd
#include <16f873a.h>
#device adc=10 //Usa resolución de 10 bits
#use delay(clock=4000000)
#fuses xt,nowdt,noput,nobrownout,nolvp,noprotect
#define LCD_ENABLE_PIN PIN_C2
#define LCD_RS_PIN PIN_C0
#define LCD_RW_PIN PIN_C1
#define LCD_TYPE 2
#include <lcd.c>
#use standard_io (D)
void main (void)
{
float temper,medicion;
lcd_init(); //Inicia LCD
lcd_putc(" Termometro\n"); //Saca texto
lcd_putc(" con LM35"); //Saca texto
delay_ms(2000);
lcd_putc("\f"); //Limpia pantalla
lcd_putc("Temperatura\n"); //Saca texto
lcd_putc("actual"); //Saca texto
delay_ms(1000);
lcd_gotoxy(14,2); //Acomoda cursor LCD
lcd_putc("oC");
while (1)
{
lcd_gotoxy(8,2); //Acomoda cursor LCD
lcd_putc(" "); //Limpia ese sector de pantalla
lcd_gotoxy(8,2); //Acomoda cursor LCD
setup_adc (adc_clock_internal);
setup_adc_ports (all_analog);
set_adc_channel (0); //Elige canal a medir RA0
delay_us (20);
medicion=read_adc (); //Hace conversión AD
setup_adc (adc_off); //Apaga ADC
temper=medicion*(0.48875); //Pasa binario a °C
//////////////////////////////////////////////////////////////////////////////////
// el "0.48875" sale de dividir 5/1023 y el resultado de eso multiplicarlo por 100
// el 5 sale de los 5 voltios aplicado a el voltage de referencia, los 1023 salen
// de los 10 bit de resolucion del conversor analogico digital que seleccionamos.
// Si utlizaramos la resolucion de 8 bist del conversor analogico digital, la
// formula fuera (5/255)*100 ya que con 8 bits el numero maximo posible es de 0-255
//////////////////////////////////////////////////////////////////////////////////
printf(lcd_putc,"%02.1f",temper); //xxx.x °C
delay_ms (1000);
}
}
Hola, me puedes explicar de donde sale el 1100 que multiplicas en la fórmula?