Muestreo de tiempo equivalente en microcontroladores

4

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

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

Me pregunto si alguien lo ha intentado antes o si conoce una buena referencia.

Saludos,

Nathan

    
pregunta akohlsmith

3 respuestas

4

El muestreo de tiempo equivalente (ETS) es un truco para medir las señales de alta frecuencia cuando puede suponer la señal que está midiendo. El supuesto 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 algún lugar fijo (su punto de activación), demorar durante un tiempo variable y luego comenzar y adquirir ADC a intervalos fijos.

El disparo se puede hacer 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 controlado por software ingenioso (aunque simplista). Alimente la salida del comparador en 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, comienza una captura de ADC y se detiene (hasta que le diga que vigile el evento nuevamente).

Si está utilizando una rutina de interrupción o bucle estrecho (es decir, un software) para detectar cuándo expira el temporizador para iniciar su captura ADC, puede experimentar cierta inestabilidad, ya que llevará un tiempo variable detectar que el temporizador es hecho. Si puede, establezca la interrupción del temporizador para iniciar la transferencia ADC automáticamente. Esto es posible en numerosos microcontroladores.

Si aún no lo has adivinado, estarás ajustando el valor de inicio del temporizador para darte una "pausa" variable antes de comenzar el ciclo de muestreo. En esencia, estará "cruzando" la forma de onda repetitiva.

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

Existe tu 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 */

Cosas bastante sencillas, pero como mencioné, debe diseñar el código y seleccionar un microcontrolador que le permita tener la menor fluctuación de fase posible. Esto significa que desea un microcontrolador que pueda configurarse de manera que se pueda iniciar una interrupción del temporizador y la captura de ADC, y que un evento de ADC completo pueda resultados de DMA (y reiniciar el ADC). Si su microcontrolador no puede hacer esto, tendrá un poco de inestabilidad 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 uniformemente espaciados.

Ahora, ¿qué pasa si no desea muestrear lo más rápido posible? Desearía que la interrupción del ADC inicie un segundo temporizador que espere la cantidad de tiempo que desea tener entre las muestras y que la interrupción de ese segundo temporizador inicie nuevamente el ADC. 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.

    
respondido por el akohlsmith
1

Creo que la respuesta es sí, pero el rendimiento sería limitado. Por lo que sé, las tasas de muestreo más altas en A / D integrados en los microcontroladores se encuentran 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 dedicado, de alta velocidad y de aproximación sucesiva, 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 le resultaría difícil reconstruir con precisión incluso señales de 1 MHz, lo que es peor que incluso el osciloscopio más barato del mercado.

Puede ser divertido intentarlo de todos modos.

Me ha resultado útil esta descripción: enlace

    
respondido por el pingswept
1

He estado allí, hecho eso.

Haga que ETS trabaje en un microchip dsPIC de 40 MHz, que tiene un ADC de ~ 500 kHz, realizando TES de 40 MHz con una fluctuación de 25 nsec.

El S / H en el ADC es horrible, por supuesto, por lo que el ancho de banda de la señal termina limitado por eso. Ayuda a controlar la entrada del ADC con una salida de amplificador operacional de baja impedancia, dado que la entrada se cambia básicamente a un capacitor para el muestreo, y quieres que la pista sea bastante rápida.

El truco para hacer que esto funcione es:

  1. Desencadenar un temporizador de repetición (temporizador 5, en mi caso).
  2. Establezca la frecuencia de repetición (registro del período del temporizador 5) a su frecuencia de muestreo en tiempo real, es decir, 500 kHz.
  3. Tener un temporizador de base de tiempo (este fue el temporizador 2 en mi caso) sincronizado con su señal de alguna manera (usé 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 mediante el retraso necesario. En un microchip, estaba haciendo esto en una sola instrucción: "agregar demora, [t2], [t5]", donde se calculó "demora" de modo que el temporizador de disparo se desborda la primera vez en el punto correcto del ciclo. Hacer esto en una sola instrucción evita tener que desactivar las interrupciones durante esta operación.
  5. Ajuste el valor de retardo, enjuague, repita.

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

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

    
respondido por el frogger

Lea otras preguntas en las etiquetas