viernes, 9 de febrero de 2018

Sonda simple para test de circuitos

Este artículo fué publicado previamente, en inglés, en el blog R6500.

El objetivo

Algunas veces necesitas verificar un circuito y testear algunos de sus nodos. Por lo general, un tester en modo de voltaje es una buena solución, pero tiene un par de problemas. En primer lugar, mide aproximadamente cero cuando el nodo está conectador a cero voltios (masa típicamente) y cuando el nodo está flotando (no funciona en absoluto). En segundo lugar, proporciona la información en la pantalla del tester, por lo que hay que separar la vista desde el circuito hacia el tester para verificar el voltaje.

El circuito propuesto es similar a una sonda lógica. No debe indicar nada cuando nada fuerza la tensión en el nodo y debe dar una indicación diferente cuando el nodo se halla a nivel de alto o bajo voltaje.

Muchas sondas lógicas no son autoalimentadas. Confían en la tensión del propio circuito para funcionar. En mi caso, me gustaría que la sonda sea utilizable también como test de continuidad. Si establecemos tierra en un punto del circuito y testeamos en otro punto, la continuidad se puede detectar entre ambos puntos porque se generará un nivel bajo incluso si el circuito no está alimentado.


El circuito

La siguiente imagen muestra el esquema del circuito.



El circuito está alimentado con una batería CR2032 de 3V. Cuando la sonda no está conectada a nada, el voltaje de la sonda, tal y como como se establece con R1 y R2 será de 1.5V. Como ambos amplificadores operacionales (MCP6002) tienen una corriente de polarización muy baja (1pA), no cae tensión en R3 y también se ven 1.5V en la entrada no inversora de U2 y en la entrada inversora de U1.

Las resistencias R4, R5 y R6 definen un divisor de tensión que establece 1V en la entrada inversora de U2 y 2V en la entrada no inversora de U1. Con 1.5V en la sonda, ambos operacionales se saturan a un nivel alto (3V) por lo que ambos LED están apagados.

Si conectamos la punta de la sonda a un voltaje inferior a 1V (El umbral de disparo de U2), U2 se saturará a un nivel bajo y el LED azul se encenderá. De manera similar, si el voltaje de la punta de la sonda se halla por encima de 2V (El umbral de disparo de U1), U1 se saturará en el nivel bajo y el LED blanco se encenderá. Sé que el blanco es un color extraño para el alto nivel. Será mejor comprar un color rojo. No tenía LED rojos similares al azul que tenía a mano.

Los amplificadores operacionales no son los mejores componentes para este proyecto dado que se usan como comparadores. Un doble comparador podría ser mejor en este caso. La elección del opamp dual MCP6002 fue solo porque los tenía disponibles. Adicionalmente, este proyecto no requiere de la mayor velocidad que suelen tener los comparadores respecto de los operacionales.


Funcionamiento del circuito

En definitiva, el circuito pone un voltaje de 1.5V en la punta de la sonda, a partir de las dos resistencias de 100k. Por tanto se comporta como una fuente de 1.5V con una resistencia en serie de 50k. Si el voltaje de la sonda se mantiene entre 1 V y 2 V, no se enciende ningún LED. Si el voltaje de la sonda está por debajo de 1V, el LED azul se enciende. Y si el voltaje de la sonda es superior a 2V, el LED blanco se encenderá.

Cuando se testeta un nodo en el circuito, se puede detectar su voltaje usando un voltímetro de alta impedancia. Ello dará el voltaje de circuito abierto (Voc). Este voltaje puede ser forzado con diferentes niveles. El nivel con que se fuerza una tensión está relacionada con la resistencia equivalente en el nodo. Para un circuito no reactivo lineal, será la resistencia equivalente de Thevenin. Al final, el circuito equivalente será algo así:

Tenemos la fuente de 1.5V y la resistencia de 50k proporcionadas por la sonda y el valor de Voc y Rth asociados con el nodo testeado. Como sabemos, los LED se encenderán cuando el voltaje de la sonda Vp sea superior a 2V o inferior a 1V. El siguiente gráfico muestra el estado del LED en función de Voc y Rth.

Para bajas resistencias equivalentes de Thevenin (por debajo de 1k), solo el voltaje Voc determina si cada LED está encendido o no. Para resistencias de nodo más altas, el voltaje umbral de Voc se desplaza debido a la interacción de la resistencia con el circuito.
Podemos ver que a 100k de resistencia a Thevenin necesitamos 0V para encender el led azul. Para resistencias más altas necesitaremos un voltaje negativo para encender el LED. Lo mismo para el led blanco: a 100k o más de resistencia de Thevenin necesita más de 3 V para encender el LED. Por lo tanto, el circuito no solo detecta el voltaje del nodo sino también si la resistencia asociada es alta o baja.

A partir de la curva podemos ver que, cuando se usa como test de continuidad, puede detectar continuidad (o falta de aislamiento) para resistencias de hasta 100k. Para bajar el umbral de detección de resistencia, las resistencias R1 y R2 podrían cambiarse por valores más bajos.


Efectos de la sonda en el circuito bajo test

La medición de cualquier magnitud siempre modifica el dispositivo bajo prueba (DUT). Algunas veces este error es insignificante. Por ejemplo, el uso de un voltímetro de buena calidad para medir el voltaje entre dos nodos generalmente introduce una resistencia de 10 megaohmios entre los nodos medidos.

La medición de la resistencia asociada al nodo siempre afecta al circuito bajo test. En nuestro caso, estamos aplicando un voltaje de 1.5V con una resistencia asociada de 50k. Si el nodo tiene una resistencia a Thevenin similar o superior a 50k, estamos modificando activamente el voltaje del nodo y potencialmente induciendo una modificación en el comportamiento del circuito.


Dame algo de protección

Como se explicó anteriormente, la resistencia R3 no debería tener ninguna corriente en funcionamiento normal. A las entradas de cirucitos integrados, como las del dispositivo MCP6002, no les gusta tener tensiones por encima de Vcc (3 V en nuestro caso) o por debajo de GND. Intentar salir de estos límites activará las protecciones internas en el dispositivo. La resistencia R3 garantiza que no se provocará una alta corriente de entrada.
El circuito se ha utilizado para testear un nodo de 20 V de baja impedancia y funciona correctamente, detectando un nivel superior a 2 V, sin dañar la sonda. Este no sería el caso si R3 no estuviera presente.

Límites frecuenciales

Si el voltaje de la punta cambia con el tiempo alternando entre voltajes de más de 2 V y por debajo de 1 V, ambos LED se iluminarán durante un tiempo. A bajas frecuencias, el parpadeo es aparente. A frecuencias más altas, debido a la frecuencia de fusión Flicker del ojo, ambos LED parecen estar encendidos al mismo tiempo. El circuito, sin embargo, debido a algunos límites técnicos, como el uso de amplificadores operacionales en lugar de comparadores, tiene una frecuencia máxima de operación de aproximadamente 50 kHz. Una señal cuadrada por encima de esta frecuencia no enciende ningún LED.


Montando el circuito

El circuito se ha montado en una placa de topos


De izquierda a derecha tenemos la punta de la sonda, las tres resistencias R1, R2 y R3, ambos LED y sus resistencias R7 y R8, el doble opamp MCP6002 y las tres resistencias R4, R5 y R6.
Al final de la placa tenemos la conexión a tierra y el conector de alimentación de tres pines.
Los LED están cerca de la punta para que no tengamos que mover los ojos del circuito para verificar si están encendidos.

La parte posterior de la placa de la sonda se muestra en la siguiente figura. Todo el cableado se ha realizado con cable delgado, aislado y de un sólo núcleo.


El conector de alimentación de tres pines utiliza el pin central para Vdd (+3 V) y los otros dos pines para tierra. La pila CR2032 está conectada a un conector hembra de tres pines para proporcionar alimentación al circuito.
Como el conector es simétrico, se puede conectar con la batería hacia la parte superior o la parte inferior de la placa. Como la alimentación es es separable de la sonda, no necesitamos un interruptor de encendido.


La conexión a tierra se obtienen con una pinza de cocodrilo conectada a un cable corto.





La sonda final con la alimentación y el terminal de tierra se muestra en la siguiente figura.





Con objeto de verificar la continuidad o detectar voltajes diferenciales, se ha construido una segunda sonda de tierra con una pieza delgada de cobre y un tubo termorretráctil. Como se puede ver, tocar ambas puntas de prueba hace que el sistema se comporte como un probador de continuidad.



Luces LED al estilo Deadbug

Este artículo fué publicado previamente, en inglés, en el blog R6500.
No es un proyecto complejo. Es sólo un proyecto rápido para pasar el rato.

Este en un breve artículo sobre la construcción de algunas luces LED para iluminar cosas pequeñas. El objetivo es crear algunas luces que se puedan orientar según sea necesario para iluminar pequeños objetos en los que trabajar o para fotografía macro.

Esquema


El circuito básico es un driver de corriente constante que utiliza un transistor NPN. La resistencia 6k8, el diodo 1N4148 y la resistencia ajustable establecen el voltaje de base en el transistor entre aproximadamente 0.6V y 1.2V. Ello establece la tensión en Re entre 0 y 0.6V. La corriente en el colector del transistor estará entre 0 mA y 0.6V / Re.
Por ejemplo, al seleccionar una resistencia de 15 ohmios podemos obtener corrientes en el LED hasta unos 27 mA.

Para alimentar el circuito, utilizaremos un conector hembra 2x6 con paso de 100 mils (2,54mm) (J1). Este conector funciona de forma pseudocoaxial con tierra en los pines exteriores y +5V en el centro. Tener dos filas nos permite encadenar varios circuitos de control LED independientes.

El LED también está conectado al circuito mediante un conector pseudocoaxial de 3 pines (J2) con +5V en los pines externos y el drenaje de corriente en el centro.

El circuito está montado en una pieza de cobre de dos caras. Las conexiones se realizan directamente en el cobre usando el estilo deadbug que consiste en montar todos los componentes sobre una lámina de cobre. El nombre viene de que los integrados, si los hay, se ponen con las patas para arriba.





Deseamos que los LED puedan ubicarse en la posición que queramos. Para hacer ello, un LED SMD se monta en un cable rígido soldado al pin de drenaje de corriente en el centro de un conector macho de 3 pines. Un segundo cable flexible proporciona la conexión a la alimentación de +5 V en uno de los pines del conector externo.




Con objeto de tener dos luces, tengo también dos circuitos:




La siguiente figura muestra el detalle del conector J1


Usando este conector es posible encadenar las alimentaciones de dos placas




Ahora, podemos poner las luces en las placas




Podemos usar LEDs de colores. Para iluminación general no es tan útil pero sí sirve para dar efecto en algunas aplicaciones fotográficas.




Eso es todo por ahora. Este era solo un pequeño proyecto para iluminar espacios pequeños. De hecho, con el tamaño de los LED SMD, prácticamente podemos iluminar cualquier cosa, independientemente del espacio que tengamos para introducir las luces.


ADC Rápido en Arduino Leonardo

Este artículo fué publicado previamente, en inglés, en el blog R6500.

El problema

Es posible usar la función Arduino analogRead para leer un valor analógico en uno de los pines habilitados para ello. En la placa Arduino Leonardo hay 12 entradas analógicas. Las típicas entradas Arduino estándar de A0 a A5 y las seis líneas adicionales A6 a A11 que corresponden a D4, D6, D8, D9, D10 y D12.
Los ADC contenidos en los MCU de Atmega, utilizadas en las placas Arduino, son convertidores de 10 bits. Para hacer una conversión, la función analogRead tarda 100us. Se supone que el MCU necesita ese tiempo para dar una conversión de precisión de 10 bits. Pero 100us, para algunas aplicaciones, puede ser demasiado tiempo. Limita, de hecho, la frecuencia máxima de muestreo analógico a 10 kHz y esto no tiene en cuenta el tiempo necesario para procesar los datos leídos.

Se puede hacer mejor. Se puede hacer más rápido. Pero, como es normal en la vida, debe haber algunas contras para cada pro. Por tanto, si quiere hacer conversiones más rápidas, necesitas saber qué estás perdiendo con ello.

El convertidor del Atmega 32u4

Sospecho que otros Arduinos basados en ATmega incluyen un ADC similar, pero no estoy seguro. El ADC usa un reloj interno que se obtiene del reloj del sistema (16MHz en Arduino Leonardo)  dividido por un factor entre 2 y 128 usando un registro de configuración específico.

