brauche ziemlich genaue Nulldurchgangsdetektion bei 230V~
Hallo,
ich möchte mit einem ATMega32 mit 16MHz - Quarz eine induktive Last (Motor) bei 230V Wechselstrom schalten.
Dazu habe ich mir eine Relaiseplatine mit Transistor und Diode gebaut. Das funktioniert, wenn ich es ohne
den Motor schalte, einwandfrei.
Außer dem Motor habe ich auch ein recht großes GLCD und mehrere DS1621- Temperatursensoren an dem Atmega.
Mache ich den Motor an das Relaise, "stürzt" mein Controler oft beim abschalten des Motors ab - wenn nicht,
funktioniert für ca. 1 Sekunde der I²C-Bus nicht mehr richtig (ich sehe das, weil nach dem abschalten des Motors,
die Temperaturen auf dem Display die unmöglichsten Werte annehmen).
Ich habe mir nun überlegt, den Motor nur dann zu schalten, wenn die Phase der Netzspannung möglichst genau auf 0 ist,
um die Spitzen der Netzspannung beim ein- und ausschalten zu vermeiden.
Dazu habe ich vom L1 der Netzspannung einen Draht über einen 1 MOhm-Wiederstand an PD2 und
einen über 1 MOhm-Wiederstand an GND gelegt.
Folgendes Programmsegment kümmert sich um das "Pahsenkorekte" schalten der Relaise :
Code:
void schalte_bei_null(volatile byte *_port, byte pin, byte neuer_zustand)
// wartet auf Phasennulldurchgang und
// schaltet bei Phasennulldurchgang port->pin auf Zustand(1/0)
{
if (neuer_zustand)
{ // EINSCHALTEN
cli(); // interrupts ausschalten, dass die Funktion nicht vom Timer unterbrochen werden kann
while(!(PIND & (1<<PIND2))); // warten, bis eine untere Halbwelle auf 0 geht
while(PIND & (1<<PIND2)); // warten, bis eine obere Halbwelle auf 0 geht
asm volatile ("nop"::); // noch kurz warten, weil 0 am PinD2 nicht genau 0 der Netzspannung ist
asm volatile ("nop"::);
asm volatile ("nop"::);
*_port |= (1<<pin); // entsprechenden Pin einschalten
}
else
{ // AUSSCHALTEN
cli();
while(!(PIND & (1<<PIND2))); //warten, bis eine untere Halbwelle auf 0 geht
while(PIND & (1<<PIND2)); //warten, bis eine obere Halbwelle auf 0 geht
asm volatile ("nop"::);
asm volatile ("nop"::);
asm volatile ("nop"::);
*_port &= ~(1<<pin);
}
sei(); // Interrupts wieder aktivieren...
}
Nun endlich meine Frage / mein Problem...:confused:
Ich habe das Programm in den Controller übertragen und gestartet - es lief vorerst einwandfrei.
nach einigen Streßtests ( über 20 Minuten mehrmals pro Minute an / und ausschalten ) habe ich jedoch bemerkt,
daß der ATMega zwar nicht mehr abstürzt, jedoch das Problem mit dem I²C-Bus weiterhin oft auftaucht.
Meine Vermutung ist, dass ich mit dem Programm nicht genau den Nullpunkt erwische.
Ich habe kein Oszi oder ähnliche Geräte (Elektronik ist mein Hobby).
Kann bitte jemand von euch tollen Leuten, die ihr hier alle seid, die Schaltung nachbasteln und
durchmessen, wie viele
Code:
asm volatile ("nop"::);
se ich einfügen oder wegnehmen muß,
um GENAU den Phasennullpunkt der Netzspannung zu erwischen ?
ATMega32 / 16MHz macht 62.5 ns pro "nop"
Danke schonmal...
Liste der Anhänge anzeigen (Anzahl: 1)
Hubert, du schrubst von Kondensatoren ? Hab ich da was falsch verstanden ? Ein Snubber ist ein Kondensator und ein Wiederstand in Reihe und das ganze parallel zu den Schaltkontakten des Relais... Oder?
Wenn nicht, kannst du mir mal bitte einen Plan skizzieren, was für Kondensatoren wie mit dem Wiederstand zu verschalten sind ? - Muß nicht gleich sein...
wenn du mal Zeit und Muse hast :rolleyes:
Anhang 20876
Liste der Anhänge anzeigen (Anzahl: 2)
Also so, wie ichs jetzt aufgebaut habe (Snubber mit 47nF + 2200 Ohm am Relais) läuft die Sache stabil. Ab und zu (bei ca. 5 - 10 % aller Ausschaltvorgänge) kommt es beim ausschalten des Ventils zu einer kurzen (1 sekunde) Störung im I²C - Bus ... die Temperaturen werden kurz falsch angezeigt... Aber nach der besagten Sekunde ist alles wieder i.O.
Zitat:
Zitat von
ranke
Man kann zur Entstörung evt. auch (zusätzlich) einen Varistor parallel zum Motor schalten, der sollte auf die Spitzenspannung ausgelegt sein (ca. 310V).
Das soll jetzt der nächte Punkt auf meiner Liste sein... ich habe wieder in meiner Kramskiste Varistoren aus alten Leiterplatten ausgelötet :
Anhang 20879
Welchen davon sollte ich nun parallel zum Ventil schalten ? Oder sind die alle nix ? Der kleine blaue gefällt mir ja- passt farblich sehr gut zum Gehäuse :eek:
...Spaß muss sein.
Anhang 20880 - der müßte doch gehen - oder ?