Pages: [1]   Go Down
Author Topic: PID Regler  (Read 2469 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 4
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo Leute!

Ich bin gerade dabei mich mit der PID-Lib auseinanderzusetzen! Als Test wollte ich einen Taster betätigen und der Regler soll sozusagen dem Signal folgen!

Also bedeutet das für mich folgendes:

Output = das was ich haben will. Sollte sich solange dem Setpoint nähern, bis er schließlich erreicht ist!
Setpoint = entweder 100 wenn der Taster nicht gedrückt ist oder 0 wenn der Taster gedrückt ist.
Input = Hier liegt wohl mein Problem? Das sollte ja im Endeffekt Setpoint - Output sein, oder?

Code:
#include <PID_v1.h>

const int buttonPin = 11;     // the number of the pushbutton pin
const int ledPin =  10;      // the number of the LED pin

int buttonState = 0;         // variable for reading the pushbutton status
double Setpoint, Input, Output;
PID myPID(&Input, &Output, &Setpoint,2,5,1, DIRECT);

void setup() {
  Serial.begin(9600);
  // initialize the LED pin as an output:
  pinMode(ledPin, OUTPUT);     
  // initialize the pushbutton pin as an input:
  pinMode(buttonPin, INPUT);   
  //turn the PID on
  myPID.SetOutputLimits(0,100);
  myPID.SetMode(AUTOMATIC);
}

void loop(){
  Setpoint = digitalRead(buttonPin)*100;
  Input = Setpoint - Output;
  myPID.Compute();
  Serial.println(Output);
 
  buttonState = digitalRead(buttonPin);
  if (buttonState == LOW) {     
    // turn LED on:   
    digitalWrite(ledPin, HIGH); 
  }
  else {
    // turn LED off:
    digitalWrite(ledPin, LOW);
  }
}

Aber die Ausgabe ist leider völliger mist... was mache ich denn falsch?

Gruß,
Markus
Logged

Switzerland
Offline Offline
Faraday Member
**
Karma: 108
Posts: 5144
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Dein Input wird falsch berechnet. Du willst ja einen Regelkreis erstellen, also muss der Input der Feedback des Systems sein. Da Du kein externes System hast, solltest Du Input = Output setzen und nicht so aggressive Tuning-Werte verwenden.

Code:
PID myPID(&Output, &Output, &Setpoint,1,0.05,0.25, DIRECT);

Kann aber auch sein, dass ich Deine Ziele falsch verstanden habe. Du willst den Taster drücken und der Ausgabewert soll nicht sofort sondern langsam an den Zielwert (durch den Taster definiert) angeglichen werden. Für dieses Problem ist die PID-Bibliothek ein Overkill, das kannst Du deutlich einfacher haben, aber ich denke, Dir geht es hier nur um's Experimentieren und nicht um ein reales Problem.
Logged

AREA COLOGNE
Offline Offline
Edison Member
*
Karma: 21
Posts: 1128
I am 1 of 10 who understands binary
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Du müsst für einen Regler einen Geschlossenen Kreis haben. Das was du vorhast ist Nur ein Integrator der langsam über eine Integrationszeit den neuen Wert in den alten Wert integriert
Logged

So ist das Leben:
Manchmal bis du das Denkmal, manchmal die Taube!

Pages: [1]   Go Up
Jump to: