TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: arcadi en 28 de Marzo de 2008, 15:25:19
-
Hola a todos;
Tengo un problema con el conversor A/D de 10 bits del 16f876a. El problema que tengo es que no me muestra bien el resultador por la pantalla LCD.
Quiero mostrar la temperatura de un LM35 de un rango de 0ºC a 75ºC.
Caracteristicas del A/D:
Vref=0.75v
10 bits
Vresolucion=0.75/2^10=0.000732421875
Vfactor=vresolucion*100=0.0732421875
------------------------------Programa--------------------------------------
int16 adcValue;
float temper;
Void main (void)
{
....
printf(lcd_putc,"\f") ;
adcValue=read_adc();
delay_us(20);
x=1;y=2;
lcd_gotoxy(x,y);
temper=adcValue*0.07324218;
printf(lcd_putc,"%1.2f C",temper) ;
...
}
Me gustaria que fuese si puede ser:
Analogica: 0.23v Salida: 23.00ºC
Me sale:
Analogica: 0.23v Salida: 3.36ºC
Muchas gracias
-
Estas definiendo que vas a trabajar con 10 bits?
-
MMhhh
Si dices que Vref es 0.75V, considero que Vref+ = 0.75V y Vref- = 0V. El rango es de 0.75V, entonces...
0.75V es a 1023bits
pero 0.75V es a 75°C y a su vez es a 1023 bits, según la hoja de características del LM35.
1023 bits -> 75°C
x -> TempC
Lo que desconocemos es TempC, despejando...
TempC = (x * 75)/1023
donde x es la lectura en binario. Traducido a tu programa...
temper=(float)(adcValue*75)/1023; //con casting para forzar el resultado en flotante
-
Creo que los cálculos los tiene bien hechos!
MigSantiago según la fórmula de la resolución de un convertidor creo que es 1024 y no 1023.
Arcadi como has hecho en el programa para programar la VREF (setup_adc_ports ...)?
Pón el programa completo.
-
Perdonen por el retraso, he tenido problemas con el PC.
He puesto en el micro Vref=0.75v i -Vref=0v.
Ahora culego el programa con la simulacion del Proteus. Es un reloj alarma con sensor de temperatura.
Muchas gracias
-
Sí, utilizo una conversion de 10 bits.
Cuando tenga el trabajo terminado, ya lo colgare como ejemplo de programar. Es que me falta tastear el tiempo de los segundos y todo esto...
-
Hola Pocher
Si cuando tiene 0V tiene 0bits, entonces 0.75V es a 1023 bits, porque 1024 requeriría de un conversor de 11 bits de resolución... (10 000 000 000 en binario).
Si el ADC fuera de 8 bits, entonces 0.75V sería a 255 (2^8-1).
-
Puede ser, ya que al final nunca conseguire el Vref. Igualmente, tengo que poner un divisor de tension despues del LM35 para configurarlo bien.
-
Ahora he visto que no se habia colgado bien...
ya esta puesto bien.
Gracias
-
Hola Arcadi.
Arcadi te falla porque te falta lo que te comentaba más arriba:
setup_adc_ports(RA0_RA1_ANALOG_RA3_REF);
Otra cosilla: Has elegido un voltímetro a.c., cámbialo por uno d.c.
Hola MigSantiago.
Este dilema entre el 1024 y el 1023 ya lo tuve hace mucho tiempo con un componente del FORO y al final cada uno nos quedamos con lo nuestro, támpoco apareció nadie a opinar al respecto.
Yo me baso simplemente en la fórmula de un conversor A/D ó D/A que es:
VRES=VREF/2^n -----> Si n=10, pues 2^n=1024
Un saludo a ambos.
-
Muchas gracias!!!! Ahora lo puebo en el Proteus.
La semana que viene me voy a Barcelona a comprar los componentes que me faltan y lo montare. Seguramente retocare alguna cosilla y despues lo colgare aqui para si alguien le interesa para proyectos futuros.
Muchas gracias a todos.
-
Hola MigSantiago.
Este dilema entre el 1024 y el 1023 ya lo tuve hace mucho tiempo con un componente del FORO y al final cada uno nos quedamos con lo nuestro, támpoco apareció nadie a opinar al respecto.
jejeje pues que le vamos a hacer... un bit a final de cuentas no afecta :D
-
Hola de nuevo
Me llegó una idea de cómo demostrar lo de la resolución. Si tuviéramos un ADC de 2 bits de resolución tendríamos los posibles datos entregados siguientes...
00, 01, 10 y 11
y si Vref+ fuera 5V...
5V / (2^2 - 1) = 5V / 3 = 1.66V
00 -> 0V
01 -> 1.66V
10 -> 3.33V
11 -> 5V
Pero si hiciéramos la división...
5V / 2^2 = 5V / 4 = 1.25
entonces la tabla estaría forzada a ser así...
00 -> 0V
01 -> 1.25V
10 -> 2.5V
11 -> 3.75V !!!
Hablando ya en 10 bits... tendría que hacerse con 2^10 - 1.
¿Qué opinas Pocher? :mrgreen:
-
Pués sí, con ese ejemplito te lo voy a demostrar fácilmente. Je, je.
Para valores de entrada Vi mayores ó iguales que 0 pero menores que 1,25V se codifican todos ellos como 00. Con números:
0V <= Vi < 1,25V -----> 00
1,25V <= Vi < 2,5V -----> 01
2,5V <= Vi < 3,75V -----> 10
3,75V <= Vi < 5V -----> 11
El valor 5V recibe el nombre de valor a fondo de escala (VFS) y suele coincidir casi siempre (salvo el caso de un convertidor de resistencias ponderadas que es un escalón menos) con el valor de referencia (VREF). En el caso del PIC creo que usa un convertidor A/D interno de aproximaciones sucesivas (el más usado) y sí que VFS=VREF)
Un saludo
-
Yo creo que es como explica pocher,aunque poniéndonos tiquismiquis, ¿qué pasa con los 5V?
-
La forma expresada más arriba es el modo de cuantificar (trocear) los escalones. En la cuantificación el Valor a Fondo de Scala (VFS) es un valor que no se alcanza nunca.
Si se alcanzara ¿qué pasaría? ... que se codificaría como 11. Igual para valores de entrada mayores que 5V
-
efectivamente
http://html.rincondelvago.com/convertidores-a-d.html (http://html.rincondelvago.com/convertidores-a-d.html)
O sea que el valor digital lo daría:
x = (Vin - 1LSB) / 1LSB = (Vin - (VFS/2^n)) / (VFS/2^n)
Y truncando el resultado
-
Erré en las cuentas,para variar :mrgreen:
Sería en todo caso truncando,pero sin restar 1LSB a Vin:
x = Vin / 1LSB = Vin*2^n / VFS
-
Ahora sí.
Esas son las 2 fórmulas que yo uso en los convertidores:
a) VRES=VFS/2^n=VREF/2^n [ para convertidor D/A interno R/2R ][ Para convertidor D/A interno de resistencias ponderadas sería VRES=VREF/(2^n -1) ]
b)VRES=Vi/nº de escalones ; Vi tensión de entrada analógica (conversor A/D)
VRES=Vo/nº de escalones ; Vo tensión de salida analógica (conversor D/A)
Utilizando la fórmula instantánea [ fórmula del apartado b) ] se deben truncar los decimales para hallar el valor digital buscado:
Valor digital = nº de escalones = Vi / VRES
-
Vref=5v
8 bits
5V / (2^8 - 1) = [19.6 19.61]mv ---------->rango de error
Digital:
00000000------------->0v
11111111-------------> [4.998 5.00055]v
------------------------------------------------------------------------
Vref=5v
8 bits
5V / (2^8) = 19.53mv ----------------> sale un numero mas redondo
Digital:
00000000------------->0v
11111111-------------> 4.98015v
-----------------------------------------------------------------------------------
Conclusiones:
Hay poca diferencia. Cuando mas bits tenga el convertidor, menos error habrá. Teniendo en cuenta que con los A/D que hay al mercado (8bits, 10 bits, 14 bits, etc) ninguno es perfecto, pues habrá el error de diseño anterior mas error en perdidas de tensión y todo estas cosas.
Haber si me he explicado bien XD.
Gracias y suerte.
-
Entendido y anotado Pocher, estoy de acuerdo contigo :D
Nada como discutir amistosamente un dilema 8)
-
MigSantiago yo estaba pensando como tu y al leer los datos de nuestros Amigos me di cuenta , aqui aprendi algo nuevo que tenia Dudas yo tambien
Gracias a todos :mrgreen:
-
Me alegro de haber servido para algo. Eso me desoxida y rejuvenece :D