Forum: Mikrocontroller und Digitale Elektronik Phasenaccumulation DDS


von Steril (Gast)


Lesenswert?

Kann mir jemand die Phasenakkumulation bei der DDS ein wenig näher
erklären?

Nach dem durchstöbern dieser Signalgenerator Arbeit vom guten Andreas
Schwarz hier habe ich mittlerweile rausbekommen, dass da immer ein Wert
(die frequenz?) zum Z-Pointer der durch die Tabelle fährt dazuaddiert
wird.
aber
1) das sind doch dann werte wie 1000 (hz), da fährt er doch dreimal
über die tabelle drüber, bevor er einen tabelleneintrag festlegt, und
2) woher weiß der pointer, dass er jetzt drüber ist (über den 256
tabelleneinträgen), und startet wieder bei 0? ich seh da den passenden
codeteil einfach nicht, oder übersehe ich da etwas wichtiges bei dem
Z-Pointer?

bin dankbar für jede aufklärung zu dem thema...

von Hans (Gast)


Lesenswert?

alles schön aber eben in englisch in den datenblättern von analog
devices zu den dds chips ad9850,da9851,... beschrieben....

viel spass beim lesen ;)

73 de oe6jwf

von Steril (Gast)


Lesenswert?

mich würde das ganze aber beim avr (8515) interessieren...

und du kannst es mir auch gerne kurz in english erklären, wenn du
magst..;)

und hier ein beispielcode, der minidds von jesper hansen...

http://www.myplace.nu/avr/minidds/minidds.asm

von Hans (Gast)


Lesenswert?

beim chip wirds so gemacht.. zum akku wird immer was dazuaddiert... der
is bei den chips 32bit breit... 10 bit is der sinus genau was ich so im
kopf hab drumm tun die einfach die oberen 10 bit her nehmen um in der
loopup table nachzuschaun... und hier is das ähnlich wie ich das
sehe...

 main loop
;
;r28,r29,r30 is the phase accumulator
;  r24,r25,r26 is the adder value determining frequency
;
; add value to accumulator
;load byte from current table in ROM
;output byte to port
;repeat
;
LOOP1:
addr28,r24; 1
adcr29,r25; 1
adcr30,r26; 1
lpm; 3
outPORTB,r0; 1
rjmpLOOP1; 2 => 9 cycles

der z-pointer is in register 30 und 31... aber nur 30 wird geändert...

daraus folgt nun das du nur das low-byte änderst...

wenn man jetzt sich den source weiter oben anschaut steht da
folgendes...

; force table to begin at 256 byte boundary
.org 0x100
sine:; 256 step sinewave table
.byte0x80,0x83,0x86,0x89,0x8c,0x8f,0x92,0x95,0x98,0x9c,0x9f,0xa2,0xa5,0x 
a8,0xab,0xae

da hast du nun das was ich gemeint hab... bis 0x1ff geht die
sine-table.. aber 0x200 is schon was anderes... er selektiert also mit
dem high-byte vom z-pointer die table und das low byte selektiert den
diskreten wert g

der typ is nicht gerade dumm wenn ich das mal so in den raum stellen
darf fg

ich kenn mich zwar im avr-asm ned wirklich aus...aber das was ich da
rein interpretiert hab müsste stimmen..schliesslich ähneln sich alle
asm irgendwo g

hoffe das hat geholfen...

73 de oe6jwf / hans

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Genau, zum Laden des Wertes aus der Tabelle wird nur das oberste der
drei Register verwendet. Weil die Tabelle genau 256 Bytes lang ist und
auf einer 256-Byte-Grenze liegt muss man sich dabei nicht um den
Ueberlauf kuemmern, wenn der Pointer ueberlaeuft faengt's einfach
wieder von vorne an.

von Steril (Gast)


Lesenswert?

"der typ is nicht gerade dumm wenn ich das mal so in den raum stellen
darf *fg*"
-------
aber ich leider...(absoluter uC-newbie) ;)

