Autor Tema: Asesoria sobre ADC  (Leído 5482 veces)

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

Desconectado estratus123

  • PIC10
  • *
  • Mensajes: 25
Asesoria sobre ADC
« en: 21 de Marzo de 2006, 22:43:00 »
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

Desconectado RaDoN

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1498
RE: Asesoria sobre ADC
« Respuesta #1 en: 22 de Marzo de 2006, 04:30:00 »
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.
Si juegas contra el mejor, pierdes como los demás.

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
RE: Asesoria sobre ADC
« Respuesta #2 en: 22 de Marzo de 2006, 05:45:00 »
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


No has intentado buscar en las Application Notes de Microchip? Realmente está todo resuelto solo debieras echar un vistazo y acomodar el software a tus necesidades puntuales.

Por defecto el pic en cuestión enciende con el puerto A todo como entrada y sus canales analógicos activados.

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 estratus123

  • PIC10
  • *
  • Mensajes: 25
RE: Asesoria sobre ADC
« Respuesta #3 en: 22 de Marzo de 2006, 10:10:00 »
Hola de nuevo,  les comento que estoy usando lenguaje ensamblador, el mayor problema que tengo es con algunos registros que no entiendo su funcion, voy a poner mi idea y espero me corrijan y me digan en que estoy mal.
El ADCON1 sirve para configurar el puerto entre a/d si es 0 los bit"s 0 y 1 es analogico y si estan en 1 es digital, pero tengo una duda en las caracteristicas dice que tambien hay un valor que lo toma como vref+, creo que es una referencia de voltaje, si me pudieran explicar que es exactamente y como usarlo o que utilidad tiene. Luego esta el ADCON0 el bit 7 y 6 (ADCS1,ADCS0) creo que es el reloj que usara para la conversion tambien tengo muchas dudas de que hace esto si lo tengo que configurar o no es necesario, el bit 4 y 3 son los canales de conversion que puedo usar, el bit 2 segun yo con este bit activo el conversor cuando se pone a uno, y tengo entendido que este regresa a cero cuando termina la conversion, el bit 1 es el que me avisa cuando la conversion termino y este bit debo de reresarlo manualmente a 0 por software, el bit 0 entiendo que es para decir si operara el adc, si esta activo o desactivo aunque no entiendo muy bien, ojala que si estoy mal en alguna de estas especificaciones me corrijan.

Tengo la duda de donde se almacena el resultado del ADC, segun he visto en los programas, se alamacena en un registro llamado ADRESL que segun mi pic 16f877 esta en 0x9E, es correcto esto o estoy completamente perdido. Este resultado se puede manipular normalmente o se tiene que manejar de alguna forma en especial.
En parte de los ejemplos que  he visto de microchip se acitva el INTCON, para esto es necesario, no entiendo ben esto.
Voy a poner mi idea de programa para capturar un dato, espero que ayuden en corregirlo, para poder obtener correctamente la conversion.
Tambien tengo una duda en el ADCON0,0 este bit lo tengo que desactivar cada vez que cambie entre canales del conversor, o siempre puede estar activo.


            bsf          status,rp0          ;entro al banco1
            movlw    0x00
            movwf    adcon1               ;configuro las entradas analogicas
            bcf         status,rp0        
            bcf         adcon0,4            
            bcf         adcon0,3            ;selecciono el canal AN0
            bsf         adcon0,0            ;Activo el ADC
            call         espe                  ;Tengo entendido que debo de darle un tiempo
                                                    ;de activacion, pero no se que tiempo debe ser.
                                                    ;Si me explicaran esta parte.
            bsf         ADCON0,2          ;Inicio la conversion
conve   btfss      ADCON0,1          ;Si el bit 1 de ADCON0 esta en uno termino
            goto      conve                  ;la conversion si no lo sigue revisando.
            bsf        status,rp0           ;Entro al banco uno para sacar el resultado
            movf     adresl,0               ;de adresl y lo dejo en W
            bcf        status,rp0            ;Regreso al banco 0

      ;En teoria yo entiendo que asi funcionaria, pero no estoy muy seguro,
      ;si quisiera sacar otro dato tendria primero que borrar el ADCON0,1

            bcf        adcon0,1


Bueno basicamente es hasta donde se yo, si cometi algun error les agradeceria mucho que me explicaran donde fue, y como lo podria corregir, y si me explicaran donde debe de llevar tiempos y donde no se los agradeceria aun mas, ya que he leido que se le debe de dar tiempos a la conversion si no esta sera erronea. Muchas gracias adelantadas

Desconectado estratus123

  • PIC10
  • *
  • Mensajes: 25
RE: Asesoria sobre ADC
« Respuesta #4 en: 22 de Marzo de 2006, 10:13:00 »
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.


Hola RaDoN, perdona mi ingnorancia, pero que es eso de escojer un reloj interno, supongo que es algo basico, pero no he visto los relojes internos, tiene que ver algo con ADCON0 los bit 7 y 6, y si si es esto, como funcionan, ya que no entiendo muy bien lo del reloj interno

Desconectado RaDoN

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1498
RE: Asesoria sobre ADC
« Respuesta #5 en: 22 de Marzo de 2006, 13:43:00 »
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

Si juegas contra el mejor, pierdes como los demás.

Desconectado estratus123

  • PIC10
  • *
  • Mensajes: 25
RE: Asesoria sobre ADC
« Respuesta #6 en: 23 de Marzo de 2006, 02:47:00 »
Escrito originalmente por RaDoN
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




