PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : DDS Sinus( Direct Digital Synthesis )



rauf81
22.03.2011, 19:29
Hallo zusammen.
Brauche Eure Hilfe.
Ich will mir in Bascom und mit einem Atmega einen Sinus Genarator bauen.
Erzeugung des Signals über DDS.
Ich habe viele Seiten dessenbezüglich durchstöbert, komm aber nicht so wirklich in die Gänge.
1. Ich mus einen Phase Accumulator programieren, also einen zähler der immer eins dazu addiert und bei einem bestimmten Wert wieder auf null springt.
2. Getaktet wird dieser mit einem Timer 0 oder 1.
3.Bei jedem Sprung in dem Phase Accumulator wird aus einer Tabelle eine Sin funktion / Wert ausgelesen und dieser macht irgendwas ?

Hört sich eigentlich einfach an, find aber nicht den einstig. Habe zwar ne grobe vorstellung wie das Ding läuft aber an der Umsetzung häng ich.
Die Durchsuchten Seiten geben mir leider kein Code Beispiel Das es mir verdeutlicht was für Rechenoperationen zum gewünschten ziel führen.
ZB. welcher Wert/ Varieabele ändert die Frequenz.
Würde mich freuen wenn von Euch jemand eine Seite Bzw. ein einfachstes Code beispiel in Bascom kennt das mir die sache veranschaulicht.

Ok soweit zu meiner Verwirrung.....

Grüße Flo

dremler
22.03.2011, 20:14
1. ja einen einfachen Zähler, der überläuft
lasse einfach nen 8 bit Zähler laufen;)

2. wo der Takt herkommt ist egal du brauchst nicht unbedingt einen Timer...lass den Zähler einfach in einer Hauptschleife laufen

3. ja zu jedem Phasenwert wird in einer Tabelle ein Sinuswert "rausgesucht" dieser Wert (meist auch 8bit) wird dann ausgegeben...zb. Port B oder wo du möchtest;)


Daran musst du noch einen D/A Wandler hängen:) Es bietet sich ein R2R Netzwerk an....je nachdem was du dann mit dem Signal machen möchtest musst du es noch verstärken...z.B. mit einem OPV

Manf
22.03.2011, 20:20
Ich erinnere mich an die Angabe Poor man's DDS, das sollte genau das sein.

http://www.google.de/search?q=poor+mans+dds&rls=com.microsoft:de:IE-SearchBox&ie=UTF-8&oe=UTF-8&sourceid=ie7&rlz=1I7GPEA_de&redir_esc=&ei=OwSJTZiMI4z4sgaz6IizDA#hl=de&rls=com.microsoft:de:IE-SearchBox&rlz=1I7GPEA_de&sa=X&ei=OwSJTaLdJ8vtsgbOtMiuDA&ved=0CBsQBSgA&q=poor+man's+dds&spell=1&fp=7817e2f2b5132f3a

http://www.andrehessling.de/wiki/Inhalt/DDSFunktionsgenerator

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

dremler
22.03.2011, 20:28
mach mal den link noch dazu;)
http://www.myplace.nu/avr/minidds/index.htm
nur quellcode ist ja doof:P

rauf81
22.03.2011, 21:00
Danke für die Antworten

1. ja einen einfachen Zähler, der überläuft
lasse einfach nen 8 bit Zähler laufen

Timer 0 hat doch 8 bit odersoll das in einer Do Loop Schleife realisiert werden.
Wie sieht sowas aus ?

Danke ür die Links

Grüße Flo

dremler
22.03.2011, 21:10
hm naja ich hab länger nix mehr in bascom gemacht...

dein avr ist logischerweise mit nix andrem beschäftigt..da du sonst nur sehr geringe frequenzen erreichst...


dann nach dem motto:

do
x=x+1
y=sin(x)
loop

wobei sin(x) ein array mit den funktionswerten ist, welches vorher gefüllt wurde....
x ist 8bit breit und läuft bei 255 (eine Periode) über

daher brauchst du keinen timer....mit timern geht nat. auch....da zählst du halt im timer interrupt und liest später in der tabelle nach;)

je nachdem was noch drinne steht verzerrst du dann aber dein signal

rauf81
22.03.2011, 21:14
Hey Supper langsam aber sich seh ich licht am ende des Tunnels :-)
Als DA wandler Kann es sein das man die PWM Nutzen kann.
Werd mal morgen mich mit der sache beschäftigen versuch mal eine Tabelle zu erstellen und die Schleife ins Laufen zu bringen.
Vielen dank für die Hilfe.
Meld mich morgen wieder

Grüße Flo

dremler
22.03.2011, 21:18
aber mit pwm lässt du den prozessor doch wieder was machen;)


glaub mir r2r ist das einfachste, weil du ja schon 8 bit ausgibst;)

rauf81
23.03.2011, 07:26
Stimmt sollte das wirklich einem externen IC überlassen. Hab aber noch ein paar Atmega 8 rumliegen, die könnten das über PWM umwandeln.
Diese Lookup Tabelle Besteht ja aus Sinus Funktionen.

