Äquivalente Zeitabtastung auf Mikrocontrollern

Ich muss zugeben, dass ich nicht allzu viel über analoge Elektronik weiß, aber ich würde gerne wissen, ob es möglich ist, einen äquivalenten Zeit-Sampler (ETS) mit den A/Ds auf einem Mikro zu konstruieren.

Ich hoffe diese Frage ist nicht zu vage. Grundsätzlich verstehe ich, dass ETS zum Abtasten sehr hochfrequenter Signale verwendet wird und ein Trick ist, der für digitale Oszilloskope verwendet wird.

Ich frage mich, ob jemand dies schon einmal versucht hat oder eine gute Referenz kennt.

Grüße,

Nathan

Antworten (3)

Equivalent Time Sampling (ETS) ist ein Trick, um Hochfrequenzsignale zu messen, wenn Sie eine Annahme über das gemessene Signal treffen können. Die Annahme ist, dass das Signal, das Sie abtasten, ein sich wiederholendes Signal ist (dh eine Sinuswelle oder ein anderes "zeitkonstantes" Signal).

Um dies auf Homebrew-Art zu tun, benötigen Sie ein Mittel, um genau und wiederholt an einem festen Ort (Ihrem Triggerpunkt) zu triggern, um eine variable Zeit zu verzögern und dann eine ADC-Erfassung in festen Intervallen zu starten.

Die Triggerung kann mit einem schnellen Komparator und einer genauen Referenz erfolgen. Wenn Ihre genaue Referenz ein gefilterter oder anderweitig stabiler DAC-Ausgang ist, haben Sie einen raffinierten (wenn auch vereinfachten) softwaregesteuerten Triggerpunkt. Führen Sie den Ausgang des Komparators in einen "Start-Timer" -Erfassungseingang Ihres Mikrocontrollers ein. Die Idee ist, dass der Timer Ihres Mikrocontrollers mit dem Zählen beginnt, sobald der Komparator ausgelöst wird. Wenn der Timer überläuft, startet er eine ADC-Erfassung und stoppt (bis Sie ihn anweisen, erneut auf das Ereignis zu achten).

Wenn Sie eine enge Schleife oder Interrupt-Routine (z. B. Software) verwenden, um zu erkennen, wann der Timer abläuft, um Ihre ADC-Erfassung zu starten, kann es zu einem gewissen Jitter kommen, da es unterschiedlich lange dauert, bis erkannt wird, dass der Timer abgelaufen ist. Wenn möglich, stellen Sie den Timer-Interrupt so ein, dass die ADC-Übertragung automatisch gestartet wird. Dies ist auf zahlreichen Mikrocontrollern möglich.

Wenn Sie es noch nicht erraten haben, werden Sie den Startwert des Timers anpassen, um Ihnen eine variable "Pause" zu geben, bevor Sie die Abtastschleife starten. Im Wesentlichen "laufen" Sie über die sich wiederholende Wellenform.

Nun zum ADC. Nehmen wir der Einfachheit halber an, dass Sie jederzeit so schnell wie möglich sampeln. (Ich werde weiter unten auf Alternativen eingehen.) Dies bedeutet, dass Sie, sobald der ADC fertig ist, ihm sagen, dass er erneut beginnen soll. Jetzt sind einige Mikrocontroller besser darin als andere; Wenn Sie Ihre ADC-Ergebnisse DMA und automatisch neu starten können, ist dies Ihre beste Option. Andernfalls haben Sie eine ANDERE Quelle von Jitter in Ihrer ETS: die Verzögerung zwischen einem vollständigen Interrupt des ADC (oder einer Abfrage, die den Abschluss erkennt), dem Speichern des Samples und dem Starten einer weiteren Erfassung.

Da ist Ihr Grundsystem. Pseudocode:

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

Ziemlich unkompliziertes Zeug, aber wie ich bereits erwähnt habe, müssen Sie den Code entwerfen und einen Mikrocontroller auswählen, der Ihnen den geringstmöglichen Jitter ermöglicht. Dies bedeutet, dass Sie einen Mikrocontroller wünschen, der so eingerichtet werden kann, dass ein Timer-Interrupt starten und ADC erfassen kann und dass ein ADC-Abschlussereignis Ergebnisse DMA (und den ADC neu starten) kann. Wenn Ihr Mikrocontroller dies nicht kann, treten bei Ihrer Abtastung einige Jitter auf, und die erfasste Wellenform sieht möglicherweise etwas "aus" aus, da die Abtastpunkte nicht in gleichmäßigen Abständen liegen.

Was nun, wenn Sie nicht so schnell wie möglich probieren möchten? Sie möchten, dass der ADC-Interrupt einen zweiten Timer startet, der die gewünschte Zeit zwischen den Abtastungen wartet, und dass der Interrupt dieses zweiten Timers den ADC erneut startet. Wenn Sie dies tun, müssen Sie sich bewusst sein, dass dies eine weitere Quelle von Jitter ist, wenn Sie eine Interrupt-Routine oder eine Abfrage (dh Software) verwenden müssen, um die Peripheriegeräte zu erkennen und zu starten.

Kurz gesagt, das ist ETS.

