Ich möchte eine Schaltung bauen, die Sinuswellen mit Frequenzen erzeugen kann, die von einem Computer oder einem Mikrocontroller gesteuert werden. Ich möchte so niedrig wie 0,01 Hz (bis hinunter zu 0,05 Hz wäre wahrscheinlich akzeptabel) und so hoch wie 100 kHz gehen; Ich brauche mindestens 10 Frequenzen pro Dekade, was einer Auflösung von ungefähr 12 mHz am unteren Rand der Skala entspricht (oder 60 mHz, wenn der untere Wert 0,05 Hz beträgt). Die Ausgangsspannung muss nicht hoch sein - ich werde sie sowieso durch einige Operationsverstärker führen.
Was ist die Standardmethode dafür? Ist DDS der richtige Weg (entweder mit einer Sinus-Lookup-Tabelle auf einem uC oder einem IC wie dem AD9850)? Gibt es eine einfache analoge Lösung, die mir fehlt?
Ich würde gerne an Durchgangslochteilen festhalten, wenn ich kann.
Mit einem internen DAC, DMA, einem Timer und einer Sinus-Lookup-Tabelle können Sie problemlos ein hochflexibles DDS auf einem STM32F4 Discovery-Board für ~ 15 US-Dollar erstellen. Leute haben Beispiele für ähnliche Dinge gebloggt, wenn Sie danach suchen.
Um die erforderliche Frequenz zu erhalten (die STM32F4xx-DACs können nur 300 ksps bei voller Aussteuerung ausführen, was ~ 1 V / entspricht s) müssen Sie die Reichweite des DAC einschränken.
Bei einer Sinuskurve beträgt die maximale Anstiegsgeschwindigkeit (in V/s). . Wenn Sie die Werte aus den Anforderungen des OP einfügen und davon ausgehen, dass Vref des DAC 3,3 V beträgt (was, wenn ich mich richtig erinnere, für einen STM32F4Disco der Fall ist), ist eine 3,3-Vpp-Sinuswelle bei 100 kHz die maximale Anstiegsrate V/s oder V/ S.
Um diese Einschränkung einzuhalten, muss die Amplitude der Sinuswelle von begrenzt werden V zu v.
Dies bringt nun das offensichtliche Problem der 300-ksps-Grenze für den STM32F4-DAC mit sich. Diese Grenze ist ein Furphy. Ich weiß nicht, was die tatsächliche physikalische Obergrenze ist, aber ich vermute, dass es die APB1-Busgeschwindigkeit ist. Ich weiß (weil ich es getan habe), dass Sie mindestens 2 Msps in den DAC schreiben können, und solange Sie die Anstiegsrate von 1 V / us respektieren, verhält er sich vorhersehbar. Sie können also 16 Abtastungen pro Zyklus für eine 100-kHz-Sinuswelle, eine Aktualisierungsrate von 1,6 Msps, durchführen, solange Sie die Sinuswellenamplitude auf 3,18 V statt 3,3 V begrenzen.
Irgendwann werden Sie sich wahrscheinlich mit digitalen Potis auseinandersetzen müssen, denn die Realität sieht so aus, dass Sie Ihr DDS durch einen Filter laufen lassen müssen, wenn Sie ein gleichmäßiges, kontinuierliches Ausgangssignal wünschen, insbesondere bei niedriger Geschwindigkeit. und dieser Filter muss einstellbar sein - Sie können nicht einfach einen 100-kHz-LPF darauf legen und erwarten, dass er bei Frequenzen unter 1 Hz nützlich ist.
Hier ist meine (RF) grobe Zusammenfassung der DDS-Lösung, die ursprünglich von Nick Alexeev vorgeschlagen wurde. Ich markiere dies als Community-Wiki, also fühlen Sie sich frei, es mit Details usw. zu verbessern.
Mit dem AD-Rechner benötigen Sie etwa 10 bis 40 MHz DDS-Takt, um das gewünschte Gleichgewicht zwischen der 12-MHz-Frequenzauflösung (die ich nur auf 10 MHz runden werde) und einer resnoably glatten Kurve bei 100-kHz-Ausgang zu erhalten, wobei 20 MHz gut aussehen Mittelweg. Bei einem Takt von weniger als 10 MHz beginnt der Ausgang des DDS bei 100 kHz ziemlich verrauscht auszusehen. Bei höheren Taktraten als 40 MHz wird die Auflösung zu grob; bei 40 MHz Takt erhält man etwas weniger als 0,01 Hz Änderung für jedes Tuning-Bit, natürlich im niedrigen Bereich; Da das Abstimmwort ein Taktteiler ist, erzeugt es eine nichtlineare Frequenzkurve.
Was praktische Lösungen betrifft, so findet man DDS-Chips, die bereits auf Arduino-kompatiblen Schilden montiert sind (für etwa 5 US-Dollar, wie es scheint); Der Haken ist jedoch, dass sie möglicherweise mit einer festen (und möglicherweise ungeeignet hohen) Uhr geliefert werden, die jedoch durch einige Überarbeitungen der Platine verbessert werden kann.
Erwähnenswert ist auch, dass, wenn man einen Mikrocontroller (uC) verwendet, der über einen eingebauten und ausreichend schnellen DAC verfügt, das Hinzufügen eines DDS (das im Grunde ein ASIC ist, das eine Sinus-Lookup-Tabelle durchsucht und diesen indizierten Wert an einen DAC sendet) ist ziemlich sinnlos, da der Sinus-Lookup in der uC-Software implementiert werden kann. Weitere Einzelheiten zu diesem integrierten DAC-Ansatz finden Sie in der Antwort von markt.
Ich habe ein Design für einen nicht-digitalen Oszillator verwendet, der anständige Sinussignale bis unter 0,1 Hz und über 100 kHz erzeugt. Theoretisch war es ein LC-Parallelschwingkreis im Rückkopplungspfad eines Verstärkers. Das L und das C waren eigentlich Präzisionsgyratorschaltungen (weshalb sie auf so lächerlich niedrige Resonanzfrequenzen abgestimmt werden konnten). Sie würden niemals einen mit echten Induktoren bauen, und wenn Sie dies tun würden, wäre er nicht abstimmbar.
Sowohl "C" als auch "L" wurden mit einem Präzisions-Dual-Gang-Topf verfolgt, und wenn ich mich richtig erinnere, konnte ein Frequenzbereich von über 50: 1 aus dem Topf herausgeholt werden, bevor die Festkondensatoren in den Gyratoren ausgetauscht wurden.
Die Töpfe wären heutzutage natürlich besser mit Digipots bedient, da diese viel besser "tracken" können als normale Töpfe. Ich bin mir sicher, dass es mit Vorsicht bis zu 0,01 Hz funktionieren könnte.
Induktor Gyrator: -
Es gibt Gyratoren höherer Qualität (besserer Frequenzgang) und hier ist ein weiterer Link zu einem Dokument über eine andere Art von Gyrator. Das Schöne an dem einzelnen Operationsverstärker-Gyrator in dieser Anwendung ist, dass das CR-Netzwerk (das normalerweise als parasitär gedacht ist) effektiv als Abstimmabschnitt verwendet werden kann, der L und C über kleine Reihenwiderstände parallel macht.
Ein Ansatz wäre, einen 28-Bit-Addierer/Akkumulator mit einem 4-MHz-Takt zu takten. Ein uController, der die niederwertigen 20 Bits mit einem digitalen Wort antreibt, und die oberen acht Bits speisen Adressen zu einem Eprom für eine Sinus-Nachschlagetabelle mit 256 Einträgen. Die in einer R2R-Leiter summierten Datenbits aus dem Eprom würden kapazitiv an die Verstärkungsstufe Ihres Operationsverstärkers gekoppelt. Treiben Sie einen hohen Wert vom Mikro in den Addierer und die höherwertigen Bits durchlaufen schneller, für eine Sinuswelle mit höherer Frequenz. Ein niedriger Wert benötigt viel mehr Taktzyklus, um eine Zählung in den oberen acht Bits zu bewirken, die das EPROM ansteuern. Mit ein wenig zusätzlicher Arbeit in der Mikrosoftware; Sie können die EPROM-Tabelle verkleinern, indem Sie einfach Winkel von 0 Grad bis 90 speichern. Lesen Sie die Tabelle einfach vorwärts für die ersten 90 Grad (Quadrant 1), dann rückwärts für Quadrant 2, wieder vorwärts für Quadrant drei usw.
Nick Alexejew
Georg Herold
Fizz
Greg d’Eon
Fizz
Greg d’Eon
Greg d’Eon