Motor regeln

Guten Tag,

meine Frage lautet wie folgt. Ich habe einen Motor den ich mittels Potentiometer steuer. Die Drehzahl krieg ich auch ausgelesen.

Nun will ich meinen 2. Motor mit einem PID-Regler genauso schnell laufen lassen. Hat jemand eine Idee diesbezüglich? Probiere schon die ganze Zeit herum, jedoch krieg ich es nicht gebacken. Hab es mit der PID Bibliothek versucht.

Habe dann als Input meine gemappte Drehzahl (auf 155) genommen und als Output den Pin 10 (Da ist auch mein Motor- angeschlossen. Motor + ist auf dem Breadboard auf +.

:frowning:

Kannst du bitte dein Vorhaben nochmal etwas genauer beschreiben und dazu ein Schaltbild liefern, wie du was angeschlossen hast.

Aus deiner obigen Erklärung geht das leider nicht hervor.

Ich hab's versucht so gut wie möglich in einem Bild darzustellen. Siehe Anhang.

Motor 1 wird mittels Potentiometer gesteuert (AnalogWrite Potentiometer Value). Motor 2 soll nun die Drehzahl von Motor 1 erkennen und mittels PID-Regler das gleiche Signal erhalten. Wenn ich demnach via Poti die "Drehzahl" änder, dann soll Motor 2 das wieder erkennen und sich um den Wert einpendeln.

Bin da etwas überfragt.

Der Setpoint sollte demnach analogRead(0); sein.

Mein Output ist der Wert den mein Motor 2 hat.

Was ist denn dann mein Input? Es sieht so aus, als wäre mein Setpoint und mein Input analogRead(0)...

Da sind noch Fragen offen:

Wie soll Motor 2 die Drehzahl von Motor 1 erkennen ?

Warum hat Motor 2 keinen Mosfet zur Steuerung ?

was meinst du mit Setpoint ?

Also ich habe eine variable wo ich mit Hallsensor und Magnet die Drehzahl von Motor 1 ermittelt habe. Die steht zur Verfügung.

Motor 2 hab ich jetzt mit Mosfet verschaltet. Sieht genau wie Motor 1 aus nun nur halt nach PWm pin 9.

Setpoint ist quasi ein Wert den sich der Motor annähern soll.
Inspiriert hier von

/********************************************************
* 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);
}

Hallo

Ein PID Regler benötigt einen Sollwert und einen Istwert.
Istwert kann in Deinem Fall ein Tacho oder ein Drehzahl Encoder sein. Hast du ja aber anscheinend nicht.
Was man machen könnte;

Motor 1 läuft im Stellbetrieb und es gibt einen Iswert.
Der Sollwert für Motor 2 könnte dann der Istwert von Motor 1 sein. Dan nennt man dann Master Slave oder Kaskade. Dann kann man den Sollwert von Motor 2 fur den Aufbau eines Regelkreises für Motor 2 benutzen und den Istwert des Motor 2 als Istwert für den Regelkreis verwenden.

Ich würde in deinem Fall den eingelesen wert des Potis als Stellgröße für beide Antriebe benutzen mehr wird ohne Drehzahl Erfassung beider Antriebe nicht drinn sein.

Heinz

Nachtrag da hat sich was überschnitten

Also du brauchst noch den Istwert von Motor 2

"Istwert kann in Deinem Fall ein Tacho oder ein Drehzahl Encoder sein. Hast du ja aber anscheinend nicht.
Was man machen könnte;"

Also die Drehzahl vom ersten Motor hab ich ja. Wird ermittelt via Hall-Effekt-Sensor. Drehzahl 2 hab ich nicht. Hab das nicht so ganz verstanden. Könntest du das in Code schreiben eventuell? muss kein funktionierender sein. Nur zum Verständnis in Logik

void loop()
{
  int stellwert = analogRead(0);
  analogWrite(11,stellwert/4); // motor1 stellen

  Input = drehzahl(motor2);
  Setpoint = drehzahl(motor1);

  myPID.Compute();

  analogWrite(10,Output); // motor2 stellen
}

Der Drehzahlwert von Motor 1 muss zum Setpoint von Motor 2 werden.

RedOne1990:
Also die Drehzahl vom ersten Motor hab ich ja. Wird ermittelt via Hall-Effekt-Sensor. Drehzahl 2 hab ich nicht.

Du musst Drehzahl 2 messen, um Drehzahl 2 regeln zu können.

Ich würde mal den Motor 2 so auswählen, dass er die gleiche Drehzahl wie Motor 1 hat. Dann wüsste ich ja analog die Drehzahl von Motor 2, würde ich jetzt mal denken.

Das wäre aber keine Reglung, sonder purer Glaube an den Elektronik-Gott.

Gruß Tommy

Ja das stimmt schon. Ich muss die Drehzahl herausfinden. Bzw. die Spannung sollte auch reichen, wenn ich eine Kennlinie habe. Weißt du, wie ich die Spannung herauskriegen kann? Welcher Sensor wäre da geeignet?

Warum ermittelst Du du die Drehzahl nicht ebenfalls über einen Hall-Schaltkreis?
Ohne irgendwelche kruden Umwege?

Gruß Tommy

Ich habe gerade leider nur einen Hallsensor und einen Lüfter da. Benutze halt so einen mini DC motor und der hat ja nur ne mini welle von 2mm oder so. Da kann ich leider keinen Magneten platzieren. Sollte dann morgen einen Hallsensor kaufen und einen lüfter irgendwo aufgabeln der gebaucht ist. Dann sollte es gehen.

Ich denke, dass ich erstmal versuche einen Motor an einem fixen Setpoint zu regeln (bsp: Setppoint = 150);
Mal schauen ob ich wenigstens das hinkriegen werde >.>

Wenn das klappt, sollte es mit zwei Motoren auch klappen.

RedOne1990:
Ich würde mal den Motor 2 so auswählen, dass er die gleiche Drehzahl wie Motor 1 hat. Dann wüsste ich ja analog die Drehzahl von Motor 2, würde ich jetzt mal denken.

Wenn das so wäre dann brauchst Du nur beide Motore gleich ansteuern und dann drehen sie sich gleich schnell. is aber nicht so.

Die Drehzahl hängt außer von den Motorcharakteristiken auch von der Last ab.
Um Motor 2 regeln zu können dann mußt Du wissen
a) wie schnell er drehen soll (Hallsensor von Motor1) und
b) wie schnell er sich tatsächlich dreht (Hallsensor an Motor 2) damit die regelung Motor 2 regeln kann.

Es gibt keinen "Arduino UNO r3 Elegoo". Das ist kein orginaler Arduino sondern ein Nachbau von Elegoo und darf deswegen den Namen "Arduino" nicht tragen.

Grüße Uwe

Ich hab mit jetzt einen neuen Lüfter besorgt. Einen neuen Hallsensor und benutze nun den Arduino Mega 2560. Mal schauen was jetzt draus wird!

So hab nun Drehzahl von Motor 1 und Drehzahl von Motor 2 vorhanden.

Wenn ich mir, nachdem ich den Parameter Kp, erneut rpm_2 anschaue, also die Drehzahl vom motor 2 erhalte ich einen wert von über 100.000, obwohl die Drehzahl vlt. 100 U/min ist. Ich frage mich wieso das passiert? Außerdem kriegt der Motor nicht genügend saft.

Prädefinition
float Kp = 1;
float Ki = 0.0025;
float Kd = 0.01;

Code im Loop

Input = rpm_2;
Setpoint = 190; //erstmal einen fixen Wert. Später kommt Motor_1 hier rein

myPID.Compute();
analogWrite(gatePin_2, Output); //Mosfet

Serial.print(rpm_2);
Serial.print(",");
Serial.println(Setpoint);

Im Bild werden Setpoint und rpm_2 angegeben. Obwohl der Motor sich fast kaum dreht sind die "Drehzahlen" enorm hoch!...
Why?

Ich glaube ich weiß woran es lag... Sobald ich anstelle des PIns 10 den Analogpin genommen habe, hab ich korrekt werte angezeigt. Freue mich mega.

Siehe bild.

Habe gerade noch probleme aber muss schauen woran das liegt. Habe wieder extreme Spitzen.