Forum: Mikrocontroller und Digitale Elektronik Frequenzerzeugung ohne DDS Overkill??


von Boris (Gast)


Lesenswert?

Hallo Leute,

ich zerbrech mir hier gerade seit Stunden den Kopf...

ich will für eine luxuriöse Schrittmotor-Karte einen einstellbaren 
Reckteck erzeugen, und zwar digital in diskreten Schritten. Soll 
heissen, ich will mit einem 8-bit Wert, eine Frequenz von ca. 5KHz bis 
etwa 50kHz möglichst linear einstellen können.

Alle bisherigen Versuche laufen darauf hinaus, dass gegen oberes oder 
unteres Ende hin, die Stufen astronomische Weiten annehemen.

Hat mir jemand da vielleicht einen Tip?

BTW, ich hab in der schaltung noch ein CPLD mit hunderten freien Gates, 
wäre schön wenn sich sowas mit Gattern lösen ließe.

Nur falls jemand was weis...

Danke
Boris

von gast (Gast)


Lesenswert?

@ 2Mhz gibt es alle 40 taktzyklen einen interrupt. Jetzt nur noch die 
int´s
zählen und mit dem 8bit wert vergleichen. Zuvor sollte man den 
int-counter
aber noch auf 8eineb  bit gerechten wert runterrechnen. In ASM ist dies 
mit
einer risc cpu mög.

Der weg über einen CPLD ist def. falsch!

von +++ (Gast)


Lesenswert?

Wie wäre es, wenn du inden CPLD einen Zähler und ein Vergleichregister 
programmierst, das bei Gleichheit den Zähler auf Null zurücksetzt und 
dieser dann von neuem beginnt hochzuzählen? Wenn du die Rücksetzung 
synchron zum (System-)Takt machst, kannst du das Rücksetzsignal als 
neues Taktsignal verwenden. Eine Veränderung des Vergleichswertes ändert 
somit den Takt. Das müsste das sein, was du suchst.

@gast: Das Vergleichen alleine bringt es nicht, der Zähler muß auch 
zurückgesetzt werden.

von Boris (Gast)


Lesenswert?

@+++: dann hab ich aber wieder das gleiche Problem: ich teile den Takt 
effektiv durch zwei, drei, vier etc... 3,5 wär da nicht drin.

Die DDS chips von analog können das doch auch, ich kapier einfach nicht, 
wie die des machen!

Wie macht man aus einem 1MHz Zähler einen, der mit 666KHz zählt?
Da liegt für mich der Hund begraben!

@Gast: ich will aber nicht noch nen µc aufs Board knalen, was 
wahrscheinlich nichtmal mehr draufpasst.
Wieso sollte ein CPLD der falsche Weg sein?

von Dirk (Gast)


Lesenswert?

>Wie macht man aus einem 1MHz Zähler einen, der mit 666KHz zählt?
>Da liegt für mich der Hund begraben!

Was spricht gegen +++ Aussage? Erhoehe einfach den Zähler von 8Bit auf 
32Bit.

von Wolfgang Horn (Gast)


Lesenswert?

Hi, Boris,


Du: "Wie macht man aus einem 1MHz Zähler einen, der mit 666KHz zählt?
Da liegt für mich der Hund begraben!"

Geht auch nicht.
Einen einigermaßen schönen Sinus bekommst du ("du" allgemein gemeint) 
nur, wenn dessen Frequen sehr klein ist gegenüber dem Systemtakt, wenn 
du viele Punkte pro Schwingung hast.
Ein Signal bei halbem Systemtakt besteht dann nur noch aus zwei Punkten 
je 360 Grad und ist möglicherweise Gleichspannung, bei 1/3 Systemtakt 
stottert dein Sinus schon entsetzlich krumm.

Eine Lösung dürfte weniger in vielen Gattern zu finden sein als in hohem 
Systemtakt.


Ciao
Wolfgang Horn

von Joerg W. (joergwolfram)


Lesenswert?

Mach doch die DDS im CPLD oder im Controller selber. Bei z.B. 62,5 KHz 
fester Abtastrate und 16 Bit Zähler kommst Du auf knapp 1 Hz Auflösung. 
Die DDS wird einfach realisiert, indem zu jedem Abtastzeitpunkt ein 
fester Wert zu einem Register dazuaddiert wird. Die resuliterende 
Frequenz ergibt sch dann zu:

Abtastfrequenz * Addierwert / Maximaler Zählwert des Registers

Und mit dem Wert des Registers kann man auch über eine einfache Tabelle 
andere Kurvenformen erzeugen.

Gruß Jörg

von Heinz K. (heinzkleister)


Lesenswert?

Bitte lesen!! Er will eine Rechteckspannung, da ist DDS definitiv ein 
Overkill

von Zip (Gast)


Lesenswert?

Fuer ein Rechtecksignal ist ein genügend grosser Zähler an einer 
genügend grossen Frequenz Vorbedingung. Ein CPLD kann das. Wenn man's 
gerne dikret macht nimmt man 74HC590, counter mit Latch. Da klemmt man 
den kaskadierbaren Carry an den Load und er beginnt von Neuem.

Z

von Falk (Gast)


Lesenswert?

@Boris

>ich will für eine luxuriöse Schrittmotor-Karte einen einstellbaren
>Reckteck erzeugen, und zwar digital in diskreten Schritten. Soll
>heissen, ich will mit einem 8-bit Wert, eine Frequenz von ca. 5KHz bis
>etwa 50kHz möglichst linear einstellen können.

>BTW, ich hab in der schaltung noch ein CPLD mit hunderten freien Gates,
>wäre schön wenn sich sowas mit Gattern lösen ließe.

Mach den DDS im CPLD. Ist einfach ein 16(32) Bit Addierer + Register. 
Das MSB ist dein Takt. Bei 10 MHz Systemtakt hat dein 50 kHz Takt einen 
systematischn Jitter von 1/200 Periode. Damit kannst du sicher leben.
Been there, done that.

@gast (Gast)

>Der weg über einen CPLD ist def. falsch!

Nööö.

>Eine Lösung dürfte weniger in vielen Gattern zu finden sein als in hohem
>Systemtakt.

Genau!

MfG
Falk

von Peter D. (peda)


Lesenswert?

Boris wrote:

> @Gast: ich will aber nicht noch nen µc aufs Board knalen, was
> wahrscheinlich nichtmal mehr draufpasst.

Puh, da muß aber das Board wirklich voll sein, wenn da nicht mal mehr 
ein ATtiny25 im SO-8 draufpaßt.

Mit 8..64Mhz interner Timertakt sollten die 50kHz auch fein genug 
auflösbar sein.

Anbindung dann über SPI oder I2C.


Peter

von Christoph Kessler (db1uq) (Gast)


Lesenswert?

Ein bit-rate-multiplier ist das richtige für den Zweck.
TTL Standard 7497 macht 64 gleiche Stufen mit n/64 der Taktfrequenz
http://pdf1.alldatasheet.com/datasheet-pdf/view/27430/TI/SN7497N.html
ein gewaltiger Jitter, aber dem Schrittmotor sollte das egal sein.

von +++ (Gast)


Lesenswert?

"Die DDS chips von analog können das doch auch, ich kapier einfach 
nicht,
wie die des machen!"
Ich weiß nicht von welcher (Preis-)Klasse von DDS-ICs wir sprechen, aber 
einige haben eine PLL mit drin, die den Systemtakt damit hochsetzen und 
dann durch teilen fast beliebige Verhältnisse einstellen können.
Eine andere Möglichkeit ist es durch Logik nur einzelne Takte ausfallen 
zu lassen. Das wäre aber sehr unsauber.

von Christoph Kessler (db1uq) (Gast)


Lesenswert?

Den halben DDS kannst du weglassen, das Sinus-Rom und den DA-Wandler. Es 
sind wirklich nur der Addierer und Zwiscenspeicher nötig, wie Joerg und 
Falk geschrieben haben. Das höchstwertige Bit ist dein Ausgangssignal.

Bis 50 kHz geht das auch noch in TTL-Technik mit Volladdierern und 
D-Flipflops, aber ein Tiny oder ähnliches braucht deutlich weniger 
Platz. Auch ein Addierer im CPLD ist möglich. Je mehr Bit desto größer 
die Frequnezauflösung.

von TheMason (Gast)


Lesenswert?

sorry wenn ich blöd frage, aber dds ist doch sowas von simpel zu 
realisieren.
ich versteh die ganze aufregung darum nicht. egal ob cpld (DAS wäre 
overkill) oder per SW. man braucht doch nur einen addierer (und einen 
timer-interrupt). dann hat man direkt einen sägezahn. mit einer 
if-abfrage einer schiebe-operation macht man daraus einen rechteck. mit 
der selben abfrage und ein bischen arithmetik (addition, subtraktion, 
und einer schiebe-operation) macht man einen dreieck daraus. für sinus 
benötigt man noch eine tabelle. wo ist das problem ?!

gruß
rene

von Uwe (Gast)


Lesenswert?

Hi!
Also linear geht erstmal auf digitaler Basis überhauptnicht. Es wird 
immer eine Auflösung innerhalb einer Schrittgrösse geben.
Aber mal so als Vorschlag, einen kleinen Atmel mit 16 Bit Timer nehmen 
und in CTC-Mode mit Toggelausgabe laufen lassen. Bei 8MHz Takt und einem 
Ladewert von 80 hst du genau 50KHz. 81 erzeugt dann einen Takt von 
49,38KHz. Die Auflösung nimmt in Richtung kleinere Freq. dann noch 
erheblich zu, da musst du halt jemanden rechnen lassen. Mit 16Bit @8MHz 
kommst du übrigens bis ca.122Hz runter, bei 8 Bit kommst du nur bis 
ca.15KHz. Sollte das für dich nicht reichen?

Viel Erfolg, Uwe

von Christoph db1uq K. (christoph_kessler)


Angehängte Dateien:

Lesenswert?

Hier "mein erster DDS" mit 4* 74F382 4Bit-Addierern und 2* 74F374 
8-Bit-Registern. Eigentlich sollte noch ein lookahead-carrygenerator 
74F182 das ganze beschleunigen, war aber schwer beschaffbar. Das war 
lange vor AD9835 und ähnlichem, ca. 1988 oder 89. Das MSB als Ausgang 
reicht, ein Sägezahn mit Vergleicher bringt keine Verbesserung.

von Falk (Gast)


Lesenswert?

@Uwe

>Also linear geht erstmal auf digitaler Basis überhauptnicht. Es wird
>immer eine Auflösung innerhalb einer Schrittgrösse geben.

[ ]  Du kennst den Unterschied zwischen linear und diskret.

>Aber mal so als Vorschlag, einen kleinen Atmel mit 16 Bit Timer nehmen
>und in CTC-Mode mit Toggelausgabe laufen lassen. Bei 8MHz Takt und einem
>Ladewert von 80 hst du genau 50KHz. 81 erzeugt dann einen Takt von
>49,38KHz. Die Auflösung nimmt in Richtung kleinere Freq. dann noch
>erheblich zu, da musst du halt jemanden rechnen lassen. Mit 16Bit @8MHz

Ein 16 Bit DDS Zähler hat bei 8 Mhz eine Auflösung von 122 Hz über den 
gesammten Frequnzbereich. Mit 24Bit sind es schon ~0,5 Hz.

MfG
Falk

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.