www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Berechnung ausserhalb Interrupt / Rechenzeit aufteilen


Autor: Samuel Rapp (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Michael K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.