Hallo, hier habe ich schon einen Hinweis bekommen wie ich einen TRIAC
als Phasenanschnittsdimmer nutzen kann. Ausgangsfrage war ob schon
jemand Erfahrungen mit "Triac Phase Control"-Bausteinen gesamemlt hat:
Matthias Lipinsky schrieb:> Du hast den falschen Ansatz.>> Die Nulldurchgangserkennung kommt an ICP. Jetzt kannst du per> durchlaufendem Timer die Zeit zwischen zwei ICP-Interrupts messen und> als 100% ansehen. Weiterhin rechnest du deine Verzögerung (bzgl. des> gewüunschten Dimmwertes) in Timertakten aus und schreibst das in das OCR> Register. Dessen Interrupt setzt dann den Triac, welcher durch den> ICP-Int zurückgenommen wird. So entsteht eine PWM, die synchron zum Netz> ist.>> Optional kannst du beim ICP-Int auch den Timerwert auf Null setzen.
Wenn ich das richtig verstanden habe würde man das ungefähr so bauen:
/*Alternativ könnte man doch vielleicht auch den TRIAC-Anschluss nicht erst mit der INT0-ISR löschen sondern den Ausgang schon ein paar
16
Millieskunden nach dem Setzen wieder ausmachen, der TRIAC läuft doch, nachdem er gezündet wurde, bis zum nächsten Nulldurchgang weiter, oder?*/
17
18
ISR(TIMER1_COMPA_vect)
19
{
20
TRIAC_PORT|=(1<<TRIAC_PIN);//TRIAC an
21
TIMSK&=~(1<<OCIE1A);//Compare Interrupt aus
22
}
Kommt das so ungefähr hin?
Dann wäre die nächste Frage wie ich das am geschicktesten umsetze, wenn
ich TCNT1, OCRIA und ISR(TIMER1_COMPA_vect) derzeit benutze um
Millisekunden zu zählen.
Ich möchte vermutlich vom ATMega8 auf einen ATMega16 wechseln, da könnte
ich dann auch gleich einen ATMega162 nehmen. Wenn ich das richtig
gelesen habe hat der 2 vollständig unabhängige 16 Bit Timer mit CTC usw.
Liest sich das als wäre es halbwegs sinnvoll oder kann man das auch
bequem mit nur einem Timer machen?
So, mal wieder zuhause gewesen und den µC gestreichelt.
Es scheint so als würde es tun was es soll, aber entspricht es dem
Vorschalg von Matthias Lipinsky oder habe ich das falsch verstanden und
mache es mir viel zu kompliziert?
/edit: die LED flackert noch, da scheint irgendwas nicht zu stimmen: Ich
gebe Spannung auf ICP, die LED geht kurz aus, kurz wieder an und dann
wieder aus, bevor sie wieder dauerhaft an geht.
Aber warum externer Pin?
Nimm den internen Takt. DU willst 20ms überbrücken. Also muss das Zählen
bis 2^16 mindestens 20ms dauern, sonst passt die Rechnung nicht
=> 2^16/20ms = 3,2...MHz
Also den Voreiler so einstellen, dass die Timer-Freq kleiner ist.
Welchen Quartz nimmst du?
Matthias Lipinsky schrieb:> Warum tust du in den zwei ISRs die Timer stoppen und die IRQs neu> konfigurieren? Das reicht doch einmal aus. TImer durchlaufen lassen...>>
> das würe kürzer zu schreiben und übersichtlicher:>
1
>TCCR1B|=((7<<CS10);
2
>
>> Aber warum externer Pin?>> Nimm den internen Takt. DU willst 20ms überbrücken. Also muss das Zählen> bis 2^16 mindestens 20ms dauern, sonst passt die Rechnung nicht> => 2^16/20ms = 3,2...MHz>> Also den Voreiler so einstellen, dass die Timer-Freq kleiner ist.>> Welchen Quartz nimmst du?
Hallo,
erstmal viel Dank für die Antwort.
Ich baue gerade zum ersten Mal selbst etwas mit den Timern. Bisher habe
ich die Einstellungen nur aus Vorlagen übernommen:
- jede Millisekunde eine ISR aufzurufen (DCF-77)
und
- PWM in Software (Soft-PWM-Artikel)
Über den Eingang soll der Nulldurchgang des Netz-Sinus ermittelt werden.
Da ich nicht weiß wie lang der µC und die Netzspannung synchron laufen,
mache ich die Interrupts in diesem ersten Versuch immer wieder aus, so
dass der TRIAC (oder hier: die LED) nur an geht, wenn ein Nulldurchgang
detektiert wurde. Das ist also quasi als "Sicherheitsmaßnahme" gedacht,
auch wenn die hier ja nicht viel bringt: solang kein neuer Nulldurchgang
detektiert wird bleibt der TRIAC ja einfach an, tut also genau das
Gegenteil von dem was später passieren soll, das müsste ich natürlich
noch ändern.
>> /*Alternativ könnte man doch vielleicht auch den TRIAC-Anschluss>> nicht erst mit der INT0-ISR [Hier meinte ich wohl ICP] löschen sondern den
Ausgang schon ein
>> paar Millieskunden nach dem Setzen wieder ausmachen, der TRIAC>> läuft doch, nachdem er gezündet wurde, bis zum nächsten Nulldurchgang>> weiter, oder?*/
Bei diesem Test läuft der µC mit der internen Taktquelle auf 1 MHz, in
der geplanten Anwendung wird das Gerät an einem 8 MHz, oder, wenn es
dann noch schnell genug für 1-wire und anderes ist, an einem 4 MHz
Quarzoszillator laufen.
Wenn ich deine Erläuterungen jetzt richtig verstanden habe schlägst du
vor, dass der Timer mit der gleichen Periodendauer läuft wie die
Netzspannung (oder vielleicht mit der halben wenn ich beide Halbwellen
nutzen möchte) und das möglichst ohne Phasenverschiebung.
Der Timer läuft dann bis zu seinem entsprechend gesetzten Maximum hoch,
irgedwo auf dem Weg "matcht" er den eingestellten Wert, macht den TRIAC
an aber "cleart" den Timer noch nicht, sondern lässt ihn einfach
überlaufen.
Das "Abschalten" des TRIACs mache ich dann wenn ich per ICP wieder einen
Nulldurchgang sehe.
Das hört sich jetzt erstmal nicht so schlecht an, aber da das Gerät 24/7
laufen soll möchte ich zumindest ab und zu mal sicherstellen dass die
Netzspannung und der Timer noch synchron laufen.
Andi M. schrieb:> und mache es mir viel zu kompliziert?
Ich würde sagen: ja
Lass doch den Timer durchlaufen. Wozu willst du denn den immer wieder
Stoppen?
Wenn du den Timer so einstellst, dass er für einmal durchzählen von 0
bis 65535 länger als die bewussten 20ms braucht, dann kann es dir nicht
passieren, dass der Timer überläuft.
Die Synchronisierung mit den Nulldurchgängen macht dir der ICP
Interrupt. Sobald der den 0-Durchgang erkennt, setzt du den Timer auf 0
zurück.
-> der Timer zählt laufend von 0 bis zu einer Zahl. Die Zahl ist also
ein Mass für den zeitlichen Abstand zwischen 2 0-Durchgängen.
Soweit so gut.
Wenn du den Triac gleichzeitig im ICP Interrupt einschaltest, dann
beginnt hier der Ausgangssstrom zu laufen. Die Frage ist daher: Wann
muss der TRIAC wieder abgeschaltet werden?
ABgeschaltet werden muss er zu irgendeinem Zeitpunkt zwischen 0 (oder
einer Zahl etwas größer als 0) und der Zahl, die du für die Zeit
zwischen 2 0-Durchgängen festgestellt hast. Für die ersten Versuche
würde ich die sogar als konstant annahmen und rechnerisch ermitteln. Wir
wissen ja, dass das 20ms sind.
d.h. du hast
im ICP Interrupt
TRIAC einschalten
Timer auf 0 setzen
im Compare Match Interrupt
TRIAC abschalten
Und im Prinzip brauchst du auch nicht mehr. Mit dem ICP Interrupt
beginnt die 'Phase' und im Compare Match wird er wieder abgeschaltet.
Dadurch dass der ICP den Timer-Wert wieder auf 0 setzt, synchronisiert
sich das ganz von alleine.
Und wenn die Netzspannung ausbleibt, gibt es auch keine 0-Durchgänge
mehr und der TRIAC wird auch nie gezündet.
Der Rest ist dann nur noch berechnen, bei welchem Zählerstand (und damit
bei welcher Zeit nach dem Einschalten des Triacs) der Triac wieder
ausgeschaltet werden soll, wenn die Phase zu x Prozent angeschnitten
werden soll.
@Karl Heinz Buchegger (kbuchegg) (Moderator)
Erwischt ;-)
Triac abschalten ist nicht unmöglich, aber schwierig ;-)
>Andi M. (rootsquash)
Als erstes rate ich dir, den Quartz einzusetzen, den du später nutzen
willst. Somit schaffst du klare Vorraussetzungen für später.
Ob du den Timer im ICP nullst oder nicht, spielt keine Rolle. Der
einzige Unterschied wäre das Setzen des OCR wertes:
1
ISR(ICP)
2
{
3
TCNT=0
4
OCR=100// die 100 ist symbolisch für die Verzögerung
5
Triacaus
6
}
7
ISR(OCP)
8
{
9
Triacein
10
}
11
ISR(OVP)
12
{
13
// Netzausfall
14
}
oder
1
ISR(ICP)
2
{
3
OCR=TCNT+100// die 100 ist symbolisch für die Verzögerung
4
Triacaus
5
}
6
ISR(OCP)
7
{
8
Triacein
9
}
Wie gesagt, entscheidend ist die richtige Geschwindigkeit des Timers.
Das habe ich oben schon mathematisch beschrieben. Bei 8MHz QUartz bietet
sich ein Vorteiler durch acht an. Das ergibt 1MHz. Somit läuft der Timer
65,.. ms bis zum Überlauf
Karl Heinz Buchegger schrieb:> Andi M. schrieb:>>> und mache es mir viel zu kompliziert?>> Ich würde sagen: ja>> Lass doch den Timer durchlaufen. Wozu willst du denn den immer wieder> Stoppen?> Wenn du den Timer so einstellst, dass er für einmal durchzählen von 0> bis 65535 länger als die bewussten 20ms braucht, dann kann es dir nicht> passieren, dass der Timer überläuft.>> Die Synchronisierung mit den Nulldurchgängen macht dir der ICP> Interrupt. Sobald der den 0-Durchgang erkennt, setzt du den Timer auf 0> zurück.>> -> der Timer zählt laufend von 0 bis zu einer Zahl. Die Zahl ist also> ein Mass für den zeitlichen Abstand zwischen 2 0-Durchgängen.>> Soweit so gut.>> Wenn du den Triac gleichzeitig im ICP Interrupt einschaltest, dann> beginnt hier der Ausgangssstrom zu laufen. Die Frage ist daher: Wann> muss der TRIAC wieder abgeschaltet werden?>
Das sieht nach einer Phasen- ab -schinttsteuerung aus.
Das ist technisch weniger trivial, da TRIACs IIRC eigentlich "an"
bleiben wenn sie erstmal gezündet sind, bis die Netzspannung einen
Nulldurchgang macht, dabei "löscht" sich der TRIAC dann selbst.
Was ich hier noch garnicht geschrieben habe: Der Dimmer ist für eine
Heizung gedacht (Heizkabel, Heizmatte oder Heizstrahler, das ist noch
nicht raus) und somit für eher induktive Lasten, da ist eine Phasen-
an -schnittsteuerung die freundlichere Variante.
> ABgeschaltet werden muss er zu irgendeinem Zeitpunkt zwischen 0 (oder> einer Zahl etwas größer als 0) und der Zahl, die du für die Zeit> zwischen 2 0-Durchgängen festgestellt hast. Für die ersten Versuche> würde ich die sogar als konstant annahmen und rechnerisch ermitteln. Wir> wissen ja, dass das 20ms sind.>> d.h. du hast>> im ICP Interrupt> TRIAC einschalten> Timer auf 0 setzen>> im Compare Match Interrupt> TRIAC abschalten>>> Und im Prinzip brauchst du auch nicht mehr. Mit dem ICP Interrupt> beginnt die 'Phase' und im Compare Match wird er wieder abgeschaltet.> Dadurch dass der ICP den Timer-Wert wieder auf 0 setzt, synchronisiert> sich das ganz von alleine.>> Und wenn die Netzspannung ausbleibt, gibt es auch keine 0-Durchgänge> mehr und der TRIAC wird auch nie gezündet.>>> Der Rest ist dann nur noch berechnen, bei welchem Zählerstand (und damit> bei welcher Zeit nach dem Einschalten des Triacs) der Triac wieder> ausgeschaltet werden soll, wenn die Phase zu x Prozent angeschnitten> werden soll.Matthias Lipinsky schrieb:> @Karl Heinz Buchegger (kbuchegg) (Moderator)>> Erwischt ;-)>>>>>
Den Timer durchlaufen lassen und nur auf Null zu setzen oder den
Vergleichswert anpassen hört sich nicht so schlecht an, das werde ich
mir dann mal angucken wenn ich wieder zuhaus bin, also frühestens
Donnerstag abend.
Dann vielleicht auch mit Oszilloskop und Wechselspannung.
>Der Dimmer ist für eine Heizung gedacht
Möööp.
Für Heizungen oder andere sehr träge Verbraucher ist zwingend eine
Wellenpaketsteuerung einzusetzen.
Das ist noch einfacher. Da brauchst du nur den (pos.) Nulldurchgang und
schaltest in diesem Zu und irgendwann Ab. Das Verhältnis gibt die
(Heiz)Leistung an.
Also 100Nulldurchgänge Ein und 100Nulldurchgänge aus, macht 50%
Mh, das verwundert mich. Ist das ständige Erwärmen und Abkühlen nicht
eher schädlich?
Wenn es um die Leistung geht: Es geht nicht darum einen ganzen Raum zu
heizen, sondern nur um einen Glaskasten mit ein paar hundert Litern
Luft. "Terrarium" soll ich hier ja nicht mehr schreiben ;-)
/e: Man könnte natürlich recht kurze Wellenpakete nehmen, dann fällt das
nicht mehr so auf. Diese Lösung wäre natürlich schön einfach und liesse
sich vermutlich auch ohne große Änderungen in das bestehende Projekt
einbauen.
Trotzdem: Geht es nur um die zu regelnde Leistung oder gibt es noch
andere Gründe warum man keine Phasenanschnittsteuerung nehmen "darf"?
Phasenschnitt ist schlecht für das Netz. Das erzeugt jede Menge
Oberschwingungen. Und wird von den Energieversorgern nur geduldet, da
Wellenpaketsteuerung bei Glühlampen zum Flackern führt. Bei Heizungen
aber nicht. Und auch deine Luft ist träge genug, damit die nicht
erkennt, dass die Heizung 5Sek an und 5sek aus ist. SIe denkt, die läuft
mit 50%
Matthias Lipinsky schrieb:> Phasenschnitt ist schlecht für das Netz. Das erzeugt jede Menge> Oberschwingungen. Und wird von den Energieversorgern nur geduldet, da> Wellenpaketsteuerung bei Glühlampen zum Flackern führt. Bei Heizungen> aber nicht. Und auch deine Luft ist träge genug, damit die nicht> erkennt, dass die Heizung 5Sek an und 5sek aus ist. SIe denkt, die läuft> mit 50%
Mh, Heizkabel und Heizmatten geben ihre Wärme ja vermutlich primär über
Wärmeleitung ab, da ist häufiges An- und Abschalten vermutlich kein
großes Problem.
Bei diesen Keramik-Heizstrahlern bin ich mir nicht sicher wie groß die
Zeitkonstante ist, da würde ich dann vermutlich nicht alle paar Sekunden
schalten sondern "PWM" mit einer Periodendauer <= 1 s.
Mh, den Dimmer kriege ich also hin, das sollte jetzt nicht mehr so
kompliziert sein, vielen Dank für die Hilfe! :)
Jetzt fehlt noch der Regel-Algorithmus.
Und die Termperaturen die meine DS18S20 zeigen scheinen mir zu hoch zu
sein, 25°C Raumtemperatur die sich nicht so anfühlen, während der Typ K
am MM 22°C oder so anzeigt.
Matthias Lipinsky schrieb:>>Jetzt fehlt noch der Regel-Algorithmus.>> Ja, dazu brauchst Du erstmal eine (mathematische) Beschreibung der> Regelstrecke
Für eine Raumheizung?
Mehr als 5 grad zu kalt: volle Pulle
weniger als 5 Grad zu kalt: halbe Kraft
zu warm: aus
:-)
Mh, ein klein wenig mehr Aufwand darf es schon sein.
Das Programm ist jetzt etwas mehr als 7 kB groß. Da ich (schon allein
aufgrund der wesentlich hübscheren Pin-Anordornung) auf einen ATMega16
übersiedeln werde, ist da noch genug Platz ;-)
Ich weiß nicht wie sehr sich das kleine Krabbeltier daran stört, aber
eine nicht allzu schnell schwankende Lufttemperatur ist bei
wechselwarmen Tieren vermutlich eher positiv als negativ zu sehen.
Andi M. schrieb:> Ich weiß nicht wie sehr sich das kleine Krabbeltier daran stört, aber> eine nicht allzu schnell schwankende Lufttemperatur ist bei> wechselwarmen Tieren vermutlich eher positiv als negativ zu sehen.
Du hast bei Heizungen, ausser im gut isolierten kleinen Schuhkarton,
sowieso nie eine homogene Temperaturverteilung im beheizten Luftvolumen.
Das Ansinnen auf 1° genau zu regeln scheitert schon alleine daran, das
es davon abhängt wo genau man im Volumen misst. Bei 10 Messstationen
kriegt man 10 unterschiedliche Werte.
Was machen denn die lieben Kleinen draussen in der Natur, wenn es in der
Nacht ein paar Grad kälter wird oder sich Wolken vor die Sonne schieben?
Natürlich wird es einen Temperaturgradienten geben und natürlich
schwankt die Temperatur in der Natur, ich möchte nur keinen harmonisch
schwingenden Wärmestrahler, die Tierchen sind ja nicht sonderlich
intelligent und assoziieren eigentlich auch Wärme mit Licht. Ausserdem
könnte ich eine halbwegs exakte Temperaturregelung vielleicht auch
Wiederverwenden, z.B. falls es mal Eier auszubrüten gibt.
Und es macht natürlich emrh Spaß eine "ordentliche" Regelung zu bauen
als so ein 3-Stufen-Ding. Da hat man nachher doch das Gefühl geschlampt
zu haben.