www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Phasenaccumulation DDS


Autor: Steril (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Steril (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Steril (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Steril (Gast)
Datum:

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

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

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Steril (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Uwe Nagel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.