Autor Tema: SALTO EN EL CONVERTIDOR A/D DE UN 16F877  (Leído 11268 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado cdlopez

  • PIC10
  • *
  • Mensajes: 39
SALTO EN EL CONVERTIDOR A/D DE UN 16F877
« en: 28 de Octubre de 2006, 20:13:07 »
Estimados Colegas:

Sucede que estoy haciendo un medidor de temperatura con un pic 16F877 un sensor lm35 y la visualizacion es en un lcd.
Hasta aqui todo bien, puedo ver la temperatura, inclusive temperaturas negativas ya que levante la referecia del lm35 con dos diodos tal como lo indica el DS del fabricante.

Hora viene lo interesante cuando estoy midiendo temperaturas de 24 ºC aprox. se produce un salto a 32 ºC, no me mide la intermedias, sin embargo el sesor esta midiando prefectamente ya que me indica el equivalente en mV de 24,5, 25, 26 ºC, ese salto tambien lo veo en los niveles de la cuantizacion del A/D o sea de 625 salta a 768 aprox, puse un capacitor en la entrada, revise el codigo, lo simule en el proteus (da perfecto), probe con otro pic igual, probe con diferentes codigos y los mismo, alguien tiene un idea de lo que esta pasando por que se produce ese salto?????

Desconectado Chaly29

  • Moderador Global
  • DsPIC33
  • *****
  • Mensajes: 4315
Re: SALTO EN EL CONVERTIDOR A/D DE UN 16F877
« Respuesta #1 en: 29 de Octubre de 2006, 06:18:49 »
Hola cdlopez, solo se me ocurren 2 posibles causas para el problema que comentas:

1) Que no dejes terminar una conversión antes de iniciar la siguiente, esto lo puedes solucionar de 2 maneras, colocando una rutina de demora con un tiempo suficiente entre una lectura y la siguiente, o que revises el bit "GO_DONE" del registro ADCON0, para verificar que la conversión a terminado.

2) La otra es que los cálculos que realices con los datos que obtienes del conversor tengan un error, para esto deberás verificar que la rutina de cálculos este correcta, lo que puedes hacer en este caso es colocar un dato "fijo" reemplazando el original del conversor y que las rutinas realicen los cálculos correspondientes, por supuesto el dato que coloques debe ser uno tal que corresponda a la banda de valores donde se te produce el salto.

Espero te sea de ayuda.

Un saludo.

Atte. CARLOS.
La teoría es cuando se sabe todo y nada funciona. La práctica es cuando todo funciona y nadie sabe por qué.

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: SALTO EN EL CONVERTIDOR A/D DE UN 16F877
« Respuesta #2 en: 29 de Octubre de 2006, 22:20:37 »
cdlopez, otra alternativa a las que expuso Carlos es que estés leyendo más de un canal A/D; ¿es esto posible?

En ese caso puede que no estés dandole al A/D el tiempo de muestreo suficiente.

También si tu rutina se encarga de esperar el flag ADIF, ten presente de borrar el mismo después de la conversión.

Saludos

- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado manuelroin24

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 665
Re: SALTO EN EL CONVERTIDOR A/D DE UN 16F877
« Respuesta #3 en: 29 de Octubre de 2006, 22:30:27 »
Creo que seria mejor que nos pudieras colgar el programa para poder revisarlo y darte una solucion mas especifica
El conocimiento se consigue a base de esfuerzo...

Desconectado cdlopez

  • PIC10
  • *
  • Mensajes: 39
Re: SALTO EN EL CONVERTIDOR A/D DE UN 16F877
« Respuesta #4 en: 31 de Octubre de 2006, 00:43:49 »
con vref+ a 5V y Vref- a masa funciona perfectamente. pero cuando intento darle un valor distinto a las Vref+ y Vref- para tener mayor resulocion en el rango del conversor no obtengo variaciones, las tensiones de referencia las obtenfo de un divisor resistivo y probe ademas hacerlo a traves de un seguidor de emisor con un operacional para tener una menor impedancia de entrada y tampoco funciono de esa manera.

Va el codigo:

DEVICE = 16F877

  XTAL = 4
 

 Dim W0   as   WORD
 
 DECLARE ADIN_RES 10       
 DECLARE ADIN_TAD FRC     
 DECLARE ADIN_STIME 200     

 DECLARE LCD_DTPIN PORTb.4
 DECLARE LCD_ENPIN PORTb.1
 DECLARE LCD_RSPIN PORTb.0
 DECLARE LCD_INTERFACE 4
 DECLARE LCD_LINES 2
 delayms 500

 cls

 W0=0
 
 
 DIM VAR1 as word
 DIM RESU AS FLOAT
 DIM RESU1 AS FLOAT
 DIM RESU2 AS FLOAT
 
 TRISA = %11111111         ' Configure AN0 (PORTA.0) as an input
 ADCON1 = %10001101        ' Set analogue input on PORTA.0
 trisc = %00111111

LOOP:




 VAR1 = ADIN 0
 
 DELAYUS 10
 RESU = (50*VAR1)
 RESU1 = RESU/1023
 RESU2 = RESU1-20

select resu2

case < 0.00
high portc.1

case 0.00 to 40
low portc.1
low portc.0

case > 40.00
high portc.0


end select


 PRINT $FE, 2
 PRINT DEC1 RESU2 ,at 1,6,"  ßC"
 PRINT AT 2,1,DEC var1
 GOTO LOOP
 
 
   

Desconectado Chaly29

  • Moderador Global
  • DsPIC33
  • *****
  • Mensajes: 4315
Re: SALTO EN EL CONVERTIDOR A/D DE UN 16F877
« Respuesta #5 en: 31 de Octubre de 2006, 00:50:55 »
Hola cdlopez, tal como ya te lo había comentado tienes la rutina de demora demaciado rapida, te recomendaría que la cambies por una de por lo menos 50useg.

Un saludo.

Atte. CARLOS.
La teoría es cuando se sabe todo y nada funciona. La práctica es cuando todo funciona y nadie sabe por qué.

Desconectado manuelroin24

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 665
Re: SALTO EN EL CONVERTIDOR A/D DE UN 16F877
« Respuesta #6 en: 31 de Octubre de 2006, 02:26:43 »
Como dice mi amigo cuando yo uso el conversor AD particularmente le dejo 30 us pero el fabricante y corriganme si me equivoco solicita 1,6us por muestra esto quiere decir que en el peor de los casos si usamos 10 muestras debemos darle 16 us es por eso que yo le doy 30us para asegurar una conversin segura.

PD: Por favor esto es a mi criterio si alguien tiene algo mas exacto corrigame
El conocimiento se consigue a base de esfuerzo...

Desconectado cdlopez

  • PIC10
  • *
  • Mensajes: 39
Re: SALTO EN EL CONVERTIDOR A/D DE UN 16F877
« Respuesta #7 en: 31 de Octubre de 2006, 08:34:03 »
Hola Carlos:

Fijate que si la rutina de demora estaria mal tampoco me funcionaria cuando pongo la referencia Vref+ a 5V y Vref- a 0V y sin embarco en esas condiciones funciona perfectamente, deja de hacerlo cuando conecto las Vref a los valores que nesecito, * 1.44V y 0.74V* que son distintos a 5V o 0V, si yo logro solucionar este inconveniente que me funcione con estos valores de Vref tengo ganado el partido.

Las tensiones de referencia las obtengo de un divisor resistivo realizado con potenciometros multivueltas para darle mas precision e inclusive conecte a la salida de los resistores un amp.operacional que funcione como seguidor de emisor porque segun las notas de microchip la impedancia de entrada a las Vref debe ser lo mas baja posible para un correcto funcionamiento, tampoco obtuve unresultado satisfactorio.

Por ultimo, la falla esta encerrada, el problema esta en las Vref, no se si es que el codigo del ADCON1 esta bien, creo que si...la impedancia de entrada las baje lo mas que pude con los operacionales, probe, con dos 16f877 y un 16f876 y el resultado es exactamente el mismo voy a jugar un poco con lor retardos tal vez ahi pueda encontrar la solucion. :(

Bueno por ahora nada mas, muy agradecido por su atencion :-)

Cristian :mrgreen:

Desconectado Chaly29

  • Moderador Global
  • DsPIC33
  • *****
  • Mensajes: 4315
Re: SALTO EN EL CONVERTIDOR A/D DE UN 16F877
« Respuesta #8 en: 31 de Octubre de 2006, 11:43:37 »
Hola cdlopez, aparte del tiempo (que a mi parecer es muy poco) y 1.6us tal como dice manuelroin24 es una locura ya que de ser así el convertidor tendría una rata de muestreo de 1/1.6us=625000 samples/seg y un convertidor de cualquier micro de la familia 16F con un cristal de 20Mhz a duras penas llega a los 10000 samples/seg en la sumatoria de sus entradas, por lo tanto lo más rápido que llega un conversor de la familia 16F es de 100useg por cada muentra si el cristal es de 20MHz.

Lo otro que puedes probar cdlopez es de colocar un condensador a la salida del OA para realizar un filtrado y que no sea esta la causa del defecto.

Un saludo.

Atte. CARLOS.
La teoría es cuando se sabe todo y nada funciona. La práctica es cuando todo funciona y nadie sabe por qué.

Desconectado manuelroin24

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 665
Re: SALTO EN EL CONVERTIDOR A/D DE UN 16F877
« Respuesta #9 en: 31 de Octubre de 2006, 12:44:02 »
Mi amigo es lo que dice en la Data Sheet por eso queria que alguien me corrija si me equivoco , en la data sheet del dispositivo dice cada Tad = 1,6 us como son un maximo de canales serian 16us pero el fabricante dice considere 12 canales para una converion optima aciendo seria

                                    1,6us  X   12      =     19,2us

Con 20 us quedaria bien pero yo le pongo 30 us

PD: Donde estas maunix ...... jejeje sacanos de esta......
El conocimiento se consigue a base de esfuerzo...

Desconectado Chaly29

  • Moderador Global
  • DsPIC33
  • *****
  • Mensajes: 4315
Re: SALTO EN EL CONVERTIDOR A/D DE UN 16F877
« Respuesta #10 en: 31 de Octubre de 2006, 15:13:49 »
Hola manuelroin24, tienes razon el datasheet dice que el convertidor A/D necesita un minimo de 12 Tad, y que es recomendable que dicho Tad no sea menor a 1.6useg, pero e aqui un par de cositas:

1) Un "mínimo" de 12 Tad, pero no te comentan cuanto es el máximo.

2) Un Tad minimo de 1.6useg, pero este va en relación a la configuración de oscilador que uses, por ejemplo si tienes un cuarzo de 4MHz y un prescaler de 8 el Tad sería de 2useg, por lo tanto ya el tiempo minimo pasaría a ser 24useg.

Y lo anterior es solo teniendo en cuenta que estas usando solo un canal, si usaras 2 o más canales el tiempo se vería incrementado enormemente ya que hay que realizar una demora (20useg más) entre la selección del canal y el comienzo de la conversión, por lo tanto no recomiendo que se use menos de 50useg.

Un saludo.

Atte. CARLOS.
La teoría es cuando se sabe todo y nada funciona. La práctica es cuando todo funciona y nadie sabe por qué.

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: SALTO EN EL CONVERTIDOR A/D DE UN 16F877
« Respuesta #11 en: 31 de Octubre de 2006, 15:51:48 »
En el módulo A/D tenemos 2 pasos importantes, los cuales en conjuntos se podrían denominar Tiempo de Muestreo.

   a) Tiempo de Adquisición
   b) Tiempo de Conversión


a) El conversor A/D tiene un capacitor de SAMPLE/HOLD (muestreo y retención) el cual se debe cargar a la tensión de la señal presente en el canal A/D elegido.  Hay entonces que darle un tiempo para que dicho capacitor se cargue.  Este tiempo depende de varias cuestiones.
   . La diferencia de tensión entre la tensión presente actualmente y la última tensión que tenía el capacitor.
   . La impedancia de la entrada que cuanto mas grande sea más lento será la carga/descarga del capacitor.  Carga será cuando la tensión del PIN en el canal A/D sea mayor a la presente en el capacitor.  Descarga será cuando la tensión en el PIN en el canal A/D sea menor a la presente en el capacitor.

b) Es el tiempo que le lleva al módulo A/D, convertir el dato del capacitor de SAMPLE/HOLD en un valor digital.



El tiempo de adquisición, está sugerido en el datasheet cómo debiera ser, pero uno puede darse "un margen" para tener valores más precisos.

El tiempo de conversión es deseable que sea lo más rápido posible para que el conversor funcione con mayor precisión.

El tiempo de conversión del módulo A/D a 10 bits son 11.5TAD.  Donde cada TAD durará diferente en función del clock que tenga el pic y del valor de prescaler que le hayamos configurado.  El tiempo de 1.6useg es el mínimo tiempo TAD posible.  Puede ser mayor, pero nunca menor.  Elegirlo menor daría como resultado que la conversión sea imprescisa.

También es importante tener en cuenta que no podemos disparar el A/D ni bien acabamos de convertir,se deben esperar 2TAD, de todas formas esto lo podemos dejar de lado.

No importa si usamos clock de 20MHz o de 5MHz, lo que importa es que ese clock vs el prescaler del A/D nos de un tiempo mayor o igual a 1.6useg.   Cuanto más cerca de 1.6useg más veloz será la conversión.

Por ejemplo con un clock de 5Mhz y un prescaler de 8TOsc logramos 1.6useg.
Con un clock de 20MHz y un prescaler de 32TOsc, también logramos 1.6useg



EL CALCULO

Yendo a los números, el tiempo total entre conversión y conversión será el Tiempo de Muestreo que será:

Condiciones
   Temperatura = 50 °C
   Rs = 1K ohm

Tmuestreo = Tadquisicion + Tconversión

Tadquisicion = Tamp + Tc + Tcoef


donde

Tamp = Tiempo de establecimiento del Amplificador
Tc = Tiempo de carga del capacitor = CHold
Tcoef = Coeficiente de temperatura


Tamp = 2 u[seg]

Tcoef = (Temperatura - 25°C)*(0.05useg/°C) = (50-25)*(0.05useg) = 1,25 u[seg]

Tc = - Chold * (Ric + Rss + Rs) * ln (1/2047) =
   = -120 pF * (1K + 7K + 1K) * (-7.62) = 8,23 u[seg]


Tadquisicion = Tamp + Tc + Tcoef = 2 + 8,23 + 1,25 = 11,48 useg


Si TAD = 1.6 useg (en el mejor de los casos)
Tmuestreo = 11.5 TAD = 18.4 u[seg]


Finalmente

Tmuestreo = Tadquisicion + Tconversion = 18.4 u [seg] + 11.48 u [seg] = 29.88 u [seg]


Esto es solo ejemplificador y como bien te ha dicho Carlos depende de la frecuencia del oscilador.  El TAD será el que cambie.   

Por último solo quiero aclarar que como recomendación, no se valgan de la "espera" para la conversión, la espera debe ser en la parte de adquisición pero no de conversión.  En la conversión una vez disparado el A/D conviene leer directamente el bit GO/DONE o el flag ADIF (ubicado en el registro PIR1).

- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: SALTO EN EL CONVERTIDOR A/D DE UN 16F877
« Respuesta #12 en: 31 de Octubre de 2006, 16:12:16 »
Vaya clase !!! :-/ :-/ :-/Te felicito Maunix !!!
Espectacular !!!!!
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado flacoclau

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1692
    • El Micro Reactor
Re: SALTO EN EL CONVERTIDOR A/D DE UN 16F877
« Respuesta #13 en: 31 de Octubre de 2006, 17:25:06 »
  La verdad espectacular desarrollo de Maunix y Chaly pero me parece que la causa del problema no es ese,
Yo tuve el mismo problema de esos saltos y era un problema con la tensión de referencia.
 La cual también intenté poner en un valor menor de 2 volts pero no resultó.
 La solución es elevar la señal a medir y trabajar con una vref+ de mas de 2v, por ejemplo utilizando un lm336 de 2,5v
este ejemplo lo subí hace un tiempo...

http://www.todopic.com.ar/foros/index.php?topic=13389.msg77809#msg77809



Bueno saludos.
« Última modificación: 29 de Octubre de 2008, 02:34:26 por flacoclau »
Las personas con buena ortografía me atraen textualmente.

El Micro Reactor

Córdoba capital - Argentina.

Desconectado cdlopez

  • PIC10
  • *
  • Mensajes: 39
Re: SALTO EN EL CONVERTIDOR A/D DE UN 16F877
« Respuesta #14 en: 31 de Octubre de 2006, 19:09:15 »
holassss:

Como lo decia, yo tambien probe con varios tiempos de conversion y los resultados no fueron satisfactorio, ademas no creo que sea ese el problema, ya que si referencio Vref a 5V y Vref a 0V funciona perfectamente como lo decia en el post anterior el tiempo de conversion depende de la frecuencia como lo decia Charly y Maunix, pero no de las tensiones de Ref., voy a probar elevando la tension como lo sugería flacoclau a ver que pasa y les cuento.

Saludos

Cristian


 

anything