Forum: Mikrocontroller und Digitale Elektronik Nullspannungserkennung im µC


von mike (Gast)


Lesenswert?

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

von W.Sprengel (Gast)


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

von Karl H. (kbuchegg)


Lesenswert?

Schreib erst mal ein Schachprogramm. Das ist einfacher
1
#include <game.h>
2
3
int main()
4
{
5
  play( "Chess" );
6
}

von mike (Gast)


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

von mike (Gast)


Lesenswert?

Super Hilfe, werd ich gleich danach machen!

von Karl H. (kbuchegg)


Lesenswert?

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.

von Michael K. (Gast)


Lesenswert?

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

von mike (Gast)


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

von Michael K. (Gast)


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

von mike (Gast)


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

von Karl H. (kbuchegg)


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.

von Karl H. (kbuchegg)


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.

von Michael Schurr (Gast)


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... ;-)

von W.Sprengel (Gast)


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

von mike (Gast)


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?

von Albert M. (Firma: Bastler aus Mönchengladbach) (albertm) Benutzerseite


Lesenswert?

Wenn Du so einen schnellen Finger hast ...

von mike (Gast)


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

von mike (Gast)


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

von Michael Schurr (Gast)


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

von Tachen (Gast)


Lesenswert?

Hast Du nun eine externe Schaltung um den Nulldurchgang zu erkennen?
Danach richtet sich dann nämlich das weitere Vorgehen.

von Michael Schurr (Gast)


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 ...! ;-)

von mike (Gast)


Angehängte Dateien:

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?

von Matthias L. (Gast)


Angehängte Dateien:

Lesenswert?

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

von StefanK. (Gast)


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?

von Bastler (Gast)


Lesenswert?

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.

von mike (Gast)


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

von Poster (Gast)


Lesenswert?

Du must nicht 20ms verwenden sondern 10ms. Ein Nulldurchgang kommt ja 
nach jeder Halbwelle.

von mike (Gast)


Lesenswert?

Poster schrieb:
> Du must nicht 20ms verwenden sondern 10ms. Ein Nulldurchgang kommt ja
> nach jeder Halbwelle.

Upps! Stimmt, 20ms wären eine 'volle Welle'...

von mike (Gast)


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?

von StefanK. (Gast)


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.

von StefanK. (Gast)


Lesenswert?

Hier noch was zum Phasenabschnitt:

www.mikrocontroller.net/attachment/71509/37378-DI300.pdf

von Oliver J. (skriptkiddy)


Lesenswert?

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

von mike (Gast)


Angehängte Dateien:

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?

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.