Nullspannungserkennung im µC

Gast #3075984
Lesenswert?

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...
Gast #3075993
Lesenswert?

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...
Gast #3076008
Lesenswert?

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...
Gast #3076010
Lesenswert?

"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
Gast #3076024
Lesenswert?

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...
#3076025
Lesenswert?

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.
#3076027
Lesenswert?

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.
Gast #3076036
Lesenswert?

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... ;-)
Gast #3076041
Lesenswert?

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
Gast #3076057
Lesenswert?

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?
Gast #3076066
Lesenswert?

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...
Gast #3076077
Lesenswert?

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...
Gast #3076080
Lesenswert?

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..
Gast #3076123
Lesenswert?

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 ...! ;-)
Gast #3085829
Lesenswert?

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?
Angehängte Dateien:
Gast #3085868
Lesenswert?

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?
Gast #3085885
Lesenswert?

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..?
Gast #3085913
Lesenswert?

@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?
Gast #3085960
Lesenswert?

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.
Gast #3111268
Lesenswert?

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?
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren