www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik SVPWM mit LPC1769


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Jürgen Liegner (jliegner)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

Hier im Forum tauchen immer wieder Fragen zur Sinus PWM mit FOC für BLDC 
Motoren auf.
Ich habe mich auch für das Thema interessiert und erst mal viel gelesen. 
Dabei ist mir folgendes aufgefallen:
Es gibt unendlich viele App-Notes und Beispiele. Bei vielen ist die Doku 
ganz gut, der dazugehörige Code aber nicht oder nur schlecht 
dukumentiert. Manchmal sind da sogar große Abweichungen zwischen Code 
und pdf erkennbar.
Ich habe deshalb mal ein wenig mit einem LPCXpresso 1769 runher 
experimentiert. Da gibts zwar eine Lib vom NXP, aber leider ist die auch 
nicht so besonders dokumentiert. Weiterhin stört mich da, dass alle 
Berechnungen mit 16bit Festkomma und einem eigenen Datentyp gemacht 
werden. Das muss bei einem 32bit Cortex M3 nicht sein.
Da ich das Pferd von hinten aufsetzen will, also zuerst die PWM und dann 
den Rest davor, habe ich also angefangen mit der SVPWM. Aus den 2 
PID-Reglern kommen bei einer FOC die  Werte q und d heraus, die 
zumindestens auf den Drehwinkel bezogen statisch sind. Diese 2 Werte 
nehme ich als Eingangsgröße für die SPVM. In der Literatur kommen jetzt 
seitenlange Formeln und Abhandlungen über inverse Clark- und 
Park-Transformationen. Diesen Teil habe ich mir aus diversen APP-Notes 
abgeguckt, und versucht einen für mich verständlichen Code zu bauen. Um 
beim Festkommarechnen mit 32bit zu bleiben, arbeite ich mit "großen 
Zahlen". d.h. die Eingangsgrößen q und d gehen von -2147483647 bis 
2147483647 und der Drehwinkel teta von 0-360Grad mit 1 Grad Auflösung. 
Am Ende stehen in der Struktur McParm dU,dV und dW (im Beispiel jeweils 
von 0-2048) mit denen direkt die Register der MCPWM des LPC1769 
beschrieben werden. Über 2 Sachen bin ich mir nicht ganz im Klaren. Die 
resultierende Spannung der Phasen ist die Hypotenuse aus q und d und die 
PIDs sollten versuchen d auf 0 zu halten. So stehts zumindestens in der 
Literatur. Damit ich aber den vollen Hub aus der PWM kriege mus sie bei 
2147483647 an q voll aussteuern. Kommt jetzt noch ein d-Anteil hinzu bin 
ich in der Übersteuerung. Wenn man jetzt nicht aufpasst kommt eine 
Wellenform am Ende raus die kein Motor wirklich will. So ähnlich wie bei 
den ersten Audio-AD-Wandlern mit Überschlag. Ich habe mich deshalb 
entschlossen, auch d=2147483647 und q=2147483647 zu akzeptieren und die 
resultierenden Kurven zu begrenzen ohne das die Werte umschlagen. 
Weiterhin findet man 2 Varianten der Phasenspannungen gegen GND in der 
Literatur. Einmal eine symetrische "Popokurve" und zum anderen eine 
asymetrische "Popokurve" bei der jede Phase 120Grad auf hart GND bleibt. 
Für den Motor gesehen kommt bei beiden das gleiche raus, nur die 
Endstufen können sich in der 2. Variante immer mal ausruhen. Allerdings 
erkauft man sich das mit einem wandernden virtuellen Sternpunkt gegen 
GND, was in der ersten Variant nicht der Fall ist. Welche Variante 
findet denn bei käuflichen Produkten Anwendung?
Ich lege den Code mal in den Anhang und auch ein paar Qszibilder. gelb 
und blau sind die phasen u und v gegen gnd. violet u-v, also so wie es 
der Motor sieht.
Die Routine CalcSpPwm braucht insgesamt 2,16us. Zum Messen toggle ich im 
Code die Led des LPCXpresso.

Vielleicht ergibt sich ein reger Austausch wenn es um die fehlenden 
"Baugruppen" geht.

Autor: Tec Nologic (tecnologic)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin Jürgen,

Wenn ich deine 2. Variante richtig interpretiere ist das 
Blockkummutation
und keine RaumzeigerModulation. Das erzeigt zwar augenscheinlich einen 
Sinusförmigen Strom im Motor auf dem ist aber ein Ripple drauf, den du 
im ungleichmäßigen Drehmoment und damit in Vibrationen hörst.

Die Variante 1 sieht aber schon nach astreiner Raumzeigermodulation aus.
Gratulation. Diese wird auch eigendlich auch ausschließlich in Industrie 
Frequenzumrichtern benutzt.

Was du noch einführen könntest um dein Problem mit dem d-Anteil etwas zu 
beseitigen, wäre nicht Q und D vor zugeben sondern Amplitude und Phase 
des Spannungsvektors. Damit wird die Regelung später robuster und 
schneller. Da die Koppeltherme die für Q und D Regelung eine große 
Bedeutung haben
quasi weg fallen. Du Trennst das System in eine Phasen Regelung und eine 
Strom/Drehmomentregelung diese Trennung ist dann vollständig möglich.
Nur Feldschächung ist dann nicht ganz so trivial, aber das willst du 
denke ich erst mal nicht?

