Forum: Mikrocontroller und Digitale Elektronik Tip zur Netzsynchronisierung


von Ingo (Gast)


Lesenswert?

Ich habe im Moment einen Knoten im Kopf und komm nicht auf die Lösung. 
Ich habe einen 9V Trafo, dahinter einen Einweggleichrichter. Ich erhalte 
dahinter also immer nur die Positive Halbwelle. Auf die Pulse möchte ich 
mich synchronisieren und zwar so das ein Attiny84 zu jeder Halbwelle 
jeweils einen Lastwiderstand zuschaltet. 1. Halbwelle = Lastwiderstand 
1; 2 Halbwelle Lastwiderstand 2 bei 4 beginnt es wieder mit 1.. Jetzt 
das eigentliche Problem, die Schaltung löst einen Trigger am AVR (INT0) 
aus, jedoch erst wenn die Halbwelle "schon"
Bei 4 Volt ist. Mann könnte zwar noch zwei V näher an den Nulldurchgang 
gehen, bringt aber nichts. Ich will die Last am Besten schon kurz vor 
der positiven Halbwelle zuschalten. Im Moment warte ich nach dem Trigger 
einfach 18ms, schalte die Last zu, warte nochmal 15ms und warte auf den 
nächsten Trigger. Klappt ja auch, aber ich schalte halt nur jede zweite 
Halbwelle die Lasten zu, das muss doch bei jeder gehen. Is eigentlich n 
Zehnzeiler von Programm her, aber ich finde keine bessere Lösung, evtl 
hat ja einer von euch n Denkanstoß!?

von Detlef K. (adenin)


Lesenswert?

Dein Problem ist, das eine Halbwelle nur 10ms lang ist ;)

von Matt B. (mattb)


Lesenswert?

Ich würde einen analogen Komparator (OP-Amp) verwenden, um aus den 
halben Sinuswellen ein Rechtecksignal zu erzeugen. Dann können die 
positiven Flanken ausgewertet werden (externer Interrupt).

In der ISR musst du dann nur eine Variable hochzählen, bzw. 
zurücksetzen.

Der rest ist dann lediglich das Ansteuern der Controllerpins.

von Wolfgang H. (frickelkram)


Lesenswert?

Detlef Kunz schrieb:
> Dein Problem ist, das eine Halbwelle nur 10ms lang ist ;)

Wenn es denn ein Zeitproblem ist dann nimm den Trigger. Messe/Bercehner 
die Zeit die Du zu spät bist. Reagiere einfach erst eine Halbwell minus 
der Fehlzeit später. So verlierst Du die erste Halbwelle, aber dann bist 
Du in Sync. Das Ganze könntest Du auch noch mit einer PLL-Funktion 
verbinden falls die 50Hz zu sehr schwanken ... aber das glaube ich 
nicht.
Wobei mir diese Lösung jetzt zu kompliziert erscheint. Kann man das 
nicht mit einer Capture/Compare Funktion machen? Es müsste doch Möglich 
sein einen Ausgang ohne Prozessor, nur abhängig von einem Einganspin, zu 
schalten ...

von Wolfgang (Gast)


Lesenswert?

Ingo schrieb:
> Im Moment warte ich nach dem Trigger
> einfach 18ms, schalte die Last zu, warte nochmal 15ms und warte auf den
> nächsten Trigger. Klappt ja auch, aber ich schalte halt nur jede zweite
> Halbwelle die Lasten zu, das muss doch bei jeder gehen.

Nachdem dein µC einen Trigger erkannt und 18ms später die Last auf der 
Halbwelle eingeschaltet hat, sollte der vollbrachte Schaltvorgang ihn 
doch nicht dran hindern, sich aus der selben Halbwelle auch wieder einen 
Trigger rauszufischen und nicht erst bei der darauf folgenden pos. 
Halbwelle wieder einen Blick auf die Realität tun.

Ein vernünftiger Nulldurchgangsdetektor - statt eines Flankentriggers 
auf die Halbwelle - wäre natürlich auch nicht schlecht. In der 
Application Note AVR182 von Atmel wird ein minimalistischer Ansatz mit 
zwei hochohmigen Widerständen direkt an der Primärseite des Trafos 
verwendet, um einen Bezugszeitpunkt für die Steuerung zu gewinnen. Die 
Spannung ist so hoch, das der Zeitfehler durch die Schwellenspannung 
unkritisch ist.

von Ingo (Gast)


Lesenswert?

Also mein Trigger ist ein Rechtecksignal. Leider läuft der AVR aufm int 
OSC, somit schwankt der Takt und meine Synchroniesierung läuft weg, 
schon ausprobiert...

von Detlef K. (adenin)


Lesenswert?

Hmm, nagut offensichtlich zählst Du die negativen Halbwellen nicht mit, 
also kommt die "zweite" erst nach 20ms. Du hast einen 50Hz-Takt.
Nimm einen Timer, der einen 18ms Takt erzeugt und immer vom INT0 
zurückgesetzt wird. Die Ausgänge schaltest Du mit dem Timer-Interrupt.

