Escrito originalmente por estratus123
Hola a todos, esta pregunta se ha formulado muchas veces pero no he logrado entender muy bien como funciona el ADC, estoy usando un pic 16f877 y me gusta saber como es que se tiene que configurar el pic para que pueda usar el ADC y como puedo recojer los datos analogicos que estan entrando... Espero me puedan ayudar
Escrito originalmente por RaDoN
En general configuras los pines del puerto A (donde suele estar el ADC) como entrada, posteriormente le indica que lo usarás como analogicos. Debes escojerle un reloj por ejemplo el interno que no te dará problemas. Seleccionas el canal que desees que coja la muestra y por ultimo le indica que inicialice la captura.
Si no indicas con que lenguaje pretendes hacerlo, no podemos ser específicos, si es en ASM basta con que veas el datasheet cuales son los registros de control de este.
Codigo:
////////////////////////////////////////////////////////////////// ADC
// ADC Functions: SETUP_ADC(), SETUP_ADC_PORTS() (aka SETUP_PORT_A),
// SET_ADC_CHANNEL(), READ_ADC()
// Constants used for SETUP_ADC() are:
#define ADC_OFF 0 // ADC Off
#define ADC_CLOCK_DIV_2 0x10000
#define ADC_CLOCK_DIV_4 0x4000
#define ADC_CLOCK_DIV_8 0x0040
#define ADC_CLOCK_DIV_16 0x4040
#define ADC_CLOCK_DIV_32 0x0080
#define ADC_CLOCK_DIV_64 0x4080
#define ADC_CLOCK_INTERNAL 0x00c0 // Internal 2-6us
Escrito originalmente por RaDoNCodigo:
////////////////////////////////////////////////////////////////// ADC
// ADC Functions: SETUP_ADC(), SETUP_ADC_PORTS() (aka SETUP_PORT_A),
// SET_ADC_CHANNEL(), READ_ADC()
// Constants used for SETUP_ADC() are:
#define ADC_OFF 0 // ADC Off
#define ADC_CLOCK_DIV_2 0x10000
#define ADC_CLOCK_DIV_4 0x4000
#define ADC_CLOCK_DIV_8 0x0040
#define ADC_CLOCK_DIV_16 0x4040
#define ADC_CLOCK_DIV_32 0x0080
#define ADC_CLOCK_DIV_64 0x4080
#define ADC_CLOCK_INTERNAL 0x00c0 // Internal 2-6us
Codigo:
; CONFIGURAMOS EL CONVERSOR A/D
bcf ADCON1,ADFM ; Justificacion a la derecha. El valor de la conversion lo guardamos en ADRESH
bcf ADCON1,0 ; D D D D D D D A
bsf ADCON1,1
bsf ADCON1,2
bsf ADCON1,3
MOVLW b"00000001" ; RA0 se programan como entrada
MOVWF TRISA
bcf STATUS,RP1 ; BANCO 0
bcf STATUS,RP0
bcf ADCON0,7 ; Fosc/32
bcf ADCON0,6
Codigo:
PATILLA_CONVERSION_0 ; En la patilla RA0 tendremos la entrada analógica
bcf ADCON0,5 ; Seleccionamos la patilla RA0 como la entrada que realizara la conversion A/D.
bcf ADCON0,4
bcf ADCON0,3
bcf PIR1,ADIF ; Cuando se finaliza una conversion este bit se activa. En primera instancia lo pondremos a "0"
RETURN
Codigo:
CONVERSION
bcf STATUS,RP1
bcf STATUS,RP0
bsf ADCON0,0 ; Hacemos operativo el modulo A/D
nop ; Retardo necesario
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
bcf PIR1,ADIF ; Este bit se activa cuando la conversión se completa. En un principio lo pongo a "0" y cuando hagamos una CONVERSIÓN ya se activará
bsf ADCON0,2 ; Le decimos al Micro que comience ya con la conversión.
loop btfss PIR1,ADIF ; Este bit se activará cuando finalice la conversión.
goto loop
nop
movf ADRESH,W
movwf AD ; Metemos el resultado de la convesion (que se guarda en ADRESH porque anteriormente lo hemos configurado así ) en AD.
RETURN
Escrito originalmente por maunix
estratus123 tal vez tu problema sea que no sabes bien como funciona un A/D o que es lo que hace? Es esta tu duda principal?
Es que comenzaste preguntando como configurar el A/D y luego saliste consultando que era el Vreferencia y el Clock y todo eso, cosas que son básicas en electrónica y cualquiera que haya usado o visto como funcionan los A/D lo sabe.
No es mi animo ofender, al contrario, es "saber que sabes" para poderte guiar o explicarte esas cosas.
Escrito originalmente por estratus123
Hola de nuevo, muchas gracias maunix por la explicacion me ha ayudado mucho para entender el ADC y gracias Azicuetano tu codigo me ayudo mucho para asesorarme, ya estoy haciendo pruebas y todo parece ir bien, ya solo me queda un duda, en la configuracion del ADCON1 esta el bit 7 ADFM, tengo entendido que el conversor de este pic es de 10 bit"s, depende de que se configure en adfm sera los valores que tomara de esos 10 bit"s, en la DataSheet del pic viene lo siguiente.
bit 7 ADFM: A/D Result Format Select bit
1 = Right justified. Six (6) Most Significant bits of ADRESH are read as ‘0’.
0 = Left justified. Six (6) Least Significant bits of ADRESL are read as ‘0’.
Y aqui es donde me confundo, si esta en "1" me tomara ADRESL los valores menos significativos de la conversion es decir los bit del 0 a 7 y ADRESH del 8 al 9 ???
Y si esta en 0 ADFM sera a l inversa o como funciona esto, por que aqui me causa mucha duda eso? ojala me puedan explicar bien.
Escrito originalmente por estratus123
Hola de nuevo a todos, muchas gracias por toda la ayuda que me han dado con el ADC, ya por fin logre entender su funcionamiento y ya funcionan a la perfeccion mis programas.
Escrito originalmente por microcom
conversion analogo digital con lm35
espero que te sirva y