Generieren einer Sinuswelle über einen großen Frequenzbereich

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.

Meine reflexartige Reaktion wäre, dafür ein DDS zu verwenden. Übrigens, was ist Ihre gewünschte Frequenzauflösung?
Ja, für das Niederfrequenzende kannst du Analog vergessen. Bei einem analogen Oszillator gibt es immer ein Einschwingen/Einschalten. Es dauert mindestens ein paar Zyklen. Für ~400 Dollar macht Rigol eine nette Signatur. Gen. das tut Millihertz bis 20 MHz.
TIs AN-263 Sine Wave Generation Techniques hat ein nettes "Menü" auf Seite 4, aus dem Sie je nach Frequenz Ihren Favoriten auswählen können. Bereich. Für Ihren sind mehrere Designs möglich. Verzerrung und Stabilität gehören ebenfalls zu den Faktoren, die bei der Auswahl einer Lösung zu berücksichtigen sind (aber das haben Sie nicht berührt).
@NickAlexeev: Ich habe einige Informationen zur Auflösung hinzugefügt. Ich brauche mindestens 10 Punkte pro Dekade, also ist der zweitniedrigste Punkt ~12 MHz höher als der niedrigste.
Leider schließt Ihre Anforderung, einen durchstimmbaren Bereich von 10M: 1 zu haben (so interpretiere ich "vom Computer gesteuert") die meisten analogen Single-Chip-Klassiker wie den XR-2206, ICL8038 usw. (von denen die meisten veraltet sind) aus ihrer Hersteller, kann aber immer noch als Überschuss gefunden werden) ... es sei denn, Sie können mit mehreren Adjument-Pots leben, wie zum Beispiel unter youtube.com/watch?v=KPtsgFw5Fno gezeigt . Sie könnten vermutlich die mikrogesteuerten Äquivalente dieser Töpfe bauen, aber Es ist nicht so einfach, Bits an einen DAC zu senden. Andererseits sind diese Oldies in DIP erhältlich.
Wenn ich "sweepable range" richtig verstehe, denke ich, dass ich das brauche. Ich stelle mir einen Mikrocontroller vor, der ein paar Bits sendet und eine Sinuswelle erscheint, bis der uC ihm sagt, dass er die Frequenzen ändern soll. Manuell gesteuerte Potis sind hier nicht sinnvoll und digital gesteuerte Potis klingen nach einer exzellenten Frustrationsquelle.
Danke für die ganze Mühe @Fluff! Ich werde mir diese Optionen bei Gelegenheit genau ansehen.

Antworten (4)

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). 2 π × F × A . 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 2 π × 10 5 × 3.3 / 2 = 1036726 V/s oder 1.04 V/ μ S.

Um diese Einschränkung einzuhalten, muss die Amplitude der Sinuswelle von begrenzt werden 3.3 V zu 3.3 × 1 / 1.04 = 3.18 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.

Tolle Informationen. Sie haben Recht mit dem Tiefpassfilter - ich muss experimentieren und sehen, was für den Sub-1-Hz-Bereich funktioniert.
Hmmm, versuchen Rigol und andere billige Kits wirklich, das Milli-Hz-Zeug mit LPF zu versehen? Welche Art von TC brauche ich bei 10 Bit für 1 Hz? (~1ms?) Und macht das Filter nicht auch eine Phasenverschiebung?
@GeorgeHerold Ich habe keine Informationen darüber, wie (oder ob) Rigol mit dem Filtern umgeht. TK?
Oh, tut mir leid, natürlich nicht. Filtert jemand Milli-Hz-DDS-Sinuswellen? TC = Zeitkonstante. (R*C) (Ich werde mir das Rigol morgen ansehen.)
Ich dachte, Sie meinten die Zeitkonstante, aber besser um sicher zu sein ... eine kurze Antwort ist eine verdammt lange! Zur Phasenverschiebung, ja natürlich, aber der Grundton ist ein reiner Ton (außer wenn Sie die Frequenzen ändern), also sollte die Phasenverschiebung keine Rolle spielen. Es kommt aber auf die Anwendung an.
Nun, ich kann nicht sagen, dass ich diese Lösung nicht mag, weil Sie sie in ein Softwareproblem verwandeln. Ein DDS besteht ebenfalls aus einem Sinus-Lookup und einem DAC, hat aber im Grunde die Tabellen-Sweeping-"Software" fest in seinem ASIC codiert. Wenn Sie bereits einen kompatiblen uC haben, kostet ein DDS auf einer Platine/Abschirmung nur etwa 5 US-Dollar ... Wenn Sie jedoch bereits einen uC mit integriertem DAC haben, betragen die Kosten 0 US-Dollar (weil die Software kostenlos ist).
Nachdem ich etwas länger darüber nachgedacht habe, scheint es ein ernsthaftes Problem mit der Geschwindigkeit des DAC zu geben. Mit 300KSPS können Sie nur maximal 3 verschiedene Spannungen pro Periode bei 100KHz ausgeben. Und ich verstehe nicht, wie Sie mit einer so niedrigen Abtastrate eine vernünftig aussehende Sinuswelle formen können. Im besten Fall wird es eine Dreiecksform sein. Ich sehe nicht, wie das durch nachfolgende analoge Stufen korrigiert werden kann, es sei denn, Sie implementieren einen Dreieck-Sinus-Wandler ... was die Verwendung eines DAC im Grunde in Frage stellt.
@RespawnedFluff Der DAC kann nur mit 300 ksps bei vollem Gang laufen , also hat er für Vref = 3,3 V eine maximale Anstiegsrate von ~ 1 V / us. Eine 3,3-Vpp-Sinuswelle bei 100 kHz hat eine Anstiegsgeschwindigkeit von ~1,04 V/us, sodass sie durch Beschränkung auf einen 3-Vpp-Bereich die 1-V/us-Grenze erreichen kann. Ich habe dies tatsächlich (weniger detailliert) in meinem Beitrag erwähnt; Ich werde es bearbeiten, um den Punkt zu erweitern.
In Bezug auf das Filtern kann es möglich sein, eine feste Frequenz lpf zu verwenden, die auf die hohen Frequenzen abgestimmt ist, und den niedrigeren Frequenzfall bei hoher Frequenz zu dithern. Das heißt, wenn der Ausgabewert beispielsweise 4,3 lsb betragen soll, geben Sie 4454454445 an dac aus. Dadurch erhöht sich auch die Auflösung.
@NicolasD Das ist eine nette Verwendung von Sigma-Delta, großartige Idee.
Übrigens hat ST einen App-Hinweis Nr. AN3126 zu genau diesem Zweck (Wellenformerzeugung, einschließlich Sinuswelle) mit dem STM32.

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: -

Geben Sie hier die Bildbeschreibung ein

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.

Ich habe noch nie von Gyratoren gehört. Das ist wirklich cooles Zeug, aber es klingt viel schwieriger, es richtig zu machen, als eine DDS-Lösung.
Schauen Sie sich die Ergänzungen und den Link an.
Dieser Link ist sehr hilfreich. Ich habe immer noch ein bisschen Angst davor, dies in der analogen Welt zu versuchen, aber das sieht nach nützlichen Informationen aus.
Sicher, dies ist eine der mehreren analogen Lösungen, die funktionieren würden ... aber dies wird genauso schwierig sein, es an einen Computer anzuschließen wie ein XR-2206 usw., was Kynit in den Kommentaren unter seiner Frage sofort abgelehnt hat . Gibt es DAC-gesteuerte Gyratoren, die dies für seine Anwendung erleichtern würden?
@RespawnedFluff Digipots würden die Kontrolle ermöglichen, wie in meiner Antwort gesagt.
Ich denke Digipots würden hier funktionieren. Ich denke nur, ich wäre glücklicher, mich an Timer und Interrupts zu halten, als an etwas, mit dem ich nicht vertraut bin. Dies sieht nach einer großartigen Lösung aus, die für jemanden mit etwas mehr Erfahrung im Filterdesign als ich genauso gut funktionieren kann wie DDS.
@Kynit Ihre Fähigkeiten und Erfahrungen sind natürlich ein wichtiger Faktor
Ich schätze, Kynit hat seine Meinung über Digipots geändert. Vor 17 Stunden schrieb er „Digital gesteuerte Potis klingen wie eine ausgezeichnete Quelle der Frustration“.
Für die Kosten von ca. 5,5 billigsten Digipots (jeweils 40 US-Cent in über 3000 Bestellungen), die von DigiKey getragen werden, können Sie das billigste DDS kaufen (ca. 2,20 USD in 1500+ Stückzahlen, max Die Lösung, die die Digipots steuern würden, müsste hervorragend sein, um sich zu lohnen. (Die Stückpreise für DYI/1-Stück-Bestellungen sind natürlich für beide höher ... und sicher gibt es Preisunterschiede zwischen den Händlern, aber das ist ein guter Richtwert, denke ich.) Nachdem ich mir also die relative Kostenseite angesehen habe, habe ich sehen Sie, warum die alten Analog-Funktions-Gen-ICs vom Markt gefegt wurden.

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.

Ich vermute, das "Verkaufsargument" dieser Lösung besteht darin, den Kauf/Verwendung eines DAC-ICs zu vermeiden und ihn stattdessen als diese R/2R-Leiter zu implementieren?
@RespawnedFluff Kein Verkaufsgespräch. Ich dachte nur an diesen Ansatz wegen des Kommentars zu den Durchgangslochteilen.
Nun, DACs im DIP-Gehäuse sind immer noch von mehreren Herstellern erhältlich ...
Also verwende ich einen Timer an Bord des uC, um einen Zähler vom uC zu inkrementieren, um herauszufinden, welche Spannung ausgegeben werden soll? Warum nicht alles an Bord behalten? Und warum eine Leiter anstelle eines DAC?