Forum: Mikrocontroller und Digitale Elektronik 230V Dimmer / timer in C


von Tom (Gast)


Lesenswert?

Hallo Zusammen,

Nachdem ich die Hardwareseite nunmehr verstanden habe, mache ich mich 
jetzt an die Programmierung meines 230V Dimmers.  Dazu habe ich ein paar 
grundsätzliche Fragen:

Die Nulldurchgangserkennung liefert mir am Controller für jede Halbwelle 
einen Interrupt. Dieser Interrupt kommt alle 20ms (50Hz Halbwelle).
Der Interrupt startet einen  8Bit-Timer, der jedesmal von 0-255 
hochzählt.Bei einem Systemtakt von 8Mhz (8Mio Takte pro Sekunde), 
benötigt der controller für das Zählen 0,032ms. Oder anders gesagt, es 
wird in 1 Sekunde 31.250 mal bis 255 gezählt. Bei jedem Überlauf wird 
ein Zähler bis 255 erhöht über den den ich dann die Zündzeiten des 
Triacs und damit meine Helligkeitswerte steuer. Für die Aufgabe, den 
Zähler zu erhöhen, benötigt der controller dann also (0,032ms *256) 
8,192ms.

Wie passt das denn mit den 20ms des Interrupts zusammen ? Bin da gerade 
etwas hilflos.

Danke schon einmal im Voraus
Tom

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Tom schrieb:
> Dieser Interrupt kommt alle 20ms (50Hz Halbwelle).
Du hast 100 Nulldurchgänge pro Sekunde. Zeichne dir das einfach mal 
auf...

> .Bei einem Systemtakt von 8Mhz (8Mio Takte pro Sekunde), benötigt der
> controller für das Zählen 0,032ms.
Mach doch einfach einen Vorteiler rein, damit der nicht so brachial 
schnell hochzählt.

: Bearbeitet durch Moderator
von Tom (Gast)


Lesenswert?

Lothar M. schrieb:
> Mach doch einfach einen Vorteiler rein, damit der nicht so brachial
> schnell hochzählt.

Aber auch dann bin ich doch viel zu schnell vor der nächsten Halbwelle 
fertig. Ist das nicht ein Problem ?

von Stefan S. (chiefeinherjar)


Lesenswert?

Tom schrieb:
> Lothar M. schrieb:
>> Mach doch einfach einen Vorteiler rein, damit der nicht so brachial
>> schnell hochzählt.
>
> Aber auch dann bin ich doch viel zu schnell vor der nächsten Halbwelle
> fertig. Ist das nicht ein Problem ?

Da du uns nicht verraten hast, mit welchem uC du arbeitest können wir 
auch keine genauen Tipps geben.
Viele Atmel-Chips (gerade die Atmega-Reihe) hat auch einen 16-Bit Timer.

Ansonsten kannst du einfach in der Interrupt-Routine des Overflows eine 
Variable hochzählen lassen. Schon hast du QUASI einen 16 Bit Timer.

Du weißt, dass er XXX ms braucht, für einen Overflow. Dann kannst du ihn 
YYY Mal in einen Overflow laufen lassen und erst dann etwas veranlassen.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Tom schrieb:
> Aber auch dann bin ich doch viel zu schnell vor der nächsten Halbwelle
> fertig. Ist das nicht ein Problem ?
Ja, dann musst du halt noch langsamer zählen. So langsam eben, dass du 
nicht "zu schnell fertig" wirst. Ist das ein Problem? Nein, das ist 
nur eine kleine Denkblockade.

Du musst doch einfach nur dafür sorgen, dass dein Zähler die 10ms 
druchzählen kann und du z.B. 3ms von 5ms und 5ms von 8ms unterscheiden 
kannst. Wenn du das kannst, dann kannst du auch zum /passenden 
Zeitpunkt/ den Strom einschalten...

Ein Tipp: es muss nicht immer alles genau auf 99 oder 255 aufgehen. Denn 
der uC ist ein Rechner. Er kann tadellos irgendwelche "krummen" Werte 
passend zurechtrechnen.

BTW, ich würde es übrigens eher so machen:
1. Interrupt vom Nulldurchgang
   --> Timer wird mit Verzögerungszeit geladen
   --> Timer wird gestartet
2. Interrupt vom Timer
   --> Strom wird eingeschaltet
Dann musst du nur den "gewünschten "Helligkeitswert" in die passende 
"Verzögerungszeit" umrechen und fertig. Und wie gesagt: rechnen kann der 
µC gut...

: Bearbeitet durch Moderator
von MaWin (Gast)


Lesenswert?

Tom schrieb:
> Die Nulldurchgangserkennung liefert mir am Controller für jede Halbwelle
> einen Interrupt.

