martes, 28 de diciembre de 2010

Cuatro canales ADC para micros sin conversor-parte 2/ 3-la pc,el joystick,el 555 y sus hijitos

Pues no recuerdo bien como fue esto, creo que amanecía en una biblioteca de cuyo nombre no quiero acordarme, cuando entre retazos de tecnología olvidada di con este diagrama del puerto de joystick de las pc XT, (perdón por lo borroso de la foto, pero tenia mucho sueño y se me nublaba la vista)


"Interesante" me dije a mi mismo (siempre llevo un espejo para estos casos), Cuatro redes R/C, conectados a simples integrados 555, configurados como multivibradores monoestables, reseteados todos con un solo pin del micro....
"no seas idiota" me dijo el espejo, no ves que es un 558? y se cerro solo, "ya ni el espejo me aguanta" pensé.
"yo tampoco" pensé, y deje de pensar por un rato...
.........................
.........................
.........................
........................


Ya volviendo a pensar, me dedique a revisar las versiones del 555, acá van tres, la primera es el clásico chip de 8 patas que todos los que hacen algo de electrónica conocen.

Veamos una comparación entre el 555 y el 556
Obviamente son dos 555 pegados, ahora el 558.
Que parece un chip de 16 patas embarazado de cuatrillizos 555.
Todo esto es para razonar que, como el análisis que voy a hacer es sobre un solo 555, podemos hacer lo mismo con uno, dos, cuatro canales y usando dos circuitos 558 con ocho canales, lo que equivale a un puerto completo de un microcontrolador.


No voy a explicar como funciona un 555 acá, nada mas el funcionamiento de este esquema, la pata RST esta conectada al positivo (5v) para habilitar la salida (QP), que tiene conectada una resistencia pull up (10k aprox) para poder detectar cuando la salida esta activa y cuando no (el 558 tiene salidas de colector abierto).
El ciclo de trabajo es como sigue, cuando se recibe un pulso positivo por la entrada TRIG, se descarga el capacitor c1 (10nf), y la salida QP pasa a estado lógico ALTO (debido a la resistencia pull up R5), C1 inmediatamente comienza a cargarse nuevamente a través de la resistencia r1 (2.2k), acá vale esta aclaración, en el diagrama no aparece, pero entre la punta "suelta" de la resistencia r1, y la alimentación (5v) va una resistencia variable o potenciometro que corresponde a uno de los ejes del joystick, la resistencia de 2.2k es una protección para limitar la corriente en el caso de que el joystick este defectuoso y cortocircuite directamente a los 5v.




Vemos entonces que el tiempo de carga del capacitor c1 va a estar determinado por la resistencia de 2.2k mas el valor de la segunda resistencia que esta ubicada físicamente dentro del joystick.
 Ahora bien, cuando la tensión en el capacitor supera 2/3 la tensión de alimentación, la salida QP pasa a estado lógico BAJO. Entonces podemos decir que el valor de la resistencia del joystick se puede relacionar directamente con el tiempo que transcurrió desde que enviamos el pulso por la entrada TRIG hasta que la salida volvió a estar en estado lógico bajo.

 Vemos que recursos del microcontrolador reemplaza este circuito:
-el comparador. (esto nos permite tener todos los canales adc que queramos sin multiplexar, recordemos que los micorcontroladores en su mayoría tienen solamente un comparador)
-la necesidad del timer (podemos usar un ciclo para monitorear cuanto tarda la salida en cambiar de estado).
 o podemos usar el timer como contador y monitorear todos los canales adc con un solo timer.

- La relación costo/beneficio o de esta idea es mayor cuantos mas canales necesitemos medir, menos recursos del micro tengamos disponibles y menos tiempo de proceso tengamos para medir las magnitudes analógicas.

-Por otro lado esta el hecho de que usar este circuito es electrónicamente equivalente a usar el puerto de joystick de la pc, los que están acostumbrados a usar esa técnica se ahorran "sorpresas" a la hora de probar un circuito que funcionaba perfectamente en la pc, pero en el microcontrolador no...

 Para terminar con el hardware les muestro el circuito usando en LM558, lo que nos da 4 canales ADC.



Este es el modulo final de lectura analógica de cuatro canales para micros que no tienen conversor adc, los pulsos de reset de los cuatro 555 (triger) están unidos para simplificar el circuito. En una aplicación con ci's discretos (compuertas CMOS o TTL) seria necesario conectar una resistencia pull up de unos 10k a la salidas (output) de los cuatro circuitos, en un microcontrolador no es necesario por tener incorporada las resistencias en el mismo chip, esto puede no ser cierto en algunos pics , revisar las hojas de datos!
El código puede implementarse por polling o interrupciones,  en varios lenguajes de programacion, pero eso lo voy a poner en la PARTE 3








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