Arduino Forum

International => Deutsch => Topic started by: HaWe on Jul 04, 2014, 11:29 pm

Title: [gelöst:] PID library - funktioniert [-nicht-]
Post by: HaWe on Jul 04, 2014, 11:29 pm
hallo,
ich versuche mich an der PID library http://playground.arduino.cc/Code/PIDLibrary
Ich habe den ordner PID_v1 nach c:\programme\Arduino\Libraries kopiert,
das Demo programm geladen
und als pid1000 gespeichert.

Code: [Select]

/********************************************************
* PID Basic Example
* Reading analog input 0 to control analog PWM output 3
********************************************************/

#include <PID_v1.h>

//Define Variables we'll be connecting to
double Setpoint, Input, Output;

//Specify the links and initial tuning parameters
PID myPID(&Input, &Output, &Setpoint,2,5,1, DIRECT);

void setup()
{
 //initialize the variables we're linked to
 Input = analogRead(0);
 Setpoint = 100;

 //turn the PID on
 myPID.SetMode(AUTOMATIC);
}

void loop()
{
 Input = analogRead(0);
 myPID.Compute();
 analogWrite(3,Output);
}


Fehlermeldung:
Quote

Arduino: 1.5.6-r2 (Windows XP), Board: "Arduino Duemilanove or Diecimila, ATmega168"

pid1000:12: error: 'PID' does not name a type
pid1000.ino: In function 'void setup()':
pid1000:21: error: 'myPID' was not declared in this scope
pid1000:21: error: 'AUTOMATIC' was not declared in this scope
pid1000.ino: In function 'void loop()':
pid1000:27: error: 'myPID' was not declared in this scope


was ist falsch und fehlt ?
Title: Re: PID library - funktioniert nicht
Post by: Rabenauge on Jul 05, 2014, 01:08 am
Ich würd sagen, die Bibliothek wird nicht gefunden.
Falscher Pfad?
Meine selber hinzugefügten sind in den eigenen Dateien/Arduino/libraries.

Du kannst auch mal versuchen, die Datei mittels Import reinzuholen.
Oben in irgendeinem Menü der IDE...
Title: Re: PID library - funktioniert nicht
Post by: HaWe on Jul 05, 2014, 09:54 am
was heißt das jetzt?
Arduino\libraries ist bei mir eben in c:\Programme\...
ich hatte die libs(*.h. *.cpp)  auch schon im aktuellen Arbeitsverzeichnis, auch da wurde sie dann nicht gefunden.

Also wie jetzt genau oder was?
Title: Re: PID library - funktioniert nicht
Post by: Klaus_ww on Jul 05, 2014, 11:03 am
Ich tippe auch auf Verzeichnis-Salat.
Check doch sicherheitshalber, wo sich andere - einbindbare! - Libs befinden und ob im PID-Verzeichnis auch die Struktur stimmt. Nicht, dass da noch ein zusätzlicher Ordner reingerutscht ist.
Title: Re: PID library - funktioniert nicht
Post by: HaWe on Jul 05, 2014, 11:05 am
wie soll ich das tun?
ansonsten sind auch die Ordner von Audio, Bridge, Esplora, Ethernet,...PID_v1,......USBHost, WiFi alle im selben Verzeichnis.

In PID_v1 befinden sich
Examples (Ordner),
keywords.txt
PID_v1.cpp
PID_v1.h

PID_v1.h hat diesen Code:
Code: [Select]
#ifndef PID_v1_h
#define PID_v1_h
#define LIBRARY_VERSION 1.0.0

class PID
{


 public:

 //Constants used in some of the functions below
 #define AUTOMATIC 1
 #define MANUAL 0
 #define DIRECT  0
 #define REVERSE  1

 //commonly used functions **************************************************************************
   PID(double*, double*, double*,        // * constructor.  links the PID to the Input, Output, and
       double, double, double, int);     //   Setpoint.  Initial tuning parameters are also set here

   void SetMode(int Mode);               // * sets PID to either Manual (0) or Auto (non-0)

   bool Compute();                       // * performs the PID calculation.  it should be
                                         //   called every time loop() cycles. ON/OFF and
                                         //   calculation frequency can be set using SetMode
                                         //   SetSampleTime respectively

   void SetOutputLimits(double, double); //clamps the output to a specific range. 0-255 by default, but
 //it's likely the user will want to change this depending on
 //the application



 //available but not commonly used functions ********************************************************
   void SetTunings(double, double,       // * While most users will set the tunings once in the
                   double);          //   constructor, this function gives the user the option
                                         //   of changing tunings during runtime for Adaptive control
void SetControllerDirection(int);  // * Sets the Direction, or "Action" of the controller. DIRECT
 //   means the output will increase when error is positive. REVERSE
 //   means the opposite.  it's very unlikely that this will be needed
 //   once it is set in the constructor.
   void SetSampleTime(int);              // * sets the frequency, in Milliseconds, with which
                                         //   the PID calculation is performed.  default is 100
 
 
 
 //Display functions ****************************************************************
double GetKp();  // These functions query the pid for interal values.
double GetKi();  //  they were created mainly for the pid front-end,
double GetKd();  // where it's important to know what is actually
int GetMode();  //  inside the PID.
int GetDirection();  //

 private:
void Initialize();

double dispKp; // * we'll hold on to the tuning parameters in user-entered
double dispKi; //   format for display purposes
double dispKd; //
   
double kp;                  // * (P)roportional Tuning Parameter
   double ki;                  // * (I)ntegral Tuning Parameter
   double kd;                  // * (D)erivative Tuning Parameter

int controllerDirection;

   double *myInput;              // * Pointers to the Input, Output, and Setpoint variables
   double *myOutput;             //   This creates a hard link between the variables and the
   double *mySetpoint;           //   PID, freeing the user from having to constantly tell us
                                 //   what these values are.  with pointers we'll just know.
 
unsigned long lastTime;
double ITerm, lastInput;

unsigned long SampleTime;
double outMin, outMax;
bool inAuto;
};
#endif


wenn ich stattdessen PID_v1.h und PID_v1.cpp ins Arbeitsverzeichnis kopiere und den include-Befehl als
Code: [Select]
#include "PID_v1.h"

schreibe (also relative Adresse), kriege ich noch mehr Mist als Fehlermeldung!
Quote

Arduino: 1.5.6-r2 (Windows XP), Board: "Arduino Duemilanove or Diecimila, ATmega168"

PID_v1\PID_v1.cpp.o: In function `PID::SetTunings(double, double, double)':
C:\Programme\Arduino\libraries\PID_v1/PID_v1.cpp:83: multiple definition of `PID::SetTunings(double, double, double)'
PID_v1.cpp.o:c:\Temp\build7831142639526092789.tmp/PID_v1.cpp:83: first defined here
PID_v1\PID_v1.cpp.o: In function `PID::SetSampleTime(int)':
C:\Programme\Arduino\libraries\PID_v1/PID_v1.cpp:105: multiple definition of `PID::SetSampleTime(int)'
PID_v1.cpp.o:c:\Temp\build7831142639526092789.tmp/PID_v1.cpp:105: first defined here
PID_v1\PID_v1.cpp.o: In function `PID::SetOutputLimits(double, double)':
C:\Programme\Arduino\libraries\PID_v1/PID_v1.cpp:125: multiple definition of `PID::SetOutputLimits(double, double)'
PID_v1.cpp.o:c:\Temp\build7831142639526092789.tmp/PID_v1.cpp:125: first defined here
PID_v1\PID_v1.cpp.o: In function `PID::SetMode(int)':
C:\Programme\Arduino\libraries\PID_v1/PID_v1.cpp:146: multiple definition of `PID::SetMode(int)'
PID_v1.cpp.o:c:\Temp\build7831142639526092789.tmp/PID_v1.cpp:146: first defined here
PID_v1\PID_v1.cpp.o: In function `PID::Initialize()':
C:\Programme\Arduino\libraries\PID_v1/PID_v1.cpp:160: multiple definition of `PID::Initialize()'
PID_v1.cpp.o:c:\Temp\build7831142639526092789.tmp/PID_v1.cpp:160: first defined here
PID_v1\PID_v1.cpp.o: In function `PID::SetControllerDirection(int)':
C:\Programme\Arduino\libraries\PID_v1/PID_v1.cpp:174: multiple definition of `PID::SetControllerDirection(int)'
PID_v1.cpp.o:c:\Temp\build7831142639526092789.tmp/PID_v1.cpp:174: first defined here
PID_v1\PID_v1.cpp.o: In function `PID::GetKp()':
C:\Programme\Arduino\libraries\PID_v1/PID_v1.cpp:190: multiple definition of `PID::GetKp()'
PID_v1.cpp.o:c:\Temp\build7831142639526092789.tmp/PID_v1.cpp:190: first defined here
PID_v1\PID_v1.cpp.o: In function `PID::GetKi()':
C:\Programme\Arduino\libraries\PID_v1/PID_v1.cpp:191: multiple definition of `PID::GetKi()'
PID_v1.cpp.o:c:\Temp\build7831142639526092789.tmp/PID_v1.cpp:191: first defined here
PID_v1\PID_v1.cpp.o: In function `PID::GetKd()':
C:\Programme\Arduino\libraries\PID_v1/PID_v1.cpp:192: multiple definition of `PID::GetKd()'
PID_v1.cpp.o:c:\Temp\build7831142639526092789.tmp/PID_v1.cpp:192: first defined here
PID_v1\PID_v1.cpp.o: In function `PID::GetMode()':
C:\Programme\Arduino\libraries\PID_v1/PID_v1.cpp:193: multiple definition of `PID::GetMode()'
PID_v1.cpp.o:c:\Temp\build7831142639526092789.tmp/PID_v1.cpp:193: first defined here
PID_v1\PID_v1.cpp.o: In function `PID::GetDirection()':
C:\Programme\Arduino\libraries\PID_v1/PID_v1.cpp:194: multiple definition of `PID::GetDirection()'
PID_v1.cpp.o:c:\Temp\build7831142639526092789.tmp/PID_v1.cpp:194: first defined here
PID_v1\PID_v1.cpp.o: In function `PID::Compute()':
C:\Programme\Arduino\libraries\PID_v1/PID_v1.cpp:47: multiple definition of `PID::Compute()'
PID_v1.cpp.o:c:\Temp\build7831142639526092789.tmp/PID_v1.cpp:47: first defined here
PID_v1\PID_v1.cpp.o: In function `PID':
C:\Programme\Arduino\libraries\PID_v1/PID_v1.cpp:21: multiple definition of `PID::PID(double*, double*, double*, double, double, double, int)'
PID_v1.cpp.o:c:\Temp\build7831142639526092789.tmp/PID_v1.cpp:21: first defined here
PID_v1\PID_v1.cpp.o: In function `PID':
C:\Programme\Arduino\libraries\PID_v1/PID_v1.cpp:21: multiple definition of `PID::PID(double*, double*, double*, double, double, double, int)'
PID_v1.cpp.o:c:\Temp\build7831142639526092789.tmp/PID_v1.cpp:21: first defined here




