Forum: Mikrocontroller und Digitale Elektronik DDS 24 Bit in C?


von Thomas (Gast)


Lesenswert?

Hallo,

ich möchte mit DDS ein Sinussignal zwischen 63,00 und 65,00  in 0,01 
Auflösung erzeugen.

Fosc 3.686400 MHz

alle 500 - 2000 ms kommt per ICP eine Messung rein, die ich dann in die 
gewünschte Frequenz im oben genannten Bereich umrechne.

Nachdem ich die Threads zum Thema gelesen habe, habe ich mit einem 16 
Bit Phasenakku zu wenig Auflösung, mit 24 wäre es optimal, 32 Bit fürs 
Ergebniss unnötig.

In C kann ich aber wohl kaum einen 24 Bit Phasenakku 
(uint_24)definieren, ,oder?

Ich weiß, dass man solche Dinge in asm macht, habe aber von asm 0 Plan.

Da das FCW aber nur alle 500 - 2000 ms neu berechnet werden muss, dachte 
ich, dass es auch in langsamen C ginge.

Wenns nicht anders geht, nehme ich halt einen uint_32 breiten 
Phasenakku.

Über einen Tipp würde ich  mich freuen..

Gruß

Thomas

von Olaf (Gast)


Lesenswert?

> ich möchte mit DDS ein Sinussignal zwischen 63,00 und 65,00  in 0,01
> Auflösung erzeugen.

Ich weiss nicht wie das heute ist, aber mein Prof haette mich tierisch 
runtergemacht wenn ich keine Einheiten angebe.  .-)

> Da das FCW aber nur alle 500 - 2000 ms neu berechnet werden muss,
> dachte ich, dass es auch in langsamen C ginge.

Wenn ich mal davon ausgehe das du da oben Herz meinst, so wuesste ich 
keinen Grund warum du das nicht in C machen kannst. Du hast in C nur 
keine genau definierte Zeit fuer einen Zyklusdurchlauf. Daher musst du 
dir was mit einem Timer schaffen. Aber sagen wir mal einen 
Timerinterrupt mit 1ms sollte deine uns unbekannte CPU schon schaffen.

> Wenns nicht anders geht, nehme ich halt einen uint_32 breiten
> Phasenakku.

Dann nimm den halt. Wieso nicht? Wir wissen ja nicht welchen Controller 
du verwendest. Fuer einen modernen 32Bit Controller ist das kein Problem 
und auch fuer einen alten abgeschlafften und unmodernen AVR mit 
vollkommen oeden deprimierenden 8Bit sollte das bei deinen geringen 
Anspruechen noch zu schaffen sein. :)

Olaf

von Thomas E. (thomase)


Lesenswert?

Thomas schrieb:
> dass es auch in langsamen C ginge.

Dann nimm doch schnelles C.

mfg.

von Rudi D. (rulixa)


Lesenswert?

Thomas schrieb:

> ich möchte mit DDS ein Sinussignal zwischen 63,00 und 65,00  in 0,01
> Auflösung erzeugen.
>
> Fosc 3.686400 MHz
>
>
> Nachdem ich die Threads zum Thema gelesen habe, habe ich mit einem 16
> Bit Phasenakku zu wenig Auflösung, mit 24 wäre es optimal, 32 Bit fürs
> Ergebniss unnötig.
>
> Ich weiß, dass man solche Dinge in asm macht, habe aber von asm 0 Plan.
>
> Da das FCW aber nur alle 500 - 2000 ms neu berechnet werden muss, dachte
> ich, dass es auch in langsamen C ginge.
>


Schau mal nach: http://elektronik-labor.de/AVR/DDSGenerator.htm
Mit anderer Quarzfrequenz kann man auch exakt 0,01 Hz Auflösung 
realisieren
LG Rudi

von holger (Gast)


Lesenswert?

>Mit anderer Quarzfrequenz kann man auch exakt 0,01 Hz Auflösung

Genau. Wenn man bei 16Bit Zähler einfach erstmal auf 1Hz
Auflösung geht und dann nur jeden 100ten Timertick nimmt,
hat man sowas wie einen 23 Bit Zähler.

von Rudi D. (rulixa)


Lesenswert?

So hab's ich nicht gedacht.
Aus dem asm Listing geht hervor, wie ich es meine.
LG Rudi

von Thomas (Gast)


Lesenswert?

vielen Dank für Eure Antworten!

ich habe einen Atmega 162 mit einem ext. 3,686400MHz Quarz. Timer 1 
verwende ich mit prescale 256 fürs ICP. Es sollte für Batteriebetrieb 
geeignet sein, weswegen ich nicht auf 16MHz gehen wollte.

@Thomas Eckmann
super Idee, wäre ich jetzt nicht drauf gekommen...

@Olaf
Sorry, hatte schon diverse Fragen zu meinem Projekt gepostet, wobei 
meist diesselben Leute geantwortet hatten. Deswegen hatte ich die 
Details in dieser Frage unterschlagen....

@rudi
sehr schönes Link, Danke

Gruß

Thomas

von Thomas (Gast)


Lesenswert?

@rudi

war nicht ironisch gemeint, hatte das schon richtig verstanden

Gruß

Thomas

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.