Hallo zusammen,
ich habe etwas Probleme mit meinen Interrupts.
Und zwar möchte ich gerne mittels einer Interrupt-Routine innerhalb
einer Millisekunde zehn Sensorwerte erfassen und ihren Mittelwert
bilden. Dann soll im Hauptprogramm eine Art Flag s´gesetzt werden zur
Synchronisierung. Der das resultierende Ist-wert ist für einen Regler.
Dieser soll wiederum eintausend Nal pro Sekunde berechnet werden. Dann
errechnet ich dort den Stellwert, der wiederum die Pulsbreite des PWM
Signals sein soll.
Meinen Istwert hole ich über einen internen 10-Bit ADC und auch den
Regelalgorythmus (PID-Regler) habe ich.
Leider weiß ich aber nicht wie ich diese genauen Aufrufszeiten meiner
Interrupt-Routinen realisieren soll und wie ich die Register setzen
muss.
Außerdem wird ein ATmega 128 eingesetzt.
1 |
|
2 | sei(); // Interrupts freigeben
|
3 | // TIMER 1
|
4 | TIMSK= 0x94; // Interrupt freischalten, warum 0x94???
|
5 | TCCR1B= 0x02; // Timer läuft mit Prescaler 8
|
und
1 | ISR (TIMER1_COMPARE)// Vector 12
|
2 | {
|
3 | PORTA= aus; // Heizung aus
|
4 | }
|
5 |
|
6 | ISR (TIMER1_OVERFLOW)// Vector 14
|
7 | {
|
8 | e = temp - ist_temp; // Aktuelle Regeldifferenz bestimmen
|
9 | esum = esum + e; // Regeldifferenzen aufsummieren
|
10 | u = Kp*(e + (Ta/Tn)*esum + (Tv/Ta)*(e - ealt)); // PID Gleichung
|
11 | ealt = e; // Regeldifferenz für nächste Abtastung speichern
|
12 |
|
13 |
|
14 | if (u < 1)
|
15 | u = 0;
|
16 | if (u > 1023)
|
17 | u = 0x;
|
18 |
|
19 | OCR1A = u ; // setzt Vergleichsregister = Stellgröße
|
20 | PORTA= an; // Heizung an
|
21 | }
|
Vielleicht kann mir ja jemand bei der Realisierung dieser Zeiten helfen.
Vielen Dank und liebe Grüße,