Hallo. Ich zerbreche mir seit einigen Tagen den Kopf über eine Moeglichkeit mehrere Taktsignal zu erzeugen, die (im statischen Zustand) alle die gleiche Frequenz haben (Bereich ca. 10Hz-100Hz). Die Auflösung der einstellbaren Perioden muss 1us betragen. Dafür kommt ein 16-bit Counter bei 1Mhz in Frage. Soweit, sogut. Kommen wir zu der Herausforderung: Ich möchte nun jedes dieser Taktsignale einzeln zu einer imaginären Referenzphasen verschieben, und zwar in Schritten weniger us und um mehr als eine Periode. Eine Lösung wäre die Verwendung von vier Countern, die synchron getaktet werden, synchron starten, und bei erreichen des TOP-wertes das Taktsignal erzeugen. Will man ein Signal vorschieben, so erhoeht man kurz die Frequenz des jeweiligen Counters, will man ein Signal zurueckziehen, so verringert man die sie entsprechend über Manipulation des TOP-wertes. Wenn man aufpasst und sauber programmiert sollten keine Takte verlorengehen.. Nun kann man das ganze in einem Controller realisieren der vier 16-Bit-Counter hat oder vier kleinere Controller nehmen die jeweils einen haben, die man synchron befüttert. Das eine ist teurer, das andere aufwendiger. Und ich habe das Gefühl, da immer noch nicht die beste Lösung gefunden zu haben. Ich dreh mich im Kreis und würde mich über eine Diskussion und Anregungen freuen. Max
:
Bearbeitet durch User
Max 123 schrieb: > und um mehr als eine Periode. > [...] > und würde mich über eine Diskussion und > Anregungen freuen. Was meinst Du mit "mehr als eine Periode"?
@ Max 123 (max123) >Kommen wir zu der Herausforderung: Ich möchte nun jedes dieser >Taktsignale einzeln zu einer imaginären Referenzphasen verschieben, und >zwar in Schritten weniger us. Dann braucht man mehr als 1 MHz Takt. Ist aber kein Problem. >Eine Lösung wäre die Verwendung von vier Countern, die synchron getaktet >werden, synchron starten, und bei erreichen des TOP-wertes das >Taktsignal erzeugen. So in etwa. > Will man ein Signal vorschieben, so erhoeht man >kurz die Frequenz des jeweiligen Counters, will man ein Signal >zurueckziehen, so verringert man die sie entsprechend über Manipulation >des TOP-wertes. Das ist eine Mögloichkeit. Man kann auch einmalig einen Wert zum aktuellen Zähler addieren. >Wenn man aufpasst und sauber programmiert sollten keine Takte >verlorengehen.. Hoffentlich ;-) >aufwendiger. Und ich habe das Gefühl, da immer noch nicht die beste >Lösung gefunden zu haben. Ja und? Finde erstmal EINE funktionierende Lösung, dann kannst du dir über das Thema Optimierung Gedanken machen. >Ich dreh mich im Kreis und würde mich über eine Diskussion und >Anregungen freuen. Man kann auch einen CPLD/FPGA nehmen, da hat man noch mehr Möglichkeiten. Oder einen DDS-IC, viele haben zwei Kanäle und Möglichkeiten zur Phasenmodulation. Das macht die Anwendung noch einfacher.
Hi, ich bin nicht ganz sicher ob ich das ganz richtig verstanden habe, aber prinzipiell kannst du das doch mit einem Timer machen der die n-fache Aufloesung deiner genauigkeit und dann wie bei soft-pwm mehrere Zaehler mit unterschiedlichen Werten fuer das Ein- und ausschalten des jeweiligen Kanal steuern. Bsp. 1hz aufloesung K1 schaltet bei z=99 um und nullt sich wieder f=1/99 hz K2 schaltet bei z=100 um f=1/100hz usw. Ob dein uC das schafft haengt von deinen schritten und Kanaelen ab. Mit einem Mega 8 bei 8MHz internem takt war ich mit dem System bei ein paar us Aufloesung einer PWM und ich glaube der Zaehler war >10 (allerdings nur ein zahler, und 5 pwm kanaele) //hufnala
@ Walter: mit mehr als einer Periode meine ich eine zeitliche Verschiebung um mehr als eine Periodendauer des Clocksignals. Moechte man nur innerhalb einer Periode verschieben, so reicht ja beispielsweise auch eine Verschiebung des Comparewertes der Timer aus um die Signalerzeugung zu shiften. @ Falk: Eine wunderbare Idee, einfach den Counterwert additiv oder subtraktiv zu manipulieren! Kann man ja mit einem Interrupt zu dem Zeitpunkt machen, an dem man auch gefahrlos ohne underflow subtrahieren kann. Zu der Taktfrequenz - wieso brauche ich mehr als 1MHz? Als CPU-Takt allemale, ja, aber als Timertakt erzeugt 1MHz mir doch 1us-Schritte, oder habe ich da einen Denkfehler? Zu den Alternativvorschlägen: CPLD/FPGA erfordern erstmal eine Einarbeitung und ein DDS-IC scheidet aus, da ich die Beschreibung etwas verainfacht habe, es handelt sich nicht um Rechteck-Taktsignale sondern um eine etwas andere Form, die man besser mit einer UART oder dergleichen realisiert. Meine Frage nach der Optimierung zielte auch eher darauf ab, hier nicht sinnlos Hardware zu verbraten, da mit vier Controller fuer diese Aufgabe doch vergleichsweise viel vorkommen. Andererseits komme ich da wohl nicht herum, wenn ich sicherstellen moechte, dass sich die Interrupts nicht gegenseitig im Weg stehen und damit keine exakte Gleichphasigkeit moeglich ist. @ hufnala: Das habe ich auch schon durchgespielt, sofern ich das richtig verstanden habe. Meine gewünschte Auflösung ist 1us bei der Frequenzeinstellung, das bedeutet ich muss mindestens mit 1MHz zaehlen. Will ich da jetzt was phasenverschieben, so habe ich genau N Moeglichkeiten bei einer Frequenz von N*1MHz mit der ich damit einen Zaehler betreibe und dann bei Werten von n_1 - n_4 abgreife. Das ist ja dann aehnlich eines Compare Matchs. Das erlaubt mir aber nur Verschiebungen um eine Periode oder ich muss mehrfach abgreifen und entsprechend noch hoeher betreiben. Das kommt mir nicht praktikabel vor glaube ich
@ Max 123 (max123) >Zu der Taktfrequenz - wieso brauche ich mehr als 1MHz? Als CPU-Takt >allemale, ja, aber als Timertakt erzeugt 1MHz mir doch 1us-Schritte, >oder habe ich da einen Denkfehler? Du willst doch WENIGER als 1us die Pahse schieben! "und zwar in Schritten weniger us und um mehr als eine Periode." Ach so, du meinst wenige us. Ok, dann reicht 1 MHz. ;-) >um eine etwas andere Form, die man besser mit einer UART oder >dergleichen realisiert. Also Pulsmuster. >Meine Frage nach der Optimierung zielte auch eher darauf ab, hier nicht >sinnlos Hardware zu verbraten, da mit vier Controller fuer diese Aufgabe >doch vergleichsweise viel vorkommen. Dann sag uns, wass das denn INSGESAMT werden soll. Dann kann man dir sinnvoll helfen, Siehe Netiquette.
Insgesamt soll es ein Pulsmustergenerator sein, der auf mehreren Kanälen (hier: 4) Frequenzen von 10-100Hz mit einer Periodengenauigkeit von 1us erzeugen kann, die beliebig weit zueinander verschiebbar sind. Jitter soll sich im Bereich von max. 5us befinden. Ich spiele nur rum und versuche meine Fingerfertigkeit mit Timingkram etwas zu verbessern, es gibt kein insgesamt. Was man halt als Student so den lieben langen Tag so macht.
:
Bearbeitet durch User
Hallo! Soll es sowas wie ein mehrkanaliger Arbiträr-Pulsgenerator werden? http://de.wikipedia.org/wiki/Arbitr%C3%A4rgenerator
Am einfachsten benutzt man einen MC mit 4 Compare-Ausgängen, z.B. ATmega1284. Die Schrittweite kann bis zum CPU-Takt herab gehen bzw. für 1µs reicht 1MHz CPU-Takt. Für max 100Hz hat man dann 10.000 CPU-Zyklen Zeit, den Interrupt zu behandeln und die Compare-Zeit bis zur nächsten Flanke zu laden. Der Jitter ist 0, d.h. nur der Jitter der Quarzfrequenz. Die einzige Schwierigkeit ist bei <16Hz, da muß man dann mehrere Compareinterrupts abzählen, ehe das Compare den Pin wechseln darf.
Mit Compare-Ausgängen funktioniert das hinzugeben/wegnehmen von Takten ja auch, dann muss man entsprechend die Compare-Werte verschieben wenn ich mir das richtig vorstelle. Ich habe mir das mal aufgemalt auf Karopapier. Was mir noch Kopfzerbrechen bereitet ist die Vorstellung eines Frequenzwechsels unter Beibehaltung der absoluten Phasenverschiebung. Denn je nachdem wann der Top-Wert des Timers und damit die Frequenz verändert wird, leidet darunter ja die Phase des jeweiligen Signals, vor allem wenn um mehr als eine Periode verschoben wurde.. @route_66: ne, so kompliziert soll es garnicht werden..
:
Bearbeitet durch User
Max 123 schrieb: > Meine Frage nach der Optimierung zielte auch eher darauf ab, hier nicht > sinnlos Hardware zu verbraten, da mit vier Controller fuer diese Aufgabe > doch vergleichsweise viel vorkommen. Andererseits komme ich da wohl > nicht herum, wenn ich sicherstellen moechte, dass sich die Interrupts > nicht gegenseitig im Weg stehen und damit keine exakte Gleichphasigkeit > moeglich ist. Nimm doch einen einzelnen schnellen Prozessor, der echte Parallelverarbeitung ohne Interrupts ermöglicht. Dann gibt es kein Problem mit echter Gleichphasigkeit. Das User-Interface kannst Du auch in echter Parallelverarbeitung bedienen. Parallax Propeller kann alles das leisten mit determinierten Befehlsausführungszeiten durch leistungsfähiges Timer-Konzept: http://de.wikipedia.org/wiki/Parallax_Propeller Die Synchronisation der Kanäle erfolgt dann durch Auswertung eines Port-Bits. PropStick in Dip40 sollte für Deine Anwendung genügen. Es gibt bereits eine 4 Kanal Anwendung in Deiner Richtung, die auf dieser Hardware basiert: https://www.dropbox.com/s/tdj4tvq0ytftn58/PGen_demo_d.pdf
:
Bearbeitet durch User
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.