- Labornetzteil AliExpress    Werbung      
Ergebnis 1 bis 10 von 24

Thema: BLDC Regelung

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    11.11.2012
    Beiträge
    10
    Hallo Ikarus,

    ja ich denke deine Aussage über die letzte Rücktransformation dürfte korrekt sein. Wie man nun aber von Alpha und Beta auf die drei Duty Cycles kommt, das verstehe ich noch immer nicht! Bild  

    Wegen des Tiefpassfilters. Die Phasenverschiebung dürfte relativ gering sein, da das Filter ja eine Grenzfrequenz von einigen kHz hat, und die Frequenz des Motors ja relativ gering ist (einige 100Hz wohl) dürfte das doch passen. Oder nicht?

    Das Problem ist, dass in dem Lowside Shunt der Strom auch negativ werden kann, d.h. man benötigt eine bipolare Strommessung, was auch recht haarig wird denke ich Bild  

    Der Algorithmus ist allerdings nicht so komplex, dünkt es mich; ich benutze einen DSP mit 160 MHz Takt und Floatingpoint Unit. So kann ich die Clarke, Park und deren inverse Transformationen in knapp einer Mikrosekunde rechnen, das passt. Für sin und cos habe ich eine Lookuptable, die auch direkt zur Auflösung meines Drehgebers passt Bild  

  2. #2
    Erfahrener Benutzer Roboter Experte Avatar von ikarus_177
    Registriert seit
    31.12.2007
    Ort
    Grein
    Alter
    32
    Beiträge
    601
    Hi bert!

    Zur Dutycycle-Berechnung mit Raumzeigermodulation: sieh dir mal die Gleichungen auf S. 4 von AN955 an.

    Zur bipolaren Strommessung: ich zitiere wieder AN1078 bzw. den Schaltplan dazu - dort ist die Strommessung so realisiert (die Anschlüsse links kommen von den Shunts, davon messen die oberen beiden direkt 2 der 3 Phasenströme (der dritte kann ja daraus berechnet werden), der untere den Gesamtstrom - der Komparator rechts unten gibt ein Überstromsignal an den Controller zurück):
    Bild  

    Zum Tiefpassfilter: da hast du wohl recht (ich hab' nachgesehen - mein Tiefpass hatte eine Grenzfrequenz von um 350Hz), käme auf einen Versuch an. Für die maximal geforderte Kommutierungsfrequenz spielt neben der max. gewünschten Drehzahl aber auch die Polpaarzahl des Motors eine Rolle.

    OK, da ist dein Controller natürlich ein paar Nummern größer als meine Plattform, da sollte das schon hinhauen Bild  

    Schöne Grüße!

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    11.11.2012
    Beiträge
    10
    Hallo Ikarus

    danke für deinen Schaltplan. Ich habs mittlerweile auch rausgefunden wie ich es machen kann und bin auf dieselbe Lösung gekommen Bild  

    Die Berechnungen der Dutycycles schaue ich mir grade an. Ich frage mich gerade, ob ich es wirklich wagen soll, die FOC zu implementieren. Das ist nämlich ein Semesterprojekt an meiner FH, und ich muss zuerst alle Konzepte etc. entwickeln, jetzt habe ich noch keine Hardware, wo ich das alles richtig testen kann. Zwar rechnet mein DSP recht locker mit Floatingpoint rum (Takt 160 MHz), aber ich möchte zwei BLDC-Motoren regeln, d.h. es sind insgesamt 4 digitale Regler zu implementieren (je einer für d und q). Dann noch ein überlagerter Drehzahlregler pro Motor, gibt 6 zu implementierende Regelkreise.
    Auf der englischen Wikipedia habe ich soeben noch gelesen, dass für eine gescheite feldorientierte Regelung der Regler alle 1ms ausgeführt werden soll - mindestens. Das packt mein Controller zwar schon, aber ob es dann reicht?

    Bisher habe ich immer mit Blockkommutierung gearbeitet und habe damit einige Erfahrung; ich wollte aber schon immer mal FOC machen, und da ich in diesem Projekt die Motoren besonders genau regeln möchte, dachte ich das wär eine gute Idee Bild  

    Ich denke ich werde mal meine Hardware dann so planen, dass ich FOC machen kann, aber erst werde ich Blockkommutierung implementieren und dann wenn die Zeit noch reicht auf feldorientiert wechseln. Hmm.... Okay aber das ist eine andere Baustelle.



    EDIT:
    habe soeben die Gleichungen in der AN995 angeschaut. Diese kenne ich bereits Bild   Da gibt es aber ein Problem:
    Zwar stehen da schon Gleichungen für TA und TB, aber da kommt noch der Winkel Psi vor, also der Winkel den der auszugebende Vektor mit der reellen Achse bildet. Nun, Psi kenne ich ja nicht... Ich habe nur d und q, bzw. nach der inversen Park-Transformation alpha und beta. In alpha und beta ist Psi ja implizit gegeben; muss ich da wirklich mit trigonometrischen Funktionen noch den Winkel ausrechnen? Wenn das so ist, erscheint mir dies recht verwegen, auch auf einem DSP. Dazu wäre ja ein arctan() nötig -- der braucht Rechenleistung ohne Ende :-/

  4. #4
    Erfahrener Benutzer Roboter Experte Avatar von ikarus_177
    Registriert seit
    31.12.2007
    Ort
    Grein
    Alter
    32
    Beiträge
    601
    Hallo!

    Ich hab' mir mal den entsprechenden Codeteil der AN1078 angesehen - wie es scheint wird die inverse Clarke-Transformation doch noch ausgeführt, d.h. ins 3-Achsen-System zurückgerechnet.
    Die Gleichungen zur Berechnung der PWM-Werte aus den Werten für die 3 Phasen scheinen sehr sehr einfach zu sein und enthalten keine Winkelfunktionen. So ganz verstehe ich den Lösungsweg aber noch nicht Bild  

    Der folgende Code ist eine C-Übersetzung des eigentlichen Codeteils, der in Assembler geschrieben ist. Alle verwendeten Variablen scheinen global zu sein.

    Code:
    void CalcRefVec( void )
    { 
        if( Vr1 >= 0 )
            {       
            // (xx1)
            if( Vr2 >= 0 )
                {
                // (x11)
                // Must be Sector 3 since Sector 7 not allowed
                // Sector 3: (0,1,1)  0-60 degrees
                T1 = Vr2
                T2 = Vr1
                CalcTimes();
                dPWM1 = Ta
                dPWM2 = Tb
                dPWM3 = Tc
                }
            else
                {            
                // (x01)
                if( Vr3 >= 0 )
                    {
                    // Sector 5: (1,0,1)  120-180 degrees
                    T1 = Vr1
                    T2 = Vr3
                    CalcTimes();
                    dPWM1 = Tc
                    dPWM2 = Ta
                    dPWM3 = Tb
    
                    }
                else
                    {
                    // Sector 1: (0,0,1)  60-120 degrees
                    T1 = -Vr2;
                    T2 = -Vr3;
                    CalcTimes();
                    dPWM1 = Tb
                    dPWM2 = Ta
                    dPWM3 = Tc
                    }
                }
            }
        else
            {;        // (xx0)
            if( Vr2 >= 0 )
                {
                // (x10)
                if( Vr3 >= 0 )
                    {
                    // Sector 6: (1,1,0)  240-300 degrees
                    T1 = Vr3
                    T2 = Vr2
                    CalcTimes();
                    dPWM1 = Tb
                    dPWM2 = Tc
                    dPWM3 = Ta
                    }
                else
                    {
                    // Sector 2: (0,1,0)  300-0 degrees
                    T1 = -Vr3
                    T2 = -Vr1
                    CalcTimes();
                    dPWM1 = Ta
                    dPWM2 = Tc
                    dPWM3 = Tb
                    }
                }
            else
                {            
                // (x00)
                // Must be Sector 4 since Sector 0 not allowed
                // Sector 4: (1,0,0)  180-240 degrees
                T1 = -Vr1
                T2 = -Vr2
                CalcTimes();
                dPWM1 = Tc
                dPWM2 = Tb
                dPWM3 = Ta
    
                }
            }
    }
    
    
    void CalcTimes(void)
    {
        T1 = PWM*T1
        T2 = PWM*T2
        Tc = (PWM-T1-T2)/2
        Tb = Ta + T1
        Ta = Tb + T2
    }
    Der Teil, in dem der Sektor bestimmt wird ist ja noch verständlich, die drei ersten Gleichungen von CalcTimes() ja auch - die beiden nächsten verstehe ich aber überhaupt nicht, vor allem, da anscheinend die Zeitwerte der vorhergehenden Berechnung ebenfalls eine Rolle spielen...

    Schöne Grüße!

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    11.11.2012
    Beiträge
    10
    Hmm also so ganz blick ich das nicht. Warum nur wird das so mystifiziert, wie man diesen Duty cycle berechnet?

    Gut, im Prinzip ist es ja einfach: aus Alpha und Beta kann der Winkel berechnet werden. (Dieser müsste mit dem vom Drehgeber gelieferten Winkel übereinstimmen, oder?)
    Anhand des Winkels bestimmt man den Sektor, und danach berechnet man den Winkel innerhalb des Sektors. Anschliessend ist

    t1 = sin(60 - x)
    t2 = sin(x)

    die Zeiten für Vektor 1 und Vektor 2, wobei x der Winkel in diesem Sektor ist.

    Beispiel:

    Winkel des Rotors sei 70°. Dies ist im Sektor 2. Also subtrahiere man 60°, man erhält 10°. Somit ist

    t1 = sin(50°) = 0.766
    t2 = sin(10°) = 0.173

    die Zeit für den Anfangs- und den Endvektor. Der Nullvektor muss während der Zeit

    1 - t1 - t2 = 0.061

    ausgegeben werden.

    Das ist alles schön und gut und auch sehr trivial, aber

    a) was mache ich denn nun mit alpha und beta, die benötige ich ja gar nicht, denn den Winkel kann ich ja auch vom Drehgeber ablesen
    b) irgendwie ist das doch ein wenig komisch, innerhalb jedes Sektors immer dieselben Winkel wieder zu berechnen -- das sollte doch auch einfacher gehen, direkt mit alpha und beta, denn diese geben den winkel doch implizit an, oder nicht?

    Gruss

  6. #6
    Erfahrener Benutzer Roboter Experte Avatar von ikarus_177
    Registriert seit
    31.12.2007
    Ort
    Grein
    Alter
    32
    Beiträge
    601
    Hallo!

    Der Winkel, der durch alpha und beta (im Grunde ja das Ergebnis der ganzen Regelung), ist (bzw. sollte) ein "bisschen" größer als der aktuelle Winkel vom Drehgeber sein. Du willst ja den Rotor im Vergleich zur aktuellen Position um ein Stückchen weiterbewegen.
    Würdest du den Winkel vom Drehgeber nehmen, könntest du dir die ganze Rechnerei gleich ganz sparen, dann würde sich der Rotor aber nie bewegen.

    Das Ergebnis der Regelung (= der Winkel, der auf den Motor / die 3 Phasen gegeben werden soll) ist sicher in alpha und beta enthalten, wie genau man dann aber die PWM-Werte mit der Methode der AN1078 berechnet, weiß ich auch noch nicht so ganz... Bild  

    Schöne Grüße!

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    11.11.2012
    Beiträge
    10
    Hallo Ikarus,

    hmm stimmt eigentlich Bild  

    heute in der Mittagspause war mir ein wenig langweilig, und daher habe ich nochmals ein wenig über Vektorgeomtrie nachgedacht. Ich habe mir überlegt, wie man ohne nervige Winkelfunktionen den Vektor (alpha, beta) auf die 6 Achsen vom "SV PWM Star" projizieren kann -- genau das möchte man ja tun, um die Einschaltzeiten für den Anfangs- und den Endvektor zu berechnen.
    Nun, es hat sich gezeigt, dass dies recht simpel ist. Es ergeben sich so sechs 2x2 Matrizen, mit denen man einen Vektor (alpha, beta) nun so umrechnen kann. Der aktuelle Sektor gibt an, welche der sechs Matrizen zu benutzen ist. Ich habe mir mal in Excel ein Sheet erstellt, wo ich die Duty cycles mit diesen Matrizen berechne und in einem Diagramm darstelle, und siehe da, es ergeben sich diese schönen SVPWM-Kurven. (Die man, glaube ich, Supersinus nennt??)

    Ich werde dann morgen schnell ein PDF hochladen, wo das beschrieben ist. Eigentlich ist es recht einfach Bild  

  8. #8
    Neuer Benutzer
    Registriert seit
    10.03.2013
    Beiträge
    3
    Moin alle zusammen,

    ich wollte dieses Thema mit der Regelung der Geschwindigkeit eines BLDC aufgreifen. Es geht um die feldorientierte Regelung.


    Wenn ich einen BLDC in Blockkommutierung betreibe, verstelle ich die Geschwindigkeit, indem ich die Spannungshöhe mit der PWM-Duty verändere.

    Wie funktioniert es aber bei der feldorientierten Regelung? Wenn ich 2 verschiedene Geschwindigkeiten haben möchte, muss ich dann doch auch 2 verschiedene Spannungshöhen erreichen oder ?


    VIelen Dank im Voraus

    Christian

  9. #9
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.11.2004
    Beiträge
    451
    Du hast durch deine drei Spulen, die du ja einzeln bestromen kannst, 6 (durch die polarität) verschiedene Vektoren (A, A', B, B', C und C'). Wenn alle drei Spulen die selbe Potential haben, dann hast du auch noch die beiden Nullvekroten.

    Für die Rotation musst du A, A', B, B', C und C' kombinieren, sollte denk ich klar sein. Für die Spannungshöhe kommt dann noch der Nullvektor, also alle oberen oder unteren Transistoren an, ins Spiel. Für die halbe Spannung musst du entsprechend die halbe Zeit noch den Nullvektor anlegen.

    E: Auch mal bei Wikipedia geschaut? Wird da mMn. recht gut erklärt.
    http://de.wikipedia.org/wiki/Raumzeigermodulation

Ähnliche Themen

  1. Motortreiber für BLDC
    Von SirHonk im Forum Motoren
    Antworten: 1
    Letzter Beitrag: 29.01.2012, 14:29
  2. [ERLEDIGT] Bidirektionaler BLDC ?
    Von PICture im Forum Elektronik
    Antworten: 6
    Letzter Beitrag: 14.09.2011, 10:17
  3. [ERLEDIGT] BLDC mit 1V ?
    Von PICture im Forum Elektronik
    Antworten: 9
    Letzter Beitrag: 17.06.2011, 16:35
  4. 3 V BLDC's ?
    Von PICture im Forum Suche bestimmtes Bauteil bzw. Empfehlung
    Antworten: 0
    Letzter Beitrag: 29.03.2011, 17:13
  5. BLDC als Lictmaschine
    Von BlackDevil im Forum Elektronik
    Antworten: 15
    Letzter Beitrag: 23.12.2009, 12:17

Stichworte

Berechtigungen

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

    Werbung      Solar Speicher und Akkus Tests