Gast
#1759746
hallo ich schreibe ein Programmiere ein Pi Regelr das programm funktioniert Interrupt gesteuert. in dem ISR lese ich die ADC kanäle ( soll und ist) und rufe die Funktion, die den Regler berechnet.Das Program funkitoniert noch nicht richtig. ADc und DAC sind schon Ok. nur die Regelung funktioniert nicht gut. ich bitte deswegen um Hilfe. ich habe das Algorithmus von der Seite folgenden Seite: http://www.rn-wissen.de/index.php/Regelungstechnik . Habe vielleicht was im Program vergessen? ist mein ISR korrekt geschrieben? das Interrupt kommt alle 10ms. zeit ist #include <ADuC7020.h> #include "header.h" volatile int i=0; volatile in j=0; int esum; int y; // Stellglied int Regler( int x, int w) { int e; // aktuelle Reglerabweichung int yp; // P_Anteil int yi; // I-Anteil e=x-w; // Regelabweichung berechnen if((y>=0)&& (y<4096)) // Begrenzung für I-Anteil { esum=esum + e; } yp=kp*e; yi=ki*Ta*esum; y= yp + yi; /* Stellglied Begrenzung */ if(y<0){ y=0; // Stellglied auf sein Minimaler Wert begrenzen } else if(y>4095){ y=4095; // Stellglied Auf sein Maximaler Wert 4095 begrenzen } return y; } ISR_timerInter(void){ if((IRQSTA & RTOS_TIMER_BIT) !=0) { T0CLRI= 0; //Timer0 clearen ADCCON = 0x6A0; // single-ended Mode, start konv. ADCCP=0; // kanal Auswahl ADCCON = 0x6A3; // software conv., single-ended, Konversion. starten while (!ADCSTA){}; // warten bie Ende der Wandlung ist = ADCDAT ; // Ergebnis der Wandlung ADCCON = 0x6A0; ADCCP = 3; // Auswahl kanal 3 für Spannungssollwert ADCCON=0x6A3; // software conv., single-ended, conv. starten while (!ADCSTA){}; // warten bis End der Wandlung soll = ADCDAT ; stellglied=Regler(ist, soll) DAC=stellglied j++; // zähler nach jedem Timer Interrupt } return; } Maon(){ init systen init timer interrupt enable while(1){ if(j==i); i=j; ein andere aufagbe ---- Uart } }