#include #include "DAC.h" #include "ADC.h" #include "Regleralgorithmus.h" volatile double Kp=7.4; volatile double Tn=2.9; volatile double Tv=0.13; volatile double Ta=0.01; volatile double I; volatile double D; volatile int e; volatile int esum; volatile int ealt; volatile int x; volatile int y; volatile int w; int main (void) { timer1_init(); sei(); DACInit(); I=Kp/Tn; D=Kp*Tv; while (1) { w = ReadAdcChannel(1)-512; // MUX-Bits auf 0b0001 -> Channel 1 // Istwert einlesen x = ReadAdcChannel(0)-512; // MUX-Bits auf 0b0000 -> Channel 0 // Sollwert einlesen //y0=w/1.06; SetDAC(DACA, y+512); } return 0; } ******************************************************************************************** Header Datei von Regleralgorithmus ******************************************************************************************** #include #include "ADC.h" #include "Regleralgorithmus.h" #define DURCHLAEUFE 156; void timer1_init() { TCNT0 = 256-DURCHLAEUFE; // TCNT0 = Register in dem man den Startwert festlegt. /* 10-Bit Vorzaehler,wir wollten durch 1024 teilen, also CSO0=1 und CSO2=1 setzen: 16MHz/1024=15625Hz */ TCCR0 = (1 << CS02)|(1 << CS00); // Timer Takt auf 16MHz/1024 /* Interrupt bei Overflow aktivieren TIMSK = (1<< TOIE0); // Deshalb TOIE0 (Timer/Counter0 Overflow Interrupt Enable) = 1 /* Alle Interrupts erlauben mit der Funktion sei () */ sei (); } ISR (TIMER0_OVF_vect) { // Regeldifferenz bilden e = w - x; // aktuelle Regelabweichung bestimmen if ((y < 511)&&(y > -512)) // bei Übersteuertem stellglied Integration einfrieren { // (Anti-Windup) esum = esum + e; // Summe der Regelabweichung aktualisieren } y = (Kp*e)+(I*Ta*esum)+(D*(e-ealt)/Ta); //Reglergleichung ealt = e; //Regelabweichung für nächste Abtastung merken if (y > 511) // Stellgröße auf -511...+512 begrenzen (10 bit DAC) { y = 511; } if (y < -512) { y = -512; } // Neu laden, damit Timer nicht bei 0 beginnt TCNT0 = 256-DURCHLAEUFE; }