Muestreo de tiempo equivalente en microcontroladores

Debo admitir que no sé mucho sobre electrónica analógica, pero estoy interesado en saber si es posible construir un muestreador de tiempo equivalente (ETS) usando los A/D en un micro.

Espero que esta pregunta no sea demasiado vaga. Básicamente, tengo entendido que ETS se usa para muestrear señales de muy alta frecuencia y es un truco que se usa para osciloscopios digitales.

Me pregunto si alguien ha probado esto antes o conoce una buena referencia.

Saludos,

natan

Respuestas (3)

El muestreo de tiempo equivalente (ETS) es un truco para medir señales de alta frecuencia cuando puede hacer suposiciones sobre la señal que está midiendo. La suposición es que la señal que está muestreando es una señal repetitiva (es decir, una onda sinusoidal u otra señal de "constante de tiempo").

Para hacer esto de manera casera, necesita un medio para disparar de manera precisa y repetitiva en una ubicación fija (su punto de activación), retrasar una cantidad variable de tiempo y luego iniciar y adquirir ADC a intervalos fijos.

La activación se puede realizar con un comparador rápido y una referencia precisa. Si su referencia precisa es una salida DAC filtrada o estable, entonces tiene un punto de activación ingenioso (aunque simplista) controlado por software. Alimente la salida del comparador a una entrada de captura de "temporizador de inicio" en su microcontrolador. La idea es hacer que el temporizador de su microcontrolador comience a contar en el instante en que se dispara el comparador. Cuando el temporizador se desborda, inicia una captura de ADC y se detiene (hasta que le indique que busque el evento nuevamente).

Si está utilizando un ciclo cerrado o una rutina de interrupción (es decir, software) para detectar cuándo expira el temporizador para iniciar la captura de ADC, es posible que experimente cierta inestabilidad, ya que llevará una cantidad variable de tiempo detectar que el temporizador ha terminado. Si puede, configure la interrupción del temporizador para iniciar la transferencia ADC automáticamente. Esto es posible en numerosos microcontroladores.

Si aún no lo ha adivinado, ajustará el valor inicial del temporizador para darle una "pausa" variable antes de comenzar el ciclo de muestreo. En esencia, estará "caminando a través" de la forma de onda repetitiva.

Ahora para el ADC. Para simplificar, digamos que tomará muestras tan rápido como pueda en todo momento. (Hablaré sobre las alternativas a continuación). Lo que esto significa es que tan pronto como finalice el ADC, le indicará que comience de nuevo. Ahora, algunos microcontroladores son mejores en esto que otros; si puede DMA sus resultados ADC y reiniciar automáticamente, esta es su mejor opción. De lo contrario, tendrá OTRA fuente de fluctuación en su ETS: el retraso entre una interrupción completa del ADC (o un sondeo que detecta la finalización), el almacenamiento de la muestra y el inicio de otra captura.

Ahí está su sistema básico. pseudocódigo:

volatile int adc_count;

/* assumes you can't use DMA to drive the ADC */
void adc_interrupt(void)
{
    store_value();

    if(--adc_count) {
        start_adc();
    }
}

do {
    int offset;
    offset = 0;               /* offset from trigger to first ADC sample */

    do {
        adc_count = 256;      /* arbitrary, how many samples per trigger */

        load_timer(offset);   /* set timer value */
        arm_timer();          /* timer will now start when the trigger occurs */
    } while(adc_count);

    offset += 10;             /* arbitrary, how much to "move over" each trigger */
} while(offset < 100);        /* arbitrary, how many triggers to use for an ETS capture */

Algo bastante sencillo, pero como mencioné, debe diseñar el código y seleccionar un microcontrolador que le permita tener la menor fluctuación posible. Esto significa que desea un microcontrolador que pueda configurarse de modo que pueda iniciarse una interrupción del temporizador y la captura de ADC y que un evento de finalización de ADC pueda generar resultados de DMA (y reiniciar el ADC). Si su microcontrolador no puede hacer esto, tendrá algo de fluctuación en su muestreo y la forma de onda capturada puede verse un poco "apagada" ya que los puntos de muestra no estarán a intervalos espaciados uniformemente.

Ahora, ¿qué sucede si no desea muestrear lo más rápido posible? Desearía que la interrupción del ADC iniciara un segundo temporizador que esperara la cantidad de tiempo que desea tener entre muestras, y que la interrupción del segundo temporizador iniciara el ADC nuevamente. Si está haciendo esto, debe tener en cuenta que esta es otra fuente de inestabilidad si tiene que usar una rutina de interrupción o sondeo (es decir, software) para detectar e iniciar los periféricos.

En pocas palabras, eso es ETS.

