ATTINY13 Phasenanschnitt

flecralf

Mitglied
25. Juli 2013
194
2
18
Sprachen
  1. ANSI C
Hallo alle zusammen,
so bin mal wieder dran an einer Phasenanschittsteuerung.....
Ich hab' hier mal die pdf vom attiny13 als Literatur zugrunde liegend, aber ich komm' nicht
richtig rein.
Einstieg:
Diesmal ist es ein Ladegerät und es soll nur eine elegante Strombegrenzung realisiert werden.
Der Thyristor ist, ich muss es erwähnen, ein 50 A / 600 V-Kollege, ein Monster.
Seine Aufgabe bisher, bestand darin durchzuschalten und bei ubatt>14,4 V abzuschalten.
Jetzt gibts' bei jedem Einschalten immer einen ordentlichen Bumms, welche ich nun mit Phasenanschnitt unterdrücken möchte.
Es geht einfacher, aber es dient den Umständen entsprechend als Lernträger.

kurze Übersicht:
*Attiny13
*Thyristor hängt über ein Optokoppler an Pin 5, PB0, schaltet auch durch
*Gleichrichter OHNE Kapazität, also 100 Hz , Graetz-Brücke
*Graetz-Plus / Thyristor-Anode am Pin3, PB4, ADC2, PCINT4 zum Nullspannungsdetektieren
// ob das die richtige Wahl war wusste ich beim Verdrahten noch nicht
*Neben Batterie/ Thyristor-Kathode an Pin2, PB3, ADC3 zum Abschalten bei Ubat > 14,4 V

/*
Thyristor aus: PORTB &= ~(1 << Ausgang);
Thyristor an: PORTB |= (1 << Ausgang);
*/

Hier hängts' gerade.....

ISR(PCINT0_vect) // interrupt service routine
{
Was muss hier hin ???
kurze Anregungen helfen schon....
INT0 regagiert auf Flankenwechsel, aber der PCINT auf Pinchange...
Könnte man auch über den adc-Eingang einen Wert verarbeiten lassen und dann einen Interrupt auslösen lassen?
Hardware-mäßig könnte ich noch die Idee, hatte jemand an anderer Stelle genannt, mit einem Optkoppler an der Wecheselspannung nutzen.
Dieser kippt dann beim Nulldurchgang...
Über den Spannungsteile bekomme ich je nach Sinuslage Werte zwischen 0 V und 2 V....
}


Im Hauptprogramm:

GIMSK |= (1<<PCIE); // enable PCINT interrupt

PCMSK |= (1<<PCINT4); // pin change mask: listen to portb bit 2

sei(); // enable all interrupts

Ist das alles scho mal richtig ?

Gruß
Ralf
 
Irgendwie ergibt sich hier beim lesen kein klares Bild, was Du nun eigentlich wirklich konkret hast und willst.
Iregdwie scheinen hier mehrere/viele Dinge in einen Topf geworfen zu sein, anschließend hast Du umgerührt.

Int0 vs PinChange:
die PinChange-Interrupts triggern beim Pegelwechsel, bei jeder Flanke. Außerdem sind mehrere Pins quasi als Gruppe zusammengefaßt, die den selben IRQ triggern, so sie dazu befähigt sind.
die externen Interrupts Int0, Int1 hingegen kannst Du einstellen, die können auch auf jeden Flankenwechsel triggern, Du kannst aber auch nur auf steigende oder nur auf fallende Flanken triggern. Und Du kannst auf einen lowPegel triggern.
Exkurs ADC:
der ADC bildet den proportionalen Anteil einer anliegenden analogen Spannung von einer vorgegebenen Referenzspannung auf den digitalen Zahlenraum mit 1024 (10 Bit, 2^10) als Referenz ab. Für die erste Abbildung benötigt er 25 ADC-Takte oder so, man kann den quasi im dauerlauf laufen lassen - dann benötigt er nur noch 13 ADC-Takte oder so. Am Ende einer jeden Wandlung kann man den ADC einen entsprechenden "hab fertig" IRQ triggern lassen.
Empfohlen sind höchstens 200kHz ADC-Takt, überschreitet man die, kann/soll die Genauigkeit leiden. Wenn Du eine geringere Genauigkeit in Kauf nimmst, kannst Du den also auch schneller laufen lassen. Ob jemand das schon mal ausgetestet hat, weiß ich nicht; einstellbares absolutes MAximum wäre die halbe MCU-Frequenz. Ich habe einen ADC mal mit 2MHz laufen lassen, und nur 8bit Genauigkeit verwendet - da ist mir nichts aufgefallen...

Phasenanschnitt:
das ist sowas ähnliches(!) wie PWM - mit der doppelten Frequenz des Wechselstromes als PWM-Frequenz und dem Anschnittswinkel als Off-Zeit.Dabei wird der Strom im Nulldurchgang abgeschaltet, und um einen bestimmten Anschnittswinkel, einen bestimmten Zeit-Bruchteil einer Halb-Periode eingeschaltet. Es wird also auf die Nulldurchgänge synchronisiert, wie auch beim Phasenabschnitt, dort wird allerdings im Nulldurchgang an, und nach einer bestimmten Zeit wieder abgeschaltet.

Deine Schaltung ist mir irgendwie komplett unklar - bzw irgendwas paßt da nicht... kannst Du mal "malen"?

Was willst Du erreichen? Den Thyristor im/dicht am Nulldurchgang zünden, oder wie?
 
Irgendwie ergibt sich hier beim lesen kein klares Bild, was Du nun eigentlich wirklich konkret hast und willst.
Iregdwie scheinen hier mehrere/viele Dinge in einen Topf geworfen zu sein, anschließend hast Du umgerührt.

Int0 vs PinChange:
die PinChange-Interrupts triggern beim Pegelwechsel, bei jeder Flanke. Außerdem sind mehrere Pins quasi als Gruppe zusammengefaßt, die den selben IRQ triggern, so sie dazu befähigt sind.
die externen Interrupts Int0, Int1 hingegen kannst Du einstellen, die können auch auf jeden Flankenwechsel triggern, Du kannst aber auch nur auf steigende oder nur auf fallende Flanken triggern. Und Du kannst auf einen lowPegel triggern.
Exkurs ADC:
der ADC bildet den proportionalen Anteil einer anliegenden analogen Spannung von einer vorgegebenen Referenzspannung auf den digitalen Zahlenraum mit 1024 (10 Bit, 2^10) als Referenz ab. Für die erste Abbildung benötigt er 25 ADC-Takte oder so, man kann den quasi im dauerlauf laufen lassen - dann benötigt er nur noch 13 ADC-Takte oder so. Am Ende einer jeden Wandlung kann man den ADC einen entsprechenden "hab fertig" IRQ triggern lassen.
Empfohlen sind höchstens 200kHz ADC-Takt, überschreitet man die, kann/soll die Genauigkeit leiden. Wenn Du eine geringere Genauigkeit in Kauf nimmst, kannst Du den also auch schneller laufen lassen. Ob jemand das schon mal ausgetestet hat, weiß ich nicht; einstellbares absolutes MAximum wäre die halbe MCU-Frequenz. Ich habe einen ADC mal mit 2MHz laufen lassen, und nur 8bit Genauigkeit verwendet - da ist mir nichts aufgefallen...

Phasenanschnitt:
das ist sowas ähnliches(!) wie PWM - mit der doppelten Frequenz des Wechselstromes als PWM-Frequenz und dem Anschnittswinkel als Off-Zeit.Dabei wird der Strom im Nulldurchgang abgeschaltet, und um einen bestimmten Anschnittswinkel, einen bestimmten Zeit-Bruchteil einer Halb-Periode eingeschaltet. Es wird also auf die Nulldurchgänge synchronisiert, wie auch beim Phasenabschnitt, dort wird allerdings im Nulldurchgang an, und nach einer bestimmten Zeit wieder abgeschaltet.

Deine Schaltung ist mir irgendwie komplett unklar - bzw irgendwas paßt da nicht... kannst Du mal "malen"?

Was willst Du erreichen? Den Thyristor im/dicht am Nulldurchgang zünden, oder wie?

Hallo,
das "Elektrische" ist klar. Ich hänge bei den Timer und Interruptgeschichten fest.
PWM bringt mir beim Thyristor nichts, also Phasenanschnitt.
Wie kann ich den Nulldurchgang detektieren um so den Thyristor "etwas" später zu zünden?
Die abzutastende Spannung ist eine gleichgerichtete Spannung ohne Elko.
PCint triggert bei Pegelwechsel - müsste doch gehen,
int triggert auf Flankenwechsel - müsste auch gehen
den ADC brauch ich doch dann gar nicht, oder?
Und nun hänge ich wieder fest....
nähme ich jetzt mal den PCINT.... dann müsste er ja nach Nulldurchgang irgendwann mal auf high übergehen, oder ?

Malen ist schlecht...
Also: Trafo 230 V / 16 V -> Brücke(+) ->(Anode)_Thyristor_(Kathode)-->(+)Akku(-)->Brücke(-)
PCINT->(+)_Brücke bzw. an (Anode)_Thyristor /// Für den Phasenanschitt
ADC -> an (Kathode)_Thyristor bzw. (+)_Akku // Hierfür egal, dient zu Abschaltung über 14,4 V
Der Thyristor wird über einen Optokoppler geschaltet.
Mal ganz schnell ne Skizze....
Wichtig: Der Thyristor wird durch den Nulldurchgang gelöscht, da kein Elko die Spannung puffert.
 

Anhänge

  • akku.jpg
    akku.jpg
    83,8 KB · Aufrufe: 24