das r30 register ist mir ja irgendwie klar (so etwas ;)...aber was
machen dann r28 und r29?

von Hans (Gast)


Lesenswert?

der hat ein 24bit phase-akkumulator-register...

da wird nun ein wert hinzuaddiert und je grösser der ist desto
schneller ändern sich die oberern 8 bit sprich das low-byte vom
pointer...

so ungefähr läuft das..genauer und ausführlicher in den datenblättern
wie oben erwähnt...da gibts auch noch weiterführendes zeug... und
nebenbei erklären die da schön was es da bei den dds für probs gibt ;)

73 de oe6jwf

von Steril (Gast)


Lesenswert?

nun gut, dann werde ich mal ein wenig rumexperimentieren jetzt, und euch
morgen weiternerven ;)

viel dank erstmal, es klärt sich so langsam...

von Benedikt (Gast)


Lesenswert?

Hast jemand die Software schonmal auprobiert ?
Bei mir
a) sendet das Control Programm ganz andere Zeichen als im AVR Code
b) kommt nix raus am Ausgang (nur Low Pegel an PB)

von Benedikt (Gast)


Lesenswert?

Jetzt gehts, mit nem anderen Terminal. Anscheinend ist die
Controlsoftware nicht für das AVR DDS Programm ??

Und irgendwie hat AVR Studio Probleme mit den org Marken:
org 0x100 und der Code landet bei 0x200

von Steril (Gast)


Lesenswert?

ich habe mal die relevanten teile (sintable, phasenakkumulator,
definitionen) bei dem signalgenerator programm vom andreas schwarz in
ein kleines eigenes programm zusammenkopiert, und die werte dann auf
den ports ausgeben lassen. da sieht man im debugger beim avr studio
ganz gut was passiert...
mir ist noch immer nicht ganz klar was die unteren beiden register
machen, aber ich vermute es findet wohl so eine art überlauf statt, der
bewirkt, dass die schrittweite beim auslesen der werte aus dem table
sich vergrössert, bzw verkleinert...ist wohl ein algorithmus den ich
mal einfach so hinnehmen muss, ohne ihn ganz zu kapieren, funktionieren
tut er ja..;)
wenn ich mal an meinem eigenen rechner bin die nächsten tage stelle ich
das mal online, dann können die anderen newbs, die es interessiert sich
das auch mal anschauen...

von Uwe Nagel (Gast)


Lesenswert?

Ist doch eigentlich ganz einfach!
Stellen wir uns mal ein 16-Bit Register vor und einen Takt von 2^16 Hz
(also 65536 Hz).
Jetzt adieren wir in jedem Takt 1. Dann haben wir nach 65536 Takten,
also nach einer Sekunde, einen Überlauf, das Register fängt wieder
vorne an. Addiern wir 2, geht das ganze doppelt, bei 3 dreimal so
schnell und so weiter. Theoretisch könnte man bis 32768 jedesmal
adieren, dann macht das Register 32768 Durchläufe in der Sekunde.
Jetzt betrachten wir das Register als Zeiger in eine Tabelle, in der
eine Periode einer Sinusschwingung abgelegt ist. Addieren wir immer 1,
wird die Tabelle in einer Sekunde durchlaufen und wir bekommen eine
Schwingung mit 1Hz, bei 2 2Hz und so weiter.
Nun lassen wir die unteren 8 Bit einfach weg, dann wird die
Sinustabelle nur nicht mehr so fein aufgelöst, an der Frequenz macht
das garnichts. Die feine Auflösung würde evtl. auch nichts bringen.
Wenn der Sinus nur mit 8 Bit dargestellt wird, würden bei höherer
Auflösung nur viele gleiche Werte hintereinander in der Tabelle
stehen.
Man kann auch einfach nur das höchste Bit des Registers ausgeben, das
ergibt ein Rechtecksignal mit in 1Hz Schritten einstellbarer Frequenz.

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.