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
@ 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!
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.
@+++: 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?
>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.
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
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
Bitte lesen!! Er will eine Rechteckspannung, da ist DDS definitiv ein Overkill
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
@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
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
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.
"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.
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.
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
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
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.
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.