Feste Zeit für PID Regler

Hallo!
Ich möchte einen PID mit einem Arduino UNO programmieren und bräuchte eine Art feste Zeitebene damit er
immer in der gleichen Zeit aufgerufen wird.
Wie mach ich das mit dem Arduino?
Gruß Hans

Am einfachsten?
Damit: http://playground.arduino.cc/Code/PIDLibrary

Ja, die PID-Library hat das bereits eingebaut, und du kannst die Abtastung auch einstellen.

Falls du den PID wirklich selbst programmieren willst, empfiehlt sich ein Zeitscheibenmodell:

/**************************************************************************************
**   Beginn Zeitscheibe  100ms                                                       **
**************************************************************************************/
  static unsigned long 	Zeitscheibe_1 = 0; 
  if (millis()> Zeitscheibe_1 )    // Zeitscheibe wird alle 100ms aufgerufen
  { Zeitscheibe_1  = millis()+100;  
  
  // Deine Befehle, die alle 100ms aufgerufen werden sollen.
  
  }// end Zeitscheibe 100ms

Ja genau sowas meinte ich.
Ich muss sie erst mal ausprobieren.
Danke schon mal.

... und wenn ich jetzt nochmal eine Zeitscheibe haben will?
z.B. 1. mit 1000ms für Displayausgabe etc.
2. eine mit 20ms

geht das dann so?

[size=10pt]
//////////////////////////////////////////////////////////////////////////////
// Programmname:
//
//////////////////////////////////////////////////////////////////////////////
//Includedateien


//Definitionen

//### SETUP ################################################
void setup()
{
 Anweisungen;
}


//### Main Loop #############################################
void loop()
{
           {
              Anweisungen;
           }

           {
              Anweisungen;
           }

//*** Beginn 50ms Zeitscheibe ******************************************************
  static unsigned long 	Zeitscheibe_1 = 0; 
  if (millis()> Zeitscheibe_1 )                             // Aufruf alle 50ms 
  { 
  Zeitscheibe_1  = millis()+50;    
  // Befehle, die alle 50ms aufgerufen werden sollen.  
  }// end Zeitscheibe 50ms 


//*** Beginn 500ms Zeitscheibe ******************************************************
  static unsigned long 	Zeitscheibe_2 = 0; 
  if (millis()> Zeitscheibe_2 )                            // ZAufruf alle 500ms 
  { 
  Zeitscheibe_1  = millis()+500;    
  // Befehle, die alle 500ms aufgerufen werden sollen.  
  }// end Zeitscheibe 500ms 

}

//### Unterprogramme ##########################################
[color=red]// Sind die hier richtig plaziert,  
Oder müssen die vor die letzte Klammer der void loop()?[/color]
void motor_vor()
  {
    Anweisungen;
  }  

void motor_zurück()
  {
    Anweisungen;
  }  
//### Programmende ### Programmende ### Programmende ### Programmende ### Programmende

[/size]

Ich nutze die ProtoThread Lib.

Hans01:
... und wenn ich jetzt nochmal eine Zeitscheibe haben will?
z.B. 1. mit 1000ms für Displayausgabe etc.
2. eine mit 20ms

geht das dann so?

Im Prinzip ja.
Die Zeitscheiben aufrufe müssen in die Loop().
Und in der 500ms Schleife müssen alle Zeitscheibe_2 heißen.

Bei einem mußt du sehr aufpassen: Die Funktionen, die in den Zeitscheiben sind, müssen deutlich kürzer laufen, als die kürzeste Zeitscheibe.
z.B. die Laufzeiten der Funktionen in einer Zeitscheibe sollten in Summe unter ca. 40ms liegen!
Wenn du in der 500ms Scheibe irgendwelche Funktionen hast, die länger als 50ms laufen, wird die 50ms Scheibe nicht mehr rechtzeitig aufgerufen.

WEnn du das anders brauchst, mußt du ein Interrupt basiertes Zeitscheibenmodell bauen.

Danke für die Info Günther!
Ich werds mal ausprobieren.

Das mit der "ProtoThread.Lib".
=> Hab ich nicht gefunden.
Schade auch, dass man keinen fertigen sketch mit 2 oder 3 funktionierenden Zeitscheiben (ohne Lib) für den Arduino findet.

Gruß Hans

...weil man es in Wirklichkeit fast nie so genau braucht.

Sowas kann man sich recht easy selber machen, mit nem milis()-Zähler. Ob nun das Display eine oder 10 ms später aktualisiert wird-wen interessierts.
Den Nachteil hatte dir ja guntherb schon genannt.

Hans01:
Schade auch, dass man keinen fertigen sketch mit 2 oder 3 funktionierenden Zeitscheiben (ohne Lib) für den Arduino findet.

Das hat denselben Grund, warum Du im Supermarkt keine fertigen Spiegeleier mit Speck oder Rührei mit Schnittlauch fertig gebraten im Regal stehen siehst: Du kannst es Dir aus den Zutaten in fünf Minuten selbermachen!

Codebeispiel:

// Funktionen im Takt abarbeiten, Demo by 'jurs' for German Arduino-Forum
void setup() {
  Serial.begin(9600);  
}

boolean halbSekundenTakt()
// liefert true falls seit dem letzten Aufruf ein neuer Takt begonnen hat
{
  static unsigned long prevMillis;
  boolean result=false;
  while( millis() - prevMillis >= 500){
    prevMillis += 500;	
    result=true;
  }
  return result;
}

boolean dreiSekundenTakt()
// liefert true falls seit dem letzten Aufruf ein neuer Takt begonnen hat
{
  static unsigned long prevMillis;
  boolean result=false;
  while( millis() - prevMillis >= 3000){
    prevMillis += 3000;	
    result=true;
  }
  return result;
}

boolean vierdreiviertelSekundenTakt()
// liefert true falls seit dem letzten Aufruf ein neuer Takt begonnen hat
{
  static unsigned long prevMillis;
  boolean result=false;
  while( millis() - prevMillis >= 4750){
    prevMillis += 4750;	
    result=true;
  }
  return result;
}


void loop() 
{
  if (halbSekundenTakt())
  {
    Serial.print("1/2 sec Tick ");
    Serial.println(millis());
  }  
  if (dreiSekundenTakt())
  {
    Serial.print("Jetzt sind 3 Sekunden um! ");
    Serial.println(millis());
  }  
  if (vierdreiviertelSekundenTakt())
  {
    Serial.print("Jetzt sind 4,75 Sekunden um! ");
    Serial.println(millis());
  }  
  // Rest des loop-Codes hier
}

Super, Danke!