Hallo,
ich habe mir neulich ein AD9850-Modul wie im Anhang zugelegt.
Es soll als Rechteckgenerator verwendet und mit einem M88 o.ä.
angesteuert werden (plus LC-Display für die Frequenz-Anzeige).
Weiß jemand, ob es hierzu schon irgendwo ein fertiges Projekt gibt?
Habe beim Googeln zwar einige Treffer erhalten, aber leider ohne
verwertbaren Inhalt.
Hallo
ggf. bringt dich das ein wenig weiter:
http://alhin.de/arduino/index.php?n=7
Ist aber alles andere als ein fertiges Projekt.
Du darfst aber auch der erste sein der dann ein fertiges Projekt in die
Codesammlung stellt;-)
mfg Andreas
Danke für den Link!
Zu Arduino habe ich das hier gefunden:
http://de.wikipedia.org/wiki/Arduino-Plattform
Will mich da aber nicht weiter einarbeiten und das ganze lieber direkt
mit dem AVR-Studio umsetzen.
In dem EF_AD8950.cpp-File (s. Anhang) findet man unter anderem folgenden
Programminhalt:
> wo die Variable frequence ihren Wert zugewiesen
Durch den Aufruf aus main.
Aber IMHO werden double im AVR-Studio als float behandelt. Also 8Bit
Exponent, Vorzeichen und 23Bit Mantisse. Deshalb gehen hier relevante
Stellen verloren. So wie ich das verstanden habe, hat das Uwe mit dem
AD9834 etwas anders umgesetzt, also mit reduzierter Auflösung, aber
immer noch gut genug:
Beitrag "Re: Ladderfilter berechnen und bauen"
> steht det nicht im Datenblatt, wie die Frequenz berechnet wird?
Schon, aber wenn einem double nicht zur Verfügung steht, fangen die
Klimmzüge an. Wieso soll man jedesmal das Rad neu erfinden, wenn das
schon mal jemand gemacht hat.
Hallo,
B e r n d W. schrieb:> Aber IMHO werden double im AVR-Studio als float behandelt. Also 8Bit> Exponent, Vorzeichen und 23Bit Mantisse. Deshalb gehen hier relevante> Stellen verloren. So wie ich das verstanden habe, hat das Uwe mit dem> AD9834 etwas anders umgesetzt, also mit reduzierter Auflösung, aber> immer noch gut genug:
ich muss anmerken, die Berechnung läuft nur mit 32 Bit ab und das FTW
wird über einen Kettenbruch berechnet. Was aber fest ist, ist die DDS
Taktfrequenz von 75MHz!
Nach zusammenfassen der Terme erhält man diese einfache Berechnung.
http://www.qrpforum.de/index.php?page=Thread&threadID=6976&highlight=ad9834
In meinem Beispiel ist die Frequenz-Auflösung ist nicht reduziert.
Das FTW kann sich um 1Bit vom exakt gerechneten unterscheiden, ist aber
vernachlässigbar.
Hallo,
Danke für eure Postings.
Habe heute endlich das LCD für die Frequenzanzeige am AVR zum Laufen
gebracht und schon mal ein kleines Menü zur Bedienung erstellt.
Gibt es eigentlich keinen einfachen linearen Zusammenhang wie
f = bw / c
wobei
f = Frequenz in Hz
bw= 32-bit-Wort
c = 687,12 (oder ähnlicher Faktor)
?
Im Datenblatt finde ich nichts in der Richtung (jedenfalls nichts
Prägnantes).
@ Bernd:
wenn man uint32 Variablen verwendet, umschifft man das Problem mit
double und float... (hoffe ich jedenfalls ;-))
Hallo KLS
> Gibt es eigentlich keinen einfachen linearen Zusammenhang?
Natürlich ist der Zusammenhang linear. Aber bei einer 32 Bit Variablen
gibt es ohne weitere Maßnahmen bei der ersten Multiplikation einen
Überlauf. Deshalb würde ich Jörgs Variante vorziehen.
> Welche Bedeutung haben die Buchstaben hinter den Zahlen?
Die bestimmen, in welchem Zahlenformat, die Konstante im
Programmspeicher angelegt wird:
L = long = int32_t
UL = unsigned long = uint32_t
ULL = unsigned long long = uint64_t
usw.
B e r n d W. schrieb:> L = long = int32_t> UL = unsigned long = uint32_t> ULL = unsigned long long = uint64_t> usw.
braucht man einen speziellen Header, damit die Schreibweise
funktioniert?
Wieso hat dieses IC-Ding keine anschlüsse für "inc frequenz" oder "dec
frequenz", dann könnte man es über eine Schleife steuern.
richie schrieb:> braucht man einen speziellen Header, damit die Schreibweise> funktioniert?
Nein. Ein C-Standard genügt. ;-)
Im Gegensatz zum Rest von C ist bei den Suffixen übrigens die Groß-
und Kleinschreibung egal.
> Wieso hat dieses IC-Ding keine anschlüsse für "inc frequenz" oder "dec> frequenz", dann könnte man es über eine Schleife steuern.
Weil du dann morgen noch nicht fertig wärst mit dem QSY.
richie schrieb:> B e r n d W. schrieb:>> L = long = int32_t>> UL = unsigned long = uint32_t>> ULL = unsigned long long = uint64_t>> usw.>> braucht man einen speziellen Header, damit die Schreibweise> funktioniert?
Nein.
> Wieso hat dieses IC-Ding keine anschlüsse für "inc frequenz" oder "dec> frequenz", dann könnte man es über eine Schleife steuern.
Schon mal nachgerechnet, wie lang das bei größeren Zahlen dauern würde?
Ausserdem hindert dich ja keiner daran, so was in Software zu machen.
richie Du brauchst ein C Buch !
Einige würden schreiben, Ende der ersten Klasse der "C" Programmierung.
Der AD9850 und der AD9851 sind so einfach zu steuern, man kann doch noch
eine Software-Ebene einführen, die genau deine Anforderungen erfüllt.
Dem "C" Programmierer sind doch kaum Grenzen gegeben !
Im Datenblatt und den Application Notes ist die Programmierung sehr
ausführlich dargestellt.
PeDa, Peter hat einen Beitrag zu schnellen 64-Bit Routinen verfasst, der
ist lesenswert:
-
http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=113673
Ich habe mir diese Idee auch mal angesehen:
- Beitrag "Re: Rechnen mit AVR"
Aus alle dem ist eine, für mich, schnelle 64-Bit Multiplikation und
Division 'abgefallen'.
richie schrieb:> B e r n d W. schrieb:>> L = long = int32_t>> UL = unsigned long = uint32_t>> ULL = unsigned long long = uint64_t>> usw.>> braucht man einen speziellen Header, damit die Schreibweise> funktioniert?>> Wieso hat dieses IC-Ding keine anschlüsse für "inc frequenz" oder "dec> frequenz", dann könnte man es über eine Schleife steuern.
Karl Heinz Buchegger schrieb:>> Wieso hat dieses IC-Ding keine anschlüsse für "inc frequenz" oder "dec>> frequenz", dann könnte man es über eine Schleife steuern.>> Schon mal nachgerechnet, wie lang das bei größeren Zahlen dauern würde?> Ausserdem hindert dich ja keiner daran, so was in Software zu machen.
hätte der Hersteller ja benutzerfreundlich in Hz-Schritten
implementieren können.
Wenn man es als Software macht, dauert es wirklich lange! ;v)
richie schrieb:> Wenn man es als Software macht, dauert es wirklich lange! ;v)
Nein, dann hast Du das "System" DDS nicht verstanden !
Hier läuft alles direkt und hat direkte Auswirkungen auf die Hardware
(DDS).
Die nächste Ebene / Schnittstelle ist dann deine.
Jörg Wunsch schrieb:> Im Gegensatz zum Rest von C ist bei den Suffixen übrigens die Groß-> und Kleinschreibung egal.
wie werden Variablen mit Vorzeichen als Suffix abgekürzt?
> uint32_t ddsval = 1000000ul;
Ist das doppelt gemoppelt?
richie schrieb:> Jörg Wunsch schrieb:>> Im Gegensatz zum Rest von C ist bei den Suffixen übrigens die Groß->> und Kleinschreibung egal.>> wie werden Variablen mit Vorzeichen als Suffix abgekürzt?
Bahnhof?
>> uint32_t ddsval = 1000000ul;>> Ist das doppelt gemoppelt?
Zur Hälfte. Den Typ "long" würde die Konstante 10000000 bereits von
sich aus bekommen (statt "int"), aber erst durch die Zuweisung wird
daraus ein "unsigned long", implizit wäre sie als Dezimalkonstante
erst einmal vorzeichenbehaftet.
Wie Uwe schon schrieb, du brauchst ein C-Buch (und danach eins über
DDS).
LOL.
Wenn man die Klimmzüge hier sieht.
Mit 8 32 bit-Konstanten die man nur passend aufsummieren muß,
kann man jede Frequenz zwischen 1 Hz und 99999999 Hz einstellen.
Ganz ohne Gleitkomma und solches Teufelszeug.
Ihr solltet vielleicht mal auf Brain 1.0 upgraden.
./. schrieb:> Endlich mal einer der mitdenkt.
Gut, dass wir dich haben. Keinen Namen, keinen Code, aber zumindest
den nötigen Durchblick. Hilft bloß keinem was.
So, ich habe jetzt einen Bresenham-Algo umgebaut für die
Frequenzberechnung.
Das funktioniert ganz gut und kommt auch ohne komplizierte Berechnungen
aus (und ich komme gleichzeitig mit meinen eher kleinen C-Kenntnissen
aus ;-)).
Die ausgegebenen Frequenzen scheinen so weit zu stimmen (zumindest lt.
rundfunksenderkalibriertem Weltempfänger).
Werde das aber noch eingehender prüfen, wenn ich wieder aus dem Urlaub
zurück bin.
Dann auch mit Filter(n) vor dem Rechteck usw.
Derweilen vielen Dank an alle Poster und schöne Zeit!
Uwe S. schrieb:> Hallo KLS,>> jetzt wäre es noch nett, wenn Du hier deinen Code mal einstellen> könntest.>> _
Nachdem nun 14 Tage vergangen sind pushe ich das hier nochmals...
Ich wäre auch interessiert am Code...
mfg Andreas
Dann eben nicht...
Habe nochmals gegoogelt, und nichts schlaues gefunden. Habe dann auf
Basis des nicht schlauen Codes selbst etwas geschrieben...
Beispiel im Anhang. Es wird kein Double verwendet, zum Vergleich mit
Double ist dieser Code ca. 1k kleiner.
Ich habe meine Rechnungen verifiziert, und ich weiss das diese nicht
korrekt sind. Mein Oszilloskop zeigt aber "nur" 4 Nachkommastellen an
bei 20MHz und diese haben sich im Vergleich zu Double nichts geändert.
Ich lads jetzt mal hier hoch, sobald ich dann weiss, dass das ganze
läuft etc. werde ich den Code noch in der Codesammlung hochladen.
Wer den Code testet soll doch kurz ein Feedback hinterlassen obs passt
oder nicht. Danke.
Der Code zum prüfen meiner Lösung (nicht für AVR!)
Ist zwar schon etwas länger her, aber nur ein kleiner Hinweis an
Andreas' code im Anhang. An der markierten Stelle hat er wohl vergessen,
das erste Byte vom 32bit-Frequenzwort zum AD9850 zu übertragen:
void AD9850_write(...)
{
...
AD9850_writeByte(tmp); <<<< Dieses erste Frequenzbyte fehlt in Andreas
Code!
AD9850_writeByte(tmp >> 8);
AD9850_writeByte(tmp >> 16);
AD9850_writeByte(tmp >> 24);
AD9850_writeByte(w0);
...
}
Habe heute den ganzen Tag gebraucht, um den Fehler zu finden. Die
Frequenz stimmte nicht mit der berechneten überein. Jetzt passt es
wunderbar. Mein Dank geht an Andreas' und seine Vorarbeit.
Mfg Alex