...Ist pingswept also falsch, dass die Abtastrate Ihre Fähigkeit, Signale zu erfassen, einschränkt? So wie ich das gelesen habe, können Sie im Wesentlichen eine so hohe Auflösung erzielen, wie Ihr Timer-Tick unterstützt. Bei einem 20-MHz-AVR, der traditionell eine ADC-Abtastfrequenz von 66 kHz (von oben nach unten) hat, könnten Sie so tun, als hätte er eine näher an einer 20-MHz-Frequenz, indem Sie nach Ihrem Trigger bei 10 us, 10,001 us, 10,002 us usw. abtasten ? Ziemlich cool! Das muss ich das nächste Mal ausprobieren.
Ich glaube nicht, dass pingswept etwas Falsches gesagt hat; Er sagte, dass Sie Probleme haben würden, Hochfrequenzsignale genau zu rekonstruieren, und er hat Recht. Sie müssen Ihre Wellenform für einige Zeit (im Computerzeitrahmen) "stillhalten", um sie genügend oft abzutasten, um ein schönes Bild davon zu erhalten, und selbst dann muss Ihr uC ziemlich gut sein und Ihr ADC ebenfalls. Es gibt einen Grund, warum gute Oszilloskope teuer sind. :-)
Außerdem benötigen Sie ein Sample & Hold, das sehr schnell erfasst werden kann. Der Auslesewert der meisten ADCs ist der Durchschnitt der Eingabe über einen bestimmten Zeitraum. Sie benötigen eine Schaltung, die den Eingangswert für einen sehr kurzen Zeitraum abtastet und diesen Wert dann lange genug beibehält, damit der ADC ihn umwandeln kann (im Allgemeinen mit Kondensatoren. Es gibt spezielle Geräte. Google "Sample and Hold") .
Absolut richtig, Fakename. Jeder ADC, den ich auf einem Mikrocontroller verwendet habe, hatte ein eigenes Sample-and-Hold, das den ADC nach seiner Abtastzeit effektiv vom Eingang entkoppelt. Wenn Ihr ADC ein langsames S/H hat (und das wird es wahrscheinlich), benötigen Sie ein externes.

Ich glaube, dass die Antwort ja ist, aber die Leistung wäre begrenzt. Soweit ich weiß, liegen die höchsten Abtastraten bei in Mikrocontrollern eingebauten A/Ds im Bereich von 10 bis 100 kHz. Sie sind auch durch die Einschwingzeit des A / D begrenzt. Mit einem dedizierten Hochgeschwindigkeits-Register-A/D mit sukzessiver Approximation können Sie über 1 MHz erreichen.

Bei sich wiederholenden Signalen könnten Sie sich schnelleren Signalen annähern, indem Sie mehrere Kanäle verwenden, aber ich vermute, dass Sie Probleme haben würden, selbst 1-MHz-Signale genau zu rekonstruieren, was schlimmer ist als selbst das billigste Oszilloskop auf dem Markt.

Könnte trotzdem Spaß machen, es zu versuchen.

Ich fand diese Beschreibung hilfreich: http://www2.tek.com/cmswpt/tidetails.lotr?ct=TI&cs=Application+Note&ci=14295&lc=EN

Kenne ich schon.

Lassen Sie ETS an einem 40-MHz-Mikrochip-dsPIC arbeiten, der über einen ~ 500-kHz-ADC verfügt und 40-MHz-TES mit 25-ns-Jitter ausführt.

Das S/H im ADC ist natürlich beschissen, sodass die Bandbreite des Signals dadurch begrenzt wird. Es ist hilfreich, den ADC-Eingang mit einem Operationsverstärkerausgang mit niedriger Impedanz anzusteuern, da der Eingang im Wesentlichen zum Abtasten in einen Kondensator geschaltet wird, und Sie möchten, dass dieser ziemlich schnell nachgeführt wird.

Der Trick, um dies zum Laufen zu bringen, war:

  1. Lösen Sie einen sich wiederholenden Timer aus (in meinem Fall Timer 5).
  2. Stellen Sie die Wiederholungsrate (Timer 5 Periodenregister) auf Ihre Echtzeit-Abtastrate ein, dh 500 kHz.
  3. Lassen Sie einen Zeitbasis-Timer (in meinem Fall war dies Timer 2) irgendwie mit Ihrem Signal synchronisieren (ich habe mit großem Erfolg eine Firmware-PLL-Schleife verwendet, die mit einem Eingangserfassungskanal verbunden ist.)
  4. Um einen ADC-Lauf zu starten, kopieren Sie den Wert Ihres Zeitbasis-Timers in den Trigger-Timer und passen Sie den Wert um die erforderliche Verzögerung an. Auf einem Mikrochip tat ich dies in einer einzigen Anweisung: "Verzögerung hinzufügen, [t2], [t5]", wobei "Verzögerung" so berechnet wurde, dass der Trigger-Timer das erste Mal zum richtigen Zeitpunkt im Zyklus überläuft. Dadurch, dass dies in einer einzigen Anweisung durchgeführt wird, wird vermieden, dass Interrupts während dieser Operation deaktiviert werden müssen.
  5. Verzögerungswert anpassen, spülen, wiederholen.

Ihre Erfassung besteht beispielsweise aus 80 dieser ADC-Läufe, wobei jeder Lauf Proben im Abstand von 2 usec sammelt. Jeder neue Lauf beginnt im Zyklus 25 ns später als der vorherige Lauf, sodass 80 Läufe am Ende eine Abtastung bei jeder möglichen Verzögerung in 25-ns-Schritten nehmen.

Nun, das war sehr Mikrochip-spezifisch; Das Setup auf einer anderen MCU kann sehr unterschiedlich sein.