Forum: Mikrocontroller und Digitale Elektronik Sweep Generator mit AD5930


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Johann B. (brockelmann)


Lesenswert?

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
von Johann B. (brockelmann)


Angehängte Dateien:

Lesenswert?

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.

von Wolfgang (Gast)


Lesenswert?

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  ;-)

von Larry (Gast)


Lesenswert?

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

von Johann B. (brockelmann)


Angehängte Dateien:

Lesenswert?

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.

von Johann B. (brockelmann)


Lesenswert?

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

von Wolfgang (Gast)


Lesenswert?

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.

von Johann B. (brockelmann)


Lesenswert?

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.

von Wolfgang (Gast)


Lesenswert?

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
}

von Hilhreich (Gast)


Lesenswert?


Beitrag #6231069 wurde vom Autor gelöscht.
von Johann B. (brockelmann)


Angehängte Dateien:

Lesenswert?

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.

von Wolfgang (Gast)


Lesenswert?

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.

von Johann B. (brockelmann)


Lesenswert?

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.

von Wolfgang (Gast)


Lesenswert?

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.

von Johann B. (brockelmann)


Angehängte Dateien:

Lesenswert?

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
Noch kein Account? Hier anmelden.