Moin, ich wollte als kleines Projekt eine Impedanzspektroskopie Schaltung bauen, um das Alter (SoH) einer z.B. 18650 Batterie zu bestimmen. Dazu wollte ich einen Frequenzgenerator entwickeln, der eine Frequenz von 1Hz bis 1kHz automatisch hoch wobbeln kann. Hierzu habe ich den AD5930 gefunden. Die interne Clock läuft standartmäßig auf 50MHz. Mit den Formeln, die ich zu dem IC gefunden habe, komme ich auf folgende Ergebnisse: Startfrequenz = 1Hz (24Bit) => (Fout*2^24)/Fmclk = (1Hz*2^24)/50MHz = 0,336 Da ich das nicht in eine lesbare Binärzahl für den 5930 umwandeln kann, schließe ich an den externen Clock-Eingang einen Quarz an, der bei 16,777216MHz schwingt. Berechnet habe ich den wie folgt: Fmclk = 2^24/1Hz = 16,777216MHz Berechnung der Startfrequenz mit der neuen Clock: (Fout*2^24)/Fmclk = (1Hz*2^24)/16,777216MHz = 1 Die 1 muss ich nur noch in eine Binärzahl umwandeln und dann in das Register schreiben: MSB = 0000 0000 0000 LSB = 0000 0000 0001. Nun möchte ich noch die Zeit ausrechnen, welcher ein Durchgang benötigt, um einmal die Frequenz von 1Hz bis 1000Hz hoch zu wobbeln, hierzu stelle ich den Multiplikator auf 500 und das Inkrement Intervall auf 2047: Tbase = Multiply*2047/Fmclk = 500*2047/16,777216MHz = 61ms. Tsweep = (1 + Nincr)*Tbase = (1 + 999)*61ms = 61s Bis hierhin wollte ich erstmal Fragen, ob mein Gedankengang richtig war und ob das mit dem AD5930 umsetzbar ist. Reichen die 61 Sekunden aus oder sind die zu niedrig/hoch bemessen? Gibt es vielleicht einen anderen Baustein, der dafür besser geeignet wäre? Wenn die Fragen zu dem Frequenzgenerator besprochen und verstanden wurden, würde ich gerne die nächsten Schritte besprechen. Über hilfreiche Tipps, Anmerkungen und Vorschläge wäre ich sehr dankbar.
:
Bearbeitet durch User
Nach weiterer recherche habe ich mich für den AD5932 entschieden. Als Durchlaufzeit habe ich 10s gewählt. Was einem Increment Interval von 1678 und einem Multiplikator von 100 entspricht. Im Anhang befindet sich der Code, welcher bei Eingabe von Fstart, Fende, Schrittgröße und Laufzeitdauer die gesuchten Größen ausspuckt. Nun wollte ich mich gerne an die Beschaltung/Dimensionierung des AD5932 machen. Leider habe ich davon nicht so viel Ahnung. Könnte mir einer von euch sagen, wie ich was zu Beschalten habe und warum ich was machen muss? Dazu habe ich noch gelesen, dass an den Ausgang vom AD5932 ein TP 7./9. Ordnung kommt, damit die Frequenz vom Oszillator keinen Einfluss auf das Ausgangssignal hat. Hier wäre meine Frage, wie der Oszillator einen Einfluss auf das Ausgangssignal haben kann, so dass man einen TP am Ausgang braucht.
Johann B. schrieb: > Dazu habe ich noch gelesen, dass an den Ausgang vom AD5932 ein TP 7./9. > Ordnung kommt, damit die Frequenz vom Oszillator keinen Einfluss auf das > Ausgangssignal hat. Hier wäre meine Frage, wie der Oszillator einen > Einfluss auf das Ausgangssignal haben kann, so dass man einen TP am > Ausgang braucht. Der AD5932 erzeugt das Ausgangssignal per DDS. Wie auch im Blockschaltbild zu sehen, wird die Ausgangswellenform über einen DAC erzeugt und damit sind automatisch die Stufen durch die Abtastung mit der Aktualisierungsfrequenz im Signal enthalten. Wenn du sowieso nur Frequenzen bis 1kHz erzeugen willst, brauchst du keinen so hoch gezüchteten TP, weil du die Grenzfrequenz weit weg legen kannst. p.s. Einen Programmable Frequency Scan Waveform Generator wie den AD5932 zu verwenden, ist eigentlich unnötig. Der Scan kann genauso gut in Echtzeit vom Mikrocontroller gesteuert werden, d.h. ein einfacher DDS-Generator wie der AD9833 täte es genauso. Nur würde der µC dann jeweils die Frequenzschritte steuern, wüsste immer wo der Scanner gerade ist und würde sich nicht die ganze Zeit langweilen ;-)
> schließe ich an den externen Clock-Eingang einen Quarz an, der bei > 16,777216MHz schwingt Quarze gibt es nicht bei der Firma "Wuensch Dir Was". Ansonsten: 1 Hz bis 1 kHz per DDS zu erzeugen, kann eigentlich jeder einigermasse fitte Controller nebenher. Selbst ein Nur-DDS wie der AD9833 ist damit akut unterfordert. Auch eine analog, d.h. mit ca. 4 OPV zusammengebaute Loesung kaeme in Betracht. Da hat man dann alle Parameter per "Knopfdreh" im unmittelbaren Zugriff.
Ah ok vielen Dank! :) Also "glättet" der TP die Ausgangfreauenzen, so dass ein Sinus ohne Stufe am Ausgang anliegt? Meine Anfangsidee war, dass ich mit dem AD9833 das Signal erzeuge. Hatte auch schon ein Programm geschrieben, welches die Frequenz durch eine ISR Schrittweise erhöht, nur leider konnte ich dort nicht auf die Phase triggern, weshalb die Frequenz am Ausgang kein vernünftiger Sinus mehr war. Als Beispiel habe ich zwei Bilder angehängt. Entschuldigt die Qualität, aber ich musste die Bilder Abfotografieren, da ich anders keine Möglichkeit hatte, die Bilder hier hochzuladen.
Larry schrieb: > Quarze gibt es nicht bei der Firma "Wuensch Dir Was". Ich weiß, aber wie es der Zufall will, gibt es genau so einen Quarz bei der Firma Mouser :) https://www.mouser.de/Search/Refine?Keyword=16.777216MHZ
Johann B. schrieb: > image1.jpg Da ist etwas grundlegend schief gelaufen. Ist das vom Versuch mit dem AD9833? Diese Phasensprünge dürfen nicht sein. Mit Stufen meinte ich die Quantisierungsstufen im Signal, die du auf dem Oszi gar nicht siehst. > Meine Anfangsidee war, dass ich mit dem AD9833 das Signal erzeuge. Hatte > auch schon ein Programm geschrieben, welches die Frequenz durch eine ISR > Schrittweise erhöht, nur leider konnte ich dort nicht auf die Phase > triggern, weshalb die Frequenz am Ausgang kein vernünftiger Sinus mehr > war. Beim AD9833 änderst du nur den Wert, der mit jedem Takt zum Phasenakkumulator hinzu addiert wird. Es ist schon eine Weile her, aber wenn ich mich recht erinnere, muss man für eine saubere Umschaltung den Wert im gerade nicht benutzten Freq-Register ändern und erst dann den Multiplexer für die Auswahl des Freq-Register umschalten.
Wolfgang schrieb: > Da ist etwas grundlegend schief gelaufen. Ist das vom Versuch mit dem > AD9833? Ja ist es. Bei meinem Programm,setzte ich die Startfrequenz auf z.B 1Hz. Nach 100ms löst eine ISR aus, welche meinen aktuellen Frequenzwert um 1 erhöht. Danach öffne ich meine UpdateFrequenz-Funktion, wo der geänderte Wert in das Frequenzregister0 geschrieben wird. So wie ich mein Programm geschrieben habe, kann ich auch nie einen richtigen Sinus am Ausgang bekommen. Ich guck mich nochmal um, wie ich genau das Frequenzregister aktualisiere, ohne eine ISR.
Johann B. schrieb: > Danach öffne ich meine UpdateFrequenz-Funktion, wo der geänderte Wert in > das Frequenzregister0 geschrieben wird. Das wird das Problem sein. Du darfst nicht in das aktuelle Register schreiben. So sieht die Funktion zur Frequenzänderung bei mir aus:
1 | MD_AD9833::channel_t ActivChannel = MD_AD9833::CHAN_0; |
2 | void changeFreqReg(uint32_t FreqReg) |
3 | {
|
4 | if (ActivChannel == MD_AD9833::CHAN_0) |
5 | {
|
6 | DDS.setRegFrequency(MD_AD9833::CHAN_1, FreqReg); |
7 | ActivChannel = MD_AD9833::CHAN_1; |
8 | }
|
9 | else
|
10 | {
|
11 | DDS.setRegFrequency(MD_AD9833::CHAN_0, FreqReg); |
12 | ActivChannel = MD_AD9833::CHAN_0; |
13 | }
|
14 | DDS.setActiveFrequency(ActivChannel); |
15 | }
|
https://www.mikrocontroller.net/articles/DDS_basierter_Funktionsgenerator_mit_AD5930 Beitrag "Projekt: DDS basierter Funktionsgenerator mit AD5930"
Beitrag #6231069 wurde vom Autor gelöscht.
Ich hab die ganze Zeit herumprobiert, konnte aber leider keine vernünftige Frequenz einstellen bzw. wurde der Sinus wie oben auf den Bildern erkennbar, abgebildet. Ich lade den Code mal hier hoch, vielleicht kann mir einer von euch sagen, wo der Fehler ist.
Johann B. schrieb: > Ich lade den Code mal hier hoch, ... Zum reinen Ändern der Frequenz (ohne Phasensprung) darfst du keinen Reset der internen Register durchführen und die Phasenregister lässt du auch in Frieden. Zwischen den Frequenzregisters schaltest du um, indem du im Control-Register nur das FSELECT-Bit änderst.
Wolfgang schrieb: > Zum reinen Ändern der Frequenz (ohne Phasensprung) darfst du keinen > Reset der internen Register durchführen und die Phasenregister lässt du > auch in Frieden. > Zwischen den Frequenzregisters schaltest du um, indem du im > Control-Register nur das FSELECT-Bit änderst. Vielen vielen Dank für deine Hilfe Wolfgang, jetzt funktioniert es endlich :-) Und für die, die selber Probleme damit hatten, lade ich heute Abend den fertigen Code hoch.
Johann B. schrieb: > Vielen vielen Dank für deine Hilfe Wolfgang, jetzt funktioniert es > endlich :-) Prima. Was mir noch eingefallen ist: Bei bspw. 1Hz ist es nicht so wirklich sinnvoll, schon nach 100ms (1/10 Periode) die Frequenz zu ändern. Bei niedrigen Frequenzen sollte man langsamer scannen und erst weiter oben die Scangeschwindigkeit erhöhen.
Das ist mir auch schon aufgefallen, wollte das Problem lösen, indem ich eine zweite ISR schreibe, welche für die niedrigeren Frquenzen zuständig ist und ab einer höheren Frequenz, ist dann die andere ISR für die Frequenzen zuständig. Danke für deinen Tipp.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.