mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PID-Regler für Drehzahregelung einen Gleichstrommotor


Autor: Joker T. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

Ich bin neu und hätte gerne eine Frage.
Ich soll eine Drehzahlregelung eines Gleichstrommotors mit PID-Regler 
und Hall-Sensor durchführen.
Ich verstehe einfach nicht, wie man einen PID-Regler im Arduino 
programmiert.
Ich brauche wirklich Hilfe.
Tnx

Autor: MaWin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was hast du denn bisher so gelernt ?

Deutsch, englisch ?
Internet, Google ?

Schon mal pid controller android gegoogelt ?

Autor: podom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schon mal pid controller ARDUINO gegoogelt ?

Autor: Andreas Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
MaWin schrieb:
> Schon mal pid controller android gegoogelt ?

Android???


Und Hausaufgaben sind zum Lernen da.
Also erstmal das Schulbuch lesen und dann Loslegen.

Autor: Baendiger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aber was ein PID-Regler ist und wie er funktioniert hast du verstanden? 
Ansonsten: http://rn-wissen.de/wiki/index.php/Regelungstechnik
Relativ weit unten findet sich der Punkt: Software PID-Regler

Wo liegt denn dein konkretes Problem?
du musst:
- den Ist-Wert mit dem Hall-Sensor einlesen
- diesen und den Soll-Wert in die Formeln im Link einsetzen
- die Anteile festlegen (im einfachsten Fall einfach ausprobieren)
- Stellgröße an den Motor weitergeben

Autor: Joker T. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also erstmal danke fürs Antwort,
ich habe die Motor schon mit eine H-Brücke gesteuert und auch 
PID-Bibliotheken von Arduino runtergeladen und schon mal Alle 
Informationen gelesen aber mir fehlt trotzdem die Code-Befehl zu 
schreiben, hab noch nie zwei Anwendungen mit Arduino dürchgeführt. habe 
Schon auch die Hall Sensor mit Arduino verwendet. Aber Hall-Sensor und 
Motor gleichzeitig nie verbundet.

Autor: Gorch Fock (hacky)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oh. Ok, ja, das ist natuerlich ein grosser Schritt. Ja, dann mach ihn. 
Wir wuenschen viel Glueck. Wo ist das Problem ? Wir sind da.

1) was wurde gemacht
2) was geht, geht nicht
3) wo liegt das Problem

Autor: Baendiger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
4) vorhandener Quellcode und Schaltung posten

Autor: Joker T. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also
ich werde den schaltung so machen:
H-Brücke wie Normal und dann hall-Sensor auch genau so wie normal mit 
Arduino verbuden,
doch mein Problem ist die quellen-code zu Schreiben. Ich habe ein paar 
codes in Google hearusgefunden, doch schaffe ich nicht die zu verstehen.
so muss gemachgt werden:
ein PID-Regler für ein Gleichstrommotor mit Hilfe eine Hall-Sensor.
Der Motor soll anfangen zu laufen, der sollwert sollte z.B 500 sein , 
der Hall-Sensor muss den wert Lesen, dann musste das zurück zu Arduino 
als Feedback schicken, wenn der Istwert nicht 500 ist, dann muss 
Automatisch die Drehzahl wieder 500 werden.

Autor: Joker T. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
http://wp.scalesoft.de/?s=PID+regler
https://github.com/bcomnes/315-lab-microcontroller...

die Zwei passen eigentlich, so ich habe halt nur eine Motor ohne 
encoder, nur eine Hall sensor , und meine Problem liegt daran dass ich 
keine PID- code schreiben kann.

Autor: Joker T. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gorch F. schrieb:
> Oh. Ok, ja, das ist natuerlich ein grosser Schritt. Ja, dann mach ihn.
> Wir wuenschen viel Glueck. Wo ist das Problem ? Wir sind da.
>
> 1) was wurde gemacht
> 2) was geht, geht nicht
> 3) wo liegt das Problem

Also
ich werde den schaltung so machen:
H-Brücke wie Normal und dann hall-Sensor auch genau so wie normal mit
Arduino verbuden,
doch mein Problem ist die quellen-code zu Schreiben. Ich habe ein paar
codes in Google hearusgefunden, doch schaffe ich nicht die zu verstehen.
so muss gemachgt werden:
ein PID-Regler für ein Gleichstrommotor mit Hilfe eine Hall-Sensor.
Der Motor soll anfangen zu laufen, der sollwert sollte z.B 500 sein ,
der Hall-Sensor muss den wert Lesen, dann musste das zurück zu Arduino
als Feedback schicken, wenn der Istwert nicht 500 ist, dann muss
Automatisch die Drehzahl wieder 500 werden.

Autor: Joker T. (Gast)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Baendiger schrieb:
> 4) vorhandener Quellcode und Schaltung posten

Bewertung
0
http://wp.scalesoft.de/?s=PID+regler
https://github.com/bcomnes/315-lab-microcontroller...

die Zwei passen eigentlich, so ich habe halt nur eine Motor ohne
encoder, nur eine Hall sensor , und meine Problem liegt daran dass ich
keine PID- code schreiben kann.

Autor: RP6conrad (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Grosse problemen immer in kleinere "teil-probleme" verteilen. Erste 
problem : kan ich ein drehzah mit diesen Hall sensor vermessen ? Noch zu 
grosses problem, dan wieder weiter : kan ich ein Hall sensor auswerten, 
1 oder 0 unterschieden ? Noch zu gross, multimeter dabei : kan ich 5 V 
oder 0 V vermessen an den Arduino eingang ? So erst die basis, wen du 
das Drehzahl messen kan und der DC-motor reglen mit PWM kommt PID as 
naechste....

Autor: Joker T. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
RP6conrad schrieb:
> Grosse problemen immer in kleinere "teil-probleme" verteilen. Erste
> problem : kan ich ein drehzah mit diesen Hall sensor vermessen ? Noch zu
> grosses problem, dan wieder weiter : kan ich ein Hall sensor auswerten,
> 1 oder 0 unterschieden ? Noch zu gross, multimeter dabei : kan ich 5 V
> oder 0 V vermessen an den Arduino eingang ? So erst die basis, wen du
> das Drehzahl messen kan und der DC-motor reglen mit PWM kommt PID as
> naechste....

Hi
ja ich könnte schin die Drehzahl mit Hall-Sensor messen.
die Motor Steurung läuft auch gut
doch jetzt die Aufgabe eine Drehzahlregelung zu machen.

Autor: RP6conrad (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jetzt eine "soll-wert" eingeben, kannst du einfach fest in die code 
setzen, oder mit ein poti und analogread. Danach kommt dann diese 
"Abweichung" berechnen : soll ist 100 n/s, der motor dreht nur 75 n/s, 
so ihre "Abweichung ist dann (100-75) = 25. Eine reine P-regelung ist 
gans einfach : Abweichung * p-factor = PWM Wert. Wie gross soll diese 
p-factor sein ? Einfach versuchen, erst mit kleinere Werten, und immer 
erhohen biss das ganse nicht mehr stabil ist.
Gas wichtig ist ihre "Loop Zeit", das ist das Zeitfenster wo drehzahl 
vermessen wird und PWM berechnet. Wie kurzer, wie besser, aber du 
brauchst eine minimale zeit um das Drehzahl zu vermessen.

Autor: Joker T. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
RP6conrad schrieb:
> Jetzt eine "soll-wert" eingeben, kannst du einfach fest in die code
> setzen, oder mit ein poti und analogread. Danach kommt dann diese
> "Abweichung" berechnen : soll ist 100 n/s, der motor dreht nur 75 n/s,
> so ihre "Abweichung ist dann (100-75) = 25. Eine reine P-regelung ist
> gans einfach : Abweichung * p-factor = PWM Wert. Wie gross soll diese
> p-factor sein ? Einfach versuchen, erst mit kleinere Werten, und immer
> erhohen biss das ganse nicht mehr stabil ist.
> Gas wichtig ist ihre "Loop Zeit", das ist das Zeitfenster wo drehzahl
> vermessen wird und PWM berechnet. Wie kurzer, wie besser, aber du
> brauchst eine minimale zeit um das Drehzahl zu vermessen.

Vielen dank für super tollen hinweise,
doch mir fehlt den Code zu Schreiben.
ich krieg das irgenwie nicht hin was sinnvolles da zu Programmieren

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also du willst nicht wissen wie es geht, sondern einen fertigen 
sourcecode?

Beitrag #5391219 wurde von einem Moderator gelöscht.
Autor: Joker T. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auf jeden fall will ich ds verstehen
und möchte keine fertige Code, weil ich es noch vortragen muss
doch mein fertige Code Funktioniert nicht
ich schick es gleich wenn an mein Laptop bin und vllt könnt ihr darauf 
gucken

Autor: Arduino Fanboy (ufuf)
Datum:

Bewertung
-2 lesenswert
nicht lesenswert
Joker T. schrieb:
> Auf jeden fall will ich ds verstehen
Guter Ansatz!

Aber, wie stellst du dir da unsere Hilfe vor?

Dir den Wikipedia Beitrag zu PID Reglern vorzulesen, dazu habe ich eine 
Lust.

: Bearbeitet durch User
Autor: Zitronen Falter (jetztnicht)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also zeig mal deinen bisherigen Code ..

Autor: Joker T. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zitronen F. schrieb:
> Also zeig mal deinen bisherigen Code ..

#include <IRremote.h>   //Bibliothekszugriff für Infrarot Fernbedienung
#include <PID_v1.h>     //Bibliothekszugriff für PID-Regler

//Variablendeklaration
int PWM_freq = 0;   //Variable für PWM-Frequenz
int pin3 = 3;   //PWM-Ausgang
int pin4 = 4;   //Linkslauf-Ausgang
int pin5 = 5;   //Rechtslauf-Ausgang
int pinX;
int RECV_PIN = 11;  //Empfangs-Eingang für Fernbedienung
volatile byte half_revolutions = 0;
unsigned int rpm = 0;
unsigned long timeold = 0;

//Fernbedienung
IRrecv irrecv(RECV_PIN);   // An dieser Stelle wird ein Objekt 
definiert, dass den Infrarotsensor an Pin 11 ausliest.
decode_results results;  // Speichert eingaben unter „results“

//PID-Regler
double Setpoint, Input, Output; //Variablendeklaration für PID-Regler
PID myPID(&Input, &Output, &Setpoint,2,5,1, DIRECT);  //Definiere 
PID-Regler

void setup() {
  //Fernbedienung
  Serial.begin(115200);  //Im Setup wird die Serielle Verbindung 
gestartet, damit man sich die Empfangenen Daten der Fernbedienung per 
seriellen Monitor ansehen kann.
  irrecv.enableIRIn();   //Dieser Befehl initialisiert den 
Infrarotempfänger.

  //Hall-Sensor
  attachInterrupt(0, magnet_detect, RISING);  //Initialisierung des 
Unterbrechungspin (Arduino digital pin 2)

  //Ein- und Ausgänge
  pinMode (pin3, OUTPUT);  //Linkslauf-Ausgang
  pinMode (pin4, OUTPUT);  //Rechtslauf-Ausgang

   //PID-Regler
  Input = analogRead(0);    //Eingang IST-Wert (Hallsensor)
  myPID.SetMode(AUTOMATIC); //PID-Regler starten
}

void loop() {

//Fernbedienung
if (irrecv.decode(&results)) {    //Wenn Daten empfangen wurden,
Serial.println(results.value, DEC); //werden sie als Dezimalzahl (DEC) 
an den Serial-Monitor ausgegeben.

  //Taste "+"
  if (results.value == 16769055){
    Setpoint = Setpoint + 50;   //SOLL-Wert
  }

  //Taste "-"
  if (results.value == 16754775){
    Setpoint = Setpoint - 50;  //SOLL-Wert
  }

  //Taste stopp
  if (results.value == 16748655){
    Setpoint = 0;  //SOLL-Wert
  }

  //Taste Links "<"
  if (results.value == 16712445){
  digitalWrite(pin3, HIGH); digitalWrite(pin4, LOW); 
//Linkslauf-Ausgang
  }

  //Taste Rechts ">"
  if (results.value == 16720605){
  digitalWrite(pin3, LOW); digitalWrite(pin4, HIGH); 
//Rechtslauf-Ausgang
  }
}

//Hall-Signal
if (half_revolutions >= 20) {
  rpm = 30*1000/(millis() - timeold)*half_revolutions;
  timeold = millis();
  half_revolutions = 0;
  Serial.println(rpm,DEC);
}

//PID-IST-Wert
Input = (255 / 20000) * rpm; //Ermittelte Drehzahl in U/min zu 0-255

//PWM/PID-Ausgang
analogWrite(pin2,Output);  //PWM-Ausgang PID-geregelt

//Fernbedienung
irrecv.resume();  //Der nächste Wert soll vom IR-Empfänger eingelesen 
werden

//LCD
Serial.println(Setpoint);   //LCD-Ausgang
}

//HALL-Sensor
void magnet_detect()  //This function is called whenever a 
magnet/interrupt is detected by the arduino
 {
   half_revolutions++;
 }

Autor: Joker T. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zitronen F. schrieb:
> Also zeig mal deinen bisherigen Code ..

das ist was ich geschrieben hab
Mit hall-Sensor und Remot cpntroller
doch funktioniert es nicht und weiss net wo das Problem Liegt

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und wo ist die Regelschleife?
Wenn das alles ist, dann ist klar, dass das nicht funktioniert!

Autor: Joker T. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jens schrieb:
> Und wo ist die Regelschleife?
> Wenn das alles ist, dann ist klar, dass das nicht funktioniert!

du meinst KP,  TV und TN muss ich noch definieren oder?

Beitrag #5391507 wurde von einem Moderator gelöscht.
Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Vermutung habe ich auch.
Und ich dachte schon es liegt an Arduino. Das hasse ich nicht nur 
einfach so.
Aber das kommt dabei raus, wenn sich keiner mehr Gedanken machen muss, 
was er tut.

Also mit der Reaktion bin ich raus. Da ist ja nichts da, worauf man 
aufbauen könnte. Nicht einmal das Verständnis, was zu tun ist.

Ich wünsche viel Glück und dass die beim Abgabetermin gnädig sind.

Autor: Joker T. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jens schrieb:
> Die Vermutung habe ich auch.
> Und ich dachte schon es liegt an Arduino. Das hasse ich nicht nur
> einfach so.
> Aber das kommt dabei raus, wenn sich keiner mehr Gedanken machen muss,
> was er tut.
>
> Also mit der Reaktion bin ich raus. Da ist ja nichts da, worauf man
> aufbauen könnte. Nicht einmal das Verständnis, was zu tun ist.
>
> Ich wünsche viel Glück und dass die beim Abgabetermin gnädig sind.

tut mir leid wegen dumme fragen
meine Aufgaben war was anderes mit arduino zubauen und die sind schon 
fertig und jetzt eine woche für abgabe verlangt der prof dass ich auch 
noch dazu machen muss und ich hatte keine Ahnung was mit dem PID-regler 
gemeint ist,
ich werde das hinkriegen und bedanke mich fürs zeit und Antworten
tut mir nochmal leid

Autor: Arduino Fanboy (ufuf)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jens schrieb:
> Und ich dachte schon es liegt an Arduino.
Zumindest in dem Punkt kann ich dich beruhigen!

Das ist hier kein Problem, was mit der Arduino Hardware, oder der IDE, 
zu tun hätte.

Hier liegt ein "Level 8 Problem" vor.

: Bearbeitet durch User
Autor: Hubert G. (hubertg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Joker T. schrieb:
> //Hall-Sensor
>   attachInterrupt(0, magnet_detect, RISING);  //Initialisierung des
> Unterbrechungspin (Arduino digital pin 2)

Joker T. schrieb:
> //PID-Regler
>   Input = analogRead(0);    //Eingang IST-Wert (Hallsensor)

Das ist doch ein zusammenkopieren ohne  jeden Zusammenhang.
Der Hallsensor wird über INT0 eingelesen und der PID-Regler erwartet 
eine Eingabe auf analogRead(0, also einen analogen Wert.

Autor: user (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das ist eigentlich sein Uni Projekt ...

Autor: Loth (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: rµ (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
zwischen
//PID-IST-Wert
Input = (255 / 20000) * rpm; //Ermittelte Drehzahl in U/min zu 0-255

und
//PWM/PID-Ausgang
analogWrite(pin2,Output);  //PWM-Ausgang PID-geregelt

muss irgendetwas von myPID aufgerufen werden was aus dem aktuellen Input 
und dem Zustand des PID Reglers einen neuen Output ausrechnet.

Beitrag #5391642 wurde vom Autor gelöscht.
Autor: Joker T. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
rµ schrieb:
> zwischen
>
> //PID-IST-Wert
> Input = (255 / 20000) * rpm; //Ermittelte Drehzahl in U/min zu 0-255
> 
>
> und
>
>
> //PWM/PID-Ausgang
> analogWrite(pin2,Output);  //PWM-Ausgang PID-geregelt
> 
>
> muss irgendetwas von myPID aufgerufen werden was aus dem aktuellen Input
> und dem Zustand des PID Reglers einen neuen Output ausrechnet.

Vielen Dank
habe hinbekommen

Autor: Loth (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Input = (255 / 20000) * rpm; //Ermittelte Drehzahl in U/min zu 0-255
Geht das?
Ist das nicht das gleiche wie:
Input = (0) * rpm; //nix

Autor: Matthias S. (Firma: matzetronics) (mschoeldgen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Geh doch bitte mal mit Überlegung ran. Da du eine Geschwindigkeit messen 
willst, brauchst du eine Uhr/Zeitbasis, also einen Timer. Auch ein 
digitaler PID Regler kann nur richtig arbeiten, wenn er regelmässig 
aufgerufen wird.

Du solltest also einen Timer implementieren und diesen erst einmal dazu 
nutzen, die Geschwindigkeit deines Motors zu messen.
Der zeitliche Abstand von Hallsensorpuls zu Hallsensorpuls ist ein Mass 
dafür. Arduino bietet dafür den millis() Timer, evtl. kannst du den ja 
benutzen. Den Ansatz hast du ja schon drin, aber du solltest da erstmal 
zusehen, das da vernünftige Werte rauskommen. Ein Regler will sinnvolle 
Werte am Eingang haben, die sinnvollerweise auch den gleichen 
Wertebereich haben. Skaliere die Werte vom Ist und Soll so, das sie etwa 
im gleichen Bereich sind.

: Bearbeitet durch User
Autor: Uwe Federer (Gast)
Datum:

Bewertung
2 lesenswert
nicht lesenswert
Joker  hat's schon bei Arduino.cc probiert Antworten zu bekommen. Als er 
kein vorgefertigtes für ihn brauchbares Projekt bekommen hat, hat er 
seine Posts gelöscht.
Bitte keine Hilfestellung geben. Er soll selbst mal lernen, daß man 
selbst arbeiten muß und nicht andere für sich arbeiten lassen, weil man 
sich zu spät an eine Arbeit für die Uni gesetzt hat.
Grüße Uwe
Moderator bei Arduino.cc.

Autor: Zitronen Falter (jetztnicht)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Projekt hat folgende Aspekte, die man einzeln ueberschauen und 
koennen muss.

0) DC Motor, Charakteristik
1) PID Regler - Theorie & Simulation auf einem PC
2) Embedded Sprache & IDE dazu
3) Kontrollierte Prozesse auf einem Controller
   - Was ist ein Prozess auf einem Controller,
     Parametrisierung und Zugriff
4) Visualisierung von kontrollierten embeddedv Prozessen auf einem PC
   - Irgendwie muss man auf einem PC zuschauen koennen,
     sonst geht's oder eben nicht, ohne Ahnung dazu.

Unter uns gesagt ..  ist schon heftig als Startprojekt. Resp wenn man 
vorher nichts gemacht hat, hat man Null Chancen.

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.

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