En Arduino Leonardo, el divisor se establece en el valor máximo de 128, por lo que, a una frecuencia de reloj de la CPU de 16 MHz, obtenemos una frecuencia de reloj del ADC de 125 kHz.
Para obtener el tiempo necesario para realizar una conversión a partir de la frecuencia de reloj del ADC, podemos consultar una tabla en la hoja de datos ATmega 42u4.

Número de ciclos para realizar una conversión
Hay tres tipos de conversión: Primera conversión, Conversiones normales y Conversión activada automáticamente. Los tipos que se aplican a analogRead son los dos primeros, pero el primero solo se aplica a la primera conversión, por lo que podemos usar la columna central (Conversión Normal) como caso típico. 

El ADC necesita hacer dos cosas para proporcionar una conversión: Sample and Hold y SAR Conversion. En la tabla, encontramos que esos necesitan 1.5 y 13 ciclos para un total de 14.4 ciclos. Como la frecuencia de ADC es de 125 kHz, el tiempo total de ADC es de 14.5 / 125 kHz = 116 us. De ahí viene el tiempo aproximado de 100us de analogRead.

La hoja de datos del MCU establece que necesitamos una frecuencia de ADC entre 50 kHz y 200 kHz para obtener la resolución máxima de 10 bits. Con una frecuencia de 200kHz podríamos acortar el tiempo total de ADC a 72,5us. Lamentablemente, la opción del divisor de reloj próxima a 128 es 64, por lo tanto, no podemos seleccionar 200 kHz. Solo podemos seleccionar 125kHz, 250kHz ... Cualquier opción más allá de 125kHz, usando un reloj maestro de 16MHz, va más allá de las recomendaciones de Atmel para la MCU.

Al separar las dos acciones que realiza el ADC, obtenemos un tiempo de muestreo de 12us y un tiempo de conversión de SAR de 104us. Si aumentamos la frecuencia de ADC podríamos acortar esos tiempos. Sabemos que no obtendremos la resolución máxima pero, ¿cuáles son exactamente los efectos secundarios?

Sample and Hold

Para comprender el sistema de Sample and Hold podemos usar una de las figuras en la hoja de datos de ATmega 32u4:

El circuito Sample and Hold (S & H) está compuesto por un interruptor, una resistencia y un condensador. Al comienzo de la conversión, el interruptor se cierra durante el tiempo de captura  (1,5 ciclos de reloj de ADC). Después de ello, el interruptor se abre y el circuito ADC SAR realiza la conversión real. El circuito S & H es importante porque la señal no debería cambiar durante la conversión SAR. Ello está garantizado por el hecho de que el interruptor está abierto durante la conversión.

Un punto fundamental acerca de los circuitos S & H es que el condensador debe cargarse al voltaje de entrada, durante el tiempo de captura, antes de que comience la conversión. Como se trata de un circuito RC, en teoría, el voltaje del condensador nunca llegará a la entrada. En la práctica, solo necesitamos acercarnos al voltaje de entrada que se necesita para la resolución del convertidor. Para un ADC de 10 bits, para obtener un error insignificante necesitamos llegar a 1/2^11 del valor de referencia del ADC que normalmente es de 5V para las placas Arduino.

La carga de RC, suponiendo que el peor caso de condensador arrancando en cero, será modelado por:

En el peor de los casos, el voltaje de entrada será de 5V y, para cumplir con la precisión de 10 bits requerida, el valor del condensador del valor de entrada debe llegar a 1/2 ^ 11 del valor de entrada.

De ello se obtiene:

Operando con un reloj del ADC de 125kHz sabemos que el tiempo de captura es 12us, por lo que la constante de tiempo debe ser 1,57us o menos. Como la capacidad es 14pF, la resistencia total debe estar por debajo de 112 kOhm. Debido a que la resistencia interna de ADC puede llegar hasta 100k, queda limitada la resistencia externa a aproximadamente 12 kOhm. Esto es consistente con el hecho de que la hoja de datos de MCU recomienda resistencias externas al ADC de 10 kOhm o menos.

La fórmula anterior es bastante importante. Cuando se usa el ADC. A una frecuencia de sistema de 16MHz, el tiempo de captura no puede ser mayor que 12us, por lo que no se debe usar una resistencia externa total al ADC mayor de 12 kOhm. Usar una mayor resistencia podría limitar la resolución de ADC disminuyendo la cantidad efectiva de bits que obtiene del ADC.

Si, por ejemplo, solo se necesitan 8 bits porque estamos descartando los 4 bits inferiores que resultan de la conversión, solo necesitamos tener una constante de tiempo de 5,4 us (tiempo de muestreo dividido por ln (9)) así que, con la misma capacidad del ADC de 14pF sólo necesitararemos una resistencia total por debajo de 386k Ohm. Teniendo en cuenta la resistencia ADC máxima de 100k interna, solo necesita garantizar una resistencia externa máxima de 286k Ohm.


Conversión SAR

El MCU ATmega 32u4 usa un Registro de Aproximación Succesiva (SAR) para realizar la conversión. Este es el tipo más común de convertidor que se puede encontrar en los MCU. Estos convertidores obtienen un bit en cada ciclo de reloj. Por tanto, para obtener un valor de 10 bits de resolución, necesitamos 10 ciclos de reloj. De la tabla que se encuentra en la hoja de datos, sabemos que la conversión real tarda 13 ciclos. Los 3 ciclos adicionales son probablemente para tareas de sincronización.

El aumento de la frecuencia del reloj durante la operación de conversión afectará la resolución del ADC, pero el efecto no es fácil de modelar . Sin embargo, puede medirse. Afortunadamente, alguien ha hecho estas mediciones.

En el sitio web de Open Music Labs puedes encontrar estos dos artículos:



Son una lectura bastante interesante y explican más detalles sobre la operación S & H. Los enlaces se aplican al ATmega 328p, pero no creo que el ADC ATmega 32u4 sea muy diferente.

El resultado es que al aumentar la frecuencia de ADC se reduce el número equivalente de bits (ENOB) de la conversión. Observese que a la frecuencia mínima de 125 kHz, la ENOB no es de 10 bits, sino algo superior a 9. Además, a 250 y 500 kHz, la ENOB también es más de 9, pero bajando. A 1MHz, la ENOB es más de 8. Para frecuencias mayores que eso, la ENOB cae por debajo de 8 bits.

Finalmente, podemos encontrar los problemas potenciales de utilizar una frecuencia de ADC mayor:
  • La resolución (número de bits) podría estar limitada por el S & H

  • La resolución (número de bits) estará limitada durante la conversión
La cantidad de bits de un ADC es un número entero, pero el Número Equivalente de Bits (ENOB) no lo es. A 125 kHz, si el S & H no es el factor limitante, se obtendrán aproximadamente 9,5 bits de datos. Es decir, la relación entre el valor máximo que puede convertir y el ruido de conversión se limitará a una relación de 2 ^ 9,5. Si no se necesitan más de 9 bits de resolución real, es posible aumentar la frecuencia de reloj del ADC hasta 500 kHz, pero debe verificarse que el S & H también será capaz de mantener esa velocidad para el valores de resistencia externa del ADC. Para una operación de 8 bits, se puede alcanzar un reloj 1MHz. Eso es ocho veces la velocidad de conversión original.

Programa ejemplo

Para cambiar el reloj del ADC, se ha de cambiar el Registro de control y estado ADC A (ADCSRA).


Los 3 bits inferiores de este registro determinan el divisor utilizado para obtener el reloj ADC a partir de la frecuencia del reloj principal del MCU.

  
Para 111 obtenemos un preescalador 128 que corresponde a la frecuencia Arduino de 125 kHz.
Para 110 obtenemos un divisor 64 que obtiene un reloj de 250 kHz. Para 101 obtenemos 500kHz y para 100 obtenemos 1MHz.

El siguiente programa de ejemplo hace 4 conversiones en secuencia. La primera con el valor por defecto de 125kHz, la segunda a 250kHz, la tercera a 500kHz y la última a 1MHz.


El programa también alterna el pin 3 de Arduino antes y después de cada llamada a analogRead para que se pueda medir el tiempo total asociado a esta función.





A partir de las medidas, podemos ver cómo el tiempo de ejecución de la función analogRead se reduce a la mitad en cada llamada a medida que se cambia el registro ADCSRA para obtener mayores frecuencias ADC.

Afortunadamente, la función analogRead no modifica el registro ADCSRA. Si ese fuera el caso, no podríamos modificar la velocidad del ADC sin crear una nueva función analogRead.


Código en Github (11/02/2018)

El código está ahora disponible en Github:

https://github.com/R6500/Leonardo/blob/master/FastAdcTest.ino