BLDC Regler

{autotoc}

1 Übersicht

Ein BLDC (brushless direct current) Regler dient dazu die häufig verwendeten Brushless Motoren anzusteuern. Diese Motoren sind sehr einfach aufgebaut.

Sie bestehen aus einem Rotor der mit Permanentmagneten bestückt ist, einem feststehenden Stator der die Spulen aufnimmt und einem Teil das die beiden Komponenten verbindet. 

 links: Verbindungsteile, mitte: Rotor, rechts: StatorBLDC Motor zerlegt

 

Die Motoren die wir verwenden haben drei Phasen. Der Regler hat die Aufgabe die sonst der mechanische Kommutator bei DC-Motoren hat, und zwar die Phasen richtig zu bestromen.

Dafür wird ein Drehfeld erzeugt, welches aus je drei 120° verschobenen Rechteckspannungen besteht. Die Drehzahl des magnetischen Drehfeldes bezeichnet man oft als Feldumdrehungen. Die Drehzahl des Motors und die Feldumdrehungen stehen in einem festen Verhältnis, welches von der Anzahl an Polpaaren im Rotor abhängt (im Bild oben z.B. 6 Polpaare).

Feldumdrehungen/ Drehzahl_Motor = Anzahl_Polpaare.

Damit der Motor flüssig läuft muss der Regler zum richtigen Zeitpunkt die Phasen neu bestromen. Um den richtigen Kommutierungszeitpunkt zu ermitteln gibt es drei verschiedene Methoden:

  1. Sensorgesteuerte Kommutierung: Hierbei werden am Motor Sensoren (z.B. Hallsensoren) angebracht um die Position des Rotors zu messen. Vorteil ist, dass der Motor auch bei sehr niedrigen Drehzahlen betrieben werden kann. Nachteilig sind die Sensoren, die zusätzlich am Motor angebracht werden müssen.
  2. Sensorlose Kommutierung: Es wird die an den Phasen anliegende Spannung gemessen und ausgehend davon bestimmt wann das nächste Mal kommutiert werden muss. Vorteil davon ist das keine externen Sensoren nötig sind. Nachteilig ist, dass diese Methode erst ab einer gewissen Mindestdrehzahl funktioniert und man deshalb einen speziellen Anlaufalgorithmus zum Starten des Motors braucht.
  3. Vektorregelung: Hierbei werden alle Phasen gleichzeitig bestromt und die Phasenströme aktiv der Rotorlage und dem gewünschten Drehmoment angepasst. Vorteil dieser Methode ist, dass ein höherer Wirkungsgrad und ein höhere Leistungsdichte erzielt werden können. Nachteil der Vektorregelung ist die aufwendige Sensorik und die hohe benötigte Rechenleistung.

Der hier gezeigte Regler verwendet den zweiten Ansatz. 

2 Funktionsweise

Wie oben schon beschrieben wird der Motor mir drei 120° verschobenen Rechteckspannungen angesteuert. So sind immer 2 Phasen mit GND und VCC verbunden und die dritte hängt in der Luft (floating).

Das Bild zeigt auch schön die Unterteilung in die sechs Kummutierungszustände.

Außerdem sieht man das auch an der in der Luft hängenden Phase eine Spannung anliegt. Dies ist die BEMF-Spannung die durch das sich bewegende Magnetfeld induziert wird.

Die BEMF kreuzt immer in der Mitte eines Zustands die Motormittelpunktsspannung, die etwa VCC/2 beträgt. Mit einem Komparator und einem Timer kann man die Zeit bestimmen, die seit Anfang eines Zustands bis zum Kreuzen der beiden Spannung vergangen ist. Die selbe Zeit muss man nun warten bis das nächste mal kommutiert werden muss.

In Realität sehen die BEMF-Spannung und die Motormittelpunktsspannung in etwa so aus:

 

Man sieht das die Motormittelpunktsspannung leider nicht konstant ist und dass das Signal durch die PWM gestört wird.

Die PWM wird benötigt um die Leistung des Motors zu Regeln. Sie wird mit einem 9-Bit Timer erzeugt und hat eine Frequenz von 19,6kHz.

3 Hardware

3.1 BEMF-Schaltung

Um die BEMF richtig messen zu können braucht man noch eine zusätzliche Schaltung, die die Spannung auf einen für den Mikrocontroller verträgliche Spannung heruntersetzt und die Spannungsschwankungen, die durch die PWM entstehen mittels eines Tiefpassfilters herausfiltert.

An PAD1 bis PAD3 werden die drei Phasen des Motors angeschlossen. PAD6 bis PAD8 gehen zum Mikroconrtoller und werden dort mit den ADC Eingängen verbunden. Die ADC Eingänge sind über einen Multiplexer mit dem Komparator verbunden.

