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