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...
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
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
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
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.
"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?
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
nun gut, dann werde ich mal ein wenig rumexperimentieren jetzt, und euch morgen weiternerven ;) viel dank erstmal, es klärt sich so langsam...
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)
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
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...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.