Autor Tema: Módulo de conversión analógica/digital (PIC16F87XA y PIC18F2455/2550/4455/4550)  (Leído 25719 veces)

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

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Algunos PICs de la familia 16F y todos los de las familias 18F tienen incorporado el módulo de conversión analógica/digital de 10 bits (Exceptuado algunos de la familia 18F que son módulos de 12 bits).  
Este modulo comprende de varias entradas analógicas multiplexadas (El número depende del PIC), un capacitor de muestro y retención, y un convertidor analógico/digital de aproximaciones sucesivas.


Todo convertidor ADC requiere voltajes de referencia que determinan el valor de mínima escala (Vref-) y el de plena escala (Vref+), de manera que la conversión de un valor de voltaje analógico Vin en el rango de Vref- a Vref+ producirá un valor equivalente binario en el rango de 0 a 2n, donde n es la resolución del convertidor (n = 10).Estas tensiones de referencias pueden seleccionarse por software, entre Vdd y Vcc o entradas positivas colocadas en los pines RA2/Vref- y RA3/VRef+  en donde se deben cumplir ciertos requisitos contemplados en las características eléctricas del convertidor ADC del PIC utilizado, por ejemplo para un 16F877A:

El modulo ADC esta controlado por medio de los registros ADCONx en donde se puede seleccionar que pines serán usados como entradas analógicas, determinar el reloj para la conversión, seleccionar canal de conversión, poner en funcionamiento la conversión, etc. Luego tenemos 2 registros más ADRESH y ADRESL en donde se guarda el resultado de la conversión.
El convertidor A/D tiene la característica de poder funcionar mientras que el dispositivo está en modo sleep. Al funcionar en sleep, el reloj de conversión A/D debe derivar del oscilador interno RC A/D.

Registros ADCONx:
16F87XA:
ADCON0:

Bit 7-6 ADCS1:ADCS0: Bits de selección de reloj para la conversión A/D.

Bit 5-3 CHS2:CHS0: Bits de selección de canal analógico.
     000: Canal 0 (AN0)
     001: Canal 1 (AN1)
     010: Canal 2 (AN2)
     011: Canal 3 (AN3)
     100: Canal 4 (AN4)
     101: Canal 5 (AN5)
     110: Canal 6 (AN6)
     111: Canal 7 (AN7)

Bit 2 GO/DONE: Bit de estado de la conversión A/D.
Cuando ADON=1:
     1 = conversión A/D en marcha (Cuando la conversión termina se borra automáticamente)
     0 = A/D en reposo

Bit 1 Unimplemented: Es leído como  ‘0’
Bit 0 ADON: Bit de habilitación de A/D
     1 = El modulo de conversión A/D es alimentado
     0 = El modulo de conversión A/D no esta en operación. (No consume corriente)

ADCON1:


Bit 7 ADFM: Bit de selección de formato de la conversión A/D.
   
     1 = Justificación derecha. Los 6 bits más significativos de ADRESH se leen como 0.
     0 = Justificación izquierda. Los 6 bits menos significativos de ADRESL se leen como 0.

Bit 6 ADCS2: Bit adicional para la selección del reloj para la conversión A/D.
Bit 5-4 Unimplemented: Es leído como  ‘0’

Bit 3-0 PCFG3:PCFG0: Bits de control de configuración del puerto A/D.


PIC18F2455/2550/4455/4550:
ADCON0:

Bit 7-6 Unimplemented: Es leído como  ‘0’
Bit 5-2 CHS3:CHS0: Bits de selección de canal analógico.
     0000: Canal 0 (AN0)
     0001: Canal 1 (AN1)
     0010: Canal 2 (AN2)
     0011: Canal 3 (AN3)
     0100: Canal 4 (AN4)
     0101: Canal 5 (AN5)*
     0110: Canal 6 (AN6)*
     0111: Canal 7 (AN7)*
     1000: Canal 8 (AN8)
     1001: Canal 9 (AN9)
     1010: Canal 10 (AN10)
     1011: Canal 11 (AN11)
     1100: Canal 12 (AN12)
     1101: Unimplemented
     1110: Unimplemented
     1111: Unimplemented

Bit 1 GO/DONE: Bit de estado de la conversión A/D.
Cuando ADON=1:
     1 = conversión A/D en marcha (Cuando la conversión termina se borra automáticamente)
     0 = A/D en reposo

Bit 0 ADON: Bit de habilitación de A/D
     1 = El modulo de conversión A/D es habilitado.
     0 = El modulo de conversión A/D no esta habilitado.

ADCON1:

Bit 7-6 Unimplemented: Es leído como  ‘0’
Bit 5 VCFG0: Bit de configuración de referencia (VREF- source)
     1 = VREF- (AN2)
     0 = VSS

Bit 4 VCFG0: Bit de configuración de referencia (VREF+ source)
     1 = VREF+ (AN3)
     0 = VDD
Bit 3-0 PCFG3:PCFG0: Bits de control de configuración del puerto A/D.


ADCON2:

Bit 7 ADFM: Bits de selección de formato de la conversión A/D
     1 = Justificación derecha. Los 6 bits más significativos de ADRESH se leen como 0.
     0 = Justificación izquierda. Los 6 bits menos significativos de ADRESL se leen como 0.

Bit 6 Unimplemented: Leído como ‘0’
Bit 5-3 ACQT2:ACQT0: Bits de selección del tiempo de adquisición A/D
     111 = 20 TAD
     110 = 16 TAD
     101 = 12 TAD
     100 = 8 TAD
     011 = 6 TAD
     010 = 4 TAD
     001 = 2 TAD
     000 = 0 TAD*
Bit 2-0 ADCS2:ADCS0: Bits de selección de reloj para conversión A/D .
     111 = FRC (reloj A/D derivado del oscilador RC)
     110 = FOSC/64
     101 = FOSC/16
     100 = FOSC/4
     011 = FRC (reloj A/D derivado del oscilador RC)
     010 = FOSC/32
     001 = FOSC/8
     000 = FOSC/2


Observando los registros se ve una diferencia importante, en la familia 18F el tiempo de adquisición se puede realizar por hardware configurándolo automáticamente.

Tiempos de adquisición A/D:

Para que el convertidor posea la exactitud especificada, se debe contemplar la carga del condensador CHOLD de manera que entre el nivel de tensión del canal. La impedancia de la fuente (RS) y la impedancia del cambio del muestreo interno (RSS) afectan directamente al tiempo requerido para cargar el condensador CHOLD. La impedancia recomendada máxima para las fuentes analógicas es de 2,5kΩ. Cuando la impedancia decrece, el tiempo de adquisición también decrece. Después de que el canal analógico haya sido seleccionado este tiempo de adquisición debe tenerse en cuenta antes de arrancar la conversión.

El calculo detallado puede observarse en el datasheet del PICs utilizado, a modo de ejemplo vemos que en un 16F87XA el mínimo tiempo de adquisición es de 19.72us el cual debe ser generado por software cada vez que se seleccione un canal (Cambiando)
En cambio para los PIC18F2455/2550/4455/4550 el tiempo mínimo de adquisición se reduce a 2.45us, los cuales podemos configurarlo por hardware dependiendo del reloj de conversión seleccionado. Cuando se selecciona ACQT2:ACQT0: 00 la demora se debe generar por software.-

Selección del reloj de conversión A/D:
El tiempo por bit de la conversión A/D se define como TAD. La conversión A/D necesita un mínimo de 12TAD para la serie 16F o 11TAD para la serie 18F por 10 bits de conversión.
La fuente de reloj A/D de la conversión es seleccionable por software. Hay siete opciones posibles para el TAD:
     • 2 TOSC
     • 4 TOSC
     • 8 TOSC
     • 16 TOSC
     • 32 TOSC
     • 64 TOSC
     • Oscilador interno RC

Para las conversiones A/D correctas, el reloj de conversión A/D (TAD) debe ser tan corto como sea posible pero mayor que un mínimo TAD (para más información véase datasheet del PIC utilizado) dado por ejemplo para la serie 16F en 1.6us y para la serie 18F en 0.7us.-


Proceso de conversión analógico/digital.

Pasos a seguir:
     1.   Configurar el módulo A/D
          a.   Configurar los pines analógicos y las tensiones de referencia.
          b.   Seleccionar el reloj de conversión.
          c.   Serie 18F: Seleccionar el tiempo de adquisición.
          d.   Habilitar módulo de conversión A/D.
     2.   Configurar interrupción para el convertidor A/D si se desea.
     3.   Seleccionar canal a convertir.
     4.   Serie 16F o si en serie 18F ACQT2, ACQT0=00: Esperar por lo menos el mínimo de tiempo de adquisición.
     5.   Iniciar conversión seteando el bit GO/DONE.
     6.   Esperar a que termine la conversión:
          a.   Por polling, testeando el bit GO/DONE.
          b.   Por interrupción.
     7.   Leer el valor convertido en ADRESH-ADRESL.
     8.   Para la siguiente conversión esperar mínimo 2TDA

Los registros de resultado:

El par de registros ADRESH:ADRESL son cargados con el dato resultante de una conversión analógico / digital. Cada uno de estos registros es de 8 bits, por lo tanto, juntos pueden guardar hasta 16 bits. Sin embargo, como el resultado es de 10 bits, el módulo de conversión A/D permite justificarlo en la parte izquierda o derecha de los 16 bits disponibles. Esto nos da la posibilidad de elegir la resolución del conversor entre 10 bits (Justificado a la derecha) u 8 bits (Justificado a la izquierda) trabajando solamente con el registro ADRESH.-

« Última modificación: 11 de Octubre de 2009, 23:32:08 por Suky »
No contesto mensajes privados, las consultas en el foro

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Módulo de conversión analógica/digital EJEMPLOS
« Respuesta #1 en: 11 de Octubre de 2009, 22:50:03 »
Ejemplos:

Implementación en assembler:

Código: ASM
  1. list            p=16f877A       ; list directive to define processor
  2.         #include        <p16f877A.inc; processor specific variable definitions
  3.         __CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC & _WRT_OFF & _LVP_ON & _CPD_OFF
  4. ; NOTA:
  5. ; Oscilador utilizado 4MHz.-
  6. ; ************************************************
  7. ByteAlto        equ     0x20    ; Registro para guardar Byte alto de la conversion.-
  8. ByteBajo        equ     0x21    ; Regsitro para guardar Byte bajo de la conversion.-
  9. Contador        equ     0x22    ; registro utilizado en demora.-
  10. ; ************************************************
  11.         org             0x00
  12.         bsf     STATUS,RP0      ; Banco 1
  13.         movlw   0x8E            ; Justificado a la derecha, Fosc/8, RA0 analógico, VDD, VSS.-
  14.         movwf   ADCON1
  15.         bcf     STATUS,RP0      ; Banco 0
  16.         movlw   0x41            ; Fosc/8, Canal 0, módulo habilitado.-
  17.         movwf   ADCON0
  18.         call    Demora_20us     ; Demora de adquision.-
  19.         bsf             ADCON0,GO
  20. Espera
  21.         btfsc   ADCON0,GO       ; Espera a que termine conversion.-
  22.         goto    Espera 
  23.         movf    ADRESH,W        ; Movemos resultado de la conversion.-
  24.         movwf   ByteAlto
  25.         bsf     STATUS,RP0      ; Banco 1
  26.         movf    ADRESL,W
  27.         movwf   ByteBajo
  28.         bcf     STATUS,RP0      ; Banco 0.-
  29.         bsf             ADCON0,ADON     ; Apago modulo de conversion.-
  30. Bucle
  31.         goto    Bucle
  32.  
  33. ;**** Demora ****
  34. Demora_20us
  35.         movlw   0x05 ;
  36.         movwf   Contador ; Iniciamos contador1.-
  37. Repeticion
  38.         decfsz  Contador,1 ; Decrementa Contador1.-
  39.         goto    Repeticion ; Si no es cero repetimos ciclo.-
  40.         return                          ; Regresa de la subrutina.-
  41.  
  42.         end


Implementación en CCS:

Código: C
  1. #include <16F877A.h>
  2. /* ********************* Conversor A/D de 10 bits *************************** */
  3. #device adc=10
  4.  
  5. #FUSES NOWDT, XT, PUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
  6.  
  7. #use delay(clock=4000000)
  8.  
  9. void main()
  10. {
  11. int16 Conversion;
  12.  
  13. /* --> 16F877A.h
  14. #define NO_ANALOGS                           7    // None
  15. #define ALL_ANALOG                           0    // A0 A1 A2 A3 A5 E0 E1 E2
  16. #define AN0_AN1_AN2_AN4_AN5_AN6_AN7_VSS_VREF 1    // A0 A1 A2 A5 E0 E1 E2 VRefh=A3    
  17. #define AN0_AN1_AN2_AN3_AN4                  2    // A0 A1 A2 A3 A5          
  18. #define AN0_AN1_AN2_AN4_VSS_VREF             3    // A0 A1 A2 A4 VRefh=A3              
  19. #define AN0_AN1_AN3                          4    // A0 A1 A3
  20. #define AN0_AN1_VSS_VREF                     5    // A0 A1 VRefh=A3
  21. #define AN0_AN1_AN4_AN5_AN6_AN7_VREF_VREF 0x08    // A0 A1 A5 E0 E1 E2 VRefh=A3 VRefl=A2    
  22. #define AN0_AN1_AN2_AN3_AN4_AN5           0x09    // A0 A1 A2 A3 A5 E0        
  23. #define AN0_AN1_AN2_AN4_AN5_VSS_VREF      0x0A    // A0 A1 A2 A5 E0 VRefh=A3          
  24. #define AN0_AN1_AN4_AN5_VREF_VREF         0x0B    // A0 A1 A5 E0 VRefh=A3 VRefl=A2          
  25. #define AN0_AN1_AN4_VREF_VREF             0x0C    // A0 A1 A4 VRefh=A3 VRefl=A2              
  26. #define AN0_AN1_VREF_VREF                 0x0D    // A0 A1 VRefh=A3 VRefl=A2
  27. #define AN0                               0x0E    // A0
  28. #define AN0_VREF_VREF                     0x0F    // A0 VRefh=A3 VRefl=A2
  29. */
  30.    setup_adc_ports(AN0);
  31. /* --> 16F877A.h
  32. #define ADC_OFF                 0              // ADC Off
  33. #define ADC_CLOCK_DIV_2   0x10000
  34. #define ADC_CLOCK_DIV_4    0x4000
  35. #define ADC_CLOCK_DIV_8    0x0040
  36. #define ADC_CLOCK_DIV_16   0x4040
  37. #define ADC_CLOCK_DIV_32   0x0080
  38. #define ADC_CLOCK_DIV_64   0x4080
  39. #define ADC_CLOCK_INTERNAL 0x00c0              // Internal 2-6us
  40. */
  41.    setup_adc(ADC_CLOCK_DIV_8);
  42.    
  43.    set_adc_channel(0);
  44.    delay_us(20);
  45.    Conversion=read_adc();
  46.    setup_adc(ADC_OFF);
  47.    
  48.    while(1){
  49.    
  50.    }
  51. }

Implementación en C18:

Código: C
  1. #include <p18f2550.h>
  2. #include <adc.h>
  3.  
  4. #pragma config FOSC = XT_XT, CPUDIV = OSC1_PLL2
  5.  
  6.  
  7. void main(void){
  8.         unsigned int Conversion;
  9.  
  10.         TRISA=0xFF;
  11.         ADCON0=0x01;   //Canal 0, Modulo habilitado.-
  12.         ADCON1=0x0E;   // AN0, Vdd, Vss.-
  13.         ADCON2=0x94;   // Justificado a la derecha, 4Tad, Fosc/4
  14.  
  15.         SetChanADC(0);                  // Selecciono canal a convertir.-
  16.         ConvertADC();                   // Comienza conversión.-
  17.         while(BusyADC()==1){}   // Hasta que se finalice conversión.-
  18.         Conversion= ReadADC();  // Realizo lectura.-
  19.         CloseADC();                        // Deshabilito modulo A/D
  20.         while(1){
  21.         }
  22. }

« Última modificación: 12 de Diciembre de 2009, 10:30:22 por un Moderador, Razón: Modificado a petición y demanda del Sr. Sukovsky :D »
No contesto mensajes privados, las consultas en el foro

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1696
Buena iniciativa don Suky  :-/ :-/ ..seria interesante ver unos ejemplos AD para 4550 en asm..desde q me meti en C ni me he mirado los registros de los 18F
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA


Desconectado fidodido18

  • PIC18
  • ****
  • Mensajes: 312
Buena iniciativa don Suky  :-/ :-/ ..seria interesante ver unos ejemplos AD para 4550 en asm..desde q me meti en C ni me he mirado los registros de los 18F

estamos igual!! jajajaja

oye una pregunta ustedes cuando simulan en proteus un programa realizado en CCS y cada vez que realiza una medicion del puerto analogico manda un warning del tiempo del puerto analogico!! NO HE ENCONTRADO LA MANERA DE QUITARLO!! y tengo programas que usan el puerto analogico cada 100 ms y esos warning me ponen lenta la simulacion!! a veces hasta la traban...

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1696
a mi tambien me suele pasar y creo q el problema tiene q ver con el seteo de los bits ADCS1 y ADCS0 que son para el reloj del conversor
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: Módulo de conversión analógica/digital (PIC16F87XA y PIC18F2455/2550/4455/4550)
« Respuesta #6 en: 22 de Noviembre de 2009, 17:36:49 »
Excelente explicacion suky!!! Me es de gran utilidad!! :-/

Aprovecho el hilo para plantear una cuestion:
Resulta que estoy haciendo una aplicacion donde obtengo valores analogicos y tengo q integrarlos y derivarlos. Por lo tanto debo conocer con cierta exactitud el periodo de muestreo.
El problema es que el muestreo no se realiza de forma periodica ya que entre una conversion y la proxima el programa principal puede seguir distintos caminos y tener demoras distintas, y eso genera errores en la derivacion/integracion.
Queria preguntarles cual es el mejor metodo para obtener muestras de forma periodica y a la mayor frecuencia posible para evitar errores. A mi se me ocurrieron un par, pero me gustaria escuchar sus opiniones :wink:
Muchas gracias desde ya!! :D

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Módulo de conversión analógica/digital (PIC16F87XA y PIC18F2455/2550/4455/4550)
« Respuesta #7 en: 22 de Noviembre de 2009, 17:40:13 »
Yo usaría interrupción por timer2 o módulo CCP en modo comparación con evento especial, creo que es lo mas preciso para crear un periodo de muestro.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: Módulo de conversión analógica/digital (PIC16F87XA y PIC18F2455/2550/4455/4550)
« Respuesta #8 en: 22 de Noviembre de 2009, 18:10:12 »

Excelente Suky! :cheesy: :cheesy:

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: Módulo de conversión analógica/digital (PIC16F87XA y PIC18F2455/2550/4455/4550)
« Respuesta #9 en: 22 de Noviembre de 2009, 19:15:22 »
Yo usaría interrupción por timer2 o módulo CCP en modo comparación con evento especial, creo que es lo mas preciso para crear un periodo de muestro.


Saludos!

Se me ocurrio utilizar una interrupcion de timer, pero me da la sensacion de q la frecuencia de muestreo va a ser mucho menor a la maxima q puedo lograr haciendo la conversion en el bucle principal. De todos modos creo q el error se ve altamente disminuido teniendo un periodo constante, asiq prefiero sacrificar algo de frecuencia a cambio de exactitud :wink:.
gracias por tu respuesta suky!!

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Módulo de conversión analógica/digital (PIC16F87XA y PIC18F2455/2550/4455/4550)
« Respuesta #10 en: 22 de Noviembre de 2009, 20:28:34 »
Hey Gera, por si te es de utilidad yo he logrado muestrear audio a 22kSps con un PIC18F2550 a 12MIPS usando el timer0 para interrumpir.  ;-)

El único detalle es que usé un ADC externo MCP3201.  :mrgreen:

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: Módulo de conversión analógica/digital (PIC16F87XA y PIC18F2455/2550/4455/4550)
« Respuesta #11 en: 22 de Noviembre de 2009, 21:04:28 »
Hola Santi!! Aprecio tu oferta, pero no creo q pueda conseguir ese integrado. Gracias igualmente!!
Te cuento q lo q tengo entre manos es una IMU q consta de un acelerometro y un gyro. Por lo tanto tengo q estar muestreando dos canales. Estaba pensando como hacer para no desperdiciar tiempo mientras cambio entre un canal y el otro, y se me ocurrio lo siguiente:
Calculo el timer para q interrumpa cada 20 us, y voy intercalando las mediciones. Durante una interrupcion mido un canal y seteo el otro canal antes de salir de la interrupcion. Entonces cuando vuelva a interrumpir, el segundo canal ya va a estar estabilizado, realizo la medicion y vuelvo a cambiar de canal, y asi sucesivamente.
Eso me va a ahorrar tiempo ocioso en delays y cosas asi, y de paso obtengo un periodo de muestreo mas o menos fijo. El tema es ver como va a repercutir en los calculos ese desfasaje entre las mediciones..

Cuando obtenga algunos resultados les cuento q tal me fue :wink:
saludos!!

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Módulo de conversión analógica/digital (PIC16F87XA y PIC18F2455/2550/4455/4550)
« Respuesta #12 en: 23 de Noviembre de 2009, 13:23:26 »
Es bueno tu plan Gera.

Yo tuve el mismo problema, necesitaba medir 5 señales de audio en el mismo instante, sin tener que esperar la estabilización del switch del PIC por lo que usé 5 MCP3201 externos.

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: Módulo de conversión analógica/digital (PIC16F87XA y PIC18F2455/2550/4455/4550)
« Respuesta #13 en: 23 de Noviembre de 2009, 14:46:51 »
Y si, cuando la tasa de muestreo es crucial no conviene usar el ADC interno del pic.
Por cierto, vieron el adc de texas instruments?? muestrea a 1 GSPS  :shock:
http://focus.ti.com/docs/prod/folders/print/ads5400.html

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Módulo de conversión analógica/digital (PIC16F87XA y PIC18F2455/2550/4455/4550)
« Respuesta #14 en: 23 de Noviembre de 2009, 15:41:30 »
 :shock: :shock:

Pasumáquina  :D

A ver si nos mandan unas free samples ¿no?  :D


 

anything