mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik [AVR] "virtueller" Timer


Autor: Henne (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich stehe mittlerweile in mehreren Anwendungen vor dem Problem, zu 
verschiedenen Zeitpunkten verschiedene Aufgaben zu erledigen.

Diese Zeitpunkte (16bit) müssten recht genau (wenige µs) getroffen 
werden.
Der Zeitraum zwischen zwei Zeitpunkten kann ebenfalls nur wenige µs 
betragen.
Es können sich einzelne oder mehrere Zeitpunkte unabhängig von den 
anderen gleichzeitig ändern.

(Ein Beispiel wäre zum Beispiel ein dreiphasiger Dimmer mit mehreren 
Kanälen.)

Es wäre nett, wenn Ihr mir etwas weiterhelfen könntet...


Was ich bislang betrachtet habe:
"soft FM"
In einer Timer-ISR hoher Frequenz werden mehrere Zählvariablen 
dekrementiert. Bei Null wird die Aktion ausgeführt und der nächste 
Zeitpunkt geladen. Nachteil: hohe CPU-Belastung, schlechte Genauigkeit 
der Zeitpunkte (der genaue Wert muss auf die ISR-Frequenz "quantisiert" 
werden...).

"Zeitpunkte sortieren und jeweils nächsten in das Compare-Register 
laden"
Im Hintergrund wird jeder neue Zeitpunkt einsortiert oder jedes Mal das 
komplette Array durchsortiert (worst case Betrachtung entscheidet). Nach 
dem Update wird der Pointer für die ISR auf das neu sortierte Array 
gesetzt. Nachteil: Wenn ich zu dem aktuellen Timerwert die 
Verzögerungszeit addiere und es zum Überlauf kommt, arbeitet die 
Sortierung falsch. (Der Timer steht aktuell auf 0xFF00 und ich möchte in 
0x10F Ticks etwas tun, so wird 0x10 vor z.B. 0xFF10 einsortiert, was 
aber zuerst erreicht wird...)

"verlinkte Liste"
Ich halte dies derzeit für eine elegantere Variante der eben genannten 
Sortierung. Ich befürchte allerdings dasselbe Problem mit Überläufen...
Es ist allerdings gut möglich, dass ich bei dem Bilden der Offsets zu 
vorigen Zeitpunkten einen Denkfehler mache.


Viele Grüße,
Hendrik

Autor: oszi40 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klingt interessant, aber was passiert beim nächsten Softwareupdate? 
Verschiebt sich alles, reichen die Zeiten noch?

Meine innerste Stimme sagt: Ein Atomkraftwerk würde ich damit nicht 
steuern wollen, höchstens eine Puppenstube. Jedenfalls würde ich noch 
irgendeine Plausibilitätsprüfung am Ende einbauen, um zu erkennen wenn 
das System hängt.

Autor: Henne (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@oszi: häh?
Der Zeitdauer eines Delays wird bei >100µs liegen. Von daher bleibt 
etwas Zeit zum Rechnen.

Ansonsten würde 30kW nicht in eine Puppenstube einbauen.
Als Scheduler misbraucht, möchte ich einen Einsatz in "interessanteren" 
Steuerungen auch nicht ausschließen.

=====
Nach dem ich den Post tippte, fiel mir auf, dass das Arbeiten mit 
Offsets evtl. doch funktionieren könnte, da ich niemals den absoluten 
Timerstand beim Auslösen vor der Sortierung bilden muss -> keine 
Überläufe, keine Fehlsortierung...

Autor: dummy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Diese Zeitpunkte (16bit) müssten recht genau (wenige µs) getroffen
>werden.
>Der Zeitraum zwischen zwei Zeitpunkten kann ebenfalls nur wenige µs
>betragen.

Wenns im us Bereich sein muss würde ich das ganze gleich sein lassen.

Beispiele (Befehle mit mehreren Takten mal vernachlässigt):
ATMega mit 4MHz  250ns pro Befehl  4 Befehle pro us
ATMega mit 16MHz  62.5ns pro Befehl  16 Befehle pro us

So, nun rechnest du mal aus wieviele Befehle du zwischen
deinen Zeitpunkten zur Verfügung hast und schätzt dann
mal ab ob das überhaupt geht.

>(Ein Beispiel wäre zum Beispiel ein dreiphasiger Dimmer mit mehreren
>Kanälen.)

Da reichen sicherlich auch ms.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Henne (Gast)

>Diese Zeitpunkte (16bit) müssten recht genau (wenige µs) getroffen
>werden.
>Der Zeitraum zwischen zwei Zeitpunkten kann ebenfalls nur wenige µs
>betragen.
>Es können sich einzelne oder mehrere Zeitpunkte unabhängig von den
>anderen gleichzeitig ändern.

Tja, das kann mn wohl auf gängigen Mikrocontrollern vergessen, wie dummy 
richtig bemerkte. Das braucht echte Hardware, entweder als FPGA/CPLD 
oder Timermodul. Der 683xx hat sowas glaub ich, nennt sich TPU, Time 
Processing Unit.

MFG
Falk

Autor: Henne (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Falk, dummy:

Bei 50Hz beträgt die Dauer einer Halbwelle 10ms. Bei 255 
Werten/Halbwelle und entsprechenden Korrekturtabellen ist man bei <40µs. 
Arbeitet man mit mehreren Phasen wird es noch einmal enger...

Derzeit habe ich noch Hoffnung, da ich die Zündzeitpunkte kurz nach dem 
Nulldurchgang kenne und bis zum ersten Anschnitt gut 200µs Zeit habe.

Derzeit werkelt auch schon ein 3p-Dimmer von mir nach dem zweiten 
Prinzip (Sortierung). Der Nachteil war nur, dass ich mit festen 
Phasenverschiebungen rechnete und alle Zündzeiten auf eine Halbwelle 
runterrechnete. (So umging ich das Überlaufproblem ;-)
Einige Leute haben aber nun das Problem, dass bei extremen Belastungen 
die Phasenveschiebungen variieren und somit Scheinwerfer an den 
"Slavephasen" flackern, da die Nulldurchgänge nicht mehr exakt getroffen 
werden.
http://www.hoelscher-hi.de/hendrik/light/dmxdimmii.htm

Ich hatte nun die Hoffnung, dass ein Forum voller Experten intelligenter 
ist, als ein einzelner Maschi...

Viele Grüße,
Hendrik

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Henne (Gast)

>Werten/Halbwelle und entsprechenden Korrekturtabellen ist man bei <40µs.
>Arbeitet man mit mehreren Phasen wird es noch einmal enger...

Kann man lösen, siehe Soft-PWM.

Das ist aber MEILENWEIT von dem Problem entfernt, welches du nebulös 
skizziert hast.

>Diese Zeitpunkte (16bit) müssten recht genau (wenige µs) getroffen
>werden.
>Der Zeitraum zwischen zwei Zeitpunkten kann ebenfalls nur wenige µs
>betragen.
>Es können sich einzelne oder mehrere Zeitpunkte unabhängig von den
>anderen gleichzeitig ändern.

>Einige Leute haben aber nun das Problem, dass bei extremen Belastungen
>die Phasenveschiebungen variieren und somit Scheinwerfer an den
>"Slavephasen" flackern, da die Nulldurchgänge nicht mehr exakt getroffen
>werden.

Naja, dann braucht man halt für jede Phase eine Nulldurchgangserkennung. 
Entweder clever über den einen ICP, denn die Phasen sind ja auf jeden 
Fall ~120 Grad zueinander versetzt, oder über drei kleine 8-Pin AVRs, 
die einzeln die Phasen steuern, die können ja an einem DMX- Receiver 
hängen.

>Ich hatte nun die Hoffnung, dass ein Forum voller Experten intelligenter
>ist, als ein einzelner Maschi...

Woraum du einen lassen kannst, selbst wenn es der beste Maschi der Welt 
wäre . . .

MFG
Falk

Autor: Henne (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Falk:

Stimmt - die dritte Variante mit der Sortierung könnte funktionieren, da 
auch mit Offsets gearbeitet wird. Da hatte ich mich damals verguckt und 
absolute Werte in Erinnerung. Danke!

Die Annahme einer konstanten Phasenverschiebung von 120° scheint nicht 
immer zuzutreffen*, da einige Leute bei starken Lastwechseln oder an 
Dieselaggregaten Probleme hatten. (Ich konnte es leider nicht 
verifizieren und es scheint auch nur bei Wenigen aufzutreten.)

Die nebulöse Umschreibung kam daher, dass die Geschichte wohl auch bei 
anderen Aufgaben (einen Haufen Stepper, LEDs,...) nützlich sein könnte 
und der Dimmer nur das Nächstliegende war ;-)

Der Ansatz einen Stapel Slave-AVRs einzusetzen ist zwar gängig - aber 
irgendwie auch unsportlich...

Viele Grüße,
Hendrik


*alternativ kann auch kurzfistig die Frequenz schwanken. Das hätte 
denselben Effekt, da ich mit zeitlichen Offsets von 120° bei 50Hz 
Netzfrequenz rechne.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Sebastian B. (mircobolle)

>Ich habe den Thread nur überflogen, konnte aber dein exakten
>Randbedingungen nun nicht direkt erfassen.

Dieser Fehler wird gern und häufig gemacht. Nicht gut, wie man mal 
wieder sieht.

>Und du benötigst nun einen Scheduler mit Echtzeitanforderungen im us
>(Mikrosekunden) Bereich.

Jaja, sonst noch was? Lies mal den Thread in RUHE.

MFg
Falk

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Henne (Gast)

>Die Annahme einer konstanten Phasenverschiebung von 120° scheint nicht
>immer zuzutreffen*, da einige Leute bei starken Lastwechseln oder an
>Dieselaggregaten Probleme hatten. (Ich konnte es leider nicht
>verifizieren und es scheint auch nur bei Wenigen aufzutreten.)

Nun, das sollte man schon mal abklopfen oder halt ignorieren. Es könnten 
auch Probleme bei der Erkennung des Nulldurchgangs sein. Denn so dolle 
ist die 0815 Optokopplerschaltung nicht.

>Der Ansatz einen Stapel Slave-AVRs einzusetzen ist zwar gängig - aber
>irgendwie auch unsportlich...

Warum einfach, wenns auch umständlich geht ;-)

>*alternativ kann auch kurzfistig die Frequenz schwanken.

Das glaub ich kaum. Ausserdem muss der Dimmer sowieso JEDE Vollwelle neu 
synchronisieren. In dieser Zeit läuft die Phase keinesfall um mehr als 
ein paar us weg.

MFg
Falk

Autor: Henne (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Sebastian:
Es sind drei Phasen. Aber nach Deinem Post entspräche ein Kanal einem 
Prozess. Rechne mit 3..12 Kanälen.

Jeder Prozess würde 100Mal/s einen Triac zünden. Allerdings ist die 
Phasenverschiebung der einzelnen Prozesse zueinander variabel und 
abhängig von Nulldurchgang und gewünschter Helligkeit.

Das ist aber eine sehr verdrehte Beschreibung des Ablaufes...
Ich denke, dass ich mit der 3.Soft-PWM meinen Ansatz gefunden habe.

Viele Grüße,
Hendrik

Autor: Henne (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Falk:

Es wird jede Vollwelle synchronisiert.
Ich spiele blos mit dem Gedanken, die Periodendauer zu messen und 
darüber Phasenverschiebungen und Zündwinkel permanent nachzujustieren.

Autor: Henne (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Sebastian:

Prinzipiell hat Falk Recht, wie Du beim Überfliegen feststellen wirst.

Die Lösung wird wohl auch ein Hybrid aus einem Scheduler und der 
Soft-PWM sein.

Es lohnt sich nicht, sich wegen sowas in die Haare zu kriegen...

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Henne (Gast)

>Ich spiele blos mit dem Gedanken, die Periodendauer zu messen und
>darüber Phasenverschiebungen und Zündwinkel permanent nachzujustieren.

Wozu? Die Netzfrequenz schankt nur im Promillebereich, das kann man in 
den Skat drücken. Und wenn jemand an nen 1kW Generator 2KW Lampen hängt 
und damit die Frequenz jenseits von Gut und Böse liegt ist das einfach 
Pech.

MFG
Falk

Autor: Henne (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Falk:

Na ja - gegen Ende meiner Schulzeit hatten wir mal eine größere Feier in 
einem Gewächshaus, das über zwei Gasturbinen versorgt wurde.
Man konnte hören, wie die Drehzahlen passend zu den Bässen der PA 
schwankten und die Spannungen um >20V einbrachen. Ich befürchte, dass 
Generatoren grundsätzlich mit der Nennleistung klarkommen aber mit 
Lastwechseln Probleme haben.

Die Frequenzabweichungen im normalen Netz werde ich mir mal morgen auf 
ein LCD ausgeben lassen. Ich habe sie kurzzeitig als deutlich größer in 
Erinnerung.

Autor: oszi40 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Frequenzabweichungen im "normalen Netz" sehe ich nicht so groß, eher 
fallen auf dem Oszi die versauten Sinuswellen durch Schaltnetzteile, 
Tyristoren usw. auf. Wenn diese verkrüppelten Sinuswellen dann 
ausgewertet werden, könnten schon merkliche Differenzen auftreten zum 
Idealfall!

Autor: Marvin M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Och, da gibt es noch viel schönere Sachen.
Ich habe derzeit Standard-Dimmer am Laufen (Bausatz von Conrad), die 
immer zu gewissen Zeiten flackern, aber nicht wenig. Man hat manchmal 
den Eindruck, dass nicht nur eine Halbwelle fehlt, so extrem ist das. 
Richtig extrem wird es gegen 22:00 Uhr, danach ist wieder Ruhe. Meine 
Vermutung sind Rundsteuersendungen, allerdings blieb meine Anfrage beim 
örtlichen Energieversorger ohne Erfolg... Deshalb hatte ich irgendwann 
(wenn ich mal Zeit habe, also nie fg) mal vor, einen Dimmer mit einem 
AVR zu basteln, der derartige Störungen rausrechnet 
(plausibilitätskontrolle des Nulldurchgangs, Fehlerkorrektur durch 
Berechnung des Zündpunkts aus den vorhergehenden)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.