mikrocontroller.net

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


Autor: Leo B. (luigi)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Uwe ... (uwegw)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Leo B. (luigi)
Datum:

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

Vielen dank.

Autor: was-willst-du (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Leo B. (luigi)
Datum:
Angehängte Dateien:
  • preview image for 5.png
    5.png
    3,78 KB, 198 Downloads

Bewertung
0 lesenswert
nicht 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
#define F_CPU 9600000    // Clock in Hz
#define OFF_DELAY_MS 750  // Tasterdrückzeit zum Ausschalten in ms

#define SINUS_TABLE_LENGTH ( sizeof(sinustabelle) / sizeof(sinustabelle[0]) )
#define OFF_DELAY ( OFF_DELAY_MS * ( F_CPU / 256000 ) )    // Tasterdrückzeit zum Ausschalten in Zählerschritten

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <util/delay.h>

const uint8_t sinustabelle[] PROGMEM= {0,40,79,116,150,180,206,227,243,252,255};

int main( void ) {
  OCR0A=0;                      // Pulsweite von OC0A auf 0
  OCR0B=0;                      // Pulsweite von OC0B auf 0
  TCCR0A = (1<<COM0A1) | (1<<COM0B1) | (1<<WGM01) | (1<<WGM00);  // 2 x non Inverting PWM, Fast PWM Mode
  TCCR0B = (1<<CS00);                 // Prescaler: 1
  TIMSK0 = (1<<TOIE0);                // Interrupt on TOP einschalten
  PORTB = (1<<PB2);                  // PB2 auf 1 setzen, Rest auf 0.
  DDRB = (1<<PB0) | (1<<PB1) | (1<<PB2);        // PB0 (OC0A), PB1 (OC0B) und PB2 als Ausgang
  
  while ( PINB & (1<<PB4) );              // Warten bis Taster losgelassen wurde.

  _delay_ms(10);                    // Wegen evtl. Prellen 1ms warten  

  sei();                        // Interrupts aktivieren
  MCUCR = (1<<SE);                  // Sleepmode: idle, + enable

  while(1)
    __asm("SLEEP");                 // in Pausen schlafen geht
    
  return 0;
}

ISR(TIM0_OVF_vect) {
  static uint8_t counter = 0;              // Position in der sinustabelle
  static int8_t summand = 1;              // Sinustabelle rauf/runter (+1/-1) zählen
  static uint8_t oc_sel = 0;              // speichert welcher PWM-Ausgang aktiv ist. ( 0->OC0A; 1->OR0B )
  static uint16_t presscount = 0;            // Dient dem entprellen von S1, sodass nur sichere tastendrücke zum ausschalten führen
  uint8_t sinwert = 0;  
  counter += summand;                  // Sinustabelle rauf/runter zählen.
  sinwert  =  pgm_read_byte (& sinustabelle[counter]); // Sinustabelle auslesen.

  if ( oc_sel )                    // Wenn oc_sel == 1 dann ist OC0B gerade an der Reihe seine Halbwelle abzulaufen,
    OCR0B = sinwert;                // dann sinuswert in OC0B setzen,
  else                         // ansonsten ist OC0A dran.
    OCR0A = sinwert;

  if ( counter > SINUS_TABLE_LENGTH-2 )      // Wenn das letzte Element der Sinustabelle erricht ist,
    summand=-1;                 // Sinustabelle wieder zurück laufen
  if ( counter < 1 ) {              // Wenn wieder beim ersten Element der Sinustabelle angekommen,
    summand=+1;                  // Sinustabelle wieder vorwärts laufen
    oc_sel ^= 1;                // Auf anderen OC0_ Ausgang umschalten
  }

  if ( PINB & (1<<PB4) ){                // Wenn Pin 4 mit V+ verbunden ist (Taster gedrückt).
    if ( presscount < 65535 )
      presscount++;                // Zählen bis Maximalwert
  }
  else {
    presscount = 0;
  }
  if ( presscount > OFF_DELAY ) {
    TCCR0A &= ~( (1<<COM0A1) | (1<<COM0B1) );    // PWM-Ausgänge abschalten
    DDRB = 0;                    // Alles Eingänge
    PORTB = 0;                    // Alles aus und damit auch die Stromversorgung
    while(1)
      presscount++;                // warten bis der Kondensator leer ist
  }
}


Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Leo B. (luigi)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Alexander Schmidt (esko) Benutzerseite
Datum:

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

Autor: Leo B. (luigi)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Alexander Schmidt (esko) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.