Nochmal:
die PCINTs triggern bei jeder Flanke, als beim wechsel des erkannten logischen Pegels.
bei den "normalen" externen INTs (also INT0, INT1) kannst Du festlegen, worauf die triggern sollen bei jeder Flanke oder bei jeder fallenden oder bei jeder steigenden, oder bei einem low-Pegel. Die Flankengetriggerten IRQs fallen also beim Flankenwechsel genau einmal (nämlich in dem Moment, wo dder Pegel kippt. Der LowLevel IRQ triggert solange immer wieder, wie der lowPegel anliegt. soweit klar?
Wann kippt der Pegel? irgendwo zwischen 0,3*Vcc und 0,7*Vcc wenn ich mich recht erinner.
Die lastabhängige Phasenverschiebung durch den Trafo interessiert hier nicht, da Detektion und Last auf derselben Seite sind.
In Deiner Schaltung hast Du durch die ungeglättete Gleichrichtung alle Halbwellen über 0.
Starten wir mal oben, die Spannung fällt, also auch die am INT0 bzw PCINT, irgendwann fällt sie unter die Schwelle des PINs (noch vor dem Nulldurchgang), ein scharfgeschalteter PCINT würde hier triggern, ebenso INT0 wenn der auf alle Flanken reagieren soll, ebenso INT0 auf fallende Flanke. Der LowLevelINT0 würde sogar immer wieder triggern.
Deine Spannung sinkt noch weiter bis 0, und steigt dann wieder... irgendwann erreicht sie den Wert, wo der logische Pegel wieder kippt (nach dem Nulldurchgang). Hier würde der PCINT wieder triggern, ebenso INT0, wenn er auf beide oder steigende Flanke eingestellt ist. INT0 auf lowLevel würde hier endlich mit dem ständigen triggern aufhören, soweit klar?

So triffst Du also die Nulldurchgänge nicht - aber das mußt Du ja nicht unbedingt... Du willst ja eh anschneiden. Wenn Du aber weißt, daß Du immer 'ne bestimmte Zeit zu spät reagierst, mußt Du eben den gewünschten Anschnittswinkel um diese Zeit reduzieren.
Jetzt mußt Du also 'ne Zeitlang warten (der Winkel), bevor Du den Thyristor zündest. Und irgendwann den Zündimpuls wieder löschen, damit der Thyristor selbst im Null-Umkehrpunkt (ist ja kein Durchgang) verlischt.

Ich habe bei mir damals einen Timer verwendet, diesen auf die Nulldurchgänge synchronisiert, und über PWM den Zündimpuls geschaltet (an und wieder aus). Ok, bei mir warens TRIACs und die Nulldurchgangsdetektion erfolgte primär und mittels Optokoppler, der seinerseits von einem Komperator gespeist wurde, welcher auf Differenz zwischen Neutralleiter und Phase ausgab...

Ader einiges sollte anwendbar sein... hier steht ein Teil davon...
 
Nochmal:
die PCINTs triggern bei jeder Flanke, als beim wechsel des erkannten logischen Pegels.
bei den "normalen" externen INTs (also INT0, INT1) kannst Du festlegen, worauf die triggern sollen bei jeder Flanke oder bei jeder fallenden oder bei jeder steigenden, oder bei einem low-Pegel. Die Flankengetriggerten IRQs fallen also beim Flankenwechsel genau einmal (nämlich in dem Moment, wo dder Pegel kippt. Der LowLevel IRQ triggert solange immer wieder, wie der lowPegel anliegt. soweit klar?
Wann kippt der Pegel? irgendwo zwischen 0,3*Vcc und 0,7*Vcc wenn ich mich recht erinner.
Die lastabhängige Phasenverschiebung durch den Trafo interessiert hier nicht, da Detektion und Last auf derselben Seite sind.
In Deiner Schaltung hast Du durch die ungeglättete Gleichrichtung alle Halbwellen über 0.
Starten wir mal oben, die Spannung fällt, also auch die am INT0 bzw PCINT, irgendwann fällt sie unter die Schwelle des PINs (noch vor dem Nulldurchgang), ein scharfgeschalteter PCINT würde hier triggern, ebenso INT0 wenn der auf alle Flanken reagieren soll, ebenso INT0 auf fallende Flanke. Der LowLevelINT0 würde sogar immer wieder triggern.
Deine Spannung sinkt noch weiter bis 0, und steigt dann wieder... irgendwann erreicht sie den Wert, wo der logische Pegel wieder kippt (nach dem Nulldurchgang). Hier würde der PCINT wieder triggern, ebenso INT0, wenn er auf beide oder steigende Flanke eingestellt ist. INT0 auf lowLevel würde hier endlich mit dem ständigen triggern aufhören, soweit klar?

So triffst Du also die Nulldurchgänge nicht - aber das mußt Du ja nicht unbedingt... Du willst ja eh anschneiden. Wenn Du aber weißt, daß Du immer 'ne bestimmte Zeit zu spät reagierst, mußt Du eben den gewünschten Anschnittswinkel um diese Zeit reduzieren.
Jetzt mußt Du also 'ne Zeitlang warten (der Winkel), bevor Du den Thyristor zündest. Und irgendwann den Zündimpuls wieder löschen, damit der Thyristor selbst im Null-Umkehrpunkt (ist ja kein Durchgang) verlischt.

Ich habe bei mir damals einen Timer verwendet, diesen auf die Nulldurchgänge synchronisiert, und über PWM den Zündimpuls geschaltet (an und wieder aus). Ok, bei mir warens TRIACs und die Nulldurchgangsdetektion erfolgte primär und mittels Optokoppler, der seinerseits von einem Komperator gespeist wurde, welcher auf Differenz zwischen Neutralleiter und Phase ausgab...

Ader einiges sollte anwendbar sein... hier steht ein Teil davon...

Zum Testen....
Wenn nun der Pegel an PB4 kippt müsste sich doch was am Port Ausgang tut?
Machts aber nicht....
Gleich geb' ich es auf und nehme einen Längstransistor parallel zum Thyristor und steuere den mit ner PWM an.
Nach der Einschaltphase übernimmt dann der Thyristor....
Gruß Ralf
Code:
ISR(PCINT0_vect)        // interrupt service routine
{              // called when PCINT0 changes state
_delay_ms(2);
PORTB |= (1 << Ausgang);
_delay_ms(2);
return;
}

Im Hauptprogramm:
GIMSK |= (1<<PCIE);   // enable PCINT interrupt
//PCMSK |= (1<<PCINT4);   // pin change mask: listen to portb bit 2
PCMSK |= (1<<PB4);   // pin change mask: listen to portb bit 2
sei();         // enable all interrupts 
}

BTW:
Wusstet Ihr, dass bei den Selengleichrichtern diese Kühllamellen NICHT auf dem selben Potential liegen?
Also Masse ist nicht überall....
Ich auch nicht, die Hirschmannklemme weiß es nun...:)
 
Mit dem PCINT triggerst Du wie gesagt auf beide Flanken, also kurz vor und kurz nach dem Nulldurchgang.

Was willst Du jetzt am Bein sehen? Bei jeder erkannten Flanke schaltest Du das Beinchen an. Aber zumindest im gezeigten Code nie wieder ab...

Nachfrage: Wie hoch ist eigentlich der (Dino, hilf) minimale Haltestrom (?) des Thyristors. Es ist ja eigentlich nicht so, daß er bei Spannung=0V abschaltet, sondern genaugenommen so, daß er abschaltet, wenn der Stromfluß Durch ihn einen bestimmten Wert unterschreitet. (Auch, wenn in dem Moment der Zünd-Pegel anliegt?, das Gate(?) High ist?
 
Zum Testen....
Wenn nun der Pegel an PB4 kippt müsste sich doch was am Port Ausgang tut?
Machts aber nicht....
Gleich geb' ich es auf und nehme einen Längstransistor parallel zum Thyristor und steuere den mit ner PWM an.
Nach der Einschaltphase übernimmt dann der Thyristor....
Gruß Ralf
Code:
ISR(PCINT0_vect)        // interrupt service routine
{              // called when PCINT0 changes state
_delay_ms(2);
PORTB |= (1 << Ausgang);
_delay_ms(2);
return;
}

Im Hauptprogramm:
GIMSK |= (1<<PCIE);   // enable PCINT interrupt
//PCMSK |= (1<<PCINT4);   // pin change mask: listen to portb bit 2
PCMSK |= (1<<PB4);   // pin change mask: listen to portb bit 2
sei();         // enable all interrupts 
}