Was für ein Mist mit den sch***- starren Verzeichnis- und Dateinamens-Strukturen!
Alleine schon, dass immer ein übergeordneter Ordner denselben Namen haben muss wie ein Programmdatei-Name!
Blödsinn³ !!
Und dass dann immer libs automatisch included werden, obwohl man es überhaupt nicht angegeben hat!!
Kein Wunder, wenn es da zu Konflikten kommt!!
Zum Kotzen!

Title: Re: PID library - funktioniert nicht
Post by: Rabenauge on Jul 05, 2014, 11:58 am
Hast du mal nachgesehen, ob du in den Eigenen Dateien _auch_  nen Arduino-Ordner hast??
Ich glaub, der wird standardmässig angelegt. DORT gehören eigene Lib`s rein.
Unter Programme geht das zwar im Prinzip auch, aber dann muss das auch entsprechend konfiguriert werden.

C:\Dokumente und Einstellungen\Anwender\Eigene Dateien\Arduino\libraries <--- da rein die Ordner für die einzelnen Lib`s.

Title: Re: PID library - funktioniert nicht
Post by: HaWe on Jul 05, 2014, 12:08 pm
da gibt es einen Ordner, der ist aber leer, und ich verwende "Eigene Dateien" auch nie. Ich speichere meine Dateien ganz woanders ab.

Das wäre ja wohl ne Frechheit, wenn mir ein programm vorschreibt, wo ich meine Dateien abzuspeichern habe.
Wenigstens den include-Pfad muss man aber konfigurieren können! (Und den gibt's ja, wie gesagt, im Installationsverzeichneis, unter c:\Programme.
Oder eben alles ins aktuelle Arbeitsverzeichnis kopieren.
Oder den echten statischen Pfad angeben.

Was für ein Durcheinander, wie ich sowas hasse!
Wer programmiert so was ???
Title: Re: PID library - funktioniert nicht
Post by: Klaus_ww on Jul 05, 2014, 12:11 pm

Was für ein Durcheinander, wie ich sowas hasse!
Wer programmiert so was ???


Ganz ruhig bleiben, es funktioniert bei anderen ja auch, also nicht aufregen.
Was passiert, wenn Du Rabenauges Tipp versuchst?
Title: Re: PID library - funktioniert nicht
Post by: Doc_Arduino on Jul 05, 2014, 12:38 pm
Hallo,

Du bist wüdent und mußt erstmal runterkommen.
Ich nutze die portable Version der IDE.
Bei mir sieht das so aus, siehe Screenshot.

Welches Board hast Du denn?
Mich macht diese Zeile stutzig.
Arduino: 1.5.6-r2 (Windows XP), Board: "Arduino Duemilanove or Diecimila, ATmega168"
Wenn Du keinen Due hast, sollte man die IDE 1.0.5... nehmen.

Das Demoprogramm hast Du wie geladen? Über das IDE Menü > Datei > Beispiele ...?
Oder den Code einfach reinkopiert?
Wenn Du in Datei > Beispiele > PID_v1 > Examples siehst, dann liegt alles an der richtigen Stelle. Dann tippe ich auf einen Versionkonflikt zwischen IDE, dem Board oder Library. Wie gesagt, wenn kein Due hast, nimm die andere IDE Version.
Title: Re: PID library - funktioniert nicht
Post by: Hubble_Pixel on Jul 05, 2014, 01:02 pm
Ich weiß, dass es unter Linux einen Ordner mit dem Namen sketchbook gibt, der sich (unter Linux) im Home-Verzeichnis des Nutzers befindet, dort gibt es drin wiederum einen Ordner libraries oder so und darin packe ich immer meinem Bibliotheken , jeweils in einen Ordner der so heißt wie die Bibliothek, also /home/USER/sketchbook/libraries/BibliothekXY/ worin sich dann der Rest befindet also BibliothekXY.h und BibliothekXY.cpp und noch andere Dateien die aber nicht wichtig für die Bibliothek an sich sind.

Sollte es so einen Ordner und Windows auch geben, dann würde ich die Bibliothek nach dem oben angegebenen Schema dorthin packen und wenn man sie dann braucht kann man sie in der IDE einbinden, dort sieht man dann auch direkt, ob die Bibliothek überhaupt zur Verfügung steht ;)

LG,
~Hubble
Title: Re: PID library - funktioniert nicht
Post by: HaWe on Jul 05, 2014, 01:14 pm
nein, ich nehme die 1.5x, weil die 1.0x kein CR an den seriellen Monitor übergibt und daher kein Ende der Eingabezeile registriert.

Ein Sketchbook habe ich auch irgendwo, aber nur wo?
In dem Ordner-Durcheinander kennt sich doch kein Mensch aus!

aah -  habs:

D:\Arduino


und da soll der Ordner mit der PID lib jetzt rein?
Nicht zu den libs im Installationsverzeichnis?

Und dann noch Linux? was will ich mit Linux? Ich programmiere in C auf Windows! Was soll der Linux-Quatsch? Hat der Arduino etwa ein Linux-Betriebssystem?

wer denkt sich sowas aus?
Title: Re: PID library - funktioniert nicht
Post by: HaWe on Jul 05, 2014, 01:21 pm
hab also jetzt die PID lib nach D:\Arduino (Sketch-Ordner) kopiert:
Immer noch Fehlermeldungen ohne Ende:
Quote

Arduino: 1.5.6-r2 (Windows XP), Board: "Arduino Duemilanove or Diecimila, ATmega168"

PID_v1\PID_v1.cpp.o: In function `PID::SetTunings(double, double, double)':
C:\Programme\Arduino\libraries\PID_v1/PID_v1.cpp:83: multiple definition of `PID::SetTunings(double, double, double)'
PID_v1.cpp.o:c:\Temp\build5123732278742385743.tmp/PID_v1.cpp:83: first defined here
PID_v1\PID_v1.cpp.o: In function `PID::SetSampleTime(int)':
C:\Programme\Arduino\libraries\PID_v1/PID_v1.cpp:105: multiple definition of `PID::SetSampleTime(int)'
PID_v1.cpp.o:c:\Temp\build5123732278742385743.tmp/PID_v1.cpp:105: first defined here
PID_v1\PID_v1.cpp.o: In function `PID::SetOutputLimits(double, double)':
C:\Programme\Arduino\libraries\PID_v1/PID_v1.cpp:125: multiple definition of `PID::SetOutputLimits(double, double)'
PID_v1.cpp.o:c:\Temp\build5123732278742385743.tmp/PID_v1.cpp:125: first defined here
PID_v1\PID_v1.cpp.o: In function `PID::SetMode(int)':
C:\Programme\Arduino\libraries\PID_v1/PID_v1.cpp:146: multiple definition of `PID::SetMode(int)'
PID_v1.cpp.o:c:\Temp\build5123732278742385743.tmp/PID_v1.cpp:146: first defined here
PID_v1\PID_v1.cpp.o: In function `PID::Initialize()':
C:\Programme\Arduino\libraries\PID_v1/PID_v1.cpp:160: multiple definition of `PID::Initialize()'
PID_v1.cpp.o:c:\Temp\build5123732278742385743.tmp/PID_v1.cpp:160: first defined here
PID_v1\PID_v1.cpp.o: In function `PID::SetControllerDirection(int)':
C:\Programme\Arduino\libraries\PID_v1/PID_v1.cpp:174: multiple definition of `PID::SetControllerDirection(int)'
PID_v1.cpp.o:c:\Temp\build5123732278742385743.tmp/PID_v1.cpp:174: first defined here
PID_v1\PID_v1.cpp.o: In function `PID::GetKp()':
C:\Programme\Arduino\libraries\PID_v1/PID_v1.cpp:190: multiple definition of `PID::GetKp()'
PID_v1.cpp.o:c:\Temp\build5123732278742385743.tmp/PID_v1.cpp:190: first defined here
PID_v1\PID_v1.cpp.o: In function `PID::GetKi()':
C:\Programme\Arduino\libraries\PID_v1/PID_v1.cpp:191: multiple definition of `PID::GetKi()'
PID_v1.cpp.o:c:\Temp\build5123732278742385743.tmp/PID_v1.cpp:191: first defined here
PID_v1\PID_v1.cpp.o: In function `PID::GetKd()':
C:\Programme\Arduino\libraries\PID_v1/PID_v1.cpp:192: multiple definition of `PID::GetKd()'
PID_v1.cpp.o:c:\Temp\build5123732278742385743.tmp/PID_v1.cpp:192: first defined here
PID_v1\PID_v1.cpp.o: In function `PID::GetMode()':
C:\Programme\Arduino\libraries\PID_v1/PID_v1.cpp:193: multiple definition of `PID::GetMode()'
PID_v1.cpp.o:c:\Temp\build5123732278742385743.tmp/PID_v1.cpp:193: first defined here
PID_v1\PID_v1.cpp.o: In function `PID::GetDirection()':
C:\Programme\Arduino\libraries\PID_v1/PID_v1.cpp:194: multiple definition of `PID::GetDirection()'
PID_v1.cpp.o:c:\Temp\build5123732278742385743.tmp/PID_v1.cpp:194: first defined here
PID_v1\PID_v1.cpp.o: In function `PID::Compute()':
C:\Programme\Arduino\libraries\PID_v1/PID_v1.cpp:47: multiple definition of `PID::Compute()'
PID_v1.cpp.o:c:\Temp\build5123732278742385743.tmp/PID_v1.cpp:47: first defined here
PID_v1\PID_v1.cpp.o: In function `PID':
C:\Programme\Arduino\libraries\PID_v1/PID_v1.cpp:21: multiple definition of `PID::PID(double*, double*, double*, double, double, double, int)'
PID_v1.cpp.o:c:\Temp\build5123732278742385743.tmp/PID_v1.cpp:21: first defined here
PID_v1\PID_v1.cpp.o: In function `PID':
C:\Programme\Arduino\libraries\PID_v1/PID_v1.cpp:21: multiple definition of `PID::PID(double*, double*, double*, double, double, double, int)'
PID_v1.cpp.o:c:\Temp\build5123732278742385743.tmp/PID_v1.cpp:21: first defined here

  Dieser Report hätte mehr Informationen mit
  "Ausführliche Ausgabe während der Kompilierung"
  aktiviert in Datei > Einstellungen



So ein Schei** !!
Title: Re: PID library - funktioniert nicht
Post by: Doc_Arduino on Jul 05, 2014, 01:49 pm
Hallo HaWe,

kannst Du die Fragen die wir zur Hilfe stellen auch komplett beantworten? Sonst wird das nichts. Wir können nur das wissen was Du uns schreibst. Das mit Linux kannste wirklich vergessen. Du nutzt Windows auf Deinem Rechner. Und und die Librarys gehören in den libraries Ordner, sonst nirgends wohin.

Nur um auszuschließen das es nicht an der falschen IDE Version liegt. Lade Dir die portable IDE runter. Das .zip File.
Entpacke es wohin wo Du willst. Kopiere die PID_v1 Library dort in den libraries Ordner, starte die arduino.exe, wähle Dein Board aus und lade ein PID Beispiel über IDE Menü > Beispiele > PID_v1 > Examples ...
Kompiliere es testweise.
Wir sind gespannt was passiert.
Title: Re: PID library - funktioniert nicht
Post by: HaWe on Jul 05, 2014, 01:56 pm
sorry, verstehe ich nicht.
Ich habe alles über setup.exe installiert, das löscht alte Installations-Daten.
Ich will nicht wieder Chaos mit den Sketch-Versionen und abweichenden Einstellungen und Speicher-Ordnern.

