#include #include "global.h" #include "ADC.h" #include "timer.h" #define DURCHLAEUFE 16; void timer0_init() { /************************************************************************************************ * * Timer0 alle 1ms aufrufen !!! * ***************************************************************/ TCNT0 = 256-DURCHLAEUFE; // Startwert festlegt. TCCR0 |= (1 << CS02)|(1 << CS00); // Timer Takt Vorteiler=1024 // => 16MHz/1024=15625Hz TIMSK |= (1<< TOIE0); // Interrupt für Overflow aktivieren sei (); // Alle Interrupts erlauben } /****************************************************************************************** * * Interrupt Routine: PID Algorithmus !!! * ***************************************************************/ ISR (TIMER0_OVF_vect) { e = w - x; y_kp = Kp*e; // Regeldifferenz bilden if ((y_i < 511)&&(y_i> -512)) // bei Übersteuertem stellglied Integration einfrieren(Anti-Windup) { esum = esum + e; // Summe der Regelabweichung aktualisieren } y_i= esum*Ki; y_R = y_i + y_kp; D=x_alt-x; x_alt=x; y_d= D*Kd; y_R =y_R + y_d; //Regelabweichung für nächste Abtastung merken if (y_R > 511) // Stellgröße auf -511...+512 begrenzen (10 bit DAC) { y_R = 511; } if (y_R < -512) { y_R = -512; } TCNT0 = 256-DURCHLAEUFE; // Neu laden, damit Timer nicht bei 0 beginnt }