Hallo,
ich habe hier ein DDS IC von Analog Devices AD9959 Datenblatt unter
http://www.analog.com/UploadedFiles/Data_Sheets/AD9959.pdf ), das ich
probiere anzusteuern. Es läuft auch alles soweit, bis auf die Phase. In
der ersten Funktion berechne ich den Registerinhalt nach der Formel
Phase = (Registerinhalt / (2^14)) * 360° (nach Registerinhalt
umgestellt)
ch(1|2)phase ist zwischen 0...3600 (per UART Ausgabe geprüft) und ein
unsigned int, Variable typ ist unsigned char und entweder 4 oder 7, der
PHASE_OFFSETT ist aktuell noch auf 0 gestellt (wollte ich ausmessen)
1 | // Registerinhalt
|
2 | unsigned long long dds_register = 0;
|
3 | [...]
|
4 | // Phase Kanal 1 oder 2
|
5 | else if ((typ == 4) || (typ == 7))
|
6 | {
|
7 | // Phase für Kanal 1?
|
8 | if (typ == 4)
|
9 | {
|
10 | // 2 hoch 14 = (1ULL << 14)
|
11 | dds_register = ch1_phase * (1ULL << 14) / (360 * 10);
|
12 | }
|
13 | // Kanal 2
|
14 | else
|
15 | {
|
16 | // 2 hoch 14 = (1ULL << 14)
|
17 | dds_register = (ch2_phase + PHASE_OFFSETT) * (1ULL << 14) / (360 * 10);
|
18 | }
|
19 | // auf Überschreitung des Maximalwerts prüfen und evtl. begrenzen
|
20 | if (dds_register > (1ULL << 14))
|
21 | {
|
22 | // auf Maximalwert begrenzen
|
23 | dds_register = (1ULL << 14);
|
24 | }
|
25 | }
|
In einer zweiten Funktion nehme ich dann den errechneten Registerinhalt
und schreibe ihn via SPI ans DDS-IC:
1 | // Registerinhalt
|
2 | char byte1register = 0;
|
3 | char byte2register = 0;
|
4 | // Registerinhalt berechnen
|
5 | byte1register = (char) ((dds_register >> 8) & 0x3F);
|
6 | byte2register = (char) (dds_register & 0xFF);
|
7 | [...]
|
8 | // Channel Phase Offset Word zum Beschreiben auswählen
|
9 | SPI_MasterTransmit (0x05);
|
10 | // Phase senden
|
11 | SPI_MasterTransmit (byte1register);
|
12 | SPI_MasterTransmit (byte2register);
|
13 | [...]
|
Auf dem SPI kann ich allerdings nur folgendes empfangen:
Phase von 1800 => 0x05 0x00 0x90
Phase von 0900 => 0x05 0x00 0x90
Phase von 2700 => 0x05 0x00 0x90
Phase von 0300 => 0x05 0x55 0x90
Phase von 0600 => 0x05 0xAA 0x90
Phase von 0000 => 0x05 0x00 0x90
Was geht da wo und warum schief?
Wenn ihr Fragen habt und mehr Infos braucht: fragt ruhig.
Ansonsten freue ich mich über Tipps.
Gruß,
Peter