Forum: Mikrocontroller und Digitale Elektronik Phasenverschobene Clockstreams erzeugen


von Max 1. (max123)


Lesenswert?

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
von Walter T. (nicolas)


Lesenswert?

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"?

von Falk B. (falk)


Lesenswert?

@ 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.

von hufnala (Gast)


Lesenswert?

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

von Max 1. (max123)


Lesenswert?

@ 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

von Falk B. (falk)


Lesenswert?

@ 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.

von Max 1. (max123)


Lesenswert?

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
von Route_66 (Gast)


Lesenswert?

Hallo!
Soll es sowas wie ein mehrkanaliger Arbiträr-Pulsgenerator werden?

http://de.wikipedia.org/wiki/Arbitr%C3%A4rgenerator

von Peter D. (peda)


Lesenswert?

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.

von Max 1. (max123)


Lesenswert?

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
von Benjamin B. (bussi04)


Lesenswert?

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
Noch kein Account? Hier anmelden.