Autor Tema: Cuánto tiempo requiere el conversor ADC  (Leído 21666 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado jfmateos2

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3145
Cuánto tiempo requiere el conversor ADC
« en: 25 de Enero de 2008, 14:51:12 »
Estoy usando un 18F2455 con la siguiente configuración:

Código: [Seleccionar]
   setup_adc_ports(PIN_B0);
   setup_adc(ADC_CLOCK_INTERNAL);
   set_adc_channel(12);

y tengo el siguiente código:
Código: [Seleccionar]
   do{
      value = read_adc();
      if (value>UMBRAL){
         break;
      }     
   }while(true);

A. ¿Debería introducir una pausa después de value=read_adc() para que dé tiempo a que se efectúe la conversión?

B. ¿Cómo se configura el número de muestras que se tienen en cuenta en la conversión, en otras palabras, cuánto tiempo requiere la conversión?

C. ¿En caso de A afirmativa, sería más apropiado utilizar el siguiente código que el anterior para evitar introducir la pausa?
Código: [Seleccionar]
   read_adc(ADC_START_ONLY);
   do{
      value = read_adc(ADC_READ_ONLY);
      if (value>UMBRAL){
         break;
      }     
   }while(true);

Gracias. Me temo que no entiendo en absoluto cómo funciona el conversor ADC.

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Cuánto tiempo requiere el conversor ADC
« Respuesta #1 en: 25 de Enero de 2008, 15:00:53 »
Hola jfmateos2

lo ideal es que le metas un retardo lo suficientemente largo para aproximar la conversión (que depende de la R de carga)

mira en la datasheet, hablan que existe un retardo por hardware mediante los registros ACQT2:ACQT0 en ADCON2

una vez hice unos ensayos con el 4550

http://www.todopic.com.ar/foros/index.php?topic=15208.msg97194#msg97194
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado jfmateos2

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3145
Re: Cuánto tiempo requiere el conversor ADC
« Respuesta #2 en: 25 de Enero de 2008, 15:12:04 »
Gracias Palitroquez; estoy echando un vistazo a tu enlace.

De momento he descubierto que el segundo código que puse (y que repito a continuación) no funcionaría, pues al ejecutar read_adc(ADC_START_ONLY) parece ser que se ejecuta una única conversión.

Código: [Seleccionar]
  read_adc(ADC_START_ONLY);
   do{
      value = read_adc(ADC_READ_ONLY);
      if (value>UMBRAL){
         break;
      }     
   }while(true);

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Cuánto tiempo requiere el conversor ADC
« Respuesta #3 en: 25 de Enero de 2008, 16:23:07 »
jfmateos2 si quieres ver la limitante de hardware, te dejo un par de hilos que te pueden interesar

http://www.todopic.com.ar/foros/index.php?topic=14529.msg88942#msg88942


http://www.todopic.com.ar/foros/index.php?topic=12529.0
- 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 reiniertl

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1187
Re: Cuánto tiempo requiere el conversor ADC
« Respuesta #4 en: 25 de Enero de 2008, 16:35:10 »
Si usas read_adc(READ_ONLY) es porque usarás la interrupción para leer el dato, y tendrías que previamente haber iniciado el proceso de conversión con una llamada del tipo read_adc(ADC_START_ONLY)

Si lo que quieres es inicar el proceso de conversión y leer el conversor cuando este termine usando el método de encuesta, no te queda más remedio que usar read_adc(ADC_START_AND_READ), para ello puedes usar el segundo código con este tipo de llamada.

Las otras dos formas permitidas implican inicar el proceso de conversión y luego o esperar un tiempo o consultar constantemente la bandera de fin de conversión o utilizar read_adc(ADC_START_AND_READ) que hace precisamente eso.

Si optas por las INT utilizarás read_adc(ADC_START_ONLY) en alguna parte del programa para iniciar el proceso de conversión y en la ISR del converso utilizarías read_adc(READ_ONLY) para obtener el valor del dato.

Saludos
Reinier

Desconectado jfmateos2

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3145
Re: Cuánto tiempo requiere el conversor ADC
« Respuesta #5 en: 25 de Enero de 2008, 17:12:31 »
Maunix, la explicación del primer enlace que me pusiste es excelente. Muchas gracias.

Reiniertl, maunix: entonces entiendo que este código no es correcto

Código: [Seleccionar]
   do{
      value = read_adc();
      if (value>UMBRAL){
         break;
      }     
   }while(true);

porque entre dos llamadas consecutivas a read_adc() debo esperar 2TADs ¿es así?, pero... lo que no sé calcular es cuánto tiempo es 2TAD utilizando estos valores:

Código: [Seleccionar]
#use delay(clock=48000000)
setup_adc(ADC_CLOCK_INTERNAL);

Desconectado reiniertl

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1187
Re: Cuánto tiempo requiere el conversor ADC
« Respuesta #6 en: 25 de Enero de 2008, 17:23:42 »
con read_adc(ADC_START_AND_READ) ya no tienes que calcular nada, esta función se encarga de encuestar la bandera de fin de conversión hasta que el conversor termina de convertir. Puesto que el tiempo que demora la conversión dependerá de muchos factores, entre ellos la frecuencia del oscilador, el nivel de tensión de la señal medida y el circuito equivalente conectado a la entrada del ADC.

Así que no te calientes mucho con eso de cuanto esperar ni nada de eso, si trabajas por encuesta utiliza read_adc(ADC_START_AND_READ), si trabajas por INT utiliza las otras dos.

Saludos
Reinier

Desconectado jfmateos2

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3145
Re: Cuánto tiempo requiere el conversor ADC
« Respuesta #7 en: 25 de Enero de 2008, 17:26:08 »
Gracias reiniertl,

el problema es que obtengo el siguiente mensaje al depurar en mplab

Código: [Seleccionar]
ADC-W0012: Selected channel 12 is an invalid channel.
ADC-W0010: A Minimum of 2 TADs are required before another conversion should be started.

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Cuánto tiempo requiere el conversor ADC
« Respuesta #8 en: 25 de Enero de 2008, 17:54:34 »
jfmateos2 no tomes todo a literal, lo de 2Tad es para los 16F, para el pic que tu usas es 3Tad.  Te pego el extracto del datasheet

For next conversion, go to step 1 or step 2, as required. The A/D conversion time per bit is
defined as TAD. A minimum wait of 3 TAD is required before the next acquisition starts.


For correct A/D conversions, the A/D conversion clock (TAD) must be as short as possible but greater than the
minimum TAD (see parameter 130 in Table 28-29 for more information).
Table 21-1 shows the resultant TAD times derived from the device operating frequencies and the A/D clock
source selected.



Así que no te calientes mucho con eso de cuanto esperar ni nada de eso, si trabajas por encuesta utiliza read_adc(ADC_START_AND_READ), si trabajas por INT utiliza las otras dos.
No estoy de acuerdo o no te comprendí, según lo que yo sé hay que esperar si o si.  Los 3Tad entre Starts de las conversiones es una limitante del módulo. 

jfmateos2 si lo que sigue al read ocupa 3Tad entonces no tendrás que preocuparte.  Ese warning puede que te lo de el MPLAB ni bien enciendes el módulo A/D.  Si te lo hace siempre en todas las ocurrencias del bucle entonces sí, de seguro estas haciendo algo mal. 

Lo que tienes que hacer es calcular el TAD, para ello debieras conocer de cuanto es la división que estas usando en el módulo A/D.  Si el CCs te setea todo en forma automática para saber bien hará que digas como queda cargado el registro ADCON2.

Otra cuestión que no es menor, fíjate que te está advirtiendo que estás queriendo leer el canal 12 del A/D siendo que tu micro no lo tiene.
- 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 reiniertl

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1187
Re: Cuánto tiempo requiere el conversor ADC
« Respuesta #9 en: 25 de Enero de 2008, 18:00:08 »
Eso pensaba yo, que el error estaba en que quería leer el canal 12 que no existe, el resto de las cosas tendré que refrescarlas en los datasheets del uC.

Así que sin más, amigo maunix, voy a sumergirme en los profundos mundos de la existencia de los PICs, preparando...

¡DATSSHEET A MI!

PD: Y después alguien por aquí anda diciendo que la teoría no sirve para nada, simplemente PAMPLINAS





Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Cuánto tiempo requiere el conversor ADC
« Respuesta #10 en: 25 de Enero de 2008, 18:13:12 »
Eso pensaba yo, que el error estaba en que quería leer el canal 12 que no existe, el resto de las cosas tendré que refrescarlas en los datasheets del uC.
Así que sin más, amigo maunix, voy a sumergirme en los profundos mundos de la existencia de los PICs, preparando...
¡DATSSHEET A MI!
PD: Y después alguien por aquí anda diciendo que la teoría no sirve para nada, simplemente PAMPLINAS

Jijiji.  Es cierto, hay que leer los datasheets.  Yo los suelo leer cuando uso un micro nuevo y trato de repasarlos si haré alguna aplicación que sea crítica en tiempos, etc.   Esto de esperar los TAD aplica cuando uno quiere leer el módulo A/D a máxima velocidad, si uno lo lee cada X tiempo entonces no hace falta tenerlo en cuenta.  ;)

