Hallo Experten,
angenommen ich habe ein Nullspannungsdedektion für einen µC realisiert.
(Möchte einen Dimmer bauen...)
Wie gehe ich jetzt programmiertechnisch damit um?
evtl. so?:
if (pinZeroDetection == HIGH AND dimmSwitch == HIGH){
dimm(ledPin1);
}
....
Dank Euch
mike schrieb:> angenommen ich habe ein Nullspannungsdedektion für einen µC realisiert.
Dann lass mal sehen wie das ganze aussieht, sonst kann hier keiner was
sagen.
mike schrieb:> Wie gehe ich jetzt programmiertechnisch damit um?
Das weis bei Deinen Angaben hier keiner.
mike schrieb:> if (pinZeroDetection == HIGH AND dimmSwitch == HIGH){> dimm(ledPin1);> }> ....
Ich hoffe Du hast von 230V mehr Ahnung als von Erklärungen verfassen ;-)
Also her mit mehr Infos...
Nullspannungserkennung nach üblichen Verfahren:
Gräzbrücke Widerstand Transistor oder OK...
Schaltungstechnisch ist die Sache gerade zweitrangig. Mir gehr es um die
Softwareseitig Lösung...
Als µC kommt ein Atmel ATMEGA328P(Arduino) zum Einsatz. Was jetzt aber
auch nicht Entscheident für meine Frage ist - denk ich...
In mir kommt gerade die Frage hoch, wie es eigentlich dazu gekommen ist,
dass immer mehr Menschen denken, Programmieren wäre eine ganz einfache
Sache, die man zwischen 12:00 Uhr und Mittag lernen könne und für die
man nichts können muss.
Irgendwie seltsam.
mike schrieb:> Wie gehe ich jetzt programmiertechnisch damit um?> if (pinZeroDetection == HIGH AND dimmSwitch == HIGH){> dimm(ledPin1);> }
Das wird Dir derjenige sagen können, der pinZeroDetection, dimmSwitch
und dimm geschrieben hat.
42m
Man(n) kann nun mal nicht alles können. Und jeder hat irgendwann mal
'angefangen'!
Und ja, Programmiertechnisch bin ich nicht gerade die Leuchte. Aus
diesem Grund habe ich hier nachgefragt. Ich will auch keine fertige
Lösung. Aber ein paar Denkansätze hab ich mir schon erhofft. Aber ich
merke gerade das das 'hier' wahrscheinlich nicht (mehr) Möglich ist...
"Hier" ist nur so viel an Rückmeldung möglich wie Du durch Deine
Fragestellung möglich machst.
Ich habe ehrlich gesagt nicht verstanden, was Du nun eigentlich wissen
willst.
Hast Du bereits einen Code, der Dir die Funktionen pinZeroDetection usw.
zur Verfügung stellt und willst wissen, wie Du die verwendest?
War das ganze Pseudocode un zu verdeutlichen, wie Du Dir den Ablauf
vorstellst?
Du wirst schon ein bisschen mehr liefern müssen, damit irgendwer
überhaupt was sinnvolles dazu sagen kann.
42m
Na dann hol ich doch mal etwas aus:
Im Prinzip habe ich einen einfachen Tastdimmer realisiert, der bei
kurzem Tastendruck eine LED ein bzw. ausschaltet. Bei 'gedrückt halten'
dimmt die LED von 0 bis 100% und zurück - bis man den Taster loslässt.
Nun möchte ich das ganze natürlich erweitern und eine 'grosse Leuchte'
dimmen. Ich hab dazu auch ne Menge gelesen und überall war von
Nulldurchgang die Rede, damit der MosFet o.ä. im richtigen Moment
geschalten wird. Aber ich fand nirgends wie das detektiert Signal
SW-Technisch ausgewertet wird.
Im meinem jugendlichen Leichtsinn denk ich halt, das ich nur dimmen
'darf' wenn Nulldurchgang erkannt ist - deswegen dieser o.g.
Pseudocode...
Und kommt mir jetzt bitte nicht damit, das Netzspannung gefährlich ist -
die ess ich nämlich zum Frühstück...
mike schrieb:> Man(n) kann nun mal nicht alles können. Und jeder hat irgendwann mal> 'angefangen'!
Fang dort an, wo alle anfangen.
Mit einer LED an einem Portpin.
LED einschalten, LED ausschalten, LED blinken, Lauflicht.
Die letzten 2 Punkte dann Timergesteuert.
Dann eine Taste dazunehmen.
Schrittweise den Schwierigkeitsgrad erhöhen. Und irgendwann im Sommer
bist du dann soweit, dass man sich über eine Phasenabschnittsteuerung
unterhalten kann.
mike schrieb:> Na dann hol ich doch mal etwas aus:>> Im Prinzip habe ich einen einfachen Tastdimmer realisiert, der bei> kurzem Tastendruck eine LED ein bzw. ausschaltet. Bei 'gedrückt halten'> dimmt die LED von 0 bis 100% und zurück - bis man den Taster loslässt.
Du hast es vielleicht 'realisiert' aber ganz offenbar nicht verstanden
wie es funktioniert.
> geschalten wird. Aber ich fand nirgends wie das detektiert Signal> SW-Technisch ausgewertet wird.
ganz einfach.
Mit dem Nulldurchgang wird eingeschaltet und nach einer gewissen Zeit
(aber vor dem nächsten Nulldurchgang) wird wieder abgeschaltet. Der
Zeitraum dazwiscen ist variabel und ist nichts anderes als der Dimmgrad.
Also im Grunde auch nichts anderes als eine PWM. Nur dass die diesmal
mit dem Nulldurchgang synchronisiert ist und eine Periodendauer
identisch zur Netzfrequenz hat.
Hi Mike,
Wenn du eine sichere Nulldurchgangserkennung hast, kannst du beim ND
einen Timer starten und den OVL per Compare Match im Bereich von 0 bis
10ms (Halbwellensteuerung)verschieben. Beim starten des Timers den FET
einschalten, bei OVL wieder aus. Das ist das Prinzip des
PhasenABschnittdimmers. Umgekehrt, bei ND die Timerzeit abwarten und
danach für den Rest der Halbwelle einschalten bis zum nächsten ND, dann
hast du eine PhasenANschnittsteuerung...
...soweit zur Theorie... ;-)
Was willst Du überhaupt machen?
Du schreibst von großen Lampen und Nullspannungserkennung auf der
anderen Seite aber von LED und PWM.
Das ist vom Prinzip her was ganz anderes.
Bei ner LED machst Du ne normale PWM und sweepst nur den Comparewert
durch.
Bei ner 230V-Glühbirne brauchst Du ne Phasenanschnittssteuerung[1] und
deshalb warscheinlich die Nullspannungserkennung?
Dann schreib das auch so.
Dann musst Du erst mal den Zeitpunkt des Nulldurchgangs bestimmen.
Entweder über eine Schaltung, oder über eingelesene ADC-Werte.
Anschließend musst Du das Einschalten Deiner Leistungselektronnik um
einen gewissen Comparewert verzögern. Der Comparewert wird dann anhand
Deines Tastendrucks durchgesweept...
[1]:http://www.elektronik-kompendium.de/public/schaerer/phasecnt.htm
Mh, wenn ich also mein Tasterprinzip beibehalten will, muss ich:
- von einer Periodendauer von 20ms ausgehen
- Taster triggert keinen Ausgang sondern eine 'Funktion'
- Nulldurchgang wird ebenfalls an eine 'Funktion' übergeben
- Funktion(en) messen die 'Tasterzeit' & setzen/löschen, innerhalb der
Periodendauer, einen Ausgang welcher quasi analog zur 'Tasterzeit'
entsprechend kurz oder lang ausfällt.
Wäre das so ungefähr richtig?
W.Sprengel schrieb:> Du schreibst von großen Lampen und Nullspannungserkennung auf der> anderen Seite aber von LED und PWM.
Ja, weil ich mit der LED auf dem Board angefangen habe - zum Test.
Ich habe auch nicht vor via PWM eine Leuchte zu 'dimmen' - das soll
ärger geben ;-)
Inzwischen wird einiges klarer (Periodendauer etc.)
Mir ist klar, das der Ansatz wie ich es mit der LED gelöst habe, nicht
auf Netzspannung funktioniert...
Albert M. schrieb:> Wenn Du so einen schnellen Finger hast ...
analog ist sicher falsch ausgedrückt. Eher mein ich damit, via Zähler
o.ä. einen Bereich vorgeben welcher dann entsprechend auf die
Periodendauer umgerechnet wird und, bei Phasen-AN/AB-Schnitt, entweder
zu Beginn/Ende der Halbwelle eine 'Einzeit' vor gibt...
Ich weiß nicht was deine ND Funktion macht, ob die 10 oder 20ms
(Vollwelle) Signale generiert.
Ich würde es (ND) mit INT0, oder einem PChg_int machen, evtl. über den
AC oder ADC.
Im Int dann Compare Match-Wert aus der Tastensteuerung übernehmen,
Timer0 starten und entsprechend den Ausgang ansteuern. Den Timer nach
Ablauf mit TSM & PSR0 im PrescaleSyncModus gestoppt halten und
zurücksetzen und starten durch Reset von TSM... dann fängt sowohl der
Timer als auch der Prescaler exakt bei 0 an.
Die Tastensteuerungsroutine sollte den über die Tasten erzeugten Wert
des CompMatch schon vorher im richtigen Bereich skalieren, so dass es
zum Timertakt und einem 1Byte Wert passt und im Int nur eingelesen
werden muss..
Ach ja,bevor ich's vergesse:
Den Int des ND natürlich disablen, bis nach Ablauf der Timerzeit. Sonst
haut der Durchschalteimpuls des FET ein neues Triggersignal rein. Die
ganze Chose hängt sich nämlich währen des Durchsteuerns
kurzschlussmässig von der Versorgung ab, falls sie inline gespeist
werden soll... das ist die lustigste Sache beim Debuggen, die es zu
handlen gibt... vor allem wenn die Last dazu noch mitspiked...
Das ist trotz der überschaubaren Grund-Funktion, sicher kein
Anfängerprojekt, dafür mit garannitiertem Frustfaktor ...! ;-)
hi,
ich würde diese Thema gern noch einmal aufwärmen.
Als erstes - Entschuldigung für den, releativ, unprofessionellen Start
diese Threads.
Nach dem mir der eine oder andere den richtigen Denkanstoss gegeben hat,
habe ich bemerkt, das das ganze doch nicht soo trivial ist.
Bis jetzt habe ich folgendes realisiert:
Nulldurchgang via Schaltung im Anhang.
Jetzt brauch ich noch den einen oder anderen Tipp in Bezug
Interruptprogrammierung. Meine Idee dazu wäre:
'HIGH'-Pegel der ND-erkennung löst einen Interrupt aus und ein Timer
beginnt und läuft 20ms (Periodendauer der Netzfrequenz)
Innerhalb dieses Zeitfensters kann ich jetzt die 'Anzeit' meines
Dimmerausgang setzten. Je nach Art der Steuerung (Phasen An oder
Abschnitt)kann ich zu Beginn oder zum Ende des Zeitfensters den Ausgang
für X ms setzten.
'LOW'-Pegel bzw. Timerende sperrt den Dimmerausgang und dann das ganze
von vorn...?
Wäre das so ungefähr richtig?
Jetzt habe ich nach ein wenig Literatur im grossen Buchhaus für AVR
gesucht aber nichts gefunden. Das AVR-Tuturial aus diesem Forum ist zwar
sehr Aufschlussreich doch ist mir Assembler zu kryptisch und C wäre mir
da echt lieber. Hat jemand evtl eine Buch Empfehlung?
Ich würde nicht auf den HIGH-Pegel sondern auf die Flanke den Interupt
triggern. Steigende Flanke startet den TIMER. Bei Phasenanschnitt ist
die Timerlaufzeit die Verzögerung, wann deine Last eingeschaltet wird,
bei Phasenabschnitt die Zeit, solange deine Last eingeschaltet ist.
Wie sieht denn deine Leistungsstufe aus, hast du die mit einem Mosfet
oder einem Triac gebaut?
Ich würde den Ansteuerpuls für den Triac nicht bis zum nächsten
Nulldurchgang anliegen lassen.
Damit hatte ich Probleme.
Nur ein kurzer Puls reicht völlig zum zünden.
Ja, richtig - steigende Flanke!
Leistungsstufe gibt es noch nicht aber ich dachte schon an einen
Triac...
Mosfets sind doch nur für Gleichspannung gängig, oder? Gut, Antiparallel
sollte auch gehen - da wäre doch eine Triaclösung aber günstiger..?
Poster schrieb:> Du must nicht 20ms verwenden sondern 10ms. Ein Nulldurchgang kommt ja> nach jeder Halbwelle.
Upps! Stimmt, 20ms wären eine 'volle Welle'...
@Lippy:
Nette Grafik aber genau hier liegt mein Problem: diese ganzen
kryptischen Abkürzungen...
ZCD & INT0 bekomm ich noch hin aber dann hörts irgendwie auf. Könntest
du bitte etwas ausführlicher sein?
Also wenn du einen Triac verwendest, dann hast du eine
Phasenanschnittsteuerung. Dann startest du einen Timer mit der
steigenden Flanke. Nachdem der Timer abgelaufen ist schaltet dieser
einen Portpin kurz ein, der deinen Triac triggert. Dieser schaltet beim
nächsten Nulldurchgang automatisch ab. Entweder startest du mit dem
Interrupt noch einen zweiten Timer mit 10ms Laufzeit, der dir die zweite
Halbwelle anzeigt oder du verwendest die fallende Flanke. Deine Flanken
werden nicht genau im Nulldurchgang erscheinen, du hast eine kleine
Verschiebung, die man evtl. herausrechnen muss.
Karl Heinz Buchegger schrieb:> Schreib erst mal ein Schachprogramm. Das ist einfacher
:D
Wo nimmst du immer nur die Vergleiche und Analogien her.
Gruß Oliver
Tach,
im Anhang hab ich mal meinen Testaufbau. in der Praxsis verhält es sich
auch so. Allerdings hab ich R8 veränderbar - um die ND-Erkennung etwas
nach 'links' oder 'rechts' verschieben zu können.
Programm funktioniert jetzt auch soweit. (ist gar nicht so schlimm wie
ich erst dachte. Hier ein Auszug:
1
//counts from Timer...
2
volatileuint8_toffTime=40;
3
volatileuint8_toffTime_min=6;
4
volatileuint8_toffTime_max=70;
5
//set INT0 to external rising edge
6
EICRA|=((1<<ISC01)|1<<ISC00));
7
//enable INT0
8
EIMSK|=(1<<INT0);
9
//allow TIMER0 overflow interrupt
10
TIMSK0|=(1<<TOIE0);
11
//set prescale to 8 and start TIMER0
12
TCCR0B|=(0<<CS02)|(1<<CS01)|(0<<CS00);
13
14
ISR(INT0_vect){
15
PORTB=0<<1);
16
overflowCounter=0;
17
}
18
ISR(TIMER0_OVF_vect){
19
overflowCounter++;
20
if(overflowCounter>=offTime){
21
PORTB(1<<1);
22
}
noch etwas Tasterfutter drumrum und läuft. Aber:
Bei ca. 5% offTime bzw. ca. 1ms -pro Halbwelle- zündet der Triac einfach
komplett durch und ich habe ein Art Sprung drin. Ansonsten dimmt es
schön bis OffTime_max. Die Schaltung für den Dimmerteil habe ich gerade
nicht hier, ist aber Quasi aus dem Datenblatt vom MOC3041.
Nur die beiden Widerstände für Gate und T2 sind gleich gross und kein
Snubber. Jemand eine Idee dazu?