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

Gast #3345633
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

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.