Forum: Mikrocontroller und Digitale Elektronik PWM und Interrupts


von Simon (Gast)


Lesenswert?

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,

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.