BTW:
Wusstet Ihr, dass bei den Selengleichrichtern diese Kühllamellen NICHT auf dem selben Potential liegen?
Also Masse ist nicht überall....
Ich auch nicht, die Hirschmannklemme weiß es nun...:)

PCINT kippt scheinbar erst be 2 V aufwärts.... hab' gerade mal eine Spannung extern draufgehalten und siehe da es tut sich was....
Zuvor kam ich nicht über 2 V....
 
Nicht PCINT, der eingelesene Pegel. Der PCINT triggert bei einer erkannten Änderung des Pegels. Der INT0/1 aber auch, mit den Umfangreicheren Möglichkeiten...
...
Wann kippt der Pegel? irgendwo zwischen 0,3*Vcc und 0,7*Vcc wenn ich mich recht erinner.
...
Siehe Datenblatt S.115

Neben eventuellen Toleranzen liegt das am Schmitt-Trigger im Signalpfad des Pins (S. 53).

zu der Sache mit den Selengleichrichtern: ich dachte, jede "Platte" ist die Kathode (?) einer Selendiode...
 
Nicht PCINT, der eingelesene Pegel. Der PCINT triggert bei einer erkannten Änderung des Pegels. Der INT0/1 aber auch, mit den Umfangreicheren Möglichkeiten...

Siehe Datenblatt S.115

Neben eventuellen Toleranzen liegt das am Schmitt-Trigger im Signalpfad des Pins (S. 53).

zu der Sache mit den Selengleichrichtern: ich dachte, jede "Platte" ist die Kathode (?) einer Selendiode...

Das dacht' ich auch... dann gabs' ne Stichflamme.... :)
Ich werde das morgen nochmal genau messen...
Der Trafo ist zäh, das Oszi aus dem letzten kalten Krieg.... das Material hat gehalten...
Mit cli() kann man doch den Interrupt wieder löschen, oder?
Es soll ja nur zum Anlaufen dienen...
Derzeit läuft es allerdings durch...
Gruß
Ralf
 
Hallo,

also wenn ich deinen Schaltplan richtig interpretiere, dann versuchst du mit PWM/Phasenanschnittsteuerung eine Akku zu laden. Außerdem verwendest du dafür nen Thyristor für die Phasenanschnittsteuerung :rolleyes: Hast du in den Gateanschluß des Thyristors nen Vorwiderstand drin? Die reagieren auf zu hohe Ströme ähnlich gereizt wie nen Transistor :p Außerdem könnte der Thyristor (wenn man Pech hat) alleine durch Leckströme des Fototransistors vom Optokoppler schon durchsteuern wenn die Konstruktion nicht so ganz paßt. Ich halte die Konstruktion sowieso für "suboptimal" :rolleyes: Ich hätte das eher mit nem MOSFET gelöst. Aber naja ... kann man machen wie man will :)

Gruß
Dino
 
Hallo,

also wenn ich deinen Schaltplan richtig interpretiere, dann versuchst du mit PWM/Phasenanschnittsteuerung eine Akku zu laden. Außerdem verwendest du dafür nen Thyristor für die Phasenanschnittsteuerung :rolleyes: Hast du in den Gateanschluß des Thyristors nen Vorwiderstand drin? Die reagieren auf zu hohe Ströme ähnlich gereizt wie nen Transistor :p Außerdem könnte der Thyristor (wenn man Pech hat) alleine durch Leckströme des Fototransistors vom Optokoppler schon durchsteuern wenn die Konstruktion nicht so ganz paßt. Ich halte die Konstruktion sowieso für "suboptimal" :rolleyes: Ich hätte das eher mit nem MOSFET gelöst. Aber naja ... kann man machen wie man will :)

Gruß
Dino

Hi Dino,
ist doch eher als Übungsprojekt anzusehen.... klar Mosfet in Serie wäre 100x einfacher...
Der Thyristorsteuerung funktioniert....
Ubatt > 14,4 V Thyristor aus, gelöscht bei Nulldurchgang
Ubatt < 12 V Thyristor wieder an
Das war sachdienlich, da mir die Akkus immer in die Vergasungsspannung laufen.
Der Phasenanschitt war eher als Versuch anzusehen und sollte den Einschaltrumms von I > 15 A dämmen.
Außerdem hatte ich doch zufällig 50A Thyristoren bei ebay geschossen... was soll ich denn damit sonst machen ? ;-)
Als Vorwiderstand hab' ich 470R vorgeschaltet.


Besser als ein Mosfet wäre ein 2N3055. nicht dieses moderne Mosfet-Zeugs :)
Außerdem hätte ich den Ärger mit dem Interrupt nicht, werde ich wahrscheinlich nie richtig verstehen.
Übrigens die PWM in meiner Lötstation funktioniert... benötige ein Thermoelement für den Weller-Lötkolben, das alte ist abgebrochen.
Und, dann noch die Auswerteschaltung.
Gruß
Ralf
 
Zur elektrischen Seite wegen den Thyristoren und so sag ich erstmal nix,,

Aber wo nimmst Du denn nun den Pin, der das "Thyristorgate" zündet wieder zurück? Wenn Du es immer wieder anschaltest, ist es halt immer an...
Die 2te Sache ist Deine (ungefähre) Nulldurchgangsdetektion. Der PCINT reagiert auf alle Flanken. Also einmal kurz vor dem Nulldurchgang, und einmal kurz danach. Selbst, wenn Du das "Zünden & loslassen" korrekt umsetzen würdest, hättest Du 2 "Zündpunkte" pro Halbperiode.
Der zweite kurz nach dem Nulldurchgang wird ignoriert, weil Du Dich zu dem Zeitpunkt noch mit dem ersten in der ISR befindest, und die IRQs global solange unterdrückt sind? Nein! des PinChange-Interruptflag wird in der Hardware ja trotzdem gesetzt, Deine laufende ISR wird lediglich nicht unterbrochen. Kehrst Du aus der laufenden ISR zurück, werden die IRQs wieder global freigegeben, die Hardware reagiert auf das aktive Flag, und löst den IRQ jetzt aus - der warte quasi ...

Zur Selen -Dioden-Gleichrichter-Geschichte:
Was hast Du denn da? Ein "Bauteil", das mit 4 Platten bereits 'ne komplette Graetz-Brücke ist, oder 4 "Bauteile" mit je mehreren Platten, die Du zu einer solchen Brücke zusammengeschaltet hast?
Im ersten Fall wäre dann jede Platte die Kathode einer Diode, warum sollen die bei einem Brückengleichrichter alle auf Gnd (bzw demselben Potential) liegen? Mal Dir mal 'ne Graetz-Brücke auf, und schau wo die Kathoden liegen...
Im 2ten Fall hättest Du mit jedem einzelnen "Bauteil" eine Diode, die in Wirklichkeit aus mehreren in Reihe geschalteten Dioden besteht. Wenn Du also mehrere Platten miteinander verbindest, also mehrere Kathoden der Einzeldioden, schließt Du einen Teil der zusammengesetzten Diode kurz.
 
Zur elektrischen Seite wegen den Thyristoren und so sag ich erstmal nix,,

Aber wo nimmst Du denn nun den Pin, der das "Thyristorgate" zündet wieder zurück? Wenn Du es immer wieder anschaltest, ist es halt immer an...
Die 2te Sache ist Deine (ungefähre) Nulldurchgangsdetektion. Der PCINT reagiert auf alle Flanken. Also einmal kurz vor dem Nulldurchgang, und einmal kurz danach. Selbst, wenn Du das "Zünden & loslassen" korrekt umsetzen würdest, hättest Du 2 "Zündpunkte" pro Halbperiode.
Der zweite kurz nach dem Nulldurchgang wird ignoriert, weil Du Dich zu dem Zeitpunkt noch mit dem ersten in der ISR befindest, und die IRQs global solange unterdrückt sind? Nein! des PinChange-Interruptflag wird in der Hardware ja trotzdem gesetzt, Deine laufende ISR wird lediglich nicht unterbrochen. Kehrst Du aus der laufenden ISR zurück, werden die IRQs wieder global freigegeben, die Hardware reagiert auf das aktive Flag, und löst den IRQ jetzt aus - der warte quasi ...

Zur Selen -Dioden-Gleichrichter-Geschichte:
Was hast Du denn da? Ein "Bauteil", das mit 4 Platten bereits 'ne komplette Graetz-Brücke ist, oder 4 "Bauteile" mit je mehreren Platten, die Du zu einer solchen Brücke zusammengeschaltet hast?
Im ersten Fall wäre dann jede Platte die Kathode einer Diode, warum sollen die bei einem Brückengleichrichter alle auf Gnd (bzw demselben Potential) liegen? Mal Dir mal 'ne Graetz-Brücke auf, und schau wo die Kathoden liegen...
Im 2ten Fall hättest Du mit jedem einzelnen "Bauteil" eine Diode, die in Wirklichkeit aus mehreren in Reihe geschalteten Dioden besteht. Wenn Du also mehrere Platten miteinander verbindest, also mehrere Kathoden der Einzeldioden, schließt Du einen Teil der zusammengesetzten Diode kurz.

Hi LotadaC,
hab gestern es nochmal mit INT0 probiert, aber irgendwie, na ja..... es klemmt.... :)
Der Selengleichrichter ist eine Grätzbrücke... hab' mit den Dingern nie messtechnisch zu tun gehabt... und große Metallflächen sind halt Ground.... ;-)
Wobei das bei dem Thyristorkühlblech auch nicht ganz stimmt.... volle Spannung....:)
Zumindest das Vorhaben mit dem Überspannungsschutz und Tiefentladungsprävention ist schon mal eine voller Erfolg... :)
Gruß
Ralf
 
...
Der Thyristorsteuerung funktioniert....
Ubatt > 14,4 V Thyristor aus, gelöscht bei Nulldurchgang
Ubatt < 12 V Thyristor wieder an
Das war sachdienlich, da mir die Akkus immer in die Vergasungsspannung laufen.
Der Phasenanschitt war eher als Versuch anzusehen und sollte den Einschaltrumms von I > 15 A dämmen.
...
Willst Du hier lediglich verhindern, daß der Thyristor fern des Nulldurchganges zündet, im worst case gerade bei maximaler Amplitude? (dafür brauchst Du keinen Anschnitt, sondern nur die Nulldurchgangsdetektion. Für sowas gibt es zumindest bei Optokopplern/Optotriacs welche mit integrierter Nulldurchgangsdetektion. Aber das kannst Du natürlich auch extern über einen AVR realisieren. Oder mit irgendwelchen diskreten Bauteilen.)
Oder willst Du wirklich den Phasenanschnitt verwenden, um Anschnittswinkel über mehrere/viele Halbperioden hinweg langsam zurückzudrehen?

Edit: INT0 als level, steigende, fallende oder beide Flanken konfiguriert?
 
Hi Ralf,

Außerdem hätte ich den Ärger mit dem Interrupt nicht, werde ich wahrscheinlich nie richtig verstehen.

Nen Interrupt ist doch recht einfach ;)

