TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: Suky en 11 de Octubre de 2009, 22:48:45

Título: Módulo de conversión analógica/digital (PIC16F87XA y PIC18F2455/2550/4455/4550)
Publicado por: Suky en 11 de Octubre de 2009, 22:48:45
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.

(http://img16.imageshack.us/img16/1402/conversor.jpg)

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:
(http://img10.imageshack.us/img10/5051/entradasreferencia.jpg)

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:
(http://img208.imageshack.us/img208/5549/adcon0877.jpg)
Bit 7-6 ADCS1:ADCS0: Bits de selección de reloj para la conversión A/D.
(http://img340.imageshack.us/img340/1230/adcon0reloj877.jpg)
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:
(http://img17.imageshack.us/img17/1294/adcon1877.jpg)

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.
(http://img16.imageshack.us/img16/3725/adcon1puerto877.jpg)

PIC18F2455/2550/4455/4550:
ADCON0:
(http://img504.imageshack.us/img504/8243/adcon018f.jpg)
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:
(http://img517.imageshack.us/img517/6237/adcon118f.jpg)
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.
(http://img340.imageshack.us/img340/4016/adcon1puertos18f.jpg)

ADCON2:
(http://img207.imageshack.us/img207/905/adcon218f.jpg)
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.-

Título: Módulo de conversión analógica/digital EJEMPLOS
Publicado por: Suky 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. }

Título: Re: Módulo de conversión analógica/digital (PIC16F87XA y PIC18F2455/2550/4455/4550)
Publicado por: jhozate en 11 de Octubre de 2009, 23:55:02
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
Título: Re: Módulo de conversión analógica/digital (PIC16F87XA y PIC18F2455/2550/4455/45
Publicado por: Nocturno en 12 de Octubre de 2009, 01:42:06
Magnífico hilo Suky. Gracias
Título: Re: Módulo de conversión analógica/digital (PIC16F87XA y PIC18F2455/2550/4455/4550)
Publicado por: fidodido18 en 12 de Octubre de 2009, 15:35:04
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...
Título: Re: Módulo de conversión analógica/digital (PIC16F87XA y PIC18F2455/2550/4455/4550)
Publicado por: jhozate en 12 de Octubre de 2009, 15:59:39
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
Título: Re: Módulo de conversión analógica/digital (PIC16F87XA y PIC18F2455/2550/4455/4550)
Publicado por: gera 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
Título: Re: Módulo de conversión analógica/digital (PIC16F87XA y PIC18F2455/2550/4455/4550)
Publicado por: Suky 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!
Título: Re: Módulo de conversión analógica/digital (PIC16F87XA y PIC18F2455/2550/4455/4550)
Publicado por: AKENAFAB en 22 de Noviembre de 2009, 18:10:12

Excelente Suky! :cheesy: :cheesy:
Título: Re: Módulo de conversión analógica/digital (PIC16F87XA y PIC18F2455/2550/4455/4550)
Publicado por: gera 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!!
Título: Re: Módulo de conversión analógica/digital (PIC16F87XA y PIC18F2455/2550/4455/4550)
Publicado por: migsantiago 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:
Título: Re: Módulo de conversión analógica/digital (PIC16F87XA y PIC18F2455/2550/4455/4550)
Publicado por: gera 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!!
Título: Re: Módulo de conversión analógica/digital (PIC16F87XA y PIC18F2455/2550/4455/4550)
Publicado por: migsantiago 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.
Título: Re: Módulo de conversión analógica/digital (PIC16F87XA y PIC18F2455/2550/4455/4550)
Publicado por: gera 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
Título: Re: Módulo de conversión analógica/digital (PIC16F87XA y PIC18F2455/2550/4455/4550)
Publicado por: migsantiago en 23 de Noviembre de 2009, 15:41:30
 :shock: :shock:

Pasumáquina  :D

A ver si nos mandan unas free samples ¿no?  :D
Título: Re: Módulo de conversión analógica/digital (PIC16F87XA y PIC18F2455/2550/4455/4550)
Publicado por: gera en 23 de Noviembre de 2009, 15:58:34
Si, estan enviendo muestras gratis! :-/ Pero dudo q las vaya a usar jeje. Mientras me estoy fijando q otros ADC tienen a ver si hago algo parecido a lo q hiciste vos para no andar conmutando canales. Por lo pronto me quedo gustando este:
http://focus.ti.com/docs/prod/folders/print/ads7886.html

saludos!!
Título: Re: Módulo de conversión analógica/digital (PIC16F87XA y PIC18F2455/2550/4455/4550)
Publicado por: Suky en 23 de Noviembre de 2009, 16:51:50
Si, estan enviendo muestras gratis! :-/

Seee!! Este bichito de aqui (http://www.todopic.com.ar/foros/index.php?topic=27789.msg233334#msg233334) es una muestra   ;-)

Saludos!
Título: Re: Módulo de conversión analógica/digital (PIC16F87XA y PIC18F2455/2550/4455/4550)
Publicado por: migsantiago en 23 de Noviembre de 2009, 19:18:42
Si, estan enviendo muestras gratis! :-/ Pero dudo q las vaya a usar jeje. Mientras me estoy fijando q otros ADC tienen a ver si hago algo parecido a lo q hiciste vos para no andar conmutando canales. Por lo pronto me quedo gustando este:
http://focus.ti.com/docs/prod/folders/print/ads7886.html

saludos!!

Oye Gera pero ése que pones muestrea a 1MSps... y es demasiado para el AD7260 cuya respuesta de frecuencia en el eje X no rebasa los 350Hz (700Sps son suficientes).

No sé qué fin tenga tu aplicación pero si mides 6 señales (3 aceleraciones y 3 inclinaciones) entre la primera y la última habrán 60us de diferencia con el ADC del pic.

Si muestreas a 1kSps el acelerómetro y de la misma forma el inclinómetro... 60us serán cosa de nada.

No creo que haga falta tanta velocidad  :huh:
Título: Re: Módulo de conversión analógica/digital (PIC16F87XA y PIC18F2455/2550/4455/4550)
Publicado por: gera en 23 de Noviembre de 2009, 20:31:46
Si, tenes razon. Es mas, ni siquiera mido en los 3 ejes, sino q mido 2 ejes del acelerometro y uno del giroscopo. Asiq voy a estar muestreando 3 señales solamente.
Pero tengo por entendido q aumentando la frecuencia de muestreo disminuimos el error. Ademas por lo general hay q promediar varias muestras para reducir el ruido. Asi q me viene bien una buena tasa de muestreo.
Cuando me llegue el gyro y haga las primeras pruebas les cuento ;)
saludos y gracias por los consejos!!
Título: Re: Módulo de conversión analógica/digital (PIC16F87XA y PIC18F2455/2550/4455/4550)
Publicado por: migsantiago en 24 de Noviembre de 2009, 12:56:28
Otro tip más para el amigo Gera...

Digamos que quieres muestrear 4 veces un acelerómetro y luego sacar el promedio. Sumas las 4 muestras y luego las rotas 2 veces a la derecha... siendo una división entre 4  :mrgreen:

Ahora si quieres un mejor promedio, tomas 8 muestras y rotas 3 veces a la derecha.
Título: Re: Módulo de conversión analógica/digital (PIC16F87XA y PIC18F2455/2550/4455/4550)
Publicado por: Suky en 24 de Noviembre de 2009, 12:58:51
Se desvió el tema principal, pero que buenos tips Santiago!  :D :D
Título: Re: Módulo de conversión analógica/digital (PIC16F87XA y PIC18F2455/2550/4455/4550)
Publicado por: gera en 24 de Noviembre de 2009, 13:04:51
Otro tip más para el amigo Gera...

Digamos que quieres muestrear 4 veces un acelerómetro y luego sacar el promedio. Sumas las 4 muestras y luego las rotas 2 veces a la derecha... siendo una división entre 4  :mrgreen:

Ahora si quieres un mejor promedio, tomas 8 muestras y rotas 3 veces a la derecha.

Gracias por el tip :wink: aunq ya lo conocia jeje, siempre hay q tratar de tomar un numero de muestras q sea potencia de 2. Es mas, en el mouse q hice con el acelerometro tomaba como 64 muestras si no mal recuerdo. Asi y todo todavia habia un ruido de alta frecuencia muy molesto, asiq pase la señal por un LPF digital de segundo orden.

Se desvió el tema principal, pero que buenos tips Santiago!  :D :D

Suky, mil disculpas por desvirtuar el tema :oops:
Título: Re: Módulo de conversión analógica/digital (PIC16F87XA y PIC18F2455/2550/4455/4550)
Publicado por: migsantiago en 24 de Noviembre de 2009, 13:07:44
Gracias por el tip :wink: aunq ya lo conocia jeje

Ah OK por ahora ya no tengo más así que te dejaré trabajar en paz jejeje  :D
Título: Re: Módulo de conversión analógica/digital (PIC16F87XA y PIC18F2455/2550/4455/4550)
Publicado por: Medusa en 24 de Noviembre de 2009, 16:17:08
Citar
Digamos que quieres muestrear 4 veces un acelerómetro y luego sacar el promedio. Sumas las 4 muestras y luego las rotas 2 veces a la derecha... siendo una división entre 4 

Ahora si quieres un mejor promedio, tomas 8 muestras y rotas 3 veces a la derecha.

Hola, no quisiera desviarlos del tema nuevamente pero Migsantiago  tendrias la amabilidad de poner un ejemplo con esta tecnica?, que esta muy interesante yo no la conocia !!
Título: Re: Módulo de conversión analógica/digital (PIC16F87XA y PIC18F2455/2550/4455/4550)
Publicado por: migsantiago en 24 de Noviembre de 2009, 16:49:45
Citar
Digamos que quieres muestrear 4 veces un acelerómetro y luego sacar el promedio. Sumas las 4 muestras y luego las rotas 2 veces a la derecha... siendo una división entre 4 

Ahora si quieres un mejor promedio, tomas 8 muestras y rotas 3 veces a la derecha.

Hola, no quisiera desviarlos del tema nuevamente pero Migsantiago  tendrias la amabilidad de poner un ejemplo con esta tecnica?, que esta muy interesante yo no la conocia !!

Pues no es técnica, es el cálculo de siempre de un promedio pero aprovechando la bondad de los números binarios y sus rotaciones.

Código: [Seleccionar]
int16 promedio = 0;
int8 i;

for(i=0; i<8; ++i)
   promedio += read_adc(); //toma 8 muestras

promedio >>= 3; //las divide entre 8
Título: Re: Módulo de conversión analógica/digital (PIC16F87XA y PIC18F2455/2550/4455/4550)
Publicado por: AKENAFAB en 24 de Noviembre de 2009, 17:27:01
xD

Uso las mismas artimañas , xD

Checar las de algebra que facilitan el trabajo y velocidad en los calculos . No me pregunten porque soy muy malo xD }excelentes tips!
Título: Re: Módulo de conversión analógica/digital (PIC16F87XA y PIC18F2455/2550/4455/4550)
Publicado por: Medusa en 24 de Noviembre de 2009, 17:52:57
gracias...
Título: Re: Módulo de conversión analógica/digital (PIC16F87XA y PIC18F2455/2550/4455/4550)
Publicado por: Suky en 24 de Noviembre de 2009, 20:48:41
xD

Uso las mismas artimañas , xD

jejeje! Los que programan en asm saben de esto, hay que darse maña para no complicarse la vida  :D :D

Saludos!
Título: Re: Módulo de conversión analógica/digital (PIC16F87XA y PIC18F2455/2550/4455/4550)
Publicado por: fernandomt84 en 15 de Septiembre de 2010, 16:59:17
Si, estan enviendo muestras gratis! :-/

Seee!! Este bichito de aqui (http://www.todopic.com.ar/foros/index.php?topic=27789.msg233334#msg233334) es una muestra   ;-)

Saludos!


Estoy queriendo utilizar ese integrado el ADS7886 http://focus.ti.com/docs/prod/folders/print/ads7886.html
para muestrear una señal a 1Msps es un ADC de 12 bits conectado a un 18f4550 por SPI, ya que soporta esa comunicacion serial,

quisiera saber si lograron conseguirlo, o si tienen algun codigo de ejmplo para ver, gracias!

Título: Re: Módulo de conversión analógica/digital (PIC16F87XA y PIC18F2455/2550/4455/4550)
Publicado por: fernandomt84 en 04 de Octubre de 2010, 01:13:33
tengo una duda, cual es la maxima frecuencia de muestreo del ADC del 18f4550 ?

puede alcanzar 1Mhz la velocidad de muestreo?

gracias!!
Título: Re: Módulo de conversión analógica/digital (PIC16F87XA y PIC18F2455/2550/4455/4550)
Publicado por: soymoe en 05 de Enero de 2011, 21:24:52
Yo estuve buscando la rutina de conversio por todos lados y termine haciendome una que creo funciona ya que al variar la entrada AN0 varia el valor del conversor, pero si lo justifico a la derecha no anda.
Título: Re: Módulo de conversión analógica/digital (PIC16F87XA y PIC18F2455/2550/4455/4550)
Publicado por: javierdavid2006 en 21 de Junio de 2011, 13:10:42
Disculpen, no esta muy claro la parte en la que uso el conversor analogico con voltajes de referencia usando los pines AN2 y AN3, por ejemplo, si yo quiero medir 14 vdc con el pic, tendria que alimentar al integrado con 0.3v mas que lo que pongo de referencia???

Podrian poner una explicacion a ese caso, para no estar siempre midiendo con respecto a 5v.

Muchas Gracias
Título: Re: Módulo de conversión analógica/digital (PIC16F87XA y PIC18F2455/2550/4455/4550)
Publicado por: gera en 21 de Junio de 2011, 15:31:41
Disculpen, no esta muy claro la parte en la que uso el conversor analogico con voltajes de referencia usando los pines AN2 y AN3, por ejemplo, si yo quiero medir 14 vdc con el pic, tendria que alimentar al integrado con 0.3v mas que lo que pongo de referencia???

Podrian poner una explicacion a ese caso, para no estar siempre midiendo con respecto a 5v.

Muchas Gracias


El voltaje de referencia no debe exceder el de alimentación, se utiliza mas que nada cuando la señal es mas baja que la tension de alimentacion, asi aprovechamos mejor la resolucion del ADC.
Por lo tanto si la señal que queres muestrear toma valores mayores que la tension de alimentacion, tenes que atenuarla. Eso se puede hacer facilmente con un divisor de voltaje resistivo.
Saludos!!
Título: Re: Módulo de conversión analógica/digital (PIC16F87XA y PIC18F2455/2550/4455/4550)
Publicado por: Suky en 21 de Junio de 2011, 15:36:45
Segunda imagen del primer post
Título: Re:Módulo de conversión analógica/digital (PIC16F87XA y PIC18F2455/2550/4455/4550)
Publicado por: Thaanhiel en 30 de Septiembre de 2016, 14:34:13

Buen día tengan todos,

En primera instancia quiero agradecer por toda la información que han dejado en el foro y que en realidad durante mis años de estudio fue muy provechosa. Realmente es mi primer post desde que salí de la U.

Ya se que el hilo está como oxidado pero no sobra una desempolvada.

El programa que tengo hasta el momento funciona, pero hala corriente como desesperado y la aplicación es con baterías (No están durando).
La idea (A groso modo) es medir condiciones de humedad en 2 entradas continuamente, y cuando sobrepasen un valor establecido en el promedio me generen una señal sobre un actuador (Fácil cierto?).

Nunca fui muy bueno con la programación, y ahora me tienen haciendo esto en PIC C, (Afortunadamente esto es C plano).
Lo tengo con una batería de 9V estándar y el consumo de corriente mientras está apagado (Sleep) es de 2uA (Por cierto el u es el 16LF1614)
pero cuando arranca se come 122uA y no consigo bajar el consumo.

Las interrupciones son algo que hasta ahora estoy digiriendo. y quiero en primera instancia entender la interrupción "INT_AD". Como funciona, para dummyes si es posible.

Agradezco cualquier colaboración de antemano. y felicidades. Exitos Son de lo mejor.