martes, 28 de diciembre de 2010

Cuatro canales ADC para micros sin conversor-parte 1/ 3-Repaso de tecnicas de implementacion de ADC

Bueno, este post va a ir creciendo en estos días y es porque lo estoy usando como borrador para crear un pdf y ponerlo como descarga, se trata de construir el modulo mas útil, sencillo (electrónicamente hablando, y también en la implementación del código) y económico posible para "salir del apuro" a la hora de tener un micro que es perfecto para el proyecto (por costo, disponibilidad etc) pero le falta el modulo ADC.
Personalmente yo no se si esas cosas me pasan solo a mi, pero como no me importa enterarme igual lo pongo acá, porque eso si: como me gusta ir apretando las teclitas estas y ver como aparecen las letritas en en cuadrito este que ni se como se llama...

Pero volviendo al tema, y antes de empezar la solución que propongo no es la única ni la mejor, la bibliografia al final del articulo tiene soluciones para todos los gustos , desde alta velocidad a alta precisión, técnicas para aumentar la resolución o para obtener un millón de muestras por segundo, no suelen ser los casos mas comunes pero nunca falta el que se esta tratando de armar un osciloscopio y dice "ESTO ME SIRVE!!!", mientras sus vecinos se preguntan porque grita eso a las cuatro de la mañana....
Pero para que no se lean todo eso les resumo las técnicas que se usan mas conumnente, como son sus circuitos, que sucede y como es el código que lo mide desde el micro, que recursos consume del micro etc etc para que puedan comparar y decidir.

-La primera es usar un chip diseñado para ese fin, solución fuera de contexto, ya que si lo que estamos haciendo es ajustar un micro a un proyecto seria ilógico "ajustar" incorporando un chip que puede salir mas caro que el mismo microcontrolador, llore amargamente (es que me gusta el mate amargo) al comprender esta verdad así que empecé a explorar otras alternativas.
Sin embargo voy a explicar como funcionan estos conversores, los hay de dos tipos (mas allá de la interfase de salida que puede ser i2c o paralelo) , las técnicas de conversión son las siguientes

 REGISTROS DE APROXIMACIONES SUCESIVAS
Consiste en generar una tensión que inicialmente es la mitad del rango aceptable por le conversor y compararla con la tensión obtenida desde el sensor, el resultado de esta compracion puede resultar en un valor mayor o menor a la tensión creada por el chip, si es mayor se toma como valor mínimo la tensión actual como valor mínimo y la máxima tensión como valor máximo, se toma el punto medio y se repite el proceso, si la comparacion dio menor, se hace lo mismo, pero ahora el valor menor es el menor posible, y el máximo la tensión actual.
El proceso se repite hasta que ya no se puede dividir el rango de tensiones en trozos mas pequeños.
Los que saben algo de programacion reconceran aquí la descripción del algoritmo de búsqueda binaria, y los que no me hayan entendido nada pueden leer una explicacion mejor que esta en la   wikipedia.
Para terminar con esto de la búsqueda (que no había terminado??), falta aclarar que el resultado de la conversión no es instantáneo, como habrán observado requiere repetir varias veces la compracion para ir aproximando (sera por eso que se llama de aproximaciones sucesivas?, si alguien sabe que me ilumine)  en concreto es logaritmo en base dos de la cantidad de bits de precisión obtenida.
Para que dije esto? para poder contar explicar el otro tipo de conversor que se usa:

CONVERSORES FLASH  
En algunas aplicaciones el método de aproximaciones sucesivas puede resultar lento, razonando sobre el proceso de conversión se advierte que el "cuello de botella" esta en la comparacion, si tuvieramos dos comparadores aceleraríamos el proceso, así que se ponen muchos comparadores en paralelo para aumentar la velocidad de conversión.
 Llegando al extremo de la velocidad un conversor flash de 10 bits de precisión da una respuesta casi instantánea de conversión ya que posee, sin exagerar, 1024 comparadores internos, (exagerando como dos o tres millones)...

Hasta acá las técnicas de alta precisión y velocidad
Las otras tres que voy a explicar (mas o menos ya vieron que no soy muy bueno), consisten en cargar o descargar un capacitor y medir el tiempo que tarda en producirse la carga hasta valores prefijados, obviamente esto no va a ser lo mas rápido del mundo pero puede ser útil incluso para samplear audio, en la bibliografia hay un enlace de uno que lo esta usando para analizar señales de radio recolectando un millón de muestras por segundo, así que a no subestimar...

CARGA A TRAVÉS DE RED R/C
 Esta técnica tiene un par de variantes y consiste en descargar un capacitor y observar cuanto tiempo tarda en
alcanzar cierto umbral de tensión. Es una técnica barata y versátil, barata porque solo requiere dos componentes en su forma mas austera (un capacitor y una resistencia de protección) y versátil porque se puede implementar de varias maneras (con un 555), el comparador del micro si lo tiene, compuertas de schmidth, operacionales etc etc.
 El código también es sencillo ya que se limita a dos pasos
-descarga del capacitor
-un loop para ver cuantos ciclos de reloj tarda en alcanzar la tensión de referencia (o una interrupción asociada al cambio de estado del comparador).
Como este post ya se esta poniendo aburrido sin dibujitos acá les pongo uno de como se arma con un comparador.

El ciclo de conversión inicia descargando el capacitor C comenzara a cargarse a través de la resistencia r, a una velocidad que variara según el valor de R, el detalle a tener en cuenta es que PBOcapacitor puedo configurar ese mismo pin del micro como entrada y determinar cuando el capacitor alcanza la tensión de referencia (Un).
Pero les dije que iba a "explicar" tres, no?

MÉTODO DE CARGA BALANCEADA 
 Este método agrega un solo componente pero funciona totalmente distinto de de carga R/C, vemos primero el esquema:

 Acá se intenta mantener el capacitor cargado a la tensión CVref, para eso se utiliza el comparador, si la salida del comparador es negativa (GP1<CVref), GP2 se pone en modo triestado, y el capacitor se carga a través de Rsen, si por el contrario la salida del comparador es positiva (GP1>Cvref) corresponde disminuir la carga del capacitor, GP2 se coloca en estado bajo, y el capacitor se descarga a través de Rref, el algoritmo se resume en los siguientes pasos:
-Se ajusta CVref a la tensión deseada
-Se utiliza el timer del microcontrolador para obtener un "tiempo base" que se repite ciclicamente
-Al final de cada periodo de tiempo:
   Si COUT =0    =>   GP2 , modo triestado (el capacitor se carga)
   Si COUT=1    =>    GP2, estado bajo (el capacitor se descarga)
Dadas estas condiciones obtenemos:
-La cantidad de veces que realizamos el proceso determina la revolución
-La cantidad de veces que COUT=0 en relación con la cantidad de ciclos permite deducir el valor de Rsen.
 





CONVERSOR DELTA/SIGMA
Este conversor es muy similar al anterior, la diferencia radica en un par de detalles que vale la pena entender, veamos el esquema pues:


Pues esta todo casi igual, el capacitor a masa, la descarga a través de una resistencia via GP2, y el comparador controlando el ciclo de carga/descarga, pero ahora tenemos una TENSION, no una resistencia de carga, y la resistencia conectada a Vin es fija y conocida para el calculo, el código para leer es básicamente el mismo del de carga /balance:













Estos dos métodos tienen ventajas en determinadas situaciones:
-Son mas estables con respecto a variaciones de temperatura y tolerancias de los componentes (se recomienda usar capacitores de polipropileno)
-No necesitan Una etapa de Sample&Hold que "congele" la señal de entrada para proceso ya que operan a velocidades mucho mas altas que la frecuencia máxima de la señal sampleada (ver teorema de Nyquist ), esta característica simplifica también el diseño de los filtros de señal de entrada, si es que son necesarios, reduciendo en mucho el costo y la complejidad de la electrónica de entrada.


MI PROPUESTA
Habiendo visto estos métodos voy a poner un par de factores en la balanza para justificar el porque de la elección de uno en particular
-El método R/C es simple tanto en circuito como en software y se puede implementar de varias formas
-Los métodos de carga balanceada y delta/sigma proporcionarían mayor resolución y calidad, pero el costo es:
   -requieren una cantidad de recursos que pueden ser necesarios para otra función del programa
    (los micros mas comunes dispone de solo dos timers y de un único comparador)
   -la calidad de la conversión depende de la precisión del conteo de tiempo
   -la implementación mas natural del código es en assembler, y resulta mas compleja o menos eficiente en
    lenguajes de medio/alto nivel.
-Las situaciones de uso de lecturas analógicas suelen implicar varios sensores, lo que no resultaría posible
   sin agregar comparadores y timers externos, y la sincronización del código.
Así que resignamos calidad por cantidad y vemos como ponerle cuatro canales de lectura ADC utilizando el método R/C


Bibliografia consultada:
HOLTEK
  Using an I/O Port Pin as an A/D Converter Input (D/N: HA0128E)
MICROCHIP
   AN513 Analog to Digital Conversion Using a PIC16C54
   AN700 Make a Delta-Sigma Converter Using a Microcontroller’s Analog Comparator Module
   AN863 A Comparator Based Slope ADC
   PIC microcontroller Power Managed Tip's 'n Tricks
AVR
    AVR401: 8-bit Precision A/D Converter
    AVR400: Low Cost A/D Converter
    AVR121: Enhancing ADC resolution by Oversampling
Fujitsu :
    Optimizing A/D Converter Accuracy
AUTORES VARIOS
  Z8 MICROCONTROLLER-BASED ANALOG TO DIGITAL CONVERSION TECHNIQUES
    ldwin John Salido, Erwin Oclarit, Luis G. Sison, Ph.D.
TEXAS ISNTRUMENTS
 Using PWM Output as a Digital-to-Analog Converter on a  TMS320F280x Digital Signal Controller
ENLACES WEB
  http://cappels.org/dproj/wfc/wfc.html

No hay comentarios:

Publicar un comentario