Durch die Widerstände R7 bis R9 wird die Motormittelpunktsspannung gebildet. Diese dient als Referenzspannung für den Komparator.

3.2 Leistungsteil

Der Leistungsteil des Reglers besteht aus 3 Halbbrücken.

Die Halbbrücken werden mit MOSFET Transistoren aufgebaut. Es gibt zwei Möglichkeiten diese anzusteuern. Entweder direkt oder über einen FET-Treiber. Beides hat seine Vor- und Nachteile.

Vorteile FET-Treiber:

  • Logikteil ist sicher vor den hohen Spannungen im Leistungsteil getrennt
  • sehr schnelle Schaltzeiten auch bei höheren Gatekapazitäten
  • kaum Belastung der Mikrocontrollerausgänge
  • je nach Treiber integrierte Deadtime und Kurzschlussschutz
  • es können zwei gleiche N-FET Transistoren verwendet werden

Nachteile FET-Treiber:

  • Zusätzliche Beschaltung notwendig
  • höhere Kosten
  • oft minimal Spannung von ca. 10V
  • High-Side kann nur dynamisch geschaltet werden

Vorteile direkte Ansteuerung:

  • wenige Bauteile notwendig
  • großer Spannungsbereich
  • einfacher Aufbau

Nachteile direkte Ansteuerung:

  • Mikrocontroller direkt mit Leistungsstufe verbunden, wird stärker belastet
  • man braucht N- und P-FET Paare
  • Schutzfunktionen müssen selbst implementiert werden

 

3.2.1 Umsetzung mit FET-Treiber

Als Treiber wurde ein IR2110 verwendet. Bei diesem Treiber muss man die High- und Low-Side getrennt ansteuern und hat somit keinen Kurzschlussschutz wenn man versehentlich beide FETs der Halbbrücke gleichzeitig schaltet. Außerdem hat der IC einen Enable Pin (SD) der wenn er auf High geschaltet ist die Treiber ausschaltet.

Die Eingänge SD, HIN und LIN können ohne weitere Beschaltung am Mikrocontroller angeschlossen werden. Über VDD wird der Logikteil des Treibers mit 5V versorgt.

Die Gates der Transistoren werden jeweils über einen Widerstand und eine Diode an den Treiberausgängen (HO, LO) angeschlossen. Der Widerstand sorgt dafür, dass FETs leicht verzögert angeschaltet werden. Beim Abschalten kommt die Diode ins Spiel, die dafür sorgt, dass Gate-Kondensator möglichst schnell entladen wird und somir der FET sperrt. Auf diese Weise wird passiv eine Deadtime erzeugt, die verhindert dass ein Kurzschluss entsteht wenn der Ausgang der Halbbrücke von Low auf High, oder umgekehrt, geschaltet wird.

Der Kondensator C1 wird als Bootstrap Kondensator bezeichnet. Er wird benötigt um den High-Side FET zu schalten. Damit dieser voll durchgeschaltet wird sollte am Gate eine Spannung anliegen die mindestens 10V höher ist als VCC. Mit Hilfe des Bootstrap Kondensators kann der Treiber diese Spannung erzeugen. Wird der Ausgang der Halbbrücke auf Low geschaltet, wird der Kondensator geladen. Soll nun die High-Side geschaltet werden, wird die auf dem Bootstrap Kondensator gespeicherte Ladung vom Treiber hergenommen um den Gate-Kondensator zu laden und somit den FET zu schalten.

Diese Funktionsweise bringt auch einen Nachteil. Es ist nicht möglich die High-Side durchzuschalten wenn nicht vorher einmal die Low-Side geschaltet wurde. Ein statischer Betrieb ist somit nicht möglich. Im normal Betrieb stört dieses verhalten nicht, in manchen Situation könnte es allerdings zu Problemen kommen.

Für genauere Details und Funktionsweisen ist ein Blick ins Datenblatt und die Application Note AN978 sehr hilfreich

Für eine komplette Leistungsstufe braucht man dann pro Phase einmal die obige Schaltung.

Bei Tests der Schaltung hat sich herausgestellt das der Treiber Chip nicht sonderlich robust ist. Steuert man ihn falsch an, z.B. erst die High-Side dann die Low-Side ist der Chip schnell durchgebrannt. Auch wenn man versehentlich beide FETs gleichzeitig schaltet wird der Chip zerstört, obwohl das verwendete Netzteil den Strom auf 1-2A begrenzt und der Strom nur über die FETs fließen sollte.

Bei meinen Tests der Leistungsstufe sind leider mehrere Treiber kaputt gegangen. Da ich nicht immer herausfinden konnte woran das lag, hab ich mich dafür entschieden keine FET-Treiber zu verwenden und die FETs statt dessen direkt anzusteuern.