Das ganze denke ich mir so: Der Timer zählt hoch und wird irgendwann vom 
INT0 rückgesetzt (syncronisiert). Daraufhin hat er deine 18ms Zeit und 
löst
dann einen TimerInterrupt aus. Dann zählt er er wieder hoch, wird dann 
aber vom nächsten INT0 syncronisiert, worauf er wieder 18ms Zeit bis zum 
nächsten Timerinterrupt hat.

von Wolfgang H. (frickelkram)


Lesenswert?

Also, ich kenne mich auf dem Gebiet jetzt nicht wirklich aus, aber ich 
glaube das könnte funktionieren.

Dein Problem ist ja das Du exakt wenn die Spannung wieder minimal von 0 
gestiegen ist eine Aktion ausführen möchtest. Einen Nulldurchgang in dem 
Sinn gibt es ja nicht. Das Signal liegt lange auf Null und steigt dann 
an. Dein Komparator hat auf jeden Fall eine kleine "Spannungslücke" von 
ein paar Millivolt ... Die entsprechende Zeit der Halbwelle verlierst Du 
auf jeden Fall. Die kannst Du zwar sehr klein machen aber nie auf 0 
bringen.
Die von mir erwähnte Zeitberechnung kann theoretisch auf 0 kommen.
Die Zeit-Methode verliert aber die erste Halbwelle. Das mag nicht 
wichtig sein, weis ich aber nicht ...

Jetzt weis ich nicht ob es geht, aber Du hast Zähleingänge und 
Compare-Ausgänge an dem Tin84. Du könntest die Zähleingänge nutzen und 
das Compare-Register des Ausgangs auf 1 stellen. Wenn dann ein Impuls am 
Takteingang rein kommt zählt das Register herunter und der Compare 
Ausgang wird aktiviert. Gleichzeitig wird ein Interrupt ausgelöst. Du 
könntest dann in einer ISR-Routine Register ändern und so vorbereiten 
das der nächste Impuls einen anderen Ausgang schaltet. Für zwei Ausgänge 
müsste das Funktionieren. T0 und T1 als Eingänge, OC0A und OC0B als 
Ausgänge. Wenn Du jetzt noch OC1A und OC1B als Ausgänge nutzen kannst in 
dem Du die Register umprogrammierst, könnte es funktionieren ... so 
etwas habe ich aber noch nie gemacht ... weis also nicht ob es geht.

von MaWin (Gast)


Lesenswert?

Es ist softwaretechnisch nicht schwer, aus einem Signal

000000111111000000000011111100000000001111110000

die Frequenz und die Pulsweise high und Pulsweise low zu ermitteln.

Und wenn man dann die Mitte vom high bzw low als Punkt der
höchsten Spannung identifiert, ist 5ms dahinter der Nulldurchgang.

         v               v               v       Mitte high
000000111111000000000011111100000000001111110000
     ^       ^       ^       ^       ^       ^   Nulldurchgang

Auf diese Art lockt man mit einer digitalen PLL auf die ca 50Hz,
und weiß, wann der nächste Nulldurchgang kommen wird, selbst
wenn der nächste Flankenwechsel später kommt.

Starte einen ausreichend hochauflösenden Timerinterrupt
Warte auf 1
Zähle H wie lange 1 (bis Flankenwechsel auf 0 kommt)
Zähle L wie lange 0 (bis Flankenwechsel auf 1 kommt)
Nun kennt man H high-zeit und L low-Zeit,
damit die Periodendauer H + L,
der nächste Nulldurchgang nach 1->0 ist in (L+H/2)-3*(H+L)/4
der darauffolgende Nulldurchgang in (L+H/2)-1*(H+L)/4

Die Zählerwerte H und L werden kontinuierlich angepasst.
Bei zu grossen Abweichungen (kommen keine 45-65 Hz mehr raus)
wurde die Zählererfassung jedoch gestört du man verwirft
die Werte.

von Rainer Z. (razi)


Lesenswert?

Hai!

Ingo schrieb:
> Jetzt das eigentliche Problem, die Schaltung löst einen
> Trigger am AVR (INT0) aus, jedoch erst wenn die Halbwelle
> "schon" Bei 4 Volt ist. Mann könnte zwar noch zwei V näher
> an den Nulldurchgang  gehen, bringt aber nichts. Ich will
> die Last am Besten schon kurz vor der positiven Halbwelle
> zuschalten.

Nun... und was befindet sich "kurz vor der positiven Halbwelle"?
Bingo! Die negative Halbwelle!

Also: Einweggleichrichter raus, Potenzialverschiebung (mit
Spannungsteiler?) basteln, Komparator rein, Referenzspannung
des Komparators einstellbar machen (PWM und Filter); Richtungs-
erkennung (Anfang oder Ende der Halbwelle) implementieren
(per Software oder zweitem Komparator).

Waere zumindest mein Ansatz. Damit kannst Du den "Zuendwinkel"
fast zwischen -90° und +90°  einstellen.

Grusz,
Rainer

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.