- Akku Tests und Balkonkraftwerk Speicher    Werbung      
Ergebnis 1 bis 10 von 16

Thema: Motor Positionsregelung mit Encoder

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    07.04.2015
    Beiträge
    927
    Hast Du schon mal was von PID-Reglern gehört? Die sind relativ einfach in einem Controller umzusetzen.
    Das hilft allerdings bei Deinem Schrägenproblem nur bedingt , weil:

    "Ohne Abweichung keine Regelung!"

    Vielleicht wäre für das Schrägenproblem denkbar, über einen 3-Ach-Accelerometer die Schräglage zu messen und damit einen zweiten PID-Regler zuzuschalten (Die Dinger kann man kaskadieren, also das Ergebnis mehrerer Regler je nach Anwendungsfall miteinander multiplizieren oder addieren.)

    Mal ein Beispiel für eine PID-Implementierung

    PID.h
    Code:
    #ifndef INCL_PID_H
    	#define INCL_PID_H
    
        #include <avr/io.h> 
        #include <stdint.h>
    
        #define PID_SIZEOFFSET 19 // Offset in uint8_t array for data start
    
        typedef struct
        {
            uint8_t Depth;  //0
            double KP;      //1
            double KI;      //5
            double KD;      //9
            double Sum;     //13
            uint8_t Index;  //17
            double Buffer[];//18
        }PID_t;
    
    
        extern void InitPIDStruct(uint8_t arr[], uint16_t size);
        extern void PIDCalculate(PID_t* pid, double diff, double* result);
    
    
    #endif
    So ein PID-Regler benötigt drei Konstanten, die an das System anzupassen sind: KP(roportional), KI(ntegral), und KD(ifferential).
    Proportional: Je größer die aktuelle Abweichung, desto größer die Gegensteuerung
    Integral: Je "stabiler" (länger anhaltend) die Abweichung, desto größer die Gegensteuerung
    Differential: Je nach Trend (Änderung der Abweichung) ändert sich die Gegensteuerung.



    PID.c

    Code:
    #include <stdint.h>
    #include <math.h>
    #include <string.h>
    #include "PID.h"
    
    
    
    //Init array: iRead/iWrite = 0, data elements = 0, Buffer length = array length -4
    void InitPIDStruct(uint8_t arr[], uint16_t size)
    {
        memset( arr, 0, size);
        arr[0] = (size-PID_SIZEOFFSET) / sizeof(double);
    }
    
    double p, i, d;
    
    void PIDCalculate(PID_t* pid, double diff, double* result)
    {
        //Proportional
        p = diff * pid->KP;
    
        //Differential
        double previous = pid->Buffer[pid->Index];
        d = (diff - previous) * pid->KD;
    
        //Integral
        pid->Index = (pid->Index + 1) % pid->Depth; //Step up index
        double oldVal = pid->Buffer[pid->Index];
        pid->Buffer[pid->Index] = diff;
        pid->Sum -= oldVal;
        pid->Sum += diff;
        i = (pid->Sum/ pid->Depth) * pid->KI;
    
        *result = -1.0 * (p + i + d);
    }
    Um den integralen Anteil zu berechnen, verwende ich hier ein Array, dass die letzten 16 Werte hält. Allerdings berechne ich nicht die komplette Summe in jedem Durchlauf neu, sondern ziehe immer nur das älteste Element ab und füge das neu hinzugekommene Element hinzu.



    Initialisierungsbeispiel:
    Code:
    static uint8_t arrDistance[16 * sizeof(double) + PID_SIZEOFFSET];
    static PID_t* PIDDistance;
    
    void Drive_Init()
    {
        InitPIDStruct(arrDistance, sizeof(arrDistance));
        PIDDistance = (PID_t*) arrDistance;
        
        PIDDistance->KP = 0.6;
        PIDDistance->KI = 0.2;
        PIDDistance->KD = 0.4;
    }
    Vielleicht wird's hier klar, warum ich zuerst ein Array anlege und anschließend auf den Strukturtyp caste. Ich kann dadurch die Größe des Integrationspuffers in der Arraydefinition anpassen (in InitPIDStruct wird entsprechend dann das "Depth" errechnet).


    Ein Durchlauf in etwa so:
    Code:
        //calculate Distance regulation value
        static double dregDistance;
        PIDCalculate(PIDDistance, dDistance, &dregDistance);
       
        //!!! Wenn Neutral = 15000, dann hier aufaddieren
        int16_t newPWM = 15000 + (int16_t) dRegDistance;
    Eingang ist die Regeldifferenz dDistance, also Sollwert-Istwert
    Ausgang ist der Regelwert, hier als Beispiel mal die PWM.

    Die drei Konstanten kP, kI und kD einzustellen, ist allerdings eine Kunst für sich. Es gibt sowohl mathematische Ansätze als auch den reinen Probieralgorithmus, in dem zuerst kP möglichst optimal eingestellt, danach kI dazugenommen und kD als optimierendes i-Tüpfelchen zum Schluss ausgetestet wird.
    Geändert von Holomino (08.10.2016 um 10:23 Uhr)

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von i_make_it
    Registriert seit
    29.07.2008
    Ort
    Raum DA
    Alter
    57
    Beiträge
    2.814
    In der Industrie haben Motoren, die eine Position unter Last halten sollen, üblicherweise 3 Regler.
    Drehzahl-Reglung, Positions-Reglung, Strom-Reglung.
    Wobei dort neben Drehgebern auch Resolver zum Einsatz kommen.
    Durch Abgleich des Reglers mit dem Resolver wird die Winkelstellung unter unterschiedlichsten Lasten gehalten.
    Da der Regler bei dem CPC Encoder mindestens 2 Flankenwechsel (einen je Kanal) braucht, um die Drehrichtung zu erkennen, wird die Positionsreglung minimal um 4 Impulse schwanken.
    Ohne PID Regler ist diese Regelgüte aber nicht erreichbar.
    Geändert von i_make_it (08.10.2016 um 12:41 Uhr)

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    07.04.2015
    Beiträge
    927
    ...wobei Du bei Batteriebetrieb gleich 'nen vierten Regler zum Ausgleich der Versorgungsspannungsänderung einplanen kannst...

    ...sofern die Motorspannung nicht über 'nen Stabi vorher stabilisiert wird...

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    08.03.2010
    Beiträge
    66
    Ich habe mit der PID-Regelung nun ein wenig herumgespielt. Vielleicht erwarte ich auch zuviel davon.
    Im Grunde würde es mir ja schon reichen wenn das Fahrzeug auf einer geraden Strecke von A nach B fährt.
    Ohne in diesen Regelkreis einzugreifen bekomme ich es nicht hin.
    Damit meine ich: Ich muss mindestens die Regelung stoppen wenn das Ziel erreicht ist.
    (Auf einer schiefen Ebene würde er dann gnadenlos herunter fahren)

    Nur mal angenommen ich setze die Werte für KI und KD auf 0 und fange nun an KP hochzusetzen.
    In meinem Fall fährt das Fahrzeug mit KP=0 quasi gar nicht, sondern zuckelt nur auf der Stelle.
    Setze ich KP so hoch das das Fahrzeug fährt, schwingt er am Zielpunkt hin und her.
    Es gibt keine Einstellung wo er nicht schwingt.
    Ich weiß nicht ob das so sein soll???

    Gruß, Andreas

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    07.04.2015
    Beiträge
    927
    Zitat Zitat von MechMac Beitrag anzeigen
    Nur mal angenommen ich setze die Werte für KI und KD auf 0 und fange nun an KP hochzusetzen.
    In meinem Fall fährt das Fahrzeug mit KP=0 quasi gar nicht, sondern zuckelt nur auf der Stelle.
    Setze ich KP so hoch das das Fahrzeug fährt, schwingt er am Zielpunkt hin und her.
    Es gibt keine Einstellung wo er nicht schwingt.
    Ich weiß nicht ob das so sein soll???

    Gruß, Andreas
    Wahrscheinlich ist einfach die gewählte Strecke zu kurz, um alleine durch eine Proportionalregelung angesteuert werden zu können. Wenn Du die Strecke vergrößerst, muss doch das Ergebnis des P-Anteils auch wachsen und das Fahrzeug fährt los, idealerweise bis kurz vors Ziel. Die Strecke musst Du so wählen, dass der P-Anteil den PID-Regler bis in die Sättigung (also maximale Aussteuerung) treibt.

    OK, wenn dem so ist, dann stell Dir vor, Du hast KP mit dem Zuckelwert für kurze Distanzen optimal eingestellt. Schwingen sollte es mit KP alleine auf keinen Fall, egal, bei welcher Strecke.

    Dann nimm mal testweise etwas KI dazu, bis sich das Fahrzeug auch bei kurzen Distanzen bewegt. Auch der integrale Anteil sollte sich ja mit Annäherung ans Ziel verkleinern.

  6. #6
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.739
    .. stell Dir vor, Du hast KP mit dem Zuckelwert für kurze Distanzen optimal eingestellt ..
    Schöner Beitrag!

    Von Bedeutung ist gerade bei der digitalen Regelung natürliche zusätzlich der Vergleich der Motorzeitkonstanten, der Abtastrate und der Encoder-Tickrate (digital!!!). Die sollten schon in gleichen Größenordnungen liegen; leider stecke ich nicht so tief in Regelungstechnik drin, dass ich dazu sinnvolle Richtwerte angeben könnte. Aber wenn ich z.B. zehn Mal pro Minute regle und der Motor in zehn Millisekunden an die 90 % hochfahren kann - dann siehts schon düster aus. Wenn der Motor in einem Regelzyklus den Encoder grad mal ein, zwei Digits weiterdreht ist´s auch sehr suboptimal. Mein Grundsatz ist halt die Regelung schon aus Zeitgründen integer zu rechnen, dafür in einem Zeitraster der Motorzeitkonstanten oder schneller und mit Encoderticks pro Zyklus zwischen knapp zwanzig und weit über hundert. Zu letzterem habe ich aber bei 1440 Ips wenig Sorge (Irrtum vorbehalten :-/m). Aktuell regle ich (der Motorcontroller) Archie, etwa sechs bis sieben Kilo Gewicht, und die mikroskopische Coladose mit hundert Hertz.
    Geändert von oberallgeier (17.10.2016 um 14:24 Uhr) Grund: Kilo allein ist missverständlich
    Ciao sagt der JoeamBerg

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    08.03.2010
    Beiträge
    66
    Zitat Zitat von i_make_it Beitrag anzeigen
    Wenn der Regler der "A.I. BRUSHLESS (PRO) REVERSE" ist, hat der eine eigene Regelung. Alleine schon wegen der EMK Bremse wird er sich nicht passiv verhalten.
    Laut der Beschreibung die ich eben gelesen habe, kann man die Bremse wohl auch nicht abschalten.
    Willst Du den Motor wirklich selbst regeln, wirst Du in dem Fall wohl drei Halbbrücken brauchen und selbst einen Motortreiber bauen müssen oder anstelle einem Regler nach einem reinen Motortreiber für BLDC suchen müssen.
    Selber regeln fällt flach.
    A) dieses Fahrzeug ist nur ein Testfahrzeug zum Erfahrung sammeln. Es macht keinen Sinn hierfür irendetwas zu basteln.
    Mein eigentliches Projekt weicht stark in allen Belangen ab.
    B) Und die Sensoren? Ich denke nicht das es eine triviale Sache ist das ans Laufen zu bekommen.




    Zitat Zitat von Unregistriert Beitrag anzeigen
    wenn es allerdings tatsächlich über normale H-Brücken geregelte Motoren sind (L293 o. L298 o.ä.) , wäre es vielleicht auch ein Tipp, die PID_v1 lib der Arduinos zu verwenden. Es gibt dafür sogar ein eigene Autotuning-Zusatzlib.
    http://playground.arduino.cc/Code/PIDLibrary
    http://playground.arduino.cc/Code/PIDLibaryBasicExample
    Die nutze ich. Trotzdem Danke für die Infos, diese Autotuning-Lib hatte ich übersehen Bild  



    Zitat Zitat von oberallgeier Beitrag anzeigen
    Hallo Andreas.Vor längerer Zeit hatte ich mich in die Regelungstechnik (siehe hier) von Gleichstrommotoren (klicken) zur Geschwindigkeitsregelung eingearbeitet. Daraus wurde dann die Geschwindigkeitsregelung meiner Roboterantriebe. Die Vorgehensweise ist hier beschrieben und zeigt (m)ein Codebeispiel. Die Funktion ist ziemlich gut. Es ist ein sauberer Geradlauf bzw. Gleichlauf der beiden kleinen Motörchen in meinem MiniD0 möglich. Der saubere Gleichlauf erlaubt z.B. diese sauber-platztreue Pirouette im Video.

    Die Sprungantwort zur Dimensionierung der Reglerkennwerte ist sehr praktisch. Hatte ich später nicht am freilaufenden Motor bestimmt sondern im fertigen Target. Ne ähnliche Regelung hatte ich auch bei meinem Archie verwendet - die Dimensionierung der Reglerkennwerte erfolgte nach einiger Erfahrung mit früheren Auslegungen eher über den Daumen gepeilt.

    Später hatte ich eine Stellungsregelung in ähnlicher Weise programmiert für nen "Servomotor" eigener Zusammenstellung am Handgelenk meines Archie. Dort ist, wegen der relativ einfachen Aufgabenstellung, nur ein PD-Regler (Software) eingebaut. Der I-Anteil konnte wegen geringer Lastvariation weggelassen werden. Die Vorgehensweise war wie oben beschrieben, der Code lehnte sich ebenfalls an diese erste Variante an.

    Ich hatte noch nie Brushless´ in der Hand :-/ . Meine Regelungen laufen üblicherweise über käufliche Motortreiber-ICs/Motor-Vollbrücken wie L293D oder VNH2SP30.
    Dieser hier ist auch relativ "selten", die meisten BL-Motoren, sind sensorlos. Außerdem setze ich eher auf Außenläufer wegen der geringerer Drehzahl und dem besseren Anlaufverhalten.





    Zitat Zitat von Holomino Beitrag anzeigen
    Wahrscheinlich ist einfach die gewählte Strecke zu kurz, um alleine durch eine Proportionalregelung angesteuert werden zu können. Wenn Du die Strecke vergrößerst, muss doch das Ergebnis des P-Anteils auch wachsen und das Fahrzeug fährt los, idealerweise bis kurz vors Ziel. Die Strecke musst Du so wählen, dass der P-Anteil den PID-Regler bis in die Sättigung (also maximale Aussteuerung) treibt.

    OK, wenn dem so ist, dann stell Dir vor, Du hast KP mit dem Zuckelwert für kurze Distanzen optimal eingestellt. Schwingen sollte es mit KP alleine auf keinen Fall, egal, bei welcher Strecke.

    Dann nimm mal testweise etwas KI dazu, bis sich das Fahrzeug auch bei kurzen Distanzen bewegt. Auch der integrale Anteil sollte sich ja mit Annäherung ans Ziel verkleinern.
    Die Strecke sollte passen. Das Fahrzeug ist etwa 4-5 sekunden unterwegs und die Motorleistung ist PID-seitig auf etwa 5% begrenzt.
    Eigentlich ist es erst schlecht geworden als ich auch negativwerte für den Motor zugelassen habe. Wenn ich nur vorwärts fahre sieht es besser aus.
    Bei den tests mit KI und KD hatte ich nicht den eindruck das diese Werte überhaupt vorteilhaft sind. Also besser wurde es damit definitiv nicht.
    Allerdings muss ich sagen, das ich einmal eine Situation auf einer schiefen Ebene hatte, wo das Fahrzeug (wenn es denn etwa 3Kg mehr wiegen würde) gehalten worden wäre.


    Im Grunde wird es darauf hinaus laufen, das ich die Regelung bei erreichen des Endpunktes abschalten werde.
    Wie ich schon schrieb ist das hier aktuell nur ein Testfahrzeug. Das Fahrzeug um was es letztendlich geht hat u.a. eine mechanische Motorbremse.
    Die könnte ich einfallen lassen.
    Was ihr da so schreibt ließt sich alles sehr speziell. Ich nehme daraus mit, das diese Werte und das drum herum doch sehr an das Fahrzeug und die Situation angepasst werden müssen.
    Somit macht es nicht soviel Sinn an dem Testfahrzeug die Werte weiter zu optimieren wenn das eigentliche Fahrzeug doch so viel anders ist.

Ähnliche Themen

  1. Antworten: 1
    Letzter Beitrag: 21.03.2012, 18:43
  2. Motor Positionsregelung
    Von Che Guevara im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 4
    Letzter Beitrag: 11.10.2011, 12:13
  3. Encoder für BL Motor
    Von kristof81 im Forum Motoren
    Antworten: 10
    Letzter Beitrag: 05.06.2010, 13:10
  4. Motor mit Encoder
    Von Da_Vinci13 im Forum Motoren
    Antworten: 3
    Letzter Beitrag: 19.01.2009, 19:55
  5. Antworten: 2
    Letzter Beitrag: 23.07.2007, 08:44

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

    Werbung      Solar Speicher und Akkus Tests