#define F_CPU3686400 #include #include #include int16_t einlesen (int16_t istwert); //Einlesefunktion der Ausgangsspannung am Filter int16_t pidsense; /////////////////////////////Funktionen dienen ausschliesslich dem PRINT-Befehl///////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //---------------------------------------------------------------------- void initUART() { UBRRL = 23; //9600Baud siehe Baudratentabelle UCSRB = 8 + 16; //Sender enable, Empfänger enable } //---------------------------------------------------------------------- char getChar() { char data=0; //warte bis RX-complete RXC UCSRA / USR bei z.B.: AT090S2313 while (!(UCSRA&128)); //empfangen data=UDR; return data; } //---------------------------------------------------------------------- void putChar(char data) { //warte bis UDR leer ist UCSRA / USR bei z.B.: 2313 while (!(UCSRA&32)); //sende UDR=data; } void print(char buffer[]) { for (int i=0;buffer[i]!=0;i++) putChar(buffer[i]); } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// int main (void) { //Hauptprogramm //Initialisierung der Hardware TCCR1A=(1<%d<----",pidsetpoint); //Bestätigung für Eingabe print(buffer); print("P Anteil\n"); zeichen=getChar(); //Wert einlesen putChar(zeichen); //Funktion aufrufen sprintf(buffer,"K_p--->%d<----",zeichen); //Bestätigung für Eingabe print(buffer); atoi(&zeichen); //Rückgabewert in integer wandeln P=zeichen; print("I Anteil\n"); zeichen=getChar(); //Wert einlesen putChar(zeichen); //Funktion aufrufen sprintf(buffer,"K_i--->%d<----",zeichen); //Bestätigung für Eingabe print(buffer); atoi(&zeichen); //Rückgabewert in integer wandeln I=zeichen; //Wert in i-Glied speichern print("D Anteil\n"); zeichen=getChar(); //Wert einlesen putChar(zeichen); //Funktion aufrufen sprintf(buffer,"K_d--->%d<----",zeichen); //Bestätigung für Eingabe print(buffer); atoi(&zeichen); //Rückgabewert in integer wandeln D=zeichen; //Wert in D-Glied speichern //Ende der Initialisierung der Variablen// while(1) //<-----Do While Schleife für Timer { pidsetpoint=einlesen(0); pidsense=einlesen(1); err_2=err_1; err_1=err_0; err_0=pidsetpoint-pidsense; pidoutput=pidoutput+P*(err_0-err_1); pidoutput=pidoutput+I*(err_1); pidoutput=pidoutput+D*(err_0-2*err_1+err_2); help=pidoutput/65; if (help>1023) //Signalbegrenzung Start { help=1023; //Vergleichwert für PWM } else if (help<1) //Signalbegrenzung Start { help=1; //Vergleichwert für PWM } else { help=help; //Vergleichwert für PWM } OCR1A=help; if(pidsense==pidsetpoint) { sprintf(buffer, "\n------>%d<-------", index); print(buffer); } else { sprintf(buffer, "\n%d", pidsense); print(buffer); } } return 0; //Ende der Whileschleife } // Ende es Hauptprogramms //Anfang einlesen int16_t einlesen (int16_t istwert) { int index; int ergebnis; ADCSRA=(1<