ich habe aber auf einem anderen Rechner (in einem anderen Haus) noch eine alte 1.0.5 Version installiert, mit der kann ich ja stattdessen versuchen. Das geht aber blöderweise erst ab Montag. :(

Auch da ist der Sketch-Ornder aber nicht irgendwas mit Eigene Dateien, sondern d:\Arduino, aber auch da ist der Installationsordner c:\programme\Arduino, und die ganzen libs sind in c:\programme\Arduino\libraries.

In welchen ordner soll also dann bei mir der Ordner PID_V1 oder die darin enthaltenen .h und .cpp Dateien?
Title: Re: PID library - funktioniert nicht
Post by: Rabenauge on Jul 05, 2014, 02:02 pm
Funktioniert denn  Sketch-Library importieren- die PID überhaupt??
Wenn _das_ nicht klappt, liegt sie am falschen Speicherort-welcher auch immer das bei dir sein mag.
Wenn es aber _so_ (die #includes selber tippen ist ne wacklige Geschichte! ) funktioniert, sollts dann auch laufen.
Title: Re: PID library - funktioniert nicht
Post by: sven222 on Jul 05, 2014, 02:09 pm
Mit der protabeln Version ist das Windows Zip file gemeint. Lade Dir dies hier herunter:

http://arduino.googlecode.com/files/arduino-1.0.5-r2-windows.zip

Entpacken, und loslegen. Da wird nichts installiert. Dann kannst Du testen. Und bevor Du gleich Hyperventilierend explodierst, die 1.5.irgendwas ist Beta! Also, nicht aufregen. Wenn der Scheiß Dir nicht passt und Du es besser weißt, dann beteilige Dich an der Programmierung!

Grüße,


Sven
Title: Re: PID library - funktioniert nicht
Post by: HaWe on Jul 05, 2014, 02:18 pm
und wo soll da der PID_v1 reinkopiert werden ?
Title: Re: PID library - funktioniert nicht
Post by: sven222 on Jul 05, 2014, 02:40 pm
Kann ich Dir nicht sagen, weil mir von Dir dann Quatsch unterstellt wird, weil Du die Transferleistung von Linux auf Windows nicht hinbekommst, aber mach doch einfach was Dir weiter vorne schon empfohlen wurde. Nimm die automatische import Funktion bei Sketch -> Library importieren -> Add library
Spricht da was dagegen?

Title: Re: PID library - funktioniert nicht
Post by: HaWe on Jul 05, 2014, 02:58 pm
wo ist das denn? hab ja schon danach gesucht!
Title: Re: PID library - funktioniert nicht
Post by: Rabenauge on Jul 05, 2014, 03:08 pm
Da du ja die Betaversion benutzt, weiss ich das nicht (mal ganz ehrlich: wenns nicht _wirklich_ triftige Gründe gibt, lässt man immer die Finger von Beta`s), bei der normalen IDE gehts ganz oben: Sketch-Library importieren-und _da_ geht ne Liste auf, die alle Bibliotheken enthält, die die IDE "findet".

Sollte dort der Eintrag der PID _nich_ da sein, hast du sie einfach am falschen Ort gespeichert.
Ist halt jetzt blöde weil du auf der Beta beharrst, die 1.05 hat zudem noch die Möglichkeit, Bibliotheken aus nem Zip-Archiv direkt zu importieren, auch das hilft, weil die dann automatisch an die richtige Stelle kopiert  wird. Weiss aber nicht, iob das die Betaversion auch kann.
Title: Re: PID library - funktioniert nicht
Post by: Doc_Arduino on Jul 05, 2014, 03:10 pm
Hallo,

oben im Menü vom IDE Fenster.

Der Ordner PID_v1 muß in den libraries Ordner.  Mehr nicht. Wurde schon mehrfach gesagt. Guck Dir meine Screeshots an. Mehr kann man dazu nicht sagen. Bilder erklären besser. Ist alles mit der 1.0.5 gemacht und funktioniert.

Hab das nochmal nachgestellt mit einer installierten Arduino IDE. Wenn das bei Dir nicht funktioniert, bleibt meine Vermutung bestehen. Entweder hast Du alles komplett durcheinander gehauen oder die IDE 1.5.x beta ist nicht kompatibel zu der Library. Deshalb sollst Du erstmal die portable Version nehmen. Damit kann nichts passieren. Das liegt und läuft völlig getrennt von einer installierten IDE. Nur beide gleichzeitig starten würde ich nicht, wegen den COM Ports.
Title: Re: PID library - funktioniert nicht
Post by: HaWe on Jul 05, 2014, 03:13 pm
ich habe 2 libraries Ordner: den Sketch ordner und den  Arduino-Installationsordner.
der Arduino-Installationsordner sieht genau aus wie bei dir.
Alle anderen libs wie z.B serial funktionieren aber auch!
Title: Re: PID library - funktioniert nicht
Post by: HaWe on Jul 05, 2014, 03:16 pm
wenn ichs aus sketchbook - Beispiele aufrufe, geht es!

rufe ichs aus einem anderen Ordner auf (pid1000, Programm heißt dann auch pid1000.ino) geht es nicht!

wie kann das denn sein???
Title: Re: PID library - funktioniert nicht
Post by: Doc_Arduino on Jul 05, 2014, 03:19 pm
Hallo,

hier verwechselt Du was. Der Sketch-Ordner ist kein Library Ordner. Im Sketchordner liegen nur Deine Sketche, also Deine selbst geschriebenen Programme und vielleicht noch paar Beispiele. Dieser Sketchordner kann sonstwo liegen auf dem Rechner. Darin haben Librarys nichts zu suchen. Der richtige Ort für hinzugefügte Librarys ist wie im Screenshot. Und NUR dort!

Edit: dann stimmen irgendwelche Pfade nicht mehr, hast ja ganz schön hin und herkopiert, oder die Beta hat ein Problem.
Title: Re: PID library - funktioniert nicht
Post by: HaWe on Jul 05, 2014, 03:22 pm
ja, so ist es auch.
Ich meinte ja auch nur, wie auf dem Screenshot: da ist der PID-v1 odner mit dem Beispiel-Programm. Das kann ich öffnen und kompilieren.

(http://forum.arduino.cc/index.php?action=dlattach;topic=253238.0;attach=87604;image)

Das gleiche PID-v1 Basisprogramm  habe ich aber auch noch  woanders auf dem rechner, dort, wo meine Projekte gespeichert werden.
die lib ist im Programme -Ordner.
weil ich verschiedene Versionen aufeinander aufbaue, habe ihcs umbenannt.
Mit anderen programmen geht das hier einwandfrei, mit PID-Basisprogramm nicht.

Was ein Mist!
Ich hasse diese undurchsichtige Ordnerstruktur!
Title: Re: PID library - funktioniert nicht
Post by: HaWe on Jul 05, 2014, 03:31 pm
ich gebs auf.

PID in Echtzeit mit mehr als 1 Motor asynchron (eigtl 6) geht wschl sowieso nicht.

Dazu braucht man einfach Multitasking.
Title: Re: PID library - funktioniert nicht
Post by: Doc_Arduino on Jul 05, 2014, 04:45 pm
Hallo,

die Struktur ist nicht undurchstig. Die ist ganz klar geregelt. Nimm Atmel Studio wenn Du damit besser klar kommst. Nur so am Rande.

Also nochmal tief durchatmen.

Also. Das Bsp. Programm kannst Du öffnen und es wird fehlerfrei kompliliert.
Speichere das bitte nochmal unter geänderten Namen wo anders ab.
Und öffne es über das IDE Menü > Datei > öffnen ...
Funktioniert das dann noch?

Title: Re: PID library - funktioniert nicht
Post by: HaWe on Jul 05, 2014, 05:05 pm
ja, geht, ich glaubs ja nicht.  :smiley-eek-blue:
was ist denn jetzt passiert?
Title: Re: PID library - funktioniert nicht
Post by: Doc_Arduino on Jul 05, 2014, 05:18 pm
Hallo,

entweder ist/war die Datei beschädigt oder vorm speichern wurde unbeabsichtigt was blödes geändert. Keine Ahnung.
Da hilft nur ein Vergleich Zeile für Zeile in aller Ruhe.
Title: Re: PID library - funktioniert nicht
Post by: HaWe on Jul 05, 2014, 05:25 pm
tausendmal danke für deine Hilfe an einen schon fast Verzweifelnden... 8-)

ich habe das Programm jetzt für meine Encoder angepasst.
Die gute Nachricht:
Es compiliert, und es tut was.

Die schlechte:
statt 100 läuft der Motor bis 198, also besonders gut scheint die Approximierung nicht zu klappen.
Wenn er überschießt, muss er doch zurückregeln, bis der Zielwert konstant ist ...?!


Code: [Select]

/********************************************************
* PID controller ver. 1007
* Reading motor encoder[0] to control PWM motor [0]
********************************************************/

#include <PID_v1.h>

//Define Variables we'll be connecting to
double PIDSetpoint, PIDInput, PIDOutput;

//Specify the links and initial tuning parameters
PID myPID(&PIDInput, &PIDOutput, &PIDSetpoint,2,5,1, DIRECT);



#define MAXMOTORS 2

#define    OUT_RUNSTATE_IDLE     0
#define    OUT_RUNSTATE_ACTIVE   1

// set motor pins
// motor 0
#define pinmenc0A  2  // encA yellow
#define pinmenc0B  3  // encB blue
#define pinmot0d1  4  // dir1
#define pinmot0d2  5  // dir2
#define pinmot0pwm 6  // enable
// motor 1
#define pinmenc1A  7  // encA yellow
#define pinmenc1B  8  // encB blue
#define pinmot1d1  9  // dir1
#define pinmot1d2  10 // dir2
#define pinmot1pwm 11 // enable


//************************************************************************************
// Encoder functions courtesy of / entnommen aus: http: //www.meinDUINO.de //
//************************************************************************************
//*************************************************************
// Globale Variablen zur Auswertung in der
// Interrupt-Service-Routine (ISR)
//*************************************************************
volatile int8_t altAB[MAXMOTORS]  = {0,0};
volatile long   motenc[MAXMOTORS] = {0,0},
                oldenc[MAXMOTORS] = {0,0};

// Die beiden Schritt-Tabellen für 1/1, 1/2 oder 1/4-Auflösung/resolution
// 1/1 Auflösung/resolution
//int8_t schrittTab[16] = {0,-1,1,0,1,0,0,-1,-1,0,0,1,0,1,-1,0};

// 1/2 Auflösung/resolution
  int8_t schrittTab[16] = {0, 0,0,0,1,0,0,-1, 0,0,0,1,0,0,-1,0};

// 1/4 Auflösung/resolution
//int8_t schrittTab[16] = {0,0,0,0,0,0,0,-1,0,0,0,0,0,1,0,0};

//*************************************************************
// Interrupt Service Routine: wenn Interrupt ausgelöst wird
//*************************************************************
ISR(TIMER1_COMPA_vect) {
  altAB[0] <<= 2;
  altAB[0] &= B00001100;
  altAB[0] |= (digitalRead(pinmenc0A) << 1) | digitalRead(pinmenc0B);
  motenc[0] += schrittTab[altAB[0]];           //

  altAB[1] <<= 2;
  altAB[1] &= B00001100;
  altAB[1] |= (digitalRead(pinmenc1A) << 1) | digitalRead(pinmenc1B);
  motenc[1] += schrittTab[altAB[1]];           //
}



byte pinmotdir[MAXMOTORS][2]={ {pinmot0d1, pinmot0d2},
                               {pinmot1d1, pinmot1d2} };
                                                   
int  pinmotpwm[MAXMOTORS]={pinmot0pwm, pinmot1pwm};



int  PID_REGTIME_MS = 20;

//************************************************************************************
inline void motoron(byte motnr, int power) {
  if(power>0) {
     digitalWrite( pinmotdir[motnr][0],HIGH);
     digitalWrite( pinmotdir[motnr][1],LOW);
  }
  else
  if(power<0) {
     digitalWrite( pinmotdir[motnr][0],LOW);
     digitalWrite( pinmotdir[motnr][1],HIGH);
  }
  else
  if(power==0) {
     digitalWrite( pinmotdir[motnr][0],LOW);
     digitalWrite( pinmotdir[motnr][1],LOW);
  }

  power = abs(power);
  if(power>254) power=254;
  analogWrite(pinmotpwm[motnr],power);
}

//------------------------------------------------------------------------------------

inline void motorbrake(byte motnr) {
  motoron(motnr, 0);
}

//------------------------------------------------------------------------------------

inline void motorcoast(int motnr) {
  motoron( motnr, 0);
}

#define  motoroff    motorcoast

//************************************************************************************



void setup()
{
 
   pinMode(pinmot0d1,OUTPUT);        // dir1
   pinMode(pinmot0d2,OUTPUT);        // dir2
   pinMode(pinmenc0A,INPUT_PULLUP);  // encA
   pinMode(pinmenc0B,INPUT_PULLUP);  // encB
   pinMode(pinmot0pwm,OUTPUT);       // enable
   
   pinMode(pinmot1d1,OUTPUT);        // dir1
   pinMode(pinmot1d2,OUTPUT);        // dir2
   pinMode(pinmenc1A,INPUT_PULLUP);  // encA
   pinMode(pinmenc1B,INPUT_PULLUP);  // encB
   pinMode(pinmot1pwm,OUTPUT);       // enable
 
   // time interrupt for encoder readings
   noInterrupts(); // Jetzt keine Interrupts / disable
       TIMSK1 |= (1<<OCIE1A);  // Timer 1 PIDOutput Compare A Match Interrupt Enable
       TCCR1A = 0;             // "Normaler" Modus
       // WGM12: CTC-Modus einschalten (Clear Timer on Compare match)
       //        Stimmen OCR1A und Timer überein, wird der Interrupt ausgelöst
       // Bit CS12 und CS10 setzen
       // => Prescaler=1024
       // TCCR1B = (1<<WGM12) | (1<<CS12) | (1<<CS10);
       // Prescaler=8:
       TCCR1B = (1<<WGM12) | (1<<CS11);
       // Frequenz = 16000000 / 1024 / 15 = rd. 1042Hz = 1kHz
       // Frequenz = 16,000,000 / 8 / 64 = rd. 31 kHz
       // Frequenz = 16,000,000 / 8 / 512 = rd. 4 kHz
       OCR1A =511;
   interrupts(); // Interrupts wieder erlauben / enable
   
   
   //initialize the variables we're linked to
   PIDInput = motenc[0];
   PIDSetpoint = 100;

   //turn the PID on
   myPID.SetMode(AUTOMATIC);
 
   Serial.begin(115200);
}

void loop()
{
   PIDInput = motenc[0];
   myPID.Compute();
 
   motoron(0,PIDOutput);
 
   Serial.println(motenc[0]);
 
}

Title: Re: PID library - funktioniert nicht
Post by: Rabenauge on Jul 05, 2014, 05:47 pm
Ja, muss er.
Möglicherweise hast du Kp,Ki,Kd nicht korrekt justiert?
DAS sind die Parameter, die die Regelung beeinflussen.
Den Wert für Kd z.B. halte ich für seeeehr aggressiv-aber es kommt natürlich immer auf die konkrete Aufgabe (bzw. den Aufbau) an.
Kennst du dich mit PID-Reglern denn aus?
Title: Re: PID library - funktioniert nicht
Post by: HaWe on Jul 05, 2014, 05:57 pm
ja, kenne mich schon aus damit.
Habe selber einen *SEEHR* guten asynchronen für >= 3 Motoren programmiert (für den NXT).

Wenn die PID-Werte nicht stimmen, macht er sowas wie in 1):
und wenn es stimmt, so was wie in 2):

aber immerhin: in jedem Fall erreicht er den Zielwert, unabhängig vom Tuning oder Finetuning, ob mit oder ohne Overshooting!

So wie hier beim NXT muss es doch nun auch mit dem Arduino-PIDregler funktionieren, tut es aber nicht, er überschießt endlos und regelt ÜBERHAUPT NICHT wieder auf den Sollwert zurück!
Title: Re: PID library - funktioniert nicht
Post by: Rabenauge on Jul 05, 2014, 06:30 pm
Dat macht der Arduino-PID auch, wenn alles richtig ist. Sonst läge mein Segway dauernd auf der Nase (ab und zu allerdings tut ers noch, liegt aber nich an der Regelung).

Leider hab ich nicht die Zeit, dein Programm mal genauer zu analysieren, ich tu mich bei fremden Programmen immer bissel schwer und spiel grad mitm Monstertruck, der erfordert auch grade einiges an Hirnschmalz.
Wichtig ist z.B. dass zwischen Sensor und Regler _nichts_ kommt.
Wenn der Sensorwert verzögert geliefert wird (weil _irgendwas_ dazwischen noch Zeit braucht), kommt Murks raus.
Da du mit Interupts arbeitest, die Regler aber wiederum auch zeitgesteuert laufen (Samplingtime), könnte sich da ggf. was in die Quere kommen.
Die Samplintime legt _nur_ fest, wie oft die Regelung mit neuen Sensordaten (oder den alten, wenns keine neuen gibt) neu durchkalkuliert wird-regeln tut sie in der Zwischenzeit auch.
Title: Re: PID library - funktioniert nicht
Post by: HaWe on Jul 05, 2014, 07:50 pm
Im Augenblick ist kaum was dazwischen außer meine Motor-Routine, das soll auch so bleiben.
Das kann nicht der Grund sein, dass er überschießt und nicht mehr zurückrudert.

Es kommt später aber tatsächlich mit absoluter Sicherheit noch jede Menge mehr dazwischen,
zum Einen noch mehr Motoren (insg. 6 mit Mega), deren Werte an die PID-Controller übergeben und gestellt werden müssen,
und dann noch eine i2c-Read/Write-Funktion, die Werte und Befehle vom Master (NXT) in Empfang nimmt und Sensorwerte regelmäßig wieder zurückschickt. Diese haben ein delay jew. von 10-20ms, plus Codierung/Decodierung der i2c-msg-arrays.
Anders geht es nicht.

Ein guter PID-Controller vergleicht aber die echten, gestoppten loop-Zeiten und bringt sie in den I- und D- Summanden mit ein, damit die echte delta-Zeit zur Steuerung zu grunde gelegt wird. Da macht dann eine Verzögerung nichts aus.
reg = P + I*dt + D/dt

Ansonsten: Zeitscheiben-Multitasking, jeder Motor-Thread und jeder i2c-Thread in eine extra Zeitscheibe. So mache ich es beim NXT, das geht sogar mit einer VM, die alles um den Faktor 10 verlangsamt, in Echtzeit.

Da wäre also noch was deutlich ausbaufähig, beim Mega.
Title: Re: PID library - funktioniert nicht
Post by: Serenifly on Jul 05, 2014, 08:09 pm
Der Arduino Due hat einen Prozessor der in etwa dem NXT entspricht. ARM Cortex mit 84MHz. Das wäre vielleicht eher etwas für dich. Musst halt mit den 3,3V aufpassen.

Da funktioniert aber die Timer Geschichte nicht mehr so wie du es im Moment machst. Da gibt es aber Libs dafür:
https://github.com/ivanseidel/DueTimer
Title: Re: PID library - funktioniert nicht
Post by: HaWe on Jul 05, 2014, 10:22 pm
[OT]
Als NXT-Ersatz muss er nicht taugen, außerdem fehlt mir ja schon beim NXT als "Hauptrechner" oder i2c-Master ausreichend RAM (er hat nur 64 kB) - 512kB RAM aufwärts könnte ich gebrauchen.

Wenn aber der neue dann unter Linux läuft, dann kann man sicher gpp Toolchains mit POSIX libs verwenden, die pthread unterstützen (wie EV3).

Aber schon als i2c-Slave, als Motor- und Sensor-Multiplexer, wäre MT sinnvoll .
Denn das Betriebssystem an sich muss ja gar nicht MT-fähig sein, wie die Beispiele RCX (Renessas H8/300), NXT (ARM 8 ), und Robo TX (ARM9)  zeigen, man braucht nur eine VM, die das für einen erledigt .

So eine VM müsste sicherlich auch  auf dem Mega einzurichten sein.
Timer-Interrupts wären dann überflüssig und man hätte mit einem  Zeitscheiben-Multithreading ein absolut ausreichendes Echtzeitverhalten (ein Dutzend oder mehr parallel-laufende, unabhängige loop-Tasks). Der Mega ist dazu vom cpu-Takt und Speicher leistungsfähig  genug.
[/OT]

Trotzdem würde mich interessieren, warum der PID "Regler" das Überschießen des Motors nicht gegenreguliert. Nach meiner Meinung müsste mein Code mit den Encodern und den Motor-pwm- und Richtungspins doch richtig funktionieren! (direkt aufgerufen funktionieren sie ja auch korrekt nach Stärke und Richtung!)
Title: Re: PID library - funktioniert nicht
Post by: Rabenauge on Jul 05, 2014, 10:41 pm
Wie gesagt- an der PID-Lib. wird es nicht liegen, die Regler funktionieren ja nicht nur bei mir.

Was da nun genau los ist....

Zum anderen Thema: kennst den? http://www.roboternetz.de/community/threads/59698-HaikuVM-A-Java-VM-for-ARDUINO-and-other-micros-using-the-leJOS-runtime

Für mich persönlich ist Java zwar irgendwas zwischen Pest und Ebola aber wers mag....
Title: Re: PID library - funktioniert nicht
Post by: Serenifly on Jul 05, 2014, 10:49 pm
Also zumindest auf dem NXT ist leJOS super. Und von daher kommt das. Als ich da damit was gemacht habe, habe ich erst ein C++ RTOS ausprobiert, aber der Prozessor ist so leistungsstark, dass die VM problemlos läuft und noch massig Leistung da ist. Vor allem ist die API wirklich gut und es schon zig Zeug dabei das man bei anderen Firmwares erst per Hand implementieren müsste.
Title: Re: PID library - funktioniert nicht
Post by: HaWe on Jul 05, 2014, 11:02 pm
Pest und Cholera - oder Ebola - das ist Java/Lejos auch für mich.
C# genauso, alles mit OOP eben
wenn ich scho new-implements-extends höre, kann ich kotzen.

Natürlich habe ich es schon benutzt, auf dem RCX genau wie auf dem NXT, aber ich hätte die Teile danach fast an die Wand gedonnert. C# auf dem EV3 genauso, wenn nicht NOCH schlimmer.
Aber schnell ist der Java JIT compiler, das muss man ihm lassen.
Trotzdem, kommt nicht in Frage. Genausowenig wie Ebola und Pest.

Aber ich will mit dem PID controller noch nicht aufgeben- ob mein Programm mal wer mit L293D und Encodermotoren bei sich nachbauen und ausprobieren kann?


ps,
Github ist auch so ein rotes Tuch für mich.
Wer hat DIESES User-Interface erfunden? den sollte man im Hindukush steinigen!

Code: [Select]

examples Typo fix. a year ago
.gitignore Ignore file modified a year ago
DueTimer.cpp Fix for servo Library. Enable USING_SERVO_LIB in DueTimer.h 3 months ago
DueTimer.h Fix for servo Library. Enable USING_SERVO_LIB in DueTimer.h 3 months ago
README.md Explanation improvement 3 months ago
TimerCounter.md Adding documentation about the hardware of the Timer Counter a year ago



pps
das RTOS auf dem NXT ist Granate! Du meinst sicher nxtOSEK? Allerdings braucht man für die Installation schon nen Monat und ein weiteres halbes Jahr um das erste Demo-Programm zum Laufen zu kriegen. :(
Title: Re: PID library - funktioniert nicht
Post by: Serenifly on Jul 05, 2014, 11:09 pm
Du machst dir ständig selbst Probleme

Rechte Leiste -> runter -> Download ZIP

Wobei es sehr schön ist, dass man sich da die Dateien anschauen kann ohne alles runterzuladen. Manchmal will man eben nur nachschauen wie etwas implementiert ist


Quote

Du meinst sicher nxtOSEK?

Ja, wobei das wie ich es ausprobiert habe sowas wie pre-Alpha war. Geschwindigkeit ohne Ende, ja, aber am Ende lief irgendwie gar nichts mehr. Nicht mal die einfachsten Programme. Am Anfang ging alles, aber dann hat es gestreikt. Keine Ahnung wieso.
Und dann wie gesagt eine spärliche API. Da hat mir dann leJOS viel Arbeit angenommen. Und für meine Anwendung brauchte ich sowieso nicht die maximale Geschwindigkeit, da hat das perfekt gepasst.

Wenn ich mir die version history anschaue hat sich da inzwischen aber was getan :)
Title: Re: PID library - funktioniert nicht
Post by: HaWe on Jul 05, 2014, 11:13 pm
mein Denken ist einfach anders strukturiert ;)
aber im Moment tu ich mir den Due Code nicht an, ich hab ja keinen.
Mir sind Code-Listings untereinander, ungezipped, mit Beschreibung, alles im Klartext,  allerdings trotzdem lieber.
Aber alles zu seiner Zeit.

Jetzt erst noch mal zurück zum nicht funktinierenden aber immerhin laufenden sog. PID-"Regler"... 8-)

ps
zu nxtOSEK guck jetzt mal hier:
http://www.mindstormsforum.de/viewtopic.php?f=25&t=8102

;)
Title: Re: PID library - funktioniert nicht
Post by: HaWe on Jul 06, 2014, 10:57 am
da stelle ich gerade fest:
im Original-PID-Basis-Programm wird ja als Output nur eine pwm geschrieben (analogWrite(pin,Output) ):
Code: [Select]

void loop()
{
 Input = analogRead(0);
 myPID.Compute();
 analogWrite(3,Output);
}


Da ist eine Richtungssteuerung doch überhaupt nicht möglich, denn pwm-Output ist doch immer positiv!?!
Wo werden hier die Richtungspins gesetzt ???

Das kann doch gar nicht funktionieren, wenn der Zielwert kleiner ist als der Ist-Wert (also z.B. nach Überschießen)!!
Title: Re: PID library - funktioniert nicht
Post by: Rabenauge on Jul 06, 2014, 05:36 pm
Ne PWM wird da nicht geschrieben, man kann es aber als PWM benutzen.
Der Regler berechnet einfach nur _irgendeine_ Grösse-was damit dann angestellt wird, interessiert ihn nicht.
Das muss man sich dann schon passend aufdröseln, z.B. indem man, wenn man die Dino-PWM benutzen will, die OutputLimits auf -255, 255 setzt, das Vorzeichen als Richtungsinformation weiter benutzt und den PWM-Wert als abs(Wert) auf die PWM-Leitung gibt, oder eben je nach konkretem Aufbau.

Diese Lösung ist viel flexibler, weil mans eben an seine konkrete Anwendung anpassen kann, wie man es braucht (du z.B. steuerst deine Motoren ja ganz anders an als ich meine- es geht aber bei beiden).
Gibt ja auch Anwendungsfälle für solche Regler, bei denen gar keine Motoren bedient werden.

Title: Re: PID library - funktioniert nicht
Post by: HaWe on Jul 06, 2014, 06:19 pm
ach so ist das...

was für Outputs werden denn von dem Controller erzeugt, für
a) Input < Setpoint
b) Input == Setpoint
c) Input > Setpoint

bzw wo kann man die definieren?
es wäre ja sinnvoll für

a) Input < Setpoint => Output = 1...255
b) Input == Setpoint => Output = 0
c) Input > Setpoint => Output = -1...-255

ausgeben zu lassen, und dafür habe ich ja auch schon eine Steuer-Lösung in meinen Motorfunktionen.
Title: Re: PID library - funktioniert nicht
Post by: Rabenauge on Jul 06, 2014, 06:25 pm
http://playground.arduino.cc/Code/PIDLibrary

Lies mal ganz unten die Links zu den "Funktionen". Da steht das alles recht gut beschrieben.
Auch zu SetOutputLimits(), das ist das,w as dich grad interessiert.
Wenn du genau wissen willst, was bei einem gegebenen Input passiert-einfach mal die serielle Konsole benutzen, grad bei solchen Geschichten, die immer abgestimmt werden müssen, eine grosse Hilfe.
Title: Re: PID library - funktioniert nicht
Post by: HaWe on Jul 06, 2014, 06:51 pm
ah - also SetOutputLimits(-255, 255)
Das muss wschl dann aber in die loop(), vermute ich...

- teste ich sofort aus.

erstmal  tausend dank!
Title: Re: PID library - funktioniert nicht
Post by: HaWe on Jul 06, 2014, 06:56 pm
nö -
SetOutputLimits(-255, 255);
akzeptiert er nicht.
Quote
Arduino: 1.5.6-r2 (Windows XP), Board: "Arduino Duemilanove or Diecimila, ATmega168"

pid1007.ino: In function 'void loop()':
pid1007:175: error: 'SetOutputLimits' was not declared in this scope
pid1007.ino: At global scope:
pid1007:186: error: expected constructor, destructor, or type conversion before '=' token
pid1007:187: error: expected constructor, destructor, or type conversion before '.' token
pid1007:190: error: expected constructor, destructor, or type conversion before '(' token
pid1007:192: error: expected constructor, destructor, or type conversion before '.' token
pid1007:194: error: expected declaration before '}' token


ist aber auch ausgesprochen schlecht dokumentiert - noch nicht mal nen Beispiel-Code findet man dazu  :(
Title: Re: PID library - funktioniert nicht
Post by: Rabenauge on Jul 06, 2014, 07:15 pm
Hab grad mal in der Segway-Software nachgesehen: ich habs in der setup() stehen.

Ich versuchs mal, dir zusammenzubasteln:

Code: [Select]

PID radAchse(&genullterWinkel,&pwmRegler,&sollWert,reglerP,reglerI,reglerD,DIRECT);

void setup()
{
radAchse.SetMode(AUTOMATIC);
  radAchse.SetOutputLimits(-230,230);
  radAchse.SetSampleTime(30);
}

void regelungAchse()//************PID-Regler Achse *********************************************
{
    double abw = abs(sollWert+genullterWinkel);
   if (abw<3)                                 // bei kleineren Abweichungen
   {
    radAchse.SetTunings(reglerP,reglerI,reglerD);
    digitalWrite(ledGelb,LOW);
   }
  else                                          // bei grösseren Abweichungen
   {
    radAchse.SetTunings(reglerAggP,reglerAggI,reglerAggD);
    digitalWrite(ledGelb,HIGH);
   }
  radAchse.Compute(); // Regler berechnen

  if (pwmRegler<0)
  {
    drehRichtung=0;
  }
  else
  {
    drehRichtung=1;
  }
pwmMotoren=abs(pwmRegler)+10;
}


Ist etwas erweitert (ich benutze mehr als einen Satz Tuningparameter) aber- es funktioniert.
Du wirst allerdings deine Motoransteuerung anders aufdröseln müssen, ich brauche pro Motor nur zwei Steuerleitungen: PWM und Drehrichtung.
Ausserdem sind da noch andere Anpassungen drin, aber ich denke, dir wird klar, wie es ungefähr geht..
Title: Re: PID library - funktioniert nicht
Post by: HaWe on Jul 06, 2014, 08:11 pm
sehr schön, danke, das hat jetzt weitergeholfen. 8-)

Den regler jetzt auf Encoderwerte zu tunen, ist ntl eine Lebensaufgabe.

Gibt es eine Tabelle mit Erfahrungswerten für Encoder, Reg.-Time ca 10ms?

mit  PID 2,5,1  schwankt er sehr langsam um den Zielwert (100),

mit höheren PID Werten ist er schneller, aber zittert mächtig.

Code: [Select]

//***********************************************************************************
// PID controller
// Reading motor encoder[0] to control PWM motor [0]
// ver 1.007
//************************************************************************************

#include <PID_v1.h>

//Define Variables we'll be connecting to
double PID0setpoint, PID0input, PID0output;

//Specify the links and initial tuning parameters
// PID myPID(&PIDInput, &PIDOutput, &PIDSetpoint,2,5,1, DIRECT);
PID PID0(&PID0input, &PID0output, &PID0setpoint,20,5,3, DIRECT);

#define  PID_REGTIME_MS 10


//*************************************************************

#define sensortouch(pinHIGH) !digitalRead(pinHIGH)

#define startpin  12
#define MAXMOTORS  2

#define    OUT_RUNSTATE_IDLE     0
#define    OUT_RUNSTATE_ACTIVE   1

// set motor pins
// motor 0
#define pinmenc0A  2  // encA yellow
#define pinmenc0B  3  // encB blue
#define pinmot0d1  4  // dir1
#define pinmot0d2  5  // dir2
#define pinmot0pwm 6  // enable
// motor 1
#define pinmenc1A  7  // encA yellow
#define pinmenc1B  8  // encB blue
#define pinmot1d1  9  // dir1
#define pinmot1d2  10 // dir2
#define pinmot1pwm 11 // enable


//************************************************************************************
// Encoder functions courtesy of / entnommen aus: http: //www.meinDUINO.de //
//
// Globale Variablen zur Auswertung in der Interrupt-Service-Routine (ISR)
//************************************************************************************
volatile int8_t altAB[MAXMOTORS]  = {0,0};
volatile long   motenc[MAXMOTORS] = {0,0},
                oldenc[MAXMOTORS] = {0,0};

// Die beiden Schritt-Tabellen für 1/1, 1/2 oder 1/4-Auflösung/resolution
// 1/1 Auflösung/resolution
//int8_t schrittTab[16] = {0,-1,1,0,1,0,0,-1,-1,0,0,1,0,1,-1,0};

// 1/2 Auflösung/resolution
  int8_t schrittTab[16] = {0, 0,0,0,1,0,0,-1, 0,0,0,1,0,0,-1,0};

// 1/4 Auflösung/resolution
//int8_t schrittTab[16] = {0,0,0,0,0,0,0,-1,0,0,0,0,0,1,0,0};

//*************************************************************
// Interrupt Service Routine: wenn Interrupt ausgelöst wird
//*************************************************************
ISR(TIMER1_COMPA_vect) {
  altAB[0] <<= 2;
  altAB[0] &= B00001100;
  altAB[0] |= (digitalRead(pinmenc0A) << 1) | digitalRead(pinmenc0B);
  motenc[0] += schrittTab[altAB[0]];           //

  altAB[1] <<= 2;
  altAB[1] &= B00001100;
  altAB[1] |= (digitalRead(pinmenc1A) << 1) | digitalRead(pinmenc1B);
  motenc[1] += schrittTab[altAB[1]];           //
}

//************************************************************************************

byte pinmotdir[MAXMOTORS][2]={ {pinmot0d1, pinmot0d2},
                               {pinmot1d1, pinmot1d2} };
                                         
int  pinmotpwm[MAXMOTORS]={pinmot0pwm, pinmot1pwm};



//************************************************************************************
inline void motoron(byte motnr, int power) {
  if(power>0) {
     digitalWrite( pinmotdir[motnr][0],HIGH);
     digitalWrite( pinmotdir[motnr][1],LOW);
  }
  else
  if(power<0) {
     digitalWrite( pinmotdir[motnr][0],LOW);
     digitalWrite( pinmotdir[motnr][1],HIGH);
  }
  else
  if(power==0) {
     digitalWrite( pinmotdir[motnr][0],LOW);
     digitalWrite( pinmotdir[motnr][1],LOW);
  }

  power = abs(power);
  if(power>254) power=254;
  analogWrite(pinmotpwm[motnr],power);
}

//------------------------------------------------------------------------------------

inline void motorbrake(byte motnr) {  // to do list !!!
  motoron(motnr, 0);
}

//------------------------------------------------------------------------------------

inline void motorcoast(int motnr) {
  motoron( motnr, 0);
}

#define  motoroff    motorcoast

//************************************************************************************

void setup()
{
   pinMode(startpin,INPUT_PULLUP);   // btn to start
   
   pinMode(pinmot0d1,OUTPUT);        // dir1
   pinMode(pinmot0d2,OUTPUT);        // dir2
   pinMode(pinmenc0A,INPUT_PULLUP);  // encA
   pinMode(pinmenc0B,INPUT_PULLUP);  // encB
   pinMode(pinmot0pwm,OUTPUT);       // enable
   
   pinMode(pinmot1d1,OUTPUT);        // dir1
   pinMode(pinmot1d2,OUTPUT);        // dir2
   pinMode(pinmenc1A,INPUT_PULLUP);  // encA
   pinMode(pinmenc1B,INPUT_PULLUP);  // encB
   pinMode(pinmot1pwm,OUTPUT);       // enable
 
   // time interrupt for encoder readings
   noInterrupts(); // Jetzt keine Interrupts / disable
       TIMSK1 |= (1<<OCIE1A);  // Timer 1 PIDOutput Compare A Match Interrupt Enable
       TCCR1A = 0;             // "Normaler" Modus
       // WGM12: CTC-Modus einschalten (Clear Timer on Compare match)
       //        Stimmen OCR1A und Timer überein, wird der Interrupt ausgelöst
       // Bit CS12 und CS10 setzen
       // => Prescaler=1024:
       // TCCR1B = (1<<WGM12) | (1<<CS12) | (1<<CS10);
       
       // => Prescaler=8:
       TCCR1B = (1<<WGM12) | (1<<CS11);
       // Frequenz = 16000000 / 1024 / 15 = rd. 1042Hz = 1kHz
       // Frequenz = 16,000,000 / 8 / 64 = rd. 31 kHz
       // Frequenz = 16,000,000 / 8 / 512 = rd. 4 kHz
       OCR1A =511;
       
   interrupts(); // Interrupts wieder erlauben / enable
   
   
   //initialize the variables we're linked to
   PID0input = motenc[0];
   PID0setpoint = 100;

   //turn the PID on
   PID0.SetMode(AUTOMATIC);
   PID0.SetOutputLimits(-255, 255);
   PID0.SetSampleTime(PID_REGTIME_MS);
 
   Serial.begin(115200);
}

//************************************************************************************

void loop()
{
     
   PID0input = motenc[0];
   PID0.Compute(); 
   motoron(0, PID0output);
 
   Serial.println(motenc[0]);
 
}


Nur mit sehr kurzen  Reg.-Time von ca 2ms ist er halbwegs schnell und zuckt nicht und schwingt nicht. Derart kurze Regzeiten will ich aber vermeiden.

Erfahrungswerte wären also gut.
Title: Re: PID library - funktioniert nicht
Post by: Rabenauge on Jul 06, 2014, 11:25 pm
Kann man nur raten, wenn man deinen konkreten Aufbau nicht in den Fingern hat.
Ich z.B. brauche im Segway extreme Werte, da die Motoren sehr stark sind: Kp unter 10 (ich habs nicht im Kopf, glaub, um die 5 herum), Ki dagegen deutlich über 100, Kd wiederum eher sehr klein (einstelliger Kommabereich).

An deiner Stelle würd ich mal bissel mit I spielen.

Kleiner Trick (falls noch paar Analogpins vorübergehend frei sind: mal einfach drei Potis anschliessen, dann kannst du Kp,Ki und Kd in "sinnvollen" Wertebereichen einfach mal on the fly verstellen, wenn das Ergebnis leidlich passt, Werte auslesen (Konsole) und dann fix einstellen in der Software. Das geht manchmal schneller als ewig rumzuprobieren und hunderte Male neu zu flashen.
Title: Re: PID library - funktioniert nicht
Post by: sven222 on Jul 07, 2014, 09:13 am

Kleiner Trick (falls noch paar Analogpins vorübergehend frei sind: mal einfach drei Potis anschliessen, dann kannst du Kp,Ki und Kd in "sinnvollen" Wertebereichen einfach mal on the fly verstellen, wenn das Ergebnis leidlich passt, Werte auslesen (Konsole) und dann fix einstellen in der Software. Das geht manchmal schneller als ewig rumzuprobieren und hunderte Male neu zu flashen.

Die Idee ist so simpel, aber so gut! Danke. 
Title: Re: PID library - funktioniert nicht
Post by: HaWe on Jul 07, 2014, 09:18 am
ja, danke, werd ich auch so probieren! 8-)
Title: Re: PID library - funktioniert nicht
Post by: HaWe on Jul 07, 2014, 12:07 pm
habe jetzt mit 20,80,1 für p,i,d eine ganz gute Einstellung zum Annähern gefunden.

Nun reguliert das Programm aber immer weiter, auch wenn der Zielwert erreicht ist -
wie sagt man ihm am besten, dass der PID-controller nach einer erfolgten Annäherung  gestoppt werden soll (Motoren stromlos)?

Und erst nach einem neuen entsprechenden Befehl (Tastendruck, analoger globaler Wert, was auch immer) dann wieder annähern soll, dann nach Erfolg wieder stoppen, usw.?
Title: Re: PID library - funktioniert nicht
Post by: Rabenauge on Jul 07, 2014, 12:33 pm
Ein Regler läuft normalerweise immer.
Er regelt ja nix, wenn nix zu regeln ist. Also solange Sollwert==Istwert, tut sich da nix. Falls doch, steuert der Regler nicht komplett aus (sollte er aber können).

Hm, um ihn stoppen bzw. zuschalten zu können, würd ich mal versuchen, pid.compute() von ner Flag-Variablen (die du dann sowohl per Button als auch per Software bearbeiten kannst) abhängig zu machen.
Einfacher ist es vielleicht, die Ausgabe des Regler-Ergebnisses einfach ins Nirvana zu schicken, statt zur Motorsteuerung.
Was auch geht: wenn die Regelung "unerwünscht" ist, einfach Kp,Ki,Kd auf Null setzen (dann regelt der gar nix mehr). Das klappt mit dem unter "adaptive Tunings" beschriebenen Vorgehen auf jeden Fall.
Title: Re: PID library - funktioniert nicht
Post by: HaWe on Jul 07, 2014, 02:53 pm
edit: 
das mit 0,0,0 habe ich auch schon gemacht, das funktioniert nicht, er gibt weiter output.
das mit .compute() und output nur bei Fallunterscheidung habe ich auch probiert, hier auch völlig erfolglos.

Der Sinn dahinter ist:
Ich will den PID-Regler auf dem Arduino fernsteuern.
Er bekommt i2c-Nachrichten, welcher Wert mit welchem Motor angefahren werden soll (2 Achsen von einen Roboterarm, auf einem Mega auch mehr als diese 2), und die steuert der Arduino dann solange per PID an, bis die Encoder-Counter die entsprechenden Werte haben.
Das Erreichen der Stellwerte meldet er an den Master zurück, und der kann dann bei Bedarf neue  Stellbefehle schicken - dazwischen ist aber nichts zu tun, er kann daher die Motoren abschalten.
Es braucht auch keine Position gegen passive Kräfte gehalten zu werden, da es Schneckengetriebe sind, so spare ich Batteriestrom.
Title: Re: PID library - funktioniert nicht
Post by: HaWe on Jul 07, 2014, 04:22 pm
update: hatte mich vertan, das mit 0,0,0 funktioniert auch nicht:

Code: [Select]

void loop()
{  
  cnt++;
  if (!started) {Serial.println(motenc[0]); delay(500); started=1; }
 
  PID0input = motenc[0];
 
  float gap = abs(PID0setpoint-PID0input); //distance away from setpoint
  if(gap>40)            { PID0.SetTunings(15, 50, 1);   }
  else
  if(gap<=PID_REG_PREC) { PID0.SetTunings( 0,  0, 0);   }
  else                  { PID0.SetTunings(20, 80, 1);   }
 
  PID0.Compute();  
 
  if(gap>2)  motoron(0, PID0output);

  if(cnt>=9) {Serial.print(motenc[0]);Serial.print(" - "); Serial.println(PID0output); cnt=0; }
 
  delay(10);
 
}



obwohl er nach Erreichen des Ziels (gap<=2) als pid 0,0,0, gestellt bekommt, liefert er weiter output an den Motor (Ziel =3600):

Code: [Select]

enc  -  output

2125 - 255.00
2226 - 255.00
2327 - 255.00
2427 - 255.00
2528 - 255.00
2628 - 255.00
2729 - 255.00
2829 - 255.00
2931 - 255.00
3032 - 255.00
3132 - 255.00
3234 - 255.00
3335 - 255.00
3436 - 255.00
3537 - -175.00
3591 - -65.00
3607 - -24.08
3606 - 208.16
3606 - 47.32
3606 - 12.76
3606 - -21.80
3606 - -56.36
3606 - -90.92
3606 - -125.48
3606 - -160.04
3606 - -194.60
3602 - -92.52
3600 - -97.00
3601 - -97.00
3601 - -97.00
3601 - -97.00
3601 - -97.00
3601 - -97.00
3601 - -97.00



Man hört den Motor am Schluss auch deutlich dauerhaft piepen (1000 Hz oder so), und wenn ihn manuell verstellen will, merkt man auch deutlich eine Rückstellkraft.
(Diese Nachregulierung soll aber nach Erreichen des Ziels aber eigentlich dauerhaft ausgeschaltet bleiben, nicht nur zeitweise innerhalb der Fehlertoleranz).

da stimmt also was nicht...


Man müsste den PID controller auch jederzeit komplett abschalten können.
Title: Re: PID library - funktioniert nicht
Post by: Rabenauge on Jul 07, 2014, 05:15 pm
Hm: so vielleicht: http://playground.arduino.cc/Code/PIDLibrarySetMode ?

Einfach, wenn er sich raushalten soll, den Modus auf manuell stellen, sollte eigentlich klappen.
Title: Re: PID library - funktioniert nicht
Post by: HaWe on Jul 07, 2014, 05:27 pm
das versteh ich nicht, das ist aber auch grottenschlecht dokumentiert!

ps, edit:
heisst denn "auto" = on und "manual" = off?
nichts anderes?

und was bedeutet "The PID defaults to the off position when created. " ?
Title: Re: PID library - funktioniert nicht
Post by: Rabenauge on Jul 07, 2014, 07:03 pm
Es bedeutet, dass der Regler _gar_ nicht arbeitet, wenn er nicht durch Aufruf von setMode(AUTOMATIC) zugeschalten wird.
Ich glaub, das war mir nämlich beim Segay anfangs passiert: die Anmerkung überlesen und eben das nicht getan.
Da regelte sich nix.

Also: manual=off (Regler aus).
Da das Ganze _nur_ Sinn macht, wenn man es im Programm mehrmals aufrufen kann (sonst brächt mans ja nicht...), dürfts klappen.
Title: Re: PID library - funktioniert nicht
Post by: Serenifly on Jul 07, 2014, 07:08 pm

und was bedeutet "The PID defaults to the off position when created. " ?

Genau was es sagt. Die Standardeinstellung im Konstruktor. Also Aus nachdem das Objekt erstellt wurde.
Title: Re: [gelöst:] PID library - funktioniert [-nicht-]
Post by: HaWe on Jul 07, 2014, 08:07 pm
ok, srry, ich kenne  mich mit Objekten und Konstrukten oder OOP absolut nicht aus. Ich verstehe also nicht, was für defaults er dann genau schreibt. Aber ich habe sicherheitshalber noch mal alle pids =0 gesetzt.

edit:

funktioniert - habe runstates eigefügt, jetzt ist er nach Ziel erreichen stille 8-)

Code: [Select]

//***********************************************************************************
// PID controller
// Reading motor encoder[0] to control PWM motor [0]
// ver 1.010
//************************************************************************************

#include <PID_v1.h>

//Define Variables we'll be connecting to
double PID0setpoint, PID0input, PID0output;

//Specify the links and initial tuning parameters
PID PID0(&PID0input, &PID0output, &PID0setpoint, 20, 70, 1.5, DIRECT);

#define  PID_REGTIME_MS  8
#define  PID_REG_PREC    2


//*************************************************************

#define sensortouch(pinHIGH) !digitalRead(pinHIGH)

#define startpin  12
#define MAXMOTORS  2

#define    OUT_RUNSTATE_IDLE     0
#define    OUT_RUNSTATE_ACTIVE   1

// set motor pins
// motor 0
#define pinmenc0A  2  // encA yellow
#define pinmenc0B  3  // encB blue
#define pinmot0d1  4  // dir1
#define pinmot0d2  5  // dir2
#define pinmot0pwm 6  // enable
// motor 1
#define pinmenc1A  7  // encA yellow
#define pinmenc1B  8  // encB blue
#define pinmot1d1  9  // dir1
#define pinmot1d2  10 // dir2
#define pinmot1pwm 11 // enable


//************************************************************************************
// Encoder functions courtesy of / entnommen aus: http: //www.meinDUINO.de //
//
// Globale Variablen zur Auswertung in der Interrupt-Service-Routine (ISR)
//************************************************************************************
volatile int8_t altAB[MAXMOTORS]  = {0,0};
volatile long   motenc[MAXMOTORS] = {0,0},
               oldenc[MAXMOTORS] = {0,0};
volatile int  runstate[MAXMOTORS];                
               

// Die beiden Schritt-Tabellen für 1/1, 1/2 oder 1/4-Auflösung/resolution
// 1/2 Auflösung/resolution
 int8_t schrittTab[16] = {0, 0,0,0,1,0,0,-1, 0,0,0,1,0,0,-1,0};

//*************************************************************
// Interrupt Service Routine: wenn Interrupt ausgelöst wird
//*************************************************************
ISR(TIMER1_COMPA_vect) {
 altAB[0] <<= 2;
 altAB[0] &= B00001100;
 altAB[0] |= (digitalRead(pinmenc0A) << 1) | digitalRead(pinmenc0B);
 motenc[0] += schrittTab[altAB[0]];           //

 altAB[1] <<= 2;
 altAB[1] &= B00001100;
 altAB[1] |= (digitalRead(pinmenc1A) << 1) | digitalRead(pinmenc1B);
 motenc[1] += schrittTab[altAB[1]];           //
}

//************************************************************************************

byte pinmotdir[MAXMOTORS][2]={ {pinmot0d1, pinmot0d2},
                              {pinmot1d1, pinmot1d2} };
                                       
int  pinmotpwm[MAXMOTORS]={pinmot0pwm, pinmot1pwm};



//************************************************************************************
inline void motoron(byte motnr, int power) {
 if(power>0) {
    digitalWrite( pinmotdir[motnr][0],HIGH);
    digitalWrite( pinmotdir[motnr][1],LOW);
 }
 else
 if(power<0) {
    digitalWrite( pinmotdir[motnr][0],LOW);
    digitalWrite( pinmotdir[motnr][1],HIGH);
 }
 else
 if(power==0) {
    digitalWrite( pinmotdir[motnr][0],LOW);
    digitalWrite( pinmotdir[motnr][1],LOW);
 }

 power = abs(power);
 if(power>254) power=254;
 analogWrite(pinmotpwm[motnr],power);
}

//------------------------------------------------------------------------------------

inline void motorbrake(byte motnr) {  // to do list !!!
 motoron(motnr, 0);
}

//------------------------------------------------------------------------------------

inline void motorcoast(int motnr) {
 motoron( motnr, 0);
}

#define  motoroff    motorcoast

//************************************************************************************

void setup()
{
 
  Serial.begin(115200);
 
  pinMode(startpin,INPUT_PULLUP);   // btn to start
 
  pinMode(pinmot0d1,OUTPUT);        // dir1
  pinMode(pinmot0d2,OUTPUT);        // dir2
  pinMode(pinmenc0A,INPUT_PULLUP);  // encA
  pinMode(pinmenc0B,INPUT_PULLUP);  // encB
  pinMode(pinmot0pwm,OUTPUT);       // enable
 
  pinMode(pinmot1d1,OUTPUT);        // dir1
  pinMode(pinmot1d2,OUTPUT);        // dir2
  pinMode(pinmenc1A,INPUT_PULLUP);  // encA
  pinMode(pinmenc1B,INPUT_PULLUP);  // encB
  pinMode(pinmot1pwm,OUTPUT);       // enable

  // time interrupt for encoder readings
  noInterrupts(); // Jetzt keine Interrupts / disable
      TIMSK1 |= (1<<OCIE1A);  // Timer 1 PIDOutput Compare A Match Interrupt Enable
      TCCR1A = 0;             // "Normaler" Modus
      // WGM12: CTC-Modus einschalten (Clear Timer on Compare match)
      //        Stimmen OCR1A und Timer überein, wird der Interrupt ausgelöst
      // Bit CS12 und CS10 setzen
      // => Prescaler=8:
      TCCR1B = (1<<WGM12) | (1<<CS11);
      // Frequenz = 16,000,000 / 8 / 512 = rd. 4 kHz
      OCR1A =511;
     
  interrupts(); // Interrupts wieder erlauben / enable
 
  //initialize the variables we're linked to
  PID0input = motenc[0];

  // set PID parameters
  PID0.SetMode(AUTOMATIC);
  PID0.SetOutputLimits(-255, 255);
  PID0.SetSampleTime(PID_REGTIME_MS);
   
  PID0setpoint = 360;                 // set target,  
  runstate[0]=OUT_RUNSTATE_ACTIVE;   // switch the PID on to motor[0]
}

char started =0;
int  cnt=0;


//************************************************************************************

void loop()
{
  cnt++;
  if (!started) {                               // pause before start
    Serial.println("enc - output");
    Serial.print(motenc[0]);Serial.print(" - "); Serial.println(PID0output);
    delay(500);
    started=1;
  }
 
 
  PID0input = motenc[0];

  float gap = abs(PID0setpoint-PID0input); //distance away from setpoint
 
  if (runstate[0]==OUT_RUNSTATE_ACTIVE) {
     PID0.Compute();
     PID0.SetTunings(20, 70, 1.5);
  }
  else PID0output=0;
 
  if ((gap>PID_REG_PREC)&&(runstate[0]==OUT_RUNSTATE_ACTIVE)) motoron(0, PID0output);

  if(cnt>=9) {
    if( (gap<=PID_REG_PREC)&& abs(oldenc[0]-motenc[0])<1 ) {
      PID0.SetMode(MANUAL);
      PID0.SetTunings( 0,  0, 0);
      runstate[0]=OUT_RUNSTATE_IDLE;
      motoroff(0);
    }
    Serial.print(motenc[0]);Serial.print(" - "); Serial.println(PID0output);
    cnt=0;
  }
 
  oldenc[0]=motenc[0];
  delay(10);

}



Code: [Select]

enc - output
0 - 0.00
40 - 255.00
124 - 255.00
215 - 255.00
302 - 255.00
342 - 240.00
359 - 87.50
358 - 255.00
358 - 0.00
358 - 0.00
358 - 0.00
358 - 0.00
358 - 0.00
358 - 0.00
358 - 0.00
358 - 0.00
358 - 0.00
358 - 0.00
358 - 0.00
358 - 0.00
358 - 0.00
358 - 0.00
358 - 0.00
358 - 0.00
358 - 0.00