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...
Schreib erst mal ein Schachprogramm. Das ist einfacher
1 | #include <game.h> |
2 | |
3 | int main() |
4 | {
|
5 | play( "Chess" ); |
6 | }
|
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..
Hast Du nun eine externe Schaltung um den Nulldurchgang zu erkennen? Danach richtet sich dann nämlich das weitere Vorgehen.
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?
>Nulldurchgang via Schaltung im Anhang. Kannst du vergessen. Das Signal kommt mal davor, und mal nach dem Nulldurchgang. Siehe Diskussion hier: Beitrag "Re: Nullpunkterkennung: Halbe Welle oder beiden Hälften detektieren?" Im Anhang die Timingplanung für meinen Dimmer.
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..?
Du must nicht 20ms verwenden sondern 10ms. Ein Nulldurchgang kommt ja nach jeder Halbwelle.
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.
Hier noch was zum Phasenabschnitt: www.mikrocontroller.net/attachment/71509/37378-DI300.pdf
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 | volatile uint8_t offTime = 40; |
3 | volatile uint8_t offTime_min = 6; |
4 | volatile uint8_t offTime_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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.