Der bei FOC ist ja dein Ziel das der Stromvector der Rotor Position 
immer 90° voreilt um maximales Drehmoment zu erzeugen. Wenn du jetzt die 
Rotorposition auf irgendeine Weise ermittelst (Sensor oder Sensorlos), 
dann misst du zusätzlich den Stromvector den du in den Motor einprägst.
Damit die Phase zwischen Rotorposition und Strom 90° kannst du für 
geringe
Drehzahlen einen 90° zur Rotorposition verschobenen Spannungsvektor 
schalten. Aber bei höheren Drehzahlen sorgt die Gegen EMK das die Phase 
von Strom zu Rotor geringer wird, damit verheizt du Energie, da den 
Strom vektor misst kommt jetzt die Phasenregelung zum tragen, die jetzt 
nich indirekt den D Anteil runter regelt, sonder gezielt den 
Spannungsvektor weiter voreilen lässt ihn also auf 100 oder mehr Grad 
steuert damit der Stromvektor genau 90°.

In Matlab siehst du dann das der Regler für die Phase das wesendlich 
besser im Griff hat als der D Regler.

PS: Für n STM32 wäre dein Code sicher für mich brauchbar :)

MfG

Tec

Autor: Tec Nologic (tecnologic)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
void ParkInv(struct McParm *pM)
{
  //Spannungsvektor Phase ist phU
  int icos=Cosinus(pM->teta + pM->phU);
  int isin=Sinus(pM->teta + pM->phU);
  //Spannungsektorbetrag wäre MagU
  pM->valpha=(int)((long long int)pM->MagU*(long long int)isin))>>32);
  pM->vbeta =(int)((long long int)pM->MagU*(long long int)icos))>>32);
}

Ich hab mir mal deinen Code angesehen, sieht ganz gut aus, für die 
Vorgabe von Phase und Amplitude müsstest du nur deine InvPark umbauen 
wie ich das oben mal getan habe. Wäre toll wenn du das Mal Probieren 
könntest. Ich hab das bisher nur Simuliert :)

MfG

Tec

Autor: Jürgen Liegner (jliegner)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Tec,

danke erst mal fürs Drüberschauen. Die beiden Varianten oben sind beides 
echte Raumzeigermodulationen und aus Sicht des Motors ändert sich 
nichts. Sogar die Phasenlage ist die selbe. Die Phasenspannungen 
untereinander stimmen,(bis auf das letzte Bit bei 2048), vollständig 
überein. Das Problem beim Betrachten von solchen Systemen ist halt, dass 
man eigentlich alles aus der Sicht des Sternpunktes betrachten muss. Wir 
sind aber gewohnt alles aus der Sicht des GNDs zu sehen. Deshalb kommen 
einen manche Kurven komisch vor. Atmel hat z.B. in seinen App-Notes 
häufig die Variante 1 von oben. Bei NXP ist es Variante 2. Interessant 
ist wie der Sternpunk gegen GND aussieht. Da kann ich heute Abend mal 
ein paar Kurven aufzeichnen.

Die Anregung von Dir die Amplitude und Phase zu regeln anstelle von q 
und d nehme ich gern auf. Ist sicher der einfachere Weg. Ich wollte nur 
von Anfang an die Möglichkeit mit q und d einplanen, wenn sie sinnvoll 
ist. Bei der Regelung bin ich aber noch nicht, muss erst mal Hardware 
bauen. Wenn ich d mit 0 in meine ParkInv laufen lasse, erziehle ich den 
selben Effekt, muss dann nur noch das Delta der Phasenlage zu teta 
dazurechnen.
Der einzige Controller abhängige Teil ist die Initialisierung der 
Hardware. Das ist sicher beim stm32 nicht so viel anders. Ich habe 
eigentlich vor, das ganze auf den kleinen LPC11C24 zu portieren.
Die 3. Kurve stellt nur die Übersteuerung dar und sollte so ja nicht 
auftreten. Wenn ich nur Spannung und Phasenlage regele, kann sie auch 
gar nicht auftreten.

Autor: Tec Nologic (tecnologic)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Jürgen,

Die Portierung auf einen Controller ist sicher nicht das Problem das 
habe ich bei näherem durch sehen auch gesehen. Sind die PWMs bei dir 
syncronisiert? Bzw. wie hast du die eingestellt?

Was die HW angeht ist die Endstufe je nach Leistung das geringste 
Problem, viel schwieriger ist es den Strom von den Phasen sauber in den 
µC zu bekommen. Für Welche Leistungsklasse willst du das ganze auslegen?

MfG

Tec

Autor: Jürgen Liegner (jliegner)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Tec

Zuerst wird wohl ein 250W 36V Fahrradnabenmotor mit Hallsensoren ins 
Spiel kommen.
Ich habe auch die Oszibilder des Sternpunktes gelb (3 Widerstände) gegen 
GND mal angehangen. Blau ist eine der Phasen, violet A-B der beiden 
Kanäle also die Spannung zwischen dem Sternpunk und der Phase. Da war 
ich dann doch erst mal überrascht.

mfg
Jürgen

Autor: Tec Nologic (tecnologic)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Jürgen,

36V 250W ist ja noch überschaubar. Kennst du den Blog von Shane Colton?
Der hat n FOC Elektro Scooter gebaut,die Boards sind recht sauber 
gemacht, aber oft sehr exotische Bauteile drauf.

Bei den Kurven bin ich auch sehr Überrascht. Variante 1 habe ich noch so 
erwartet und die GND Phasen der einzelnen Phasen auszugleichen. Aber die 
Variante 2 hätte ich so nicht erwartet, fragt sich warum das so ist. Und 
da
glaube ich liegen die 15% mehr U_ZK Ausnutzung der SVPWM, denn schaut 
man sich die Amplitude der Sternspannung an passt das genau. Wenn man 
einen reinen Sinus 3 Phasig raus gibt dann müsste die Sternpkt Spannung 
glatt wie ein Kinderpopo sein. EMV Technisch würde ich Variante 2 nehmen 
weil dU/dt des Sternpunktes kleiner ist. Aber sonst sehe ich nix was für 
die eine oder andere Variante spricht. Wie Erzeugst du die Varianten? 
Ich bin bei deinem Code da jetzt nicht explizit drüber gestolpert.

MfG

Tec

Autor: Tobias Plüss (hubertus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Jürgen,
wir haben ja auch schon voneinander gelesen ;-)

hey, genial deine Software. Ich habs noch nicht ganz angeschaut, aber 
Bild 2 sagt eigentlich schon alles - genauso muss es nämlich aussehen 
;-) wie bist du vorgegangen? obwohl es viel Material zu dem Thema gibt 
im Netz habe ich es nie verstanden, trotz dem dass ich mathematisch 
eigentlich recht gut bewandert bin.

Werde deinen Code gleich heute Abend testen :-D
 Gruss

Autor: Jürgen Liegner (jliegner)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also, die beiden Varianten werden durch die Zeile:

#define FW     1  // FW==1 Vollwellenmodus, FW==0 Halbwellenmodus

umgeschaltet.
Die MCPWM im LPC1769 kennt einen AC-Modus. Bei dem werden die 3 PWM 
Einheiten von einem einzigen gemeinsamen Timer versorgt und sind damit 
natürlich auch immer syncron. Zusätlich haben die eine Art Doppelbuffer 
drin, so dass die aktuellen PWM Werte immer am Ende eines Zyklus 
gemeinsam übernommen werden.

Autor: Tec Nologic (tecnologic)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin Jürgen,

Das habe ich übersehen. Ich kann es nur nicht ganz nachvollziehen. Du 
halbierst im Vollwellenmodus die Strangspannungen und setzt 1/4 der 
Amplitude als Offset drauf. Wenn ich das durch rechne hast du +/-2^30 
Amplitude und +2^29 als Offset dh. bei voll negativer Aussteuerung fehlt 
dir ein Viertel der Ampitude. Der Halbwellen Modus ist das wie ich es 
implementiert hätte, da hast du ja die volle Amplitude. Hast du vllt die 
Einstellungen vertauscht? oder Habe ich einen groben Denkfehler?

MfG

Tec

Autor: Jürgen Liegner (jliegner)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Tec,

ne, das passt schon. Ich lege mal eine Routine bei um das mit einem 
C-Copmiler auf dem PC zu testen. Da werden nur die Werte für den Kreis 
mit printf ausgegeben und zwei "Textgrafiken" in Dateien geschrieben.
In beiden Varianten kommt am Ende das selbe raus.

Autor: Tec Nologic (tecnologic)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Moin Jürgen,

Aus Juks hab ich das mal zusammen geschmissen, hab hier aber gerade nur 
VC6
und da kommt nicht das raus was ich dachte. siehe Anhang

Hab den C Code nur fix zusammen kopiert.

MfG

Tec

Autor: Jürgen Liegner (jliegner)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
VC6 Gott hab ihn seelig....
der kennt kein long long sondern nur __int64. in der ParkInv hast du 
daraus 32bit Variablen gemacht. Die Multiplkation geht dort ueber 64bit, 
was die ARMs koennen. Sicher auch AVR32, sowas benutzt Atmel in den 
App-Notes auch.


// das Ergebnis wird in pM->valpha und pM->vbeta gespeichert
// das >>32 anstelle >>31 bedeutet, dass valpha und vbeta durch
// 2 geteilt wird um ein ?berlauf des Wertebereiches zu verhindern
void ParkInv(struct McParm *pM)
{
  int icos=Cosinus(pM->teta);
  int isin=Sinus(pM->teta);
  pM->valpha=(int)((((__int64)pM->vD*(__int64)icos)-((__int64)pM->vQ*(__int64)isin))>>32);
  pM->vbeta =(int)((((__int64)pM->vQ*(__int64)icos)+((__int64)pM->vD*(__int64)isin))>>32);
}


dann gehts auch.

Autor: Tec Nologic (tecnologic)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin Jürgen,

Ich ging in meinem Leichtsinn davon aus das long 64bit ist :) weil auf 
nem Cortex int ja schon 32Bit hat. Aber gut ich kann das morgen ja noch 
mal ändern, wenn ich wieder mal auf Teile warte.

MfG

Tec

Autor: Tobias Plüss (hubertus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich hab da noch eine allgemeine Frage.

ich habe hier einen maxon EC40 Motor mit Hallsensoren und Drehgeber mit 
500 Impulsen/Umdrehung sowie die zum Motor passende Steuerung. Fragen:

- wenn der Motor einen Drehgeber hat - wieso werden trotzdem noch 
Hallsensoren benötigt? Im Prinzip könnte man ja auch nur anhand der vom 
Drehgeber gemeldeten Position kommutieren.

- wenn ich auf dem PC der Steuerung das Stop-Kommando sende, dann wird 
der Motor gebremst. Versuche ich, von Hand an der Welle zu drehen, dann 
hält die Steuerung den Rotor mit aller Kraft, und es ist kaum möglich, 
die Welle um mehr als einen einzigen Drehgeberpuls zu verdrehen. Das 
finde ich ja ein ganz geiles Feature; hab ich noch nie gesehen. 
Wohlverstanden: der Motor hat keine Bremse, sondern er wird effektiv von 
der Steuerung so kommutiert, dass er steht. Rührt man die Welle nicht 
an, fliesst also auch kein Strom, aber bei der geringsten Berührung 
"wehrt" sich das Gerät sofort. Wie macht man sowas? könnte man mit dem 
LPC17xx sowas auch implementieren?

Gruss Tobias

Autor: Tec Nologic (tecnologic)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin Tobias,

Die Hallsensoren werden bestimmt dafür gebraucht um eine absolute 
Referenzposition zu haben. Der Drehgeber wird Incremental sein, also nur 
eine Positionsänderung raus geben keine absolute Position.

Die Betriebsart die du meinst nennt sich Positionsregelung. -> Du willst 
den Motor verdrehen und der Regler steuert Drehmoment dagegen.

Jenach Dynamik kannst du das auf nem Cortex m3 locker implementieren.
1kHz Regelfrequenz schafft man sicherlich. ist ja nicht viel bei.

Wenn du die SVPWM hast machst du ne Stromregelung und damit eine 
Drehmoment Regelung, da du einen Drehgeber hast ist die Ermittlung der 
Rotorlage kein Problem. Jetzt hast du zwei Möglichkeiten.

1. Du regelst die Drehzahl über das Drehmoment und die Drehzahl auf 
Grund der Position
2. Du regelst das Drehmoment direkt für die Position.

Ist alles Stand der Technik bei Industrie-Servo-Umrichtern.

MfG

Tec

Autor: Tobias Plüss (hubertus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
moin Tec,
der Drehgeber ist inkremental, stimmt. aber er hat noch einen Index. Ich 
hätte jetzt versucht, die Hallsensoren einzusparen. Im Prinzip könnte 
man ja einmalig beim Start der Steuerung den Motor so lange bestromen, 
bis der Indexpuls kommt. Ab da kenne ich die Rotorlage und kann 
"Softwarehallsensoren" implementieren. Nicht?

Kannst du das mit der Regelung noch ein wenig verdeutlichen? ist mir 
noch nicht ganz klar.

Auf jeden Fall steht mein neues Projekt fest: den Motor ansteuern mit 
einem Cortex, unter Verwendung von SVPWM sowie implementieren einer 
Drehzahl- und später dann noch Positionsregelung. :-D hältst du das für 
machbar mit einem, sagen wir STM32F4? sollte bei 120MHz schon drinne 
liegen, oder?

Noch was fällt mir ein:
wenn ich den Motor drehen lasse, und auf Stop klicke, dann kann ich das 
so einstellen, dass er wirklich "hart" an einer bestimmten Position 
anhält. Ich sage z.B. "fahr mal 1048576 Counts im Uhrzeigersinn", und 
tatsächlich, der Motor hält exakt dort an. Wie also ist es möglich, den 
so schnell zu bremsen?

Autor: Tec Nologic (tecnologic)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin Tobias,

Laut ST packt ein STM32F100 mit 24MHz die Feldorientierte Regelung 
(SVPWM) für einen Motor mit dem ST Motorcontrol Library ohne Probleme. 
Ein F4 ist da eigendlich overkill. Ich würde n F103 nehmen ist günstiger 
und für einen Motor vollkommen ausreichend. Bei mir steht die umsetzung 
meiner Regelung auf dem µC auch noch aus.

Die Geschichte mit den Softwarehallsensoren würde ich lassen, du hast 
doch eine viel höher aufgelößte Position. Ich würde das so 
implementieren:

Beim Start über die Hallsensoren den Sektor bestimmen und damit den 
Incrementalzähler initialisieren und dann beim ersten Nullpuls den Geber 
richtig kalibrieren. Es stellt sich dabei die Frage nach den Polpaares 
des Motors ich tippe mal auf 4, das steht aber im Datenblatt. Denn die 
Hallsensoren messen ja die elektrische Rotorlage und der Inc Geber misst 
die mechanische Rotorlage, dazwischen steht die Anzahl der Polpaare als 
Faktor. (elektrische Untersetzung)

Zur Regelung: Wenn du mit der SVPWM arbeitest dann machst du allg eine 
Feldorientierte Regelung. Das bedeutet mit der SVPWM erzeugst du einen 
Spannungsvektor(Summe aus Ua Ub Uc), daraus resultiert ein Stromvektor 
im Motor(Summe Ia Ib Ic). Dieser Strom vektor interesiert dich 
eigendlich.

Denn wenn du die elektrische Rotorlage hast muss der Stromvector in 
Drehrichtung 90° voreilen damit du den Strom ausschließlich in 
Drehmoment umsetzt.

Bei Industriellen Umrichter kommen da für die Clark und die Park 
Transformation zum Einsatz. Klingt kompliziert ist aber recht einfach.
Damit bezweckt man den bezug zur Rotorlage in der Regelung weg zu 
lassen.
Am Beispiel: Du misst den Stromvektor durch den Motor sagen wir der ist 
8A und hat den Winkel von 30° zur Rotornulllage. Um jetzt zu wissen wie 
der Vektor zum Rotor steht Transformmiert man den Vektor in die 
Rotorkoordinaten, di suptrahierst also die elektrsche Rotorlage die ist 
beispielsweise 120° (-> genau am 2. Hallsensor). Der Stromvektor in 
Rotorkoordinaten ist also -90° und 8A, das bedeutet du erzeugst mit 8A 
Drehmoment gegen den Uhrzeiger sinn. Denn der Stromvektor eilt dem Rotor 
um 90° entgegen den Uhrzeigersinn vor.

Angehen tust du das in der Sw wie folgt, Sollstrom vorgeben und 
Drehrichtung, Rotorlage messen, Spannungsvektor 90° voreilend in 
Drehrichtung vorgeben, Die Spannungsvektorlänge mach ein PID Regler aus 
der Länge des Stromvektors. Deshlab musst du diesem Messen. Ein 2. PID 
Regler Über wacht den Winkel des Stromvektors zum Rotor ist der kleiner 
als 90° was bei höherer Drehzahl auf Grund der GegenEMK des Motors 
zwangsläufig so ist. Wird der Spannungsvektor weiter vorgestellt bis der 
Strom wieder 90° hat. Wenn du das so hast kannst du mit dem Strom das 
Drehmoment vorgeben.  Willst du jetzt die Drehzahl regeln musst die 
diese Messen (dtheta/dt) Änderungsrate des Drehwinkels. Die Drehzahl 
mach dann wieder ein PID Regler der den Stromsollwert für den 
Stromregler so vor gibt das die Drehzahl passt. Beim Positionsregler ist 
das das gleiche PID Regler der das Drehmoment/Strom entgegen der 
Richtung des Positionsfehlers vor gibt.

Ich hoffe das war halbwegs verständlich.

MfG

Tec

Autor: Tobias Plüss (hubertus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin Tec,

die Park und Clarke Transformationen und deren Inverse kannte ich 
bereits, da ich davon mal gelesen habe und versucht habe mir diese 
Matrizengleichungen selber herzuleiten. Die Transformationen sind mir 
also aus mathematischer Sicht durchaus bekannt! Aber dennoch herzlichen 
Dank für deine Ausführungen.

Das Problem ist eher die Umsetzung in die Praxis ;-)

Eben z.B. die Sache, wie ich den Motor an einer gewünschten Position 
festhalten oder sehr schnell bremsen kann.

Zur Software:
ich möchte die ST FOC Library eigentlich nicht einsetzen, der Witz ist 
ja eigentlich gerade, das "zu Fuss" zu implementieren. Oder ist das 
nicht machbar? Ich stelle mir das ansich nicht so komplex vor: mittels 
ADC Ia, Ib messen, dann Clarke und Park, dann der PI-Regler, dann 
Inverse Park und dann SVPWM (oder so in der Art). Aus meiner Sicht ist 
nach wie vor die einzige Schwerigkeit die Positions- und 
Drehzahlregelung, sowie die Berechnung der Zeiten für die SVPWM. Da 
hilft der Code hier schon extrem weiter.

Beim STM32 habe ich auch noch das Problem, dass ich die Doku extrem 
unübersichtlich finde. Ich weiss noch immer nicht, welchen Timer ich 
benutzen muss, um damit SVPWM machen zu können. Da gefällt mir NXP schon 
besser, ich bin noch nicht sicher, mit welchem Prozessor ich anfangen 
soll, denn ich habe glücklicherweise zu beidem Evalboards hier (einmal 
STM32F100 Discovery, STM32F4 Discovery und ein NXP-Board mit einem 
LPC17... irgendwas).
Ich hoffe, ich komme heute endlich mal noch dazu, eine passende 
MOSFET-Endstufe zu bauen, dann kann ich mal versuchen, es auf dem 
NXP-Prozessor zu implementieren. Ich meld mich dann wieder ;-)

Autor: Tec Nologic (tecnologic)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin Tobias,

Sry ich wusste nicht wie weit du damit vertraut bist. Ich würde das auch 
ohne die Lib von ST machen zumindest die FOC lib. Was den Timer angeht 
bei ST heißen die Advanced Timer ist aber auch egal Hauptsache 3 PWM 
Kanäle
Sychronisiert bekommste die auch so.

Was die Regelung an geht wenn die Drehmoment Commandierung/Vorgabe klar 
ist, dann hast du die größte Hürde schon. Du brauchst jetzt für 
Positionsregelung nur noch einen Drehzahlregler und darüber den 
Positionsregler. Die Drehzahl messen und berechnen ist ja kein Ding 
diese mit nem Sollwert zuvergleichen auch net PID und der Ausgang ist 
die Drehmomentvorgabe für die FOC. Für Positionsregelung, vergleichst du 
Soll und Istposition, daraus ergibt sich der Schleppfehler -> PID und 
den Ausgang auf den Drehzahlregler. Oder du machst 
DTC(DirectTorqueControl) und gibst den Ausgang des PositionsReglers 
direkt auf den Drehmoment Sollwert.
Für Servobetrieb ist das ausreichend. Willst du aber die 
Positionsregelung haben das der Motor/Achse einem Master folgt dann ist 
Variante 1 besser.

Ich hoffe das war jetzt Aufschlussreicher.

MfG

Tec

Autor: Tobias Plüss (hubertus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin Tec,

Naja, wirklich vertraut bin ich nur mit der Mathematik hinter der Park- 
und Clarke Transformation. An die konkrete Umsetzung derselbigen habe 
ich mich bisher jedoch noch nicht gewagt...

Also, ich werd jetzt erst mal eine ordentliche Endstufe aufzubauen 
versuchen und dann werd ich mich wieder melden ;-)

Gruss


PS: machst du beruflich Servoregler, oder wieso kennst du dich damit so 
aus? Kannst du da gute Literatur empfehlen? Das Thema finde ich wirklich 
höchst spannend.

Autor: Tec Nologic (tecnologic)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Moin Tobias,

Ich hab dir mal ne Umfassende Diplomarbeit angehängt da steht alles 
drin.
Sonst kann ich nur den Blog von Shane Colton vom MIT empfehlen, der 
schreibt immer mal wieder was über seien MC Geschichten. Und hat z.B. 
auch diese Arbeit dort verlnkt. Falls ein Mod sie löscht. Was ich nicht 
hoffe.

Beruflich setze ich Servoregler ein und da wir speziel an die 
Positionsregelung sehr hohe und nicht alltägliche Ansprüche haben müssen 
die Regler der Umrichter oft angepasst oder zumidest über geordnete 
Regelstrukturen Programmiert werden. Aber vieles ist auch einfach nur 
Interesse an der Materie. Ich ma einfach Motoren und von diesen 
Amlibsten Permanent erregte Synchronmaschinen (ähnl. bzw. = BLDC jenach 
dem wen du fragst).

Bei der Endstufe musst du nur die Strommessung sauber halten. Ich würde 
keinerlei Filter physisch einbauen vllt ein RC glied mit als "Snubber" 
um die Flanken nicht so hart zuhaben. Die PWM die du dann auf dem Strom 
siehst ist quasi egal wenn du Sychron zur PWM die ADCs laufen lässt.


Was für Daten hat den dein Motor, vllt kann ich die Endstufe auch 
gebrauchen.

MfG

Tec

Autor: Tobias Plüss (hubertus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin Tec,

danke erst mal für das PDF! das schaue ich mir gerne an. Wie gesagt ist 
die Thematik extrem spannend. Sobald BLDCs und ähnliches ins Spiel 
kommt, wirds sehr intressant ;-) daher befasse ich mich viel mit solchem 
Kram.

Mein Motor ist dieser:
http://www.maxonmotor.ch/maxon/view/product/motor/...

Als Drehgeber dürfte dieser verbaut sein:
http://www.maxonmotor.ch/maxon/view/product/sensor...

(wobei ich bei letzterem aber nicht 100%ig sicher bin; ich hab den Motor 
grade nicht heir und kann daher nicht nachschauen).

Erstmal will ich eine passende Endstufe für diesen Motor bauen. Später 
dann möchte ich schon noch was grösseres realisieren, wobei es da dann 
allerdings wieder schwierig wird, passende Motoren sich zu beschaffen. 
Auch die Drehgeber sind nicht so leicht beschaffbar, soll ja auch noch 
im bezahlbaren Rahmen bleiben ;-)

Autor: Tec Nologic (tecnologic)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin Tobias,

Die Für die Positionsregelung ohne Drehgeber würde ich eine 
hochpoligemaschine nehmen 14 oder mehr pole als Außenläufer und die 
Hallsensoren außen anbringen dann hast eine auf lösung von 9° bei 
14Polen das ist schon mal recht gut, wenn du einen 54Poler findest (kein 
Modellbau derivat) kommste fast auf die Drehgeberauflösung.

Als Endstufe wäre diese hier wohl nicht so falsch
http://danstrother.com/2011/01/12/brushless-dc-mot...
Schaus dir mal an.

Ich bin auf deine Ergebnisse gespannt. Wenn ich wieder Zeit dafür hab 
dann werde ich mich auch mal wieder an meine Regelung setzen. Ich will 
das ganze weitest gehen im Zustandsraum bewerkstelligen mal sehen was 
das bringt.


Hast du dich schon für Prozie usw. entschieden? Willst du nur n 
Steckbrettaufbau machen oder gleich ne richtige Platine? Wenn du ne 
Separate Endstufe erstellen willst ohne Prozie und den Extern haben 
willst, wäre ich auch dran interessiert dann könnte ich die an mein 
STM3210B-Eval bummeln das hat n extra Motorcontrol stecker, Wo die 
Endstufe von ST normal rankommt aber die ist mir viel zu teuer.

MfG

Tec

MfG

Tec

Autor: Tobias Plüss (hubertus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin Tec,

ich habe mich noch nicht für den Prozessor entschieden. Da ich aber 
NXP-Fan bin und hier noch ein paar LPC1766 herumliegen habe, werde ich 
wohl die verwenden. Der STM32 ist toll, aber da brauche ich wohl zu 
lang, um mich in die Motorcontrol Geschichte einzuarbeiten. Für den 
Motorcontrol Timer von NXP haben wir hier ja dank Jürgen einen schönen 
Beispielcode ;-)

Allerdings habe ich tatsächlich vor, die Endstufe separat zu bauen, 
sodass man ein Mikrocontroller-, Prozessor- oder DSP-Board 
draufschnallen kann. Dann würde ich davon eine Platine herstellen 
lassen. Wenn du an der Hardware interessiert bist, könnte ich ja mehrere 
LPs fertigen und wir teilen uns dann die Kosten... ich denk, auf 2 Lagen 
sollte man das vernünftig hin bekommen. Besser wäre zwar 4, aber das 
wird dann wohl doch ein wenig teuer...

Was sollte deiner Meinung nach alles auf die Endstufe?
Ich dachte an folgendes:

ein paar kräftige MOSFETs, D2PAK oder so, mit galvanisch getrennten 
Gatetreibern, und dann auch noch direkt 3 Stromsensoren. FHS-40 von LEM 
möchte ich schon lange gerne mal Einsetzen. Dann noch ein wenig analoge 
Signalaufbereitung, und dann das ganze auf den Stecker geführt... was 
meinst du?