3.2.2 Direktes Ansteuern der FETs

Diese Art die FETs anzusteuern ist vom Prinzip her einfacher. Für die High Side wird ein P-Kanal FET verwendet und für die Low Side ein N-Kanal FET. Bei der Auswahl von diesem muss man darauf achten, dass der FET schon bei 5V Gate Spannung voll durchschaltet. Das ist wichtig weil das Gate direkt vom Logikteil angesteuert wird und dieser maximal 5V liefert. 

Die Low Side wird mit einem PWM-Signal angesteuert um die Ausgangsleistung zu regeln. Damit man nicht für jede Phase einen eigenen PWM Kanal erzeugen muss, benutzt man nur ein PWM-Signal und verteilt dieses mit Hilfe von AND-Gattern (IC1A) auf die drei Phasen.

Der Gatewiderstand (R7) dient dazu den Strom, der beim laden und entladen der Gatekapazität, fließt zu begrenzen damit das AND-Gatter nicht zerstöt wird.

Um den P-Kanal FET richtig zu schalten braucht man noch einen zusätzlichen NPN-Transistor. Ist dieser offen liegt am Gate über den Widerstand R1 die Spannung VCC an, der FET sperrt also.

Wenn der NPN-Transistor schaltet wird das Gate nahezu auf 0V gezogen und der FET wird leitend. Der Widerstand R4 dient dazu den Basistrom zu begrenzen damit der Transistor nicht in Sättigung gerät. Ein Nebeneffekt davon ist eine gewisse Verzögerung beim Schalten. Diese wird aber durch den parallel geschalteten Kondensator C1 deutlich verringert. Bei einer steilen Schaltflanke fängt der Kondensator an zu leiten und überbrückt kurzzeitig den Basiswiderstand.

 

3.3 Versorgungsspannung messen

Zur Messung der Versorgungsspannung wird ein Spannungsteiler und zusätzlich noch ein Tiefpass Filter verwendet. Die Spannung wird dann mit dem ADC vom Mikrocontroller gemessen.

Die Widerstände für den Spannungsteiler muss man an die maximale Spannung anpassen und an die verwendete Referenzspannung. 

3.4 Strom messen

Zum messen des Stroms wird ein 0.02 Ohm Shunt verwendet. Dieser wird zwischen Masse vom Akku und Masse der Leistungsstufe geschaltet. Auch hier wird wieder ein Tiefpass Filter verwendet um Störungen heraus zu filtern. Mit dem Mikrocontroller ADC wird die am Shunt abfallende Spannung gemessen und daraus der Strom berechnet.

Man sollte sich schon vorher im klaren sein welche Ströme man maximal messen will. Davon hängt nämlich die Dimensionierung des Shunts und auch die der Referenzspannung für den ADC ab. Die Referenzspannung sollte gleich der maximalen Spannung sein die am Shunt abfällt.

3.5 Gesamt Schaltplan

Auf dem Bild sieht man den Schaltplan für den gesamten Regler. Die Widerstandswerte wurden für eine Maximale Versorgungsspannung von 17V und einen maximalen Strom von 20A ausgelegt. Als Mikrocontroller wurde ein Atmega 328P verwendet.

Zu diesem Schaltplan wurde auch schon ein Layout erstellt. 

Fertig gelötet sieht das dann so aus.

EAGLE Dateien

4 Software

In diesem Abschnitt soll ein kurzer Überblick über die Funktionsweise der Software gegeben werden. Auf die einzelnen Funktionen wird nicht eingegangen. Diese sind allerdings hier dokumentiert: Dokumentierter C-Code + Llibraries 

4.1 Ablauf

Die Software ist relativ zeitkritisch, da man die Kommutierung des Motors genau steuern muss. Deshalb läuft der größte Teile der Motorsteuerung Interruptbasiert ab.

Am Anfang des Programms werden erstmal alle Pins, die Kommunikationsschnittstellen und sonstige Funktionen initialisiert. Danach wartet der Controller auf den Befehl den Motor zu starten. Dieser kann entweder über UART oder I2C gesendet werden.

Um den Motor zu starten muss die "start_up" Funktion aufgerufen werden. Diese Funktion lässt den Motor anlaufen und bringt ihn auf eine so hohe Drehzahl, dass man das BEMF Signal auswerten kann. Dazu werden mit einer langsam ansteigenden Frequenz immer wieder die 6 Kommutierungsschritte hintereinander durchgeschaltet. Man gibt dem Motor also ein festes Drehfeld vor.

Ist der Anlauf abgeschlossen wird der interne Komparator eingeschaltet. Der Komparator erzeugt einen Interrupt wenn die gemessene BEMF Spannung die Motormittelpunktsspannung schneidet. Außerdem wird nach dem letzten mal Kommutieren beim Anlauf ein Timer gestartet der die Zeit bis zum Komparator Interrupt misst.

In der Komparator Interruptroutine wird der Timer angehalten und die  Zeit ausgelesen. Aus dieser Zeit und den vorher gemessenen Zeiten wird ein Mittelwert gebildet, der dazu dient den Lauf des Motors flüssiger zu machen. Nach dieser Berechnung wird der Timer wieder gestartet, diesmal aber so, dass er nach der gemittelten Zeit einen Interrupt auslöst.

In der Timer ISR wird nun die Kommutierung ausgeführt und der globale Kommutierungszähler einen Schritt weiter gezählt. Am Ende der ISR wird noch der Komparator auf die nächste zu messende Phase eingestellt und der Timer wieder gestartet.

Dann geht es wieder mit der Komparator ISR von vorne los. Durch diese beiden ISRs wird der Motor gesteuert.

Die Leistung bzw. die Drehzahl des Motors kann man durch Ändern des Duty Cycles einstellen.

Zwischen den beiden Interruptroutinen hat der Mikrocontroller Zeit um sich um die Kommunikation und das Messen von Strom und Spannung zu kümmern. Diese Messungen sollten allerdings möglichst schnell durchgeführt werden, weil man während dieser Zeit den Komparator nicht nutzen kann.

4.2 Kommunikaton

4.2.1 UART

Die UART Kommunikation wurde mit dieser Library umgesetzt: http://homepage.hispeed.ch/peterfleury/group__pfleury__uart.html Auf der Seite wird auch kurz erklärt wie die Library funktioniert.

Die UART Schnittstelle wird vorwiegend zur Kommunikation mit dem Computer verwendet. Zum Einsatz im Quadrocopter ist sie weniger geeignet da man pro Regler eine UART Schnittstelle braucht und meistens nur eine verfügbar ist.

4.2.2 TWI/ I2C

Die I2C (bei Atmel TWI genannt) Schnittstelle eignet sich besser beim Einsatz mehrerer Regler, da man hier jedem Busteilnehmer eine eigene Adresse zuweisen kann.

Auch hier wurde wieder auf eine Library zurück gegriffen: http://www.jtronics.de/avr-projekte/library-i2c-twi-slave.html

Die Regler agieren als Slaves. Der Master kann ihnen Daten schicken oder Daten vom Regler auslesen. Geschickt werden zum Beispiel der PWM Duty Cycle zur Leistungssteuerung oder Befehle die dem Regler sagen was er machen soll. Ausgelesen werden können die Versorgungsspannung, der fließende Strom und die Drehzahl.

Mit Arduino können wie folgt Daten an den Regler geschickt werden:

Wire.beginTransmission(Adresse);
//Puffer-Adresse auswählen in die die Daten geschrieben werden sollen
Wire.write(2);
//jetzt können die Daten gesendet werden. 
//Wird mehr als ein Byte gesendet wird der Puffer automatisch weitergezählt.
Wire.write(Daten);
Wire.endTransmission();    

Und gelesen:

Wire.beginTransmission(Adresse);
//Puffer-Adresse auswählen aus der die Daten gelesen werden sollen
Wire.write(2);
//"Anzahl_Bytes" gibt an wie viele Bytes gelesen werden sollen.
//Die Puffer-Adresse wird wieder automtisch weitergezählt.
Wire.requestFrom(Adresse, Anzahl_Bytes);
for(i=0; i<Anzahl_Bytes; i++)
{
    readbuffer[i] = Wire.read();
}
Wire.endTransmission();

 

5 TODO

Da ich in den fünf Woche leider nicht mit allem fertig geworden bin gibt es noch ein paar Dinge zu tun damit man den Regler auch wirklich einsetzen kann.

  • Motorstart verbessern, funktioniert noch nicht zuverlässig
  • Bessere p-Kanal FETs verbauen (geringere Gate-Spannung)
  • Steuerung mit I2C
  • Messungen fest im Programmablauf integrieren
  • Drehzahl Berechnung
  • Temperatur Sensor
  • Erkennung von Fehlern am Motor
  • SMD Board
Anhänge:
Diese Datei herunterladen (an-978.pdf)an-978.pdf[ ]%2013-%03-%19 %0:%Mär%+01:00
Diese Datei herunterladen (BLDC_V02_doc.zip)BLDC_V02_doc.zip[ ]%2013-%04-%24 %1:%Apr%+02:00
Diese Datei herunterladen (BLDC_V1D.zip)BLDC_V1D.zip[ ]%2013-%04-%24 %1:%Apr%+02:00
Diese Datei herunterladen (IR2110_IR2110S_IR2113_IR2113S.pdf)IR2110_IR2110S_IR2113_IR2113S.pdf[ ]%2013-%03-%19 %0:%Mär%+01:00