Timer läuft immer weiter, sollte aber stoppen und bei null beginnen

Gast #3345633
Lesenswert?

Hallo,

ich bin dabei eine Phasenanschnittsteuerung für eine 
B2-Stromrichterschaltung auf dem ATMega2561 zu programmieren. Hierfür 
werden netzsynchrone Zündimpulse zum Einschalten von Thyristoren 
berechnet und übergeben.
Für eine Regelung wird allerdings noch die Stromleitdauer der 
Thyristoren benötigt. Diese wird mit einer Optokopplerschaltung 
ermittelt und dann an den PIN PD1 als TTL-Signal (grüner Verlauf) 
übergeben.
Die Dauer des Signals soll über den Timer3 gemessen werden.

Der Timer3 soll im Zündzeitpunkt der Thyristoren bei null starten und in 
der ISR (INT1), durch die positive Flanke des grünen Verlaufs ausgelöst, 
in LAMBDA geschrieben werden.

Das Problem besteht aber darin, dass der Timer3 im Interupt1 nicht 
aufhört zu zählen und den Wert in LAMBDA kontinuierlich erhöht.
Wie kann ich den Timer3 nach dem Übergeben des Zählerstandes stoppen, so 
dass dieser bei der nächsten Zündung wieder bei null anfängt zu zählen?
1
ISR (INT0_vect)        
2
{
3
  leitdauerErkennung1 = 1;
4
  TCNT1 = 0;
5
  TCNT4 = 0;
6
  ALPHAnutz = ALPHArech;
7
  OCR1A = ALPHAnutz;
8
  LAMBDA = LAMBDAmess;
9
}
10

11
ISR (INT1_vect)        
12
{
13
  EIMSK &= ~(1<<INT1);        
14

15
  if(leitdauerErkennung1)
16
  {
17
    leitdauerErkennung1 = 0;
18
    LAMBDA1 = TCNT3;         
19
    TCCR3B = 0x00;          
20
  }
21

22
  if(leitdauerErkennung2)
23
  {
24
    leitdauerErkennung2 = 0;
25
    LAMBDA2 = TCNT3;
26
    TCCR3B = 0x00;
27
    LAMBDAmess = (LAMBDA1 + LAMBDA2) / 2;
28
  }
29
}
30

31
ISR (TIMER1_COMPA_vect)        //Zündung erste Halbwelle
32
{
33
  if(gezuendet)
34
  {
35
  zweiteHalbwelle = 1;
36
  ausschaltsicherung = 0;
37
        weiterZuenden = 1;
38

39
  if(drehrichtung)
40
  {
41
     //PORTA |= (1<<PINA7);      
42
  }
43
  else
44
  {
45
  PORTA |= (1<<PINA4);      
46
  EIMSK |= (1<<INT1);        
47
  TCCR3B = 0x02;        
48
//   TCNT3 = 0;
49
  }
50

51
  OCR1B = ALPHAnutz + 400;      
52
  }
53
}
54

55
ISR (TIMER1_COMPB_vect)      //Löschen aller gezündeten Pins
56
{
57
  if(gezuendet)
58
  {
59
    if(weiterZuenden)
60
    {
61
      ausschaltsicherung = 1;
62

63
        PORTA &= ~(1<<PINA4);    
64
        PORTA &= ~(1<<PINA5);  
65
        PORTA &= ~(1<<PINA6);    
66
        PORTA &= ~(1<<PINA7);    
67

68
      if(zweiteHalbwelle)
69
      {
70
        zweiteHalbwelle = 0;
71
        OCR1C = ALPHAnutz + 20000;
72
      }
73
      else
74
      {
75
        weiterZuenden = 0;
76
      }
77
    }
78
  }
79
}
80

81
ISR (TIMER1_COMPC_vect)        //Zündung zweite Halbwelle
82
{
83
  if(gezuendet)
84
  {
85
    if(weiterZuenden)
86
    {
87
      ausschaltsicherung = 0;
88

89
      if(drehrichtung)
90
      {
91
        //PORTA |= (1<<PINA6);    
92
      }
93
      else
94
      {
95
        PORTA |= (1<<PINA5);    
96
        EIMSK |= (1<<INT1);      
97
        TCCR3B = 0x02;      
98
//        TCNT3 = 0;
99
      }
100

101
      OCR1B = ALPHAnutz + 20400;    
102
    }
103
  }
104
}
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