Du sitzt am PC und arbeitest so vor dich hin. Dann kommt einer in den Raum gestürzt und schreit: "Sofort Müll rausbringen!" (Das ist der Interrupt). Du unterbrichst deine aktuelle Arbeit und bringst sofort den Müll raus (Die ISR - Interrupt Service Routine wird angesprungen). Danach machst du wieder am PC weiter (Rücksprung aus der ISR und Stackpointer und Programmcounter wieder herstellen).

Beim INT0 oder INT1 kannst du auch verschiedene Weise diesen Interrupt auslösen. ...
  • Pegel geht von GND auf Vcc (steigende Flanke = Rising Edge) __---
  • Pegel geht von Vcc auf GND (fallende Flanke = Falling Edge) ---__
  • Pegel wechselt von Vcc auf GND oder umgekehrt (fallende oder steigende Flanke = Logical Change) ---__ oder __---
  • Pegel ist auf GND (Low Pegel) ______

Der Interrupt wird so lange immer wieder neu ausgelöst, so lange wie die Interruptbedingung gültig ist.

Flanken können nicht dauerhaft anliegen sondern müssen durch einen Pegelwechsel erzeugt werden. Die Interruptbedingung liegt also nur kurz an wenn die jeweilige Flanke auftritt.

Pegel können dauerhaft anliegen und die Interruptbedingung ist dann auch so lange aktiv und die ISR wird dann auch so lange immer wieder neu angesprungen.

Wenn du also zB INT0 auf Low-Pegel einstellst und den Pin auf GND legst, dann macht der Atmel nix anderes mehr als die ISR auszuführen. Wenn er aus der ISR kommt, wird INT0 wieder freigegeben und der Atmel springt sofort wieder in die ISR da der Pin ja immer noch auf GND liegt.

Soweit alles klargeworden?

Bei deinem Phasenanschnitt sieht es nun folgendermaßen aus. Wenn der Nulldurchgang ansteht und die Spannung zusammensackt, dann hast du am INT0-Pin zB folgendes ...
INT0-Pin -------_____-------
... der Pegel sackt also um den Nulldurchgang herum auf GND. Kurz vor bis kurz nach dem Nulldurchgang ist er also auf Low-Pegel.

Nun hast du folgende Möglichkeiten ...

  • steigende Flanke -> Der Interrupt wird am Ende des Nulldurchgangs ausgelöst (INT0-Pin geht wieder auf High)
  • fallende Flanke -> Der Interrupt wird am Anfang des Nulldurchgangs ausgelöst (INT0-Pin geht auf Low)
  • Pegelwechsel -> Der Interrupt wird am Anfang und Ende des Nulldurchgangs ausgelöst (also 2x weil der Nulldurchgang auch 2 Pegelwechsel hat)
  • Low Pegel -> Der Interrupt wird immer wieder neu während des Nulldurchgangs ausgelöst (also zig Aufrufe der Interruptroutine so lange der Pegel Low ist)

Gruß
Dino
 
Hi Ralf,



Nen Interrupt ist doch recht einfach ;)

Du sitzt am PC und arbeitest so vor dich hin. Dann kommt einer in den Raum gestürzt und schreit: "Sofort Müll rausbringen!" (Das ist der Interrupt). Du unterbrichst deine aktuelle Arbeit und bringst sofort den Müll raus (Die ISR - Interrupt Service Routine wird angesprungen). Danach machst du wieder am PC weiter (Rücksprung aus der ISR und Stackpointer und Programmcounter wieder herstellen).

Beim INT0 oder INT1 kannst du auch verschiedene Weise diesen Interrupt auslösen. ...
  • Pegel geht von GND auf Vcc (steigende Flanke = Rising Edge) __---
  • Pegel geht von Vcc auf GND (fallende Flanke = Falling Edge) ---__
  • Pegel wechselt von Vcc auf GND oder umgekehrt (fallende oder steigende Flanke = Logical Change) ---__ oder __---
  • Pegel ist auf GND (Low Pegel) ______

Der Interrupt wird so lange immer wieder neu ausgelöst, so lange wie die Interruptbedingung gültig ist.

Flanken können nicht dauerhaft anliegen sondern müssen durch einen Pegelwechsel erzeugt werden. Die Interruptbedingung liegt also nur kurz an wenn die jeweilige Flanke auftritt.

Pegel können dauerhaft anliegen und die Interruptbedingung ist dann auch so lange aktiv und die ISR wird dann auch so lange immer wieder neu angesprungen.

Wenn du also zB INT0 auf Low-Pegel einstellst und den Pin auf GND legst, dann macht der Atmel nix anderes mehr als die ISR auszuführen. Wenn er aus der ISR kommt, wird INT0 wieder freigegeben und der Atmel springt sofort wieder in die ISR da der Pin ja immer noch auf GND liegt.

Soweit alles klargeworden?

Bei deinem Phasenanschnitt sieht es nun folgendermaßen aus. Wenn der Nulldurchgang ansteht und die Spannung zusammensackt, dann hast du am INT0-Pin zB folgendes ...
INT0-Pin -------_____-------
... der Pegel sackt also um den Nulldurchgang herum auf GND. Kurz vor bis kurz nach dem Nulldurchgang ist er also auf Low-Pegel.

Nun hast du folgende Möglichkeiten ...

  • steigende Flanke -> Der Interrupt wird am Ende des Nulldurchgangs ausgelöst (INT0-Pin geht wieder auf High)
  • fallende Flanke -> Der Interrupt wird am Anfang des Nulldurchgangs ausgelöst (INT0-Pin geht auf Low)
  • Pegelwechsel -> Der Interrupt wird am Anfang und Ende des Nulldurchgangs ausgelöst (also 2x weil der Nulldurchgang auch 2 Pegelwechsel hat)
  • Low Pegel -> Der Interrupt wird immer wieder neu während des Nulldurchgangs ausgelöst (also zig Aufrufe der Interruptroutine so lange der Pegel Low ist)

