Forum: Mikrocontroller und Digitale Elektronik was passiert mit den Ausgängen im Falle einer Brown-Out detection


von Leo B. (luigi)


Lesenswert?

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.

von Uwe .. (uwegw)


Lesenswert?

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.

von Leo B. (luigi)


Lesenswert?

Naja, hochohmig sollte wohl reichen, dass ein handelsüblicher Transistor 
begrenzter Verstärkung ebenfalls hochohmig wird.

Vielen dank.

von was-willst-du (Gast)


Lesenswert?

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.

von Leo B. (luigi)


Angehängte Dateien:

Lesenswert?

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
}

von (prx) A. K. (prx)


Lesenswert?

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.

von Leo B. (luigi)


Lesenswert?

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.

von Alexander S. (esko) Benutzerseite


Lesenswert?

Das wird wohl ein Wechselrichter werden.
Funktioniert das mit der PWM und dem Trafo so?
Gibt das beim ausschalten des Transistors keine Spannungsspitzen?

von Leo B. (luigi)


Lesenswert?

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.

von Alexander S. (esko) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.