Gruss

Autor: Tec Nologic (tecnologic)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin Tobias,

Für wieviel Strom und Spannung willst du das Auslegen? Ich wäre für 
10-20A
bei 12-24V, irgendwas indem Bereich. PWM Frequenz muss größer 20kHz 
möglich sein da ich bis 2kHz Drehfeldrequenz will(>150krpm). Die FHS-40 
gefallen mir scheint aber das man da mit dem Layout sehr aufpassen muss.
Generell wäre ich da für 2 seitig das kann ich auch zur Not selber 
herstellen. Aber wenn wir die Platinen von IteadStudio in China machen 
lassen kosten die eh nicht viel. Was ich noch gern hätte wäre nicht nur 
die Strommessung sondern auch eine zusätzliche Strangspannungsmessung, 
die ist einfach aufzubauen und für Experimente gut.

Die Frage ist für mich noch was die Bauteile so Kosten?

Ich würde sonst einfach sagen mach doch mal n Schaltplan wie du dir das 
gedacht hattest wahrscheinlich passt mir das dann auch schon. Ich werde 
die Endstufe eh nur zur Softwareentwicklung nutzen. Und die Motoren die 
ich habe sind alle Modellbaugeräte. Mein Quälmotor ist n 14Pol 
Außenläufer mit 200W bei knapp 14V also ähnliche Kategorie wie dein 
Motor. Wenn natürlich größere Motoren möglich sind, gut. Aber das hat 
auch Nachteile.
Die Strommessung muss genau dimensionierbar sein also wären vllt 
bestückbare Shunts auch gut. Quasi n FHS-40 oder OP und Shunt. Über 
Jumper auf die Ausgangs Pins legbar. Das du damit auch Motoren mit 1A 
Maxstrom gut Regeln kannst und wenns die FETS Packen aber auch ich sage 
24V 80A Klopper kein Ding sind. Zum reinen Experimentieren sicher nicht 
verkehrt.


MfG

Tec

Autor: Tobias Plüss (hubertus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Jürgen,
ich habe da noch eine Frage zu deinem Code.

Kannst du mir erklären, wie du auf
int vsq3h=vb-(vb>>3)-(vb>>7)-(vb>>10)-(vb>>12);

kommst? interessanterweise multipliziert dieses Statement tatsächlich 
mit sqrt(3)/2, aber sowas habe ich ja noch nie gesehen :-D

Dann weiter:
was wird mit
int qV1 = va;
int qV2 = -(va>>1) + vsq3h; 
int qV3 = -(va>>1) - vsq3h; 

genau gerechnet? ich kann diese Rechnung mit den gängigen AppNotes nicht 
nachvollziehen. Korrekt ist sie ja aber zweifelsohne, wie deine 
Oszibilder ja zeigen :-O wie bist du darauf gekommen?

Autor: Jürgen Liegner (jliegner)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, ist eigentlich ganz einfach.

int vsq3h=

  vb                      1 * vb
-(vb>>3)  = -1/8     =   -0.125 * vb
-(vb>>7)  = -1/128   =   -0.0078125 *vb
-(vb>>10) = -1/1024  =   -0.0009765625 *vb
-(vb>>12) = -1/4096  =   -0.000244140625 *vb
                         -------------------
                          0.865966796875 * vb

              sqrt(3)/2 = 0.86602540378443864676372317075294

d.h. Es wird soviel von vb abgezogen, dass nur noch sqrt(3)/2=0.866026 
vb übrig bleiben. Dabei kommen nur Terme zum Einsatz die durch 2 teilbar 
sind, und somit habe ich die Multiplikation mit sqrt(3)/2 durch 4 mal 
Schieben und Subtrahieren ersetzt. Der Fehler liegt bei:
0.86602540378443864676372317075294/0.865966796875=1,00006767800988460590 
47674393583  das sind ca. 0.0068% und somit für diesen Zweck 
vernachlässigbar.

Damit wird dann aus

  int qV2 = -(va>>1) + vsq3h;
  int qV3 = -(va>>1) - vsq3h;

die inverse Clark Transformation:
      qV1=va;
      qV2 = -va/2 + (sqrt(3)/2) * vb
      qV3 = -va/2 - (sqrt(3)/2) * vb

Autor: Tobias Plüss (hubertus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Jürgen,
danke für deine Ausführungen. Im Nachhinein betrachtet ist es eigentlich 
klar :-) raffinierter Trick, habe ich so noch nie gesehen, aber das ist 
ja super elegant. Der Cortex M3 kann ja direkt mit einer einzigen 
Instruktion schieben und addieren/subtrahieren, dann wird diese 
Geschichte wirklich effizient!
;-)

Gruss

Autor: Tobias Plüss (hubertus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Jürgen,
noch eine Frage.
Du verwendest den LPC1769. Wie machst du die Messung der Phasenströme, 
bzw. wie synchronisierst du den ADC? Soweit ich das aus dem User Manual 
erkennen kann, lässt sich die MCPWM nicht wirklich mit dem ADC 
synchronisieren, ich sehe da keine Möglichkeit die Conversion zum MCPWM 
zu synchronisieren.

Gruss
      Tobias

Autor: Tec Nologic (tecnologic)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

Also bei dem STM32 ist es möglich den ADC mit einem Timer zu 
syncronisieren. Wieviele parallele ADCs hat den ein LPC17?
Der STM32 hätte 2 damit ließen sich 2 Phasenströme in der Lowphase der 
PWM gleichzeitig samplen. Oder man lässt die PWMs bewust asyncron laufen 
damit man mit einem ADC im Overflowinterrupt in der LowPhase jeder PWM 
samplen kann. was das für EMV Auswirkungen und so hat kann ich nicht 
abschätzen.

MfG

Tec

Autor: Tobias Plüss (hubertus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei einem LPC17 ist es auch möglich, den ADC mit einem Timer zu 
synchronisieren, aber leider haben die wohl nicht daran gedacht, dass es 
noch Sinn machen würde die ADCs mit dem Motorcontrol PWM zu 
synchronisieren ;-) so wie ich das hier aus dem User manual heraus lese, 
kann ich mit Timer 0, 1, 2 und 3 synchronisieren, aber nicht mit dem 
MCPWM timer. Hmm...

Wäre es eigentlich auch denkbar, den Strom durch die Lowside-Shunts 
irgendwie zu mitteln mittels eines kleinen RC Glieds? Dann spielt es ja 
nicht so eine grosse Rolle, wann ich messe....
Irgendwie fände ich es nicht so toll, wenn ich für jede Messung einen 
Interrupt brauche.

Autor: Tec Nologic (tecnologic)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit einem naja damit du mittelst muss die Zeitkonstante des RC gliedes 
größer als die PWM Periode sein, damit handelst du dir dann aber schon 
eine segnifikante Phasenverschiebung ein. Klar kann man die raus rechnen 
aber die ist nicht konstant sondern Spannungsabhängig usw.
Da ich das ganze physisch aber auch noch nicht aufgebaut habe ist das 
nur eine vermutung.

MfG

Tec

Autor: Ringer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

dieses Thread ist zwar nicht mehr ganz aktuell aber denke er passt am 
besten zu meinem Anliegen.

Habe ein STM32F103 µC und als Treiberstufe einen DRV8301 jetzt würde ich 
da gerne einen BLDC mit FOC Regeln kann mir da noch jemand weitere 
Informationen/Codeauszüge posten?
Die PWM geschichte ist denk ich soweit klar aber wie regelt ihr 
dies(d/q-Anteil) und vorallem wie setzt ihr dies um? 
(PWM/ADC-Einstellung)

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
Du kannst mal bei TI nachsehen. Da gibt es eine komplette SW Library zum 
Download. Microchip ist auch interessant. Einfach auf der Website mal 
nach AN1078 suchen. Auch hier gibt es den Source Code zum download.
Gruß,
Ralf

Autor: Ringer (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

hab mal die oben veröffentlichte datei erweitert.
bitte um kritik und weitere inspirationen

Autor: Adrian K. (-adrian-)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Jürgen,

ich habe bei der Ansteuerung von BLDC folgendes Problem:
Beitrag "BLDC Direct-Drive Servo - Sinus Positionsregelung"

Vor kurzem habe ich deinen Code mit einem LPCExpresso 1796
ausprobiert um herauszufinden ob es an meiner Art der Ansteuerung liegt.
Allerdings tritt mit deinem Code exact dasselbe Phänomen auf.

http://www.youtube.com/watch?v=1RSOzZ6Stwk&feature...

Vielleicht weist du ja, wie dieser Effekt zustande kommt?

Viele Grüße,
Adrian

Autor: Thomas T. (runout)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Tec, hallo Tobias,
(und alle anderen)

weiter oben im Thread wurde mal geäussert, dass Interesse an einer 
separaten
Endstufe besteht... (s. 12.03.2012 14:45)

Ich habe mir auch mal Gedanken über eine etwas "bessere" 
BLDC-Ansteuerung,
komplett mit Feedbackzweig, gemacht.

Hier mal paar Stichpunkte die mir wichtig sind:

-separater Aufbau von Controller und Leistungsteil
-High-Voltage-fähig: 48..300V DC, Auslegung mit 450V Bauelementen
-vollständige Opto-Entkopplung von Leistungsteil/Feedbackzweig und 
Ansteuerung
-Ausführung möglichst als Shuttle- oder Mainboard von z.B. TI 
DK-TM4C123G
-opulente Ausstattung des Feedbackzweigs (3x Strangströme, 3x 
Strangspannung, 1x Uhv)
-diskretes Leistungsteil: keine Hybrid-Endstufen, keine 
Ladungspumpen-Gatedriver
-0..100% Duty-Cycle bzw. statisches Schalten der Brücken soll möglich 
sein

Im Anhang ist mal der 1. Wurf des Konzepts zu sehen.
Es sollte möglich sein, damit unterschiedliche 
Controller/Developmentkits zu betreiben.
meine Lieblinge sind abgebildet...

In der Zeichnung sind die favorisierten Bauelemente mit möglichem 
Gehäuse
und ein paar Eckdaten angegeben.

Es gäbe noch einige Optionen:
z.B. Auswerten der /Fault-Ausgänge der Stromsensoren,
Anschlussmöglichkeit von 3 gängigen Hallschaltern, Absicherung etc.

Das ganze ist also kein Spielzeug mehr und soll auch für "erwachsene" 
Antriebe
geeignet sein.
Der Teufel steckt meistens im Detail (z.B. DC/DC-Wandler) und für
PWM-Ansteuerung gibt's eigentlich nur "bleiben lassen" oder 100%-ig 
umsetzen.

Ich bin auf ein paar Hinweise bezüglich Konzept und Bauteilauswahl 
gespannt.
Vielleicht gibt es Interesse an einer "gemeinsamen" Hardware.

Viele Grüße TT

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




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.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

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