Hallo, Ich habe folgendes Problem. Mein Mikrocontroller (ADuC7020) liefert mir in den Interrupt(s) die Istwerte zu Reglerberechung. Da die Reglerberechnung zu lange dauert habe ich sie von der Interruptserviceroutine ins main() ausgelagert und sogar auf mehrere Perioden verteilt (20 KHz Takt). Dies ist in meiner Anwendung kein Problem, da der Regler langsamer laufen kann. Meine Struktur sieht also folgendermassen aus: //Hauptprogramm main() { ........... ........... while(1) { if (ConrtollerPart ==1 && DoFlag==1) { //Berechnung Reglerteil 1 ......... //Um mehrere Durchläufe durch einen Reglerteil zu vermeiden //das Flag hier rückgesetzt DoFlag = 0; } else if (ConrtollerPart ==2 && DoFlag==1) { //Berechnung Reglerteil 2 ......... //Um mehrere Durchläufe durch einen Reglerteil zu vermeiden //das Flag hier rückgesetzt DoFlag = 0; } else if (ConrtollerPart ==3 && DoFlag==1) { //Berechnung Reglerteil 3 ......... //Um mehrere Durchläufe durch einen Reglerteil zu vermeiden // wird das Flag hier rückgesetzt DoFlag = 0; } //Interrupt Servie Routine ISR() { Meßwerte holen... //Auswahl des aktuellen Berechnunsteils des Reglers für aktuelle Periode if (ControllerPart ==0) { ControllerPart ==1; } else if(ControllerPart ==1) { ControllerPart ==2; } else if(ControllerPart ==2) { ControllerPart ==3; } //DoFlag setzten um Reglerteilberechnung im main zu starten DoFlag =1; } Meine Frage ist, wie kann man das ganze eleganter lösen, da mit meiner bisherigen Struktur die ganze Kommunikation zwischen den variablen der ISR() und main() über globale variablen laufen muß. Kann man das ganze über Funktionspointer lösen. Ich habe damit schrecklich wenig Ahnung. hat jemand vielleicht eine Idee und wenn es möglich ein Beispiel Vielen Dank Gruß Samuel
Hallo Samuel, * also wenn der Regler langsamer laufen kann, dann die entgültige Reglerfrequenz festlegen und diese auch nutzen ! * Für die Regelwertberechnung machst Du Dir eine eigene Funktion könnte so aussehen: ISR (TimerX) { CDF = 1; // Controller dispatch flag setzten } void Controller_Dispatch () { Meßwerte holen... Berechnung ... Ausgabe ... } while (1) { if (CDF == 1) { Controller_Dispatch (); CDF = 0; // Reset controller dispatch flag resetten } else { tu was anderes ... oder schlaf' ... } } Grüße, Michael
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.