Gruß
Dino

Hallo Dino,
sehr schön erklärt. :)
Ich bau' mir mal eine Thyristosschaltung auf kleinerer Basis auf. Denn hier rappelt es ordentlich. ;-)

Bei mir hängts am konkreten Beispiel.
Den Int0 hatte mir gestern LotadaC schon schmackhaft gemacht. Jetzt habe ich es mal damit versucht.
Gut also, der INT0 wird ausgelöst. Es wird die Routine
Code:
ISR(INT0_vect)        // interrupt service routine
{              // called when PCINT0 changes state
_delay_ms(5);
PORTB |= (1 << Ausgang);
_delay_ms(1);
PORTB &= ~(1 << Ausgang);
return;
}

Code:
MCUCR |= ( 1 << ISC00) | (1 << ISC01); //Steigende Flanke
GIMSK |= (1 << INT0);
sei();

*/

Wenn ich es richtig verstehe wird nun nach (theoretisch) Nulldurchgang
gestartet, richtig ?
Nach eine Zeit von 5 ms wird der Ausgang gesetzt und nach 1 ms wird zurückgesetzt ?!?

Die Routine soll im Ladegerät aber vielleicht 2 Sekunden laufen, dann soll der Interruot gelöscht werden.
Am Int0 / PB1 liegen nun 2,5 Vspitze, gleichgerichtet ohne Elko...
 
Willst Du hier lediglich verhindern, daß der Thyristor fern des Nulldurchganges zündet, im worst case gerade bei maximaler Amplitude? (dafür brauchst Du keinen Anschnitt, sondern nur die Nulldurchgangsdetektion. Für sowas gibt es zumindest bei Optokopplern/Optotriacs welche mit integrierter Nulldurchgangsdetektion. Aber das kannst Du natürlich auch extern über einen AVR realisieren. Oder mit irgendwelchen diskreten Bauteilen.)
Oder willst Du wirklich den Phasenanschnitt verwenden, um Anschnittswinkel über mehrere/viele Halbperioden hinweg langsam zurückzudrehen?

Edit: INT0 als level, steigende, fallende oder beide Flanken konfiguriert?

Hi LotadaC,
ne, es soll später durchschalten um den Strom zu begrenzen... und damit auf die Leistung.
Eine Optko mit Detektor würde dies ja verhindern.
Den Code habe ich unten gepostet.
Gruß
 
Mal wieder sehr schön...
Da normalerweise während einer ISR weitere Unterbrechungen unterdrückt werden (könnte man zwar in der ISR auch aufheben, aber das lassen wir erstmal), geht es Dir hier nicht wie in der Realität:
...Du sitzt am PC und arbeitest so vor dich hin. Dann kommt einer in den Raum gestürzt und schreit: "Sofort Müll rausbringen!" (Das ist der Interrupt). Du unterbrichst deine aktuelle Arbeit und...
schnappst Dir Deine Schlüssel und den Mülleimer. Du bist gerade an der Tür, als es wieder tönt: "Wolltest Du mir hier nich noch'n Haken in die Wand machen, für das Bild!?"
Du läßt also den Müll an der Tür stehen, marschierst direkt in den Keller, holst Bohrmaschine usw. Du setzt die gerade an, als ein deutliches "Einkauf aus dem Auto holen, aber dalli!!" zu hören ist.
Du läßt also die Maschine an der Wand liegen, und holst den Einkauf rein.
Anschließend erinnerst Du Dich an den Haken, Du findest Die Maschine an der Wand wieder, bohrst das Loch, bringst den Haken an.
Jetzt steht nur noch der Müll an der Tür , den Du jetzt rausbringen kannst.
...Danach machst du wieder am PC weiter (Rücksprung aus der ISR und Stackpointer und Programmcounter wieder herstellen)
...
Wie gesagt, normalerweise werden weitere IRQs beim Eintritt in eine ISR global blockiert (sozusagen ein CLI - das gegenteil vom SEI).
ABER die Sache ist eben doch etwas anders.
Die (meisten) einzelnen Interrupts brüllen Dich nicht an, sondern kleben Dir eher 'n Zettel an den Monitor. Machen Dir einen Knoten ins Taschentuch. Die ziehen ein Fähnchen hoch. Das machen die auch, während die IRQs global gesperrt sind (CLI), oder der entsprechende Interrupt nicht scharf ist. In diesen beiden Fällen wird eben bloß nicht unterbrochen.

Am Beispiel des PCINT ist das beim Tiny13 das PCIF-Bit (PinChangeInterruptFlag = Bit5) im GIFR (General Interrupt Flag Register.
aus dem Datenblatt auf Seite 47 schrieb:
•Bit 5 – PCIF: Pin Change Interrupt Flag When a logic change on any PCINT5:0 pin triggers an interrupt request, PCIF becomes set (one). If the I-bit in SREG and the PCIE bit in GIMSK are set (one), the MCU will jump to the corresponding Interrupt Vector. The flag is cleared when the interrupt routine is executed. Alternatively, the flag can be cleared by writing a logical one to it.

Wenn also der PCINT scharf ist (PCIE) und Interrupts global auch (I in SREG), und ein Flankenwechsel das PCIF-Fähnchen hochkurbelt, wird das Programm unterbrochen, und die ISR ausgeführt. Dabei werden zuerst Interrupts global unterdrückt (I in SREG), und das PCIF-Fähnchen wieder runtergekurbelt.
beim Verlassen der ISR werden die Interrupts global wieder freigegeben (I in SREG).

Während der ISR können nun aber andere Interrupt-Fähnchen hochgekurbelt worden sein, insbesondere auch wieder das PCIF, wenn ein entsprechender Flankenwechsel erfolgte, klar. In diesem Falle springt die Interrupt-Hardware nach dem neu-schärfen der globalen IRQs (I in SREG) auf die Fähnchen an, der nächste IRQ wird abgearbeitet.
Die Fähnchen bleiben ja oben, bis sie Durch eine ISR oder Dein Programm selbst runtergeholt werden.
Und was, wenn während einer ISR nun 2 relevante Flanken erfolgen, das Fähnchen also wieder gesetzt wird, und dann gleich (also vor der entsprechenden ISR) nochmal gesetzt werden soll. dann ist es immer noch gesetzt, hier wird dann also nur noch einmal reagiert.

Das Fähnchen des INT0 ist das INTF0-Bit im GIFR. Für den INT0 kannst Du einstellen, bei welcher Flanke das Fähnchen gehisst werden soll, dann ist es ähnlich wie beim PCINT:
•Bit 6 – INTF0: External Interrupt Flag 0 When an edge or logic change on the INT0 pin triggers an interrupt request, INTF0 becomes set (one). If the I-bit in SREG and the INT0 bit in GIMSK are set (one), the MCU will jump to the corresponding Interrupt Vector. The flag is cleared when the interrupt routine is executed. Alternatively, the flag can be cleared by writing a logical one to it. This flag is always cleared when INT0 is configured as a level interrupt.
Der INT0 kann aber auch auf das auslösen bei einem low-Pegel eingestellt werden (ist der default wert). Dann wird das Fähnchen nicht genutzt, der Pegel des Beinchens (invertiert) ist dann Quasi das Fähnchen. Folglich wartet hier das quasi-Flag nicht auf die ISR, wechselt der Pegel wieder auf High, ist das Interrupt Signal weg. Ist der Pegel low und I in SREG scharf, wird die INT0-ISR angesprungen.
 
Mal wieder sehr schön...
Da normalerweise während einer ISR weitere Unterbrechungen unterdrückt werden (könnte man zwar in der ISR auch aufheben, aber das lassen wir erstmal), geht es Dir hier nicht wie in der Realität:

schnappst Dir Deine Schlüssel und den Mülleimer. Du bist gerade an der Tür, als es wieder tönt: "Wolltest Du mir hier nich noch'n Haken in die Wand machen, für das Bild!?"
Du läßt also den Müll an der Tür stehen, marschierst direkt in den Keller, holst Bohrmaschine usw. Du setzt die gerade an, als ein deutliches "Einkauf aus dem Auto holen, aber dalli!!" zu hören ist.
Du läßt also die Maschine an der Wand liegen, und holst den Einkauf rein.
Anschließend erinnerst Du Dich an den Haken, Du findest Die Maschine an der Wand wieder, bohrst das Loch, bringst den Haken an.
Jetzt steht nur noch der Müll an der Tür , den Du jetzt rausbringen kannst.

Wie gesagt, normalerweise werden weitere IRQs beim Eintritt in eine ISR global blockiert (sozusagen ein CLI - das gegenteil vom SEI).
ABER die Sache ist eben doch etwas anders.
Die (meisten) einzelnen Interrupts brüllen Dich nicht an, sondern kleben Dir eher 'n Zettel an den Monitor. Machen Dir einen Knoten ins Taschentuch. Die ziehen ein Fähnchen hoch. Das machen die auch, während die IRQs global gesperrt sind (CLI), oder der entsprechende Interrupt nicht scharf ist. In diesen beiden Fällen wird eben bloß nicht unterbrochen.

Am Beispiel des PCINT ist das beim Tiny13 das PCIF-Bit (PinChangeInterruptFlag = Bit5) im GIFR (General Interrupt Flag Register.


Wenn also der PCINT scharf ist (PCIE) und Interrupts global auch (I in SREG), und ein Flankenwechsel das PCIF-Fähnchen hochkurbelt, wird das Programm unterbrochen, und die ISR ausgeführt. Dabei werden zuerst Interrupts global unterdrückt (I in SREG), und das PCIF-Fähnchen wieder runtergekurbelt.
beim Verlassen der ISR werden die Interrupts global wieder freigegeben (I in SREG).

Während der ISR können nun aber andere Interrupt-Fähnchen hochgekurbelt worden sein, insbesondere auch wieder das PCIF, wenn ein entsprechender Flankenwechsel erfolgte, klar. In diesem Falle springt die Interrupt-Hardware nach dem neu-schärfen der globalen IRQs (I in SREG) auf die Fähnchen an, der nächste IRQ wird abgearbeitet.
Die Fähnchen bleiben ja oben, bis sie Durch eine ISR oder Dein Programm selbst runtergeholt werden.
Und was, wenn während einer ISR nun 2 relevante Flanken erfolgen, das Fähnchen also wieder gesetzt wird, und dann gleich (also vor der entsprechenden ISR) nochmal gesetzt werden soll. dann ist es immer noch gesetzt, hier wird dann also nur noch einmal reagiert.

Das Fähnchen des INT0 ist das INTF0-Bit im GIFR. Für den INT0 kannst Du einstellen, bei welcher Flanke das Fähnchen gehisst werden soll, dann ist es ähnlich wie beim PCINT:

Der INT0 kann aber auch auf das auslösen bei einem low-Pegel eingestellt werden (ist der default wert). Dann wird das Fähnchen nicht genutzt, der Pegel des Beinchens (invertiert) ist dann Quasi das Fähnchen. Folglich wartet hier das quasi-Flag nicht auf die ISR, wechselt der Pegel wieder auf High, ist das Interrupt Signal weg. Ist der Pegel low und I in SREG scharf, wird die INT0-ISR angesprungen.
Code:
sei();
_delay_ms(2000);
cli();
  PORTB |= (1 << Ausgang);
Dann wäre der Interrupt nur 2 Sekunden aktiv.
Der Akku würde über Phasenanschnitt angesteuert.
Nach 2 Sekunden wird der Thyristor voll durchgeschaltet.

Mal was anderes... kann man die Antworten auch über ein MailClient schreiben, oder muss man immer über die Seite hier antworten?
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)