S(1) = 0.707
S(2) = 1.0
S(3) = 0.707
S(4) = 0
S(5) = -0.707
S(6) = -1
S(7) = -0.707

Wie reagiert der D/A bzw. Das PWM auf die negative Werte oder muss ich die noch positiv rechnen.

Grüße Flo

wkrug
23.03.2011, 07:48
Ich kann Dir nur einen guten Tipp geben - Lass es.
1. Du hast nur einen 8 Bit breiten Ausgang ( 256 Werte ).
2. Die Wertetabelle ist viel zu klein.
Ich hab mir einen ATMEGA 16 DDS Sinusgenerator nachgebaut.
Im Controller ist die DDS Routine in Assembler.
Trotzdem ist alles was über 2kHz hinaus geht alles - nur kein Sinus mehr.
Das ist ein nettes Projekt um die Grundlagen von DDS Generatoren zu lernen, als echtes Messgerät taugt es nicht.

Wenn Du einen DDS Generator bauen willst, benutz einen der zahlreichen DDS Chips z.B. den AD9833 oder den AD9834 von Analog Devices. Die haben dann sogar noch einen Dreieck und einen Rechteck Ausgang.
Für höhere Frequenzen gibts noch andere Bausteine, die bieten dann aber nur Sinus am Ausgang, allerdings mit Frequenzen bis in den GHz Bereich hinein.

Die Bausteine lassen sich relativ einfach per SPI ansteuern.

rauf81
23.03.2011, 09:15
Hört sich ja intressant an...
Was heißt SPI ?
Hast du ein Link Für diese Schaltungen.

Grüße

rauf81
23.03.2011, 09:49
Aber mal Davon ganz ab ich will ja lernen.;)
Ach so Ist ja mein erster Post will sagen Schönes Forum.

Grüße:p

wkrug
23.03.2011, 10:34
SPI heiss Serial Port Interface und besteht im Wesentlichen aus 4 Leitungen.
MISO, MOSI, SCK, und !EN
Auf MOSI werden Daten vom Controller in den peripheren Chip gegeben.
Auf MISO komen die Daten vom peripheren Chip zum Controller hin.
SCK liefert den Takt für beide.
!EN spricht der peripheren Chip an, da theoretisch auch mehrere Chips auf dem SPI hängen können, die dann über verschiedene !EN Leitungen angewählt werden.

Eine Komunikation schaut dann folgendermassen aus.
!EN wird aktiviert, Das erste Bit wird auf MOSI gegeben, SCK wird Ein und wieder ausgeschaltet, Bit 2 wird auf MOSI gelegt, CLK usw. bis alle Bits zum externen Chip durchgegeben wurden, dann wird die !CE Leitung wieder auf inaktiv gesetzt.
ATMEGA Controller besitzen eine Hardware SPI an Bord, in die man dann komplette Bytes schieben kann um die Übertragung kümmert sich dann die Hardware im Controller selber.

Da dort mit Clock polaritäten und gültigen Signalflanken Chipabhängig eingestellt werden muß, würde ich Dir empfehlen den entsprechenden Abschnitt im Datenblatt des Controllers und des verwendeten Chips zu stöbern.

Schaltpläne zu DDS Generatoren findest Du bei ELV bei den Aufbauanleitungen für diverse DDS Generatoren zum Download.
Für eine konkrete Adresse müsste ich jetzt selber suchen!

rauf81
23.03.2011, 13:56
Danke Für die Antwort werd mal nachschauem find sicherlich was dazu.
Sind doch die selben (gleichen)Ports wie beim ISP Fehlt halt nur noch GND VCC.
Also steuer ich den Sinuserzeuger über den Atmega.

Danke für die Antwort
Grüße Flo

dremler
23.03.2011, 14:08
Da kommt immer drauf an was du am Ende erreichen willst.

Es gibt immer viele Möglichkeiten ein Ziel zu erreichen.

Wenn dir eine niedrige Frequenz reicht, geht es auch mit einem ATmega.

Und übrigens ist es keine große Kunst, andere Signalformen abzuleiten;)

rauf81
23.03.2011, 19:17
Stimmt wir wohl ein lern Projekt werde auch aus diesem Grund das machen.

Grüße

Jens_Gr
01.04.2011, 15:43
Hier ist ein minidds mit 2 Prozessoren, einen zur Frequenzerzeugung und einen zur Frequenzeingabe -- so braucht man keinen PC um die Frequenz zu ändern.

http://www.elo-web.de/f-drabek

Das Ding werde ich wohl mal aufbauen --- Jens

engineer
08.01.2013, 12:34
Auch mit 8 Bits kann eine DDS bauen, wenn man gut dithert, die Tabelle interpoliert und vor dem DA-Wandler etwas filtert. Zudem hängt nach dem DAC immer noch ein analoges Filter.