was passiert mit den Ausgängen im Falle einer Brown-Out detection

OP #1204544
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.
Gast #1204660
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.
OP #1204758
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
}
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren