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 | }
|