Wirklich ? Hast du Störungen in der Netzspannung bedacht (bzw. filtert 
die deine Schaltung die aus ?)
Je nach Oberwellenanteil können aus 100 Nulldurchgängeh pro Sekunde auch 
mal 1000 werden.
Daher ist die Plausibilitätskontrolle das wichtigste, ´bessere Schaltung 
lassen digital eine PLL nahclaufen. Und es gibt kaum perfekt ohm'sche 
Lasten, also gibt es eine Phasenverschiebung zwischen Strom und 
Spannung. Ein exakt 5ms nach dem Spannugsnulldurchgang gezündeter TRIAC 
geht nicht exakt 5ms später wieder aus, sondern erst beim nächsten 
Stromnulldurchgang.

von Tom (Gast)


Lesenswert?

MaWin schrieb:
> Wirklich ? Hast du Störungen in der Netzspannung bedacht (bzw. filtert
> die deine Schaltung die aus ?)
> Je nach Oberwellenanteil können aus 100 Nulldurchgängeh pro Sekunde auch
> mal 1000 werden.
> Daher ist die Plausibilitätskontrolle das wichtigste, ´bessere Schaltung
> lassen digital eine PLL nahclaufen. Und es gibt kaum perfekt ohm'sche
> Lasten, also gibt es eine Phasenverschiebung zwischen Strom und
> Spannung. Ein exakt 5ms nach dem Spannugsnulldurchgang gezündeter TRIAC
> geht nicht exakt 5ms später wieder aus, sondern erst beim nächsten
> Stromnulldurchgang.

Ich bin mir nicht sicher, ob das wirklich alles so wichtig für einen 
Dimmer ist, der lediglich ein paar Spots im heimischen Kino auf 
Knopfdruck heller und dunkler machen soll ?

Aber auch damit werde ich mich vorher beschäftigen. Das fertige 
"Produkt" werde ich hier vorstellen und zur Diskussion stellen.

Lothar M. schrieb:
> BTW, ich würde es übrigens eher so machen:
> 1. Interrupt vom Nulldurchgang
>    --> Timer wird mit Verzögerungszeit geladen

warum die Verzögerung ?

von Thomas E. (thomase)


Lesenswert?

Tom schrieb:
> warum die Verzögerung ?

Der Timer wird nicht mit Verzögerung geladen, sondern die 
Verzögerungszeit kommt in den Timer.

von Spannungsteiler (Gast)


Lesenswert?


von MaWin (Gast)


Lesenswert?

Spannungsteiler schrieb:
> Etwas Lesenswertes über das Thema findet man hier;
> und
> :-)

Na ja, nicht wirklich: In beiden Fällen MOC3020 bzw. MOC3021 für 230V 
Netze statt MOC5051 ist hochkriminell, ohne 250V~ VDR (der seierseits 
mit Thermosicherung geschützt werden soll) und Feinsicherung (gegen 
Kurzschlüsse durchbrennende Glühbirnen die den TRIAC töten würden) sind 
das höchstens Prinzipschaltungen, wie auch der Aufbau im Steckbrett 
"abenteuerlich" ist.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

MaWin schrieb:
> statt MOC5051

Du meinst vermutlich MOC3051-3053. 600V Typen sollten es auf jeden Fall 
sein.

In meinem Tiny_Lighthouse Projekt benutze ich den Tiny 13 im Tiny15 
Modus und teile die 1,6MHz Taktfrequenz per Vorteiler durch 64. Heraus 
kommt eine Rate von 97Hz und ist damit genau richtig.

: Bearbeitet durch User
von MaWin (Gast)


Lesenswert?

Matthias S. schrieb:
> Du meinst vermutlich MOC3051-3053.

Ja, Tippfehler.

> 600V Typen sollten es auf jeden Fall sein.

Richtig, weil ein 250V~ VDR ja auch erst auf 595V begrenzt.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Thomas E. schrieb:
> Tom schrieb:
>> warum die Verzögerung ?
> Der Timer wird nicht mit Verzögerung geladen, sondern die
> Verzögerungszeit kommt in den Timer.
Der Timer sorgt auf irgendeine Art und Weise dafür, dass eine 
bestimmte Zeit gewartet wird. Nach Ablauf dieser Verzögerungsziet löst 
er einen Interrupt aus.

Tom schrieb:
> warum die Verzögerung ?
Die Verzögerung sorgt dafür, das der erste Teil der Halbwelle 
abgeshcnitten wird. Wenn die Verzögerung 10ms ist, dann ist die Lampe 
dunkel. Wenn die Verzögerung 0ms ist, dann leuchtet die Lampe mit 
maximaler Leistung...

MaWin schrieb:
> Na ja, nicht wirklich: In beiden Fällen MOC3020 bzw. MOC3021 für 230V
> Netze statt MOC5051 ist hochkriminell
Warum denn? Schlimmstenfalls leuchtet die Lampe irgendwann dauernd...

: Bearbeitet durch Moderator
von Tom (Gast)


Lesenswert?

Lothar M. schrieb:

> Du musst doch einfach nur dafür sorgen, dass dein Zähler die 10ms
> druchzählen kann

Das würde ich doch hinbekommen, wenn ich bei meinem 8bit Timer, einer 
Frequenz von 8Mhz, und einem prescale von 1.024 jeweils nur von 177-255 
zählen lassen , oder ? (100Hz , 10ms)

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Tom schrieb:
> Das würde ich doch hinbekommen, wenn ich bei meinem 8bit Timer, einer
> Frequenz von 8Mhz, und einem prescale von 1.024 jeweils nur von 177-255
> zählen lassen , oder ? (100Hz , 10ms)
Abgesehen vom Grenzfall "sofort einschalten" (wo man den Timer gar nicht 
laden, sondern sofort den Thristor sofort zünden muss) stimmen deine 
Überlegungen: ein Wert von 255 läuft sofort über und schaltet bei 
nächster Gelegenheit den Strom ein. Ein Wert von 178 schaltet erst kurz 
vor dem nächsten Nulldurchgang den Strom ein.

> lassen , oder ? (100Hz , 10ms)
Bitte nicht Plenken. Das gibt so hässliche Umbrüche auf dem Handy...

von Thomas E. (thomase)


Lesenswert?

Tom schrieb:
> Das würde ich doch hinbekommen, wenn ich bei meinem 8bit Timer, einer
> Frequenz von 8Mhz, und einem prescale von 1.024 jeweils nur von 177-255
> zählen lassen , oder ? (100Hz , 10ms)

Dann hast du einen Timer, der alle 10ms einen Interrupt auslöst. Das 
nützt dir aber gar nichts. Du brauchst eine Funktion, die mit Hilfe des 
Timers deine Lampen nach einer einstellbaren Verzögerungszeit 
einschaltet. Diese Zeit liegt zwischen 0 und 10ms.

Was hast du für einen Controller? Da solltest du nicht länger ein 
Geheimnis draus machen, wenn du heute noch damit klarkommen möchtest.

von MaWin (Gast)


Lesenswert?

Lothar M. schrieb:
> Das gibt so hässliche Umbrüche auf dem Handy...

Du meinst, der Mensch soll sich dumm geschriebenen Computerprogrammen 
unterordnen ?

von Tom (Gast)


Lesenswert?

Thomas E. schrieb:
> Dann hast du einen Timer, der alle 10ms einen Interrupt auslöst

Ja genau, dass wollte ich auch. Jetzt geht es weiter.

Thomas E. schrieb:
> Was hast du für einen Controller?

Controller ist ein Mega8.

von Bernd (Gast)


Lesenswert?

Hallo,
meiner Erfahrung nach ist es besser im Stromnulldurchgang die Last 
einschalten, aber ich muss auch eine Trafowechsel-Spannung in Reihe mit 
einem MP Kondensator vor dem Brückengleichrichter einschalten. Da tritt 
das eben so auf, seitdem sind die Störungen in der Schaltung weg !
Bernd

von Thomas E. (thomase)


Lesenswert?

Tom schrieb:
> Ja genau, dass wollte ich auch. Jetzt geht es weiter.

Ja, aber was willst du damit? 10ms liefert dir auch die 
Nulldurchgangserkennung. Sogar noch präziser als der Controller mit 
seinem RC-Oszillator.

Tom schrieb:
> Controller ist ein Mega8.

Und du verwendest natürlich Timer 0. Womit sind denn Timer 1 und 2 
beschäftigt?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

MaWin schrieb:
> Du meinst, der Mensch soll sich dumm geschriebenen Computerprogrammen
> unterordnen ?
Das Problem ist nicht das "dumme" Computerprogramm...
Es ist eben einfach so festgelegt, dass in der deutschen Sprache kein 
Leerzeichen zwischen Satzende und Interpunktion ist.
Mit einem solchen Satz käme jedes dumme Computerprogramm tadellos 
zurecht
!
Ein Interpunktionszeichen hat m.E. für sich keine eigene Zeile verdient
!

Thomas E. schrieb:
> Dann hast du einen Timer, der alle 10ms einen Interrupt auslöst. Das
> nützt dir aber gar nichts. Du brauchst eine Funktion, die mit Hilfe des
> Timers deine Lampen nach einer einstellbaren Verzögerungszeit
> einschaltet. Diese Zeit liegt zwischen 0 und 10ms.
Ich meinte ja, dass abhängig von diesem Zählerwert der Interrupt sofort, 
nach z.B. 0,1ms, oder auch nach 2,5ms, oder nach 7,3ms oder nach 9,9ms 
kommt und dann den Strom einschaltet. Damit wäre dann die Phase 
entsprechend "angeschnitten" und die Leistung einstellbar.

von MaWin (Gast)


Lesenswert?

Lothar M. schrieb:
> Es ist eben einfach so festgelegt, dass in der deutschen Sprache kein
> Leerzeichen zwischen Satzende und Interpunktion ist.

Welche engstirnige Weltsicht, typisch Programmierer (kennen nur 1% der 
Welt, glauben aber alles zu wissen). Andere Sprachen sehen das anders. 
Und manche deutschsprechende auch.

http://www.bb3regio.com/Interpunktion_F_ponctuation_D.php

von Thomas E. (thomase)


Lesenswert?

Lothar M. schrieb:
> Ich meinte ja, dass abhängig von diesem Zählerwert der Interrupt sofort,
> nach z.B. 0,1ms, oder auch nach 2,5ms, oder nach 7,3ms oder nach 9,9ms
> kommt und dann den Strom einschaltet. Damit wäre dann die Phase
> entsprechend "angeschnitten" und die Leistung einstellbar.

Daß du weißt, wie man das macht, ist klar. Ich habe allerdings das 
Gefühl, daß unser TO noch einen Denkknoten zu lösen hat.

MaWin schrieb:
> Welche engstirnige Weltsicht, typisch Programmierer (kennen nur 1% der
> Welt, glauben aber alles zu wissen). Andere Sprachen sehen das anders.
> Und manche deutschsprechende auch.

Es gibt auch Leute, die das lesen müssen. Das ist einfach eine Frage der 
Höflichkeit. Außerdem heißt es 'Welch engstirnige...' und was sind 
deutschsprechende Sprachen?

: Bearbeitet durch User
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

MaWin schrieb:
> Andere Sprachen sehen das anders.
Mag sein. Andere Länder schreiben sogar mit vollkommen anderen 
Schriftzeichen in ungewohnte Richtungen. Aber auch in diesen Ländern 
gibt es Regeln, wie dort mit Leerzeichen umzugehen ist. Ein paar davon 
hast du ja freundlicherweise verlinkt.

MaWin schrieb:
> Andere Sprachen sehen das anders.
Ich toleriere ohne jegliches Murren ein "ich habe das Licht 
eingeschalten" von einem Österreicher...  ;-)

von MaWin (Gast)


Lesenswert?

Thomas E. schrieb:
> Es gibt auch Leute, die das lesen müssen.

Du meinst, Franzosen haben eine andere Schrift, und haben daher weniger 
Abstand zwischen Text und Fragezeichen/Ausrufungszeichen ?

Ja, hatten sie mal, in den deutschen Bleilettern war das Fragezeichen 
mit mehr A-Width versehen.

Aber seit Computern verwenden wir alle dieselben Schriften, und in denen 
hat das Fagezeichzeneben kaum einen Abstand zu Text, passend für 
spanische Schrift.

Nur Dumme haben nicht begriffen, daß historische Gepflogenheiten, in 
Deutschland kein Leerzeichen zwischen Text und diese Satzzeichen zu 
setzen und in Frankreich sehr wohl (aber nicht bei Punkt und Komma) 
etwas mit unterschiedlichen Bleilettern im Drucksatz zu tun hatten.

Heute, wo alle einen einheitlichen Zeichensatz verwenden, sieht es 
einfach Scheisse aus und ist schlecht lesbar, wenn Fragezeichen und 
Ausrufungszeichen direkt hinter dem letztenBuchstanben stehen.

Aber Computerdeppen haben eben kein Auge, sondern kennen nur veraltete 
Regeln. Nein, nicht mal die kennen sie, denn vor Satzzeichen auf eine 
neue Zeile umzubrechen ohne das Wort mitzunehmen ist immer falsch. Die 
Programmierer versuchen einfach jede Ausrede um ihre grenzenlose 
Faulheit zu kaschieren.

von Thomas E. (thomase)


Lesenswert?

MaWin schrieb:
> Heute, wo alle einen einheitlichen Zeichensatz verwenden, sieht es
> einfach Scheisse aus und ist schlecht lesbar, wenn Fragezeichen und
> Ausrufungszeichen direkt hinter dem letztenBuchstanben stehen.

Reg dich ab, sonst kriegst du noch einen Herzinfarkt.

Nach deinem Rundumschlag gegen die Computerdeppen, kann ich dir nur 
sagen, daß, wenn deine Augen so sehen, wie deine Wurstfinger, die ja nun 
mal hin und wieder zwei nebeneinanderliegende Tasten drücken 
(Buchstanben), schreiben, du es vielleicht einmal mit einer Brille 
versuchen solltest. Denn bei der Bewertung, ob etwas gut oder schlecht 
aussieht, gehen die Meinungen doch häufig auseinander und die Scheiße 
liegt genauso häufig einfach im Auge des Betrachters.

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