Por eso cuando surje la disyuntiva de si comenzar por el assembly o el C ó Basic, digo que programar en assembly permite aprender esas cuestiones profundamente, para eso sirve bastante saberlo, para conocer bien la arquitectura y sus limitaciones.  Luego usar el C o Basic para programar más velozmente.
- 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 jfmateos2

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3145
Re: Cuánto tiempo requiere el conversor ADC
« Respuesta #11 en: 25 de Enero de 2008, 19:03:28 »
Si el canal 12 no existe ahora ya sí que me he liado del todo ¿Qué canal le corresponde al pin AN12?¿el 11?



¡qué follón tengo! Cuanto más leo el datasheet más me lío. Lo voy a dejar para mañana.

Desconectado Jorge_

  • PIC10
  • *
  • Mensajes: 30
Re: Cuánto tiempo requiere el conversor ADC
« Respuesta #12 en: 25 de Enero de 2008, 20:32:01 »
Yo creo que es el AN9, porque si abres el Stimulus tienes desde el AN0 al AN9, y en el datasheet dice que el AN5,AN6 yAN7 no estan implementados, y entonces 12 - 3 = 9

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Cuánto tiempo requiere el conversor ADC
« Respuesta #13 en: 25 de Enero de 2008, 20:53:52 »
jorge_ si te fijas en el datasheet dice bien que hay que poner el canal 12 para el AN12.

Si el canal 12 no existe ahora ya sí que me he liado del todo ¿Qué canal le corresponde al pin AN12?¿el 11?

Mmm,  tienes razón.  En el MPLAB abajo al medio, qué micro te indica que está seleccionado?
tienes puesto el 18F2455?
- 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 jfmateos2

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3145
Re: Cuánto tiempo requiere el conversor ADC
« Respuesta #14 en: 26 de Enero de 2008, 06:07:34 »
Tengo el 18f2455.

Te adjunto una captura.



El caso es que eligiendo el canal 12, el prototipo real funciona, a pesar del aviso que muestra MPlab.

Al final he recurrido a la interrupción #int_ad para saber cuándo ha terminado un read_adc y poder ejecutar de nuevo otro read_adc. Esta interrupción ocurre cuando read_adc ha terminado del todo, incluidos los 2TAD ¿verdad?

Por cierto, ¿qué significa la interrupción #int_adof?