Hallo Werner,
ich sehe wo Dein 64Bit Problem liegt doch geht das mit einem Trick auch nur mit 32 Bits ;).
Was mir weiterhin aufgefallen ist, ist die notwendige hohe Auflösung der Fließkommazahl bei den obigen Punkten "1." und "2.", nämlich mindestens 9 Stellen hinter dem Komma. Eine 32 Bit Float Variable bietet nur 6 oder 7 (?) Stellen hinter dem Komma. Weiterhin unterstützen manche günstige (kostenlose ?) C-Compiler für µC leider keine Fließkommaberechnungen (kann das Deiner ?), somit muß ein gänzlich anderer Weg gegangen werde. Ich tue mal so als ob ich in Assembler programmieren müßte, dazu gebe ich zum Verständnis ein Bsp. zur Berechnung des DDS-Freqenzwortes (hier für den AD9951 mit 400MHz Takt), inkl. eines Korrekturwertes für abweichende Taktfrequenzen, an !
1. Annahme Taktfrequenz ist exakt 400MHz !
1 Hz in "Bits" entspricht genau (2^32 / 400MHz) = 10,73741824 Bits/Hz
2. In HEX Format (32Bit Länge) umwandeln und zwar der Ganzzahlanteil mittels den ersten 8Bit (MSB's) sowie den Nachkommateil mittels den restlichen 24 Bits (der Windows Taschenrechner ist ideal dafür !)
Ganzzahl 10 entspricht: 0Ah
Nachkommateil: (0,73741824 * 2^24) = 12371825,09 entspricht: BC C7 71h
Womit 1Hz == 0A BC C7 71h
Dieser Wert muß jetzt als Konstante fest im µC einprogrammiert werden !
3. Alles was der µC selber noch an Arithmetik durchführen muß ist die gewünschte Ausgangsfrequenz in Hz mit dem ermittelten, fest kodierten, 1Hz HEX-Wert multiplizieren und schon hat man das DDS Frequenzwort !
Bsp.: 14,120500MHz Empfangsfrequenz (Träger) in einem DC-RX
(14120500 * 0A BC C7 71h) = 09 09 80 B2 2D 98 F4h
Offensichtlich sind das jetzt deutlich mehr als 32 Bits (wie Du schon angemerkt hast), doch davon brauchen wir NUR die ersten 32 die man in einer passenden Variablen zur Weiterverarbeitung abspeichert und bekommen:
09 09 80 B2h ... was als Frequenzwort (nach dem Instruktionsbyte) dem DDS-Chip zu übergeben ist !
Testen wir mal ob's auch stimmt:
(09 09 80 B2h * 400MHz) / 2^32 = 14,12049998MHz
Freuqenzfehler = 20mHz ( min. Schrittweite eines 400MHz AD9951 ~ 93mHz) !!
4. Zum Korrekturwert: Die Taktfrequenz weicht mit sehr hoher Wahrscheinlichkeit von den exakten 400MHz ab. Deshalb muß der 1Hz HEX-Wert geringfügig nach oben (Taktfrequenz < 400MHz) oder unten (Taktfrequenz > 400MHz) korrigiert werden. Das Ganze baut man bspw. in einem Menüpunkt der Steuerung ein damit der Nutzer die Korrektur später selbstständig durchführen kann.
Dazu gibt man z.B. 10MHz aus und schließt einen Frequenzzähler am DDS-Ausgang an, der jetzt natürlich nicht genau 10MHz mißt. Nun vergrößern oder verkleiner wir den 1Hz HEX-Wert um 1 solange bis der Frequenzzähler genau die gewünschten 10MHz anzeigt. Der neu ermittelte HEX-Wert wird nun anstelle des Alten, fest im µC-EEPROM, gespeichert.
Ohne Frequenzzähler: RX auf 10.001000MHz einstellen und 10MHz WWV in LSB empfangen. Soundkarte anschließen, die 1kHz mittels FFT (hohe FFT-Punktzahl) darstellen. Nun den 1Hz HEX-Wert solange verändern bis die FFT genau 1kHz anzeigt um danach die neue 1Hz HEX-Zahl ins EEPROM zu übernehmen.