Hola de nuevo, disculpa, pero no entendi nada de tu codigo, supongo que por que solo se lo basico del ensamblador y no he llegado tan lejos, ojala me lo pudieras explicar, y con respecto al codigo que puse esta bien o estoy completamente perdido??? Gracias y perdonen las molestias

Desconectado Azicuetano

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1020
    • Aplicaciones Electrónicas en Alicante.
RE: Asesoria sobre ADC
« Respuesta #7 en: 23 de Marzo de 2006, 03:27:00 »
Esta es la primera rutina de conversión AD que hice en su día. Yo diría que es la más simple que tengo.

Para configurar el AD pones:

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   


   


Ahora ponemos una rutina para seleccionar la patilla con la que queremos hacer la conversión. En este caso pongo RA0

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




Ahora... cada vez que quieras hacer una conversión no tienes más que llamar a esta función.

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





Recuerda que este código es el primero que hice, es decir, es muy mejorable.Yo ahora ya no lo utilizo porque lo he ido optimizando, pero, te paso este porque es el que tengo más o menos explicado.

Si tienes algún problema avisa.


Un saludo desde Alicante.

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
RE: Asesoria sobre ADC
« Respuesta #8 en: 23 de Marzo de 2006, 05:37:00 »
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.

- 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 estratus123

  • PIC10
  • *
  • Mensajes: 25
RE: Asesoria sobre ADC
« Respuesta #9 en: 23 de Marzo de 2006, 09:20:00 »
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.



Hola maunix, lamentablemente no se exactamente como funciona el ADC internamente, la informacion que tengo ha sido por otros programas que he visto o manuales que he leido, auque hasta ahorita apenas voy a llevar a cabo yo mi propio programa, ya que habia usado programas pero que me habian pasado para usos informativos, ahora yo quiero hacer mi propio programa para poder entender como se debe de tratar el ADC de un pic. Perdona si mi tema causo confusion, alomejor desde un inicio no me exprese bien sobre lo que necesitaba, aun asi espero seguir recibiendo ayuda del foro.

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
RE: Asesoria sobre ADC
« Respuesta #10 en: 23 de Marzo de 2006, 16:55:00 »
estratus123 creo que me mal interpretaste.  Claro que seguiré respondiendo tus preguntas, solo quise reformularla para saber realmente cuales son tus dudas.

A ver si te explico un poco

El módulo A/D del pic tiene las siguientes caracteristicas

1) Varios Canales
2) Una tensión de conversión que va de 0V a Vref o a Vcc.
3) 8 o 10 bits de precisión en la mayoría de los pics

El conversor puede convertir un canal  por vez.  El valor convertido será proporcional a la Tensión Adquirida dividido la Tensión de Referencia,  multiplicado por la cantidad de posibilidades que haya de acuerdo a la resolución menos 1.  Con 8 bits tienes 256 posibles valores (de 0 a 255) , con 10 bits, tienes 1024 posibles valores (de 0 a 1023).

El Vref ,se usa si quieres usar otra tensión de referencia que sea diferente a Vcc.  Sino, lo dejas con referencia igual a Vcc.

Si la tensión en un canal es 2V y la Ref es 5V, el valor convertido será

Para 8 bits --> (2/5) * 255 = 102d
Para 10 bits --> (2/5) * 1023 = 409d

El clock del A/D, es el que marca los pasos de la conversión.  Cuanto más rapido el clock más rápido tendrás la conversión.  Ahora bien, el manual aclara que no debes intentar superar la máxima velocidad ya que si haces esto, el valor convertido podria ser totalmente impreciso.

Espero haberte aclarado un poco mas el panorama.

- 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 estratus123

  • PIC10
  • *
  • Mensajes: 25
RE: Asesoria sobre ADC
« Respuesta #11 en: 24 de Marzo de 2006, 12:06:00 »
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.

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
RE: Asesoria sobre ADC
« Respuesta #12 en: 24 de Marzo de 2006, 13:40:00 »
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.


El conversor si es de 10 bits, siempre convierte 10 bits.

Ahora bien, el punto es el siguiente.  Son 10 bits que se ubican en dos registros de 8 bits cada uno.  ADRESH:ADRESL

Entonces imaginemos que el dato convertido sea el 1023d (el máximo posible).

Entonces el valor será

Con justificación izquierda:
ADRESH:ADRESL = b1111111111000000
ADRESH = 11111111b = 0xFF = 255d
ADRESL = 1100000b  = 0xC0 = 192d


Con justificación derecha
ADRESH:ADRESL = b0000001111111111
ADRESH = 00000011b = 0x03 = 3d
ADRESL = 11111111b  = 0xFF = 255d


Entonces, si solo quieres trabajar con 8 bits, usas justificación izquierda, ya que con solo leer ADRESH tendrás los valores "mas importantes" de la conversión!  Los dígitos menos significativos solo indicarán los saltos más pequeños de tensión.  El A/D convierte a 5V con una precisión de 4.8 mV.  Si tu solo usas los 8 bits mas significativos entonces etas usando saltos de casi 20 mV ya que no tienes en cuenta las variaciones más pequeñas.


Si quieres usar modo de 10 bits, entonces debes usar la justificación a la derecha asi el número leído estará bien acomodado en los registros y te será más fácil trabajar con él.


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 estratus123

  • PIC10
  • *
  • Mensajes: 25
RE: Asesoria sobre ADC
« Respuesta #13 en: 25 de Marzo de 2006, 18:23:00 »
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.

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
RE: Asesoria sobre ADC
« Respuesta #14 en: 27 de Marzo de 2006, 14:36:00 »
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.


Me alegro te esten funcionando las cosas.

- 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)