... Entonces, ¿el barrido de ping es incorrecto en cuanto a que la frecuencia de muestreo limita su capacidad para adquirir señales? La forma en que leo esto es que esencialmente puede obtener una resolución tan alta como lo admita su temporizador. Entonces, para un AVR de 20 MHz, que tradicionalmente tiene una frecuencia de muestreo ADC de 66 kHz (fuera de mi cabeza), podría pretender que tenía una frecuencia más cercana a los 20 MHz al muestrear a 10us, 10.001us, 10.002us, etc. después de su disparador ? ¡Muy genial! Tendré que probar esto la próxima vez.
No creo que pingswept haya dicho nada malo; dijo que tendría problemas para reconstruir con precisión las señales de alta frecuencia, y tiene razón. Necesita que su forma de onda "permanezca quieta" durante bastante tiempo (en el marco de tiempo de la computadora) para poder muestrearla suficientes veces para obtener una buena imagen de ella, e incluso entonces su uC debe ser bastante bueno y su ADC también. Hay una razón por la que los buenos osciloscopios son caros. :-)
Además, necesita un Sample & hold que pueda adquirirse muy rápido. El valor de lectura de la mayoría de los ADC es el promedio de la entrada durante un período de tiempo. Necesita un circuito que muestree el valor de entrada durante un período de tiempo muy corto y luego conserve ese valor el tiempo suficiente para que el ADC lo convierta (generalmente se hace con capacitores. Hay dispositivos especializados. Google "Sample and Hold") .
Absolutamente correcto, nombre falso. Cada ADC que he usado en un microcontrolador tiene su propia muestra y retención que desacopla efectivamente el ADC de la entrada después de su tiempo de muestreo. Si su ADC tiene un S/H lento (y probablemente lo tendrá), necesitará uno externo.

Creo que la respuesta es sí, pero el rendimiento sería limitado. Hasta donde yo sé, las frecuencias de muestreo más altas en los A/D integrados en los microcontroladores están en el rango de 10-100 kHz. También está limitado por el tiempo de establecimiento de la A/D. Con un registro A/D de aproximación sucesiva, de alta velocidad y dedicado, puede obtener más de 1 MHz.

Para señales repetitivas, podría aproximarse a señales más rápidas utilizando múltiples canales, pero sospecho que tendría problemas para reconstruir con precisión incluso señales de 1 MHz, que es peor que incluso el osciloscopio más barato del mercado.

Podría ser divertido intentarlo de todos modos.

Encontré útil esta descripción: http://www2.tek.com/cmswpt/tidetails.lotr?ct=TI&cs=Application+Note&ci=14295&lc=EN

He estado allí, hecho eso.

Tenga ETS trabajando en un microchip dsPIC de 40 MHz, que tiene un ADC de ~500 kHz, haciendo TES de 40 MHz con una fluctuación de 25 nseg.

El S/H en el ADC es malo, por supuesto, por lo que el ancho de banda de la señal termina limitado por eso. Es útil impulsar la entrada ADC con una salida de amplificador operacional de baja impedancia, dado que la entrada se cambia básicamente a un condensador para el muestreo, y desea que se realice un seguimiento bastante rápido.

El truco para hacer que esto funcione fue:

  1. Activar un temporizador de repetición (temporizador 5, en mi caso).
  2. Establezca la frecuencia de repetición (registro de 5 períodos del temporizador) en su frecuencia de muestreo en tiempo real, es decir, 500 kHz.
  3. Tenga un temporizador de base de tiempo (este fue el temporizador 2 en mi caso) sincronizado con su señal de alguna manera (utilicé un bucle PLL de firmware, bloqueando un canal de captura de entrada, con gran éxito).
  4. Para iniciar una ejecución de ADC, copie el valor de su temporizador de base de tiempo en el temporizador de activación, ajustando el valor con el retraso necesario. En un microchip, estaba haciendo esto en una sola instrucción: "agregar retraso, [t2], [t5]", donde se calculó "retraso" para que el temporizador de activación se desborde la primera vez en el punto correcto del ciclo. Hacer esto en una sola instrucción evita tener que deshabilitar las interrupciones durante esta operación.
  5. Ajuste el valor de retraso, enjuague, repita.

Su adquisición consiste en, digamos, 80 de esas corridas de ADC, cada corrida recolectando muestras separadas por 2 usec. Cada nueva ejecución comienza 25 nseg más tarde en el ciclo que la ejecución anterior, por lo que 80 ejecuciones terminan tomando una muestra en cada retraso posible, en incrementos de 25 nseg.

Ahora bien, esto era muy específico del microchip; la configuración en otra MCU puede ser muy diferente.