Servus leute, ich habe folgendes Problem: Mein ATTiny13 steuert über 2 Transistoren einen Minitransformator an. Daher ist es absolut wichtig, dass niemals einer der Transistoren zu lange durchsteuert, da ansonsten der Transformator (oder irgend ein anderes Bauteil) an Überstrom sterben würde. Es muss also gewährleistet sein, dass sich der mC nicht "aufhängt". Daher möchte ich gerne (um Unterspannungsprobleme auszuschließen) die Brown-Out Detection aktivieren. Nur werde ich nicht fündig, was im Falle eines Brown-Out passiert. Schalten automatisch alle Ausgänge (auch OC0A und OC0B) auf 0? das wäre 1A. Oder kann ich das irgendwo definieren, was passieren soll? Danke euch schonmal.
Es passiert dasselbe wie beim externen Reset: alle Pins schalten auf hochohmig. Wenn die Pins in diesem Fall sicher auf low liegen sollen, brauchst du externe Pulldowns.
Naja, hochohmig sollte wohl reichen, dass ein handelsüblicher Transistor begrenzter Verstärkung ebenfalls hochohmig wird. Vielen dank.
Hängt von der Schaltung ab. Kann mir auch Schaltungen vorstellen, bei denen der Transistor durchschaltet, wenn der Ausgang des uC hochohmig wird. Du hast keine Aussage über Deine Beschaltung getroffen. Und was passiert, wenn das Programm versagt und stockt? Gibts da Maßnahmen, bevor der Transformator in Flammen aufgeht? Maßnahmen hardwaremaßig, natürlich.
Naja der mC hängt über einen Widerstand an der Basis des NPN-Transistors. Emitter liegt auf Masse und Collector geht zu einem Ende der Primärwicklung vom Trafo. Hardwareseitige Schutzschaltungen gibt es nicht. Dazu ist auf der 10 x 18mm großen Platine kein Raum mehr. Wenn es zu unvorhersehbaren komplikationen kommt (und dazu zähle ich unbegründetes Stocken des mC), dann hab ich wohl pech gehabt! Das Programm ist so kurz und einfach, da hoffe ich nicht, dass grobe Fehler drin sind. So zur Ergänzung kann ich ja mal Schaltplan und Code posten
1 | #define F_CPU 9600000 // Clock in Hz
|
2 | #define OFF_DELAY_MS 750 // Tasterdrückzeit zum Ausschalten in ms
|
3 | |
4 | #define SINUS_TABLE_LENGTH ( sizeof(sinustabelle) / sizeof(sinustabelle[0]) )
|
5 | #define OFF_DELAY ( OFF_DELAY_MS * ( F_CPU / 256000 ) ) // Tasterdrückzeit zum Ausschalten in Zählerschritten
|
6 | |
7 | #include <avr/io.h> |
8 | #include <avr/interrupt.h> |
9 | #include <avr/pgmspace.h> |
10 | #include <util/delay.h> |
11 | |
12 | const uint8_t sinustabelle[] PROGMEM= {0,40,79,116,150,180,206,227,243,252,255}; |
13 | |
14 | int main( void ) { |
15 | OCR0A=0; // Pulsweite von OC0A auf 0 |
16 | OCR0B=0; // Pulsweite von OC0B auf 0 |
17 | TCCR0A = (1<<COM0A1) | (1<<COM0B1) | (1<<WGM01) | (1<<WGM00); // 2 x non Inverting PWM, Fast PWM Mode |
18 | TCCR0B = (1<<CS00); // Prescaler: 1 |
19 | TIMSK0 = (1<<TOIE0); // Interrupt on TOP einschalten |
20 | PORTB = (1<<PB2); // PB2 auf 1 setzen, Rest auf 0. |
21 | DDRB = (1<<PB0) | (1<<PB1) | (1<<PB2); // PB0 (OC0A), PB1 (OC0B) und PB2 als Ausgang |
22 | |
23 | while ( PINB & (1<<PB4) ); // Warten bis Taster losgelassen wurde. |
24 | |
25 | _delay_ms(10); // Wegen evtl. Prellen 1ms warten |
26 | |
27 | sei(); // Interrupts aktivieren |
28 | MCUCR = (1<<SE); // Sleepmode: idle, + enable |
29 | |
30 | while(1) |
31 | __asm("SLEEP"); // in Pausen schlafen geht |
32 | |
33 | return 0; |
34 | }
|
35 | |
36 | ISR(TIM0_OVF_vect) { |
37 | static uint8_t counter = 0; // Position in der sinustabelle |
38 | static int8_t summand = 1; // Sinustabelle rauf/runter (+1/-1) zählen |
39 | static uint8_t oc_sel = 0; // speichert welcher PWM-Ausgang aktiv ist. ( 0->OC0A; 1->OR0B ) |
40 | static uint16_t presscount = 0; // Dient dem entprellen von S1, sodass nur sichere tastendrücke zum ausschalten führen |
41 | uint8_t sinwert = 0; |
42 | counter += summand; // Sinustabelle rauf/runter zählen. |
43 | sinwert = pgm_read_byte (& sinustabelle[counter]); // Sinustabelle auslesen. |
44 | |
45 | if ( oc_sel ) // Wenn oc_sel == 1 dann ist OC0B gerade an der Reihe seine Halbwelle abzulaufen, |
46 | OCR0B = sinwert; // dann sinuswert in OC0B setzen, |
47 | else // ansonsten ist OC0A dran. |
48 | OCR0A = sinwert; |
49 | |
50 | if ( counter > SINUS_TABLE_LENGTH-2 ) // Wenn das letzte Element der Sinustabelle erricht ist, |
51 | summand=-1; // Sinustabelle wieder zurück laufen |
52 | if ( counter < 1 ) { // Wenn wieder beim ersten Element der Sinustabelle angekommen, |
53 | summand=+1; // Sinustabelle wieder vorwärts laufen |
54 | oc_sel ^= 1; // Auf anderen OC0_ Ausgang umschalten |
55 | }
|
56 | |
57 | if ( PINB & (1<<PB4) ){ // Wenn Pin 4 mit V+ verbunden ist (Taster gedrückt). |
58 | if ( presscount < 65535 ) |
59 | presscount++; // Zählen bis Maximalwert |
60 | }
|
61 | else { |
62 | presscount = 0; |
63 | }
|
64 | if ( presscount > OFF_DELAY ) { |
65 | TCCR0A &= ~( (1<<COM0A1) | (1<<COM0B1) ); // PWM-Ausgänge abschalten |
66 | DDRB = 0; // Alles Eingänge |
67 | PORTB = 0; // Alles aus und damit auch die Stromversorgung |
68 | while(1) |
69 | presscount++; // warten bis der Kondensator leer ist |
70 | }
|
71 | }
|
Bei dieser Schaltung wäre ein bischen Pulldown nicht unpraktisch. Jeder in die Basis von Q4 induzierte Strom taucht um hFE(Q4)*hFE(Q3) vestärkt als Strom für den Controller auf. Könnte zu spontanen Einschalteffekten führen.
Oha des hab ich ja ganz übersehen. Danke dir, den werd ich noch irgendwo draufquetschen. So n SMD-Widerstand geht ja immer irgendwie noch drauf ;-) Danke dir.
Das wird wohl ein Wechselrichter werden. Funktioniert das mit der PWM und dem Trafo so? Gibt das beim ausschalten des Transistors keine Spannungsspitzen?
Jo das muss so funktionieren. Hat einfach keine andere Wahl, aber Spannungsspitzen bis 80V erlaube ich ihm. Darüber darf er einfach nicht kommen. Sollte er doch, dann hab ich ein Problem! Abwarten.
Wäre interessant wenn du die fertige Schaltung mal oszilloskopierst, das wirst du wahrscheinlich eh machen müssen, und ein paar Bilder zeigen könntest.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.