Gast
#892270
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