Autor Tema: Configuracion modulo ADC pic18  (Leído 2510 veces)

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

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Configuracion modulo ADC pic18
« en: 23 de Mayo de 2016, 16:17:49 »
Hola hay una cosa de dicho modulo que no termino de entender, en la configuración del registro ADCON2 bits ADCS2:ADCS0 esta parte creo que la entiendo, por ejemplo para un cristal 20MHz la forma de calcularlo usando el Fosc/16 seria 16/20MHz = 0,8us que seria el Tad mínimo para el Pic18F2550, pero la parte que no entiendo como calcularla es la parte de los registros ACQT2:ACQT0 no entiendo la formula para dicho calculo.
¿Alguien puede iluminarme?

Gracias
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Configuracion modulo ADC pic18
« Respuesta #1 en: 23 de Mayo de 2016, 17:35:03 »
La diferencia entre uno y otro es que el ADCSx, es el tiempo de conversion, es decir internamente cuando ya posee un voltaje el capacitor de sampleo, el tiempo de conversion por cada bit debe ser mayor que el minimo especificado en las caracteristicas electricas, Sino es como si estuvieras tratando de hacer correr algo a mayor velocidad de lo que puede. Digamos que a un trabajador le toma 60 minutos armar algo, y vos estas intentando que lo arme en 45 min. Y eso esta entendido.

El otro es el tiempo de adquisicion, es cuando todavia NO se cargo el capacitor de sampleo, sino el tiempo que necesita para cargarse al voltaje de entrada, entonces influye todo lo que este conectado al pin.
Si vos tenes una resistencia de 1Mohm en el pin, va a circular muy poca corriente y para que llegue la tension del capacitor de sampleo a igualar la de la entrada es mucho tiempo.
Ahora vos podes tener otros valores de entrada. Pero tenes que asegurarte que el capacitor se cargo correctamente antes de iniciar la conversion. Esto se puede lograr de 2 formas.

Si por ejemplo sampleo continuamente, una detras de otro. Entonces tengo que asegurarme que el tiempo de adquisicion alcance para cargar el capacitor. Normalmente la conversion el tiempo es asi:

Código: [Seleccionar]
|----------------Taq----------------------|--------------------------------------Tconv------------------------------------|
Taq que seria el tiempo de adquisicion, va a variar segun lo que pongas ahi, Cada ves que inicies la conversion va a esperar cierta cantidad de ciclos antes de desconectar el capacitor de sampleo de la entrada y ponerse a convertir el valor a digital.

Como te decia se puede hacer de 2 formas, otra forma seria hacer algo asi:

Código: C
  1. delay_ms(1);
  2. Iniciar_conversion_ADC();

El concepto es el mismo, nomas que ahora la demora para que se cargue el capacitor esta realizado por software y no por hardware.
La idea de esto es que la lectura no se agreguen errores.

¿Como calcularlo?

Depende mucho de lo que tenes conectado a la entrada. Existen 3 coeficientes:

Código: [Seleccionar]
TACQ = Amplifier Settling Time + Holding Capacitor Charging Time + Temperature Coefficient
TACQ = TAMP + TC + TCOFF

Es decir, TAMP, TC y TOFF. Los cuales 2 no depende de lo que tengas conectado.

TAMP deberia estar en el datasheet, pero al menos el que tengo lo toma como 0.2us (fijo)
TCOFF depende de unicamente de la temperatura de trabajo:

(Temp – 25°C)(0.02 μs/°C)

El coeficiente ( 0.02 us/ºC ) realmente no se de donde sale, tal ves exista un documento con mas informacion, pero deberia listarse dentro de los parametros del ADC. Que para menos de 25ºC se toma como 0. Tal ves tenga que ver con el coeficiente del mismo conductor que lleva la corriente al capacitor de sampleo, el cual aumente su resistencia con la temperatura.

Y finalmente el mayor de todos suele ser el tiempo que tarda el capacitor en cargarse por culpa de las resistencias. Suponiendo un error de 1/2 LSB, Por eso el 2048, el tiempo que tardaria en cargarse/descargarse de VREF a VREF/2048 , esta dado por esta funcion:

Código: [Seleccionar]
VHOLD = (VREF – (VREF/2048)) * (1 – e(-TC/CHOLD(RIC + RSS + RS)))
Por si las dudas, te dejo la formula del voltaje de un capacitor ( una red RC serie )

Citar
https://upload.wikimedia.org/math/a/8/f/a8f76fb4f37fa2420ca342cc5787212f.png

O que tambien lo podes poner como (Asi queda parecida a la primera):

Código: [Seleccionar]
Vc = (Vf - Vi) * e^(t/(R*C))
La R esta compuesta por varias partes ( es la suma de todas las resistencias en serie ), la RSS que es la resistencia del switch que abre el circuito analogico al moemnto de la conversion, y que depende del voltaje de alimentacion. La RIC que es la resistencia de la misma conexion desde el PIN a ese switch. Y finalmente la resistencia exterior que seria la RS.

Si despejas la t, de la anterior formula , o TC de la formula de VHOLD, te queda asi:

Código: [Seleccionar]
TC = -(CHOLD)(RIC + RSS + RS) ln(1/2048)
Que es el tiempo que le toma cargarse al capacitor con todas esas resistencias, hasta un error que es 1/2 LSB. Reemplazando luego eso, En el cual:

CHOLD = 25uF ( deberia ser dado en los parametros electricos pero lo da en la explicacion)
RIC = 1Kohm maximo. Valor Fijo, dado nuevamente en el modelo del pin de entrada del ADC.
RSS = Valor que depende del voltaje de alimentacion, donde esta el modelo suele existir un pequeño grafico. Asi obtenes el valor.

Y finalmente la resistencia externa RS.

Sumando todos los tiempos dados, obtenes el TAQC, el cual si uno quisiera samplear uno detras de otro y no agregar ninguna pausa en software, debera ser como maximo 20TAD. Si supera eso o modificas la resistencia de entrada, o podes esperar para convertir otra ves, sino el resultado que vas a leer va a ser erroneo.

Todo esto derivado de entender como esta conformado el PIN de entrada analogico, el cual deberias ver el datasheet el modelo para darte cuenta que todo termina siendo representado por un simple RC serie.
« Última modificación: 23 de Mayo de 2016, 17:43:31 por KILLERJC »

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re:Configuracion modulo ADC pic18
« Respuesta #2 en: 23 de Mayo de 2016, 17:57:07 »
 :2] :2] :2] :2]
No dudo que sea una muy buena explicación pero no esta pensada para mi, de todos modos gracias.

Saludos!
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re:Configuracion modulo ADC pic18
« Respuesta #3 en: 23 de Mayo de 2016, 18:28:51 »
Según veo en la pagina 270 del datasheet como ejemplo calcula el TACQ con estos valores:
TACQ = 0,2us + 1,05us + 1,2us
TACQ = 2,45us

Usando un cristal de 20MHz y sabiendo el valor de TACQ en este caso 2,45us que valor seria el correcto para los registros ACQT2:ACQT0 y como se llega a este valor.
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Configuracion modulo ADC pic18
« Respuesta #4 en: 23 de Mayo de 2016, 19:14:10 »
Pero este valor:

TACQ = 0,2us + 1,05us + 1,2us

Depende de la resistencia de entrada, la cual esta calculada con una resistencia de 2.5Kohms a la entrada, es decir conectado entre la fuente de tension que queres medir y el pin. (Como la imagen que puse )
Ademas supone que estas trabajando con 5V

Luego este valor:

TACQ = 0,2us + 1,05us + 1,2us

Esta calculado para una temperatura de 85ºC

No es demasiada complicacion...
El resultado es algo asi para lo calculado:


* ad.jpg
(76.84 kB, 750x472 - visto 425 veces)


Si tenes los mismos valores vas a tener 2.45us, si recordas con Fosc/16 tenias 0.8us de TAD
Asi que deberias seleccionar un TAQC de 5 TAD o mas.

Ahora si llegas a tener una resistencia de entrada de 10K los valores cambian. Y la formula quedaria:

TACQ = 0,2us + 2.47us + 1,2us = 3.87us

Y necesitarias 5 TAD o mas ( 3.87us / 0.8us = 4.83 )

-------------------------

Supongamos el caso en que le pones una resistencia muy grande para no consumir corriente de la fuente. Tal ves 1Mohm. Eso se traslada a:

TACQ = 0,2us + 191.18us + 1,2us = 192.58us

Lo cual tendrias que esperar 192.58us para que se cargue el capacitor antes de iniciar una conversion. O lo que es igual que 242 TAD, lo cual no puede realizarse por hardware.

No hice nada magico hasta ahora, solo reemplace los valores de la resistencia RS (observa el grafico) para calcular el tiempo:

Primera formula: TC = -(25 pF) (1 kΩ + 2 kΩ + 2.5 kΩ) ln(0.0004883)
Segunda formula: TC = -(25 pF) (1 kΩ + 2 kΩ + 10 kΩ) ln(0.0004883)
Ultima formula: TC = -(25 pF) (1 kΩ + 2 kΩ + 1 MΩ) ln(0.0004883)
« Última modificación: 23 de Mayo de 2016, 19:20:33 por KILLERJC »

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re:Configuracion modulo ADC pic18
« Respuesta #5 en: 24 de Mayo de 2016, 03:33:54 »
Muchas gracias ahora si lo tengo claro.

Gracias.
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re:Configuracion modulo ADC pic18
« Respuesta #6 en: 24 de Mayo de 2016, 18:24:20 »
Gracias a KILLERJC tengo el modulo ADC del pic18 funcionando sin hacer un copy&paste del programa.
Código: C
  1. /* includes globales */
  2. #include <xc.h>
  3. #include <plib/usart.h>
  4. #include <plib/adc.h>
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7.  
  8. /* includes locales */
  9. #include "config_bits.c"
  10.  
  11. /* declaración de variables globales */
  12. unsigned char MsgFromPIC[] = "\r\nADC value is: ";
  13. int ADCValue = 0;
  14. unsigned char ADCStringVal[4];
  15.  
  16. /* Declaracion de funciones */
  17. void OpenUSART(unsigned char config,unsigned int spbrg);
  18.  
  19. void main(void)
  20. {    
  21.     // configuramos modulo ADC
  22.     ADCON1 = 0x0E;
  23.     ADCON0 = 0x03;
  24.     ADCON2 = 0x9D;
  25.    
  26.     // Configuracion del puerto serie USART
  27.     // (frecuencia a la que trabaja el cpu/dbaudrate)/16)-1
  28.     // (20.000.000/9600)/16)-1=129
  29.     OpenUSART(USART_TX_INT_OFF & USART_RX_INT_ON &
  30.               USART_ASYNCH_MODE & USART_EIGHT_BIT &
  31.               USART_CONT_RX & USART_BRGH_HIGH, 129);
  32.    
  33.     ConvertADC();
  34.    
  35.     while(1)
  36.     {
  37.         ADCValue = ReadADC();
  38.         putsUSART(MsgFromPIC);
  39.         putsUSART(itoa( ADCStringVal, ADCValue,10)); // convertimos a string
  40.     }
  41. }
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.