Hi Leute,
ich baue mir grade einen Brushless Regler.
Es funktioniert soweit alles, der Motor dreht sich in beide Richtungen
und lässt sich starten, stoppen und bremsen - alles einwandfrei.
Jetzt möchte ich noch eine Regelung implementieren. Und zwar habe ich
das bisher so gemacht, dass ich die High-Zeit eines einzelnen
Hallsensors gemessen habe. War diese länger, als ein bestimmter
Vorgabewert, dann wird der Tastgrad der PWM vergrössert; war die
High-Zeit des Hallsensors zu kurz, dann wurde der PWM-Tastgrad
verkleinert.
Das funktioniert aber so nicht; die Drehzahl steigt immer weiter, und
fällt dann wieder ab, und steigt wieder.....
Wie ksnn ich die Regelung anders (besser) lösen?
Die Idee ist nicht schlecht. Ich würde sagen die Regelfaktoren stimmen
nicht. Hast du nur einen I oder auch einen P Anteil? Sprich Wenn du z.B
auf den Pulslängenwert 100 regeln möchtest sollte das so funktionieren:
Proportional (Faktor) zur Abweichung davon müste du dein PWM erhöhen.
Und zeitlich über mehere Regelzyklen einen klleinen Anteil dazugeben,
wenn der wert nicht erreicht wurde.
Hmm, so einen richtigen Regelalgorythmus habe ich noch nicht
implementiert.
Ich mach es wie folgt: (in einem Timer-Interrupt, der alle 100us
aufgerufen wird):
if(PTCD_PTCD2) // Signal vom Hallsensor 2
{
impulsdauer++;
}
else
{
if((impulsdauer < 1000) && (impulsdauer != 0))
pwm++;
else
pwm--;
impulsdauer = 0;
}
was sagst du dazu?
ich frage mich noch, ob ich nicht irgendwie alle drei Hallsensoren in
die Messung mit einbeziehen muss. Oder reicht einer?
Also, nachdem ich jetzt eine Prüfung auf Unter- und Überlauf eingebaut
habe, funktioniert das schon einigermassen.
Jetzt habe ich nur noch folgendes Problem: Wenn die Regelung "bemerkt",
dass der Motor zu langsam dreht, dann wird der PWM-Tastgrad stetig
erhöht. Der Motor läuft hoch, überschreitet den gewünschten
Drehzahlwert, die Regelung schaltet die PWM fast auf 0% usw. der Motor
"pendelt" also immer in einem gewissen Drehzahlbereich.
Ich denke, das kann man durch einen PID-Regler verbessern, oder? Die
Frage ist nur: wie muss ich dazu mein Programm umbauen?
Wer kann helfen?
Also sinngemaess wurde es ja schon gesagt:
I-anteil: Differenz soll-ist aufintegrieren, Im Microkontroller durch
Summierung der Differenz in jedem Durchgang
D-anteil: Differenz zwischen Aktuellem Regelwert und vorherigem
Regelwert bilden
P-Anteil: Differenz zwischen soll und ist, hast du ja schon.
Der I anteil kann Schwingungen verursachen, dem musst du mit D
"gegenwirken"
Der Ianteil ist notwendig, wenn du keine bleibende Regelabweichung haben
moechtest bei konstanter fuehrungsgroesse.
Der D-Anteil steuert bereits gegenm, sobald eine Aenderung z.B.
hervorgerufen durch P oder I eintritt oder durch eine Lastaenderung.
Gruesse Gast
Hi Gast,
vielen Dank erstmal.
Nun habe ich nur noch ein Problem:
Der Speed-Sollwert wird mit einem Poti vorgegeben, das vom 8 Bit-ADC
digitalisiert wird. Das wäre also unsere Führungsgrösse, mit einer
Breite von 8 Bit (1 char).
Die High-Zeit, die ich bei einem einzelnen Hallsensor messe, ist aber
ein 16 Bit-Wert, da sie einige ms sein kann, und der Timer eine
Auflösung von 100 us hat.
Der Wert pwm, der den Tastgrad regelt, wiederum ist ein byte (also nur 8
Bit).
Wie verrechne ich denn jetzt meine Eingangsgrössen in den Regler
sinnvoll so miteinander, dass am Schluss wieder ein 8 Bit-Wert
rauskommt? Sobald ich doch irgendwas multipliziere oder so ist das
Ergebnis dann ja 16 Bit gross.
Da stehe ich im Moment noch auf dem Schlauch.
Hallo hab sowas auch noch nicht gemacht, denke aber auch gerade ueber
eine Moeglichkeit der Implementierung nach, da ich an einem aehnlichen
projekt arbeite.
Muesstest mal Eventuell darueber nachdenken, in welchem Bereich sich
deine Messgroesse bewegt, ob in jedem fall immer sowohl das Highbyte udn
das Low byte genutzt werden oder nicht, dann koenntest du evtl nur das
High-byte betrachten?
oder du "verschiebst" deine Fuehrungsroesse um einige Bit in ein Anderes
Register und hast dann auch fuer die Fuehrungsgroesse einen 16 Bit wert,
allerdings immer noch nur 8 bit Informationen. (einmal nach links
geschoben= Multiplikation mit 2)
Wuesste aber jetz nur wie ich das in Assembler mache, kann leider kein
C.
Fuer den Anfang ist es das beste denke ich, wenn du versuchst, deine
Messgroesse auf 8bit zu bringen (entweder nur High oder Low Byte
betrachten, evtl vorher verschieben, um in den fuer dich relevanten
Bereich zu kommen) einziges Manko: "nur" 256 Werte der Fuehrungsgroesse
moeglich.
Gruesse Gast
Hallo Gast,
jau dass ich da nur 256 Werte habe ist mir bewusst.
Ich will ja vorerst auch keinen Highend-Regler bauen; vielmehr geht es
vorerst darum, dass sich der BLDC dreht und seine Drehzahl auch bei
Belastung nicht absinkt (also immer ungefähr konstant ist).
Nachher werde ich das natürlich auf einem hochwertigen, schnellen
Rechner machen. Das hier ist nur ein Versuch.
Die siehst ja auch, dass meine Pulsdauermessung recht Hemdsärmlig ist;
normalerweise würde man für sowas ja Input Capture verwenden.
Achja, mir fällt nochwas ein:
Die Ansteuersignale für die Highside-FETs gehen vom Controller direkt zu
den Gatetreibern.
Die Lowside-Ansteuersignale jedoch habe ich mit einem AND-Gatter mit der
PWM verknüpft; dadurch werden die Lowside-FETs entweder ganz
ausgeschaltet, oder im Takt der PWM eingeschaltet. Ist das korrekt, oder
muss ich zwingend aktiven Freilauf machen?
Hintergrundgedanke dabei war, dass ich die Highside-FETs nicht allzu oft
schalten möchte, da die aus einem Bootstrap-Kondensator versorgt werden.
Hallo Walter,
Dann ums erstmal geregelt zu bekommen wuerde ich die "Eingangsgroessen"
der Stellgroesse, also P I und D anteil mit 8Bit rechnen und dann
zusammenaufaddieren, was moeglicherweise eine Zahle groesser 8 Bit
ergibt. Diese dann wieder reduzieren. Einzig der I anteil koennte in der
Theorie Probleme bereiten, da er wenn du z.B. bei einem sprungfoermigen
Eingangssignal und langsamen System ueberlaeuft, wenn du da jedoch auch
nur 8bit hast, ist das schon ein ganz guter anit-wind-up.
Meine Idee mit PWM ist momentan, dass ich einen FET in der Groundleitung
vor den anderen FETS habe und diesen an den PWM ausgang anschliese, ist
ja auch eine UND-Vernkuepfung. Oder gibt es dabei Probleme, dass ich mir
evtl die PhasenFETs zerstoere?
Habe mich noch nicht mit aktivem Freilauf beschaeftigt und in den
Applicationnotes von Atmel zum Beispiel auch noch nichts derartiges
gelesen, koenntest du mir kurz mit physikalischem Hintergrundeffekt
erklaeren was man darunter versteht?
Soweit ich die Sache verstehe ist im Leerlauf die induzierte Spannung in
den (aktiven)Wicklungen genau gleich der von aussen angelegten Spannung
(bei PWM dem Mittelwert entsprechend). Wenn nun Last kommt, kommt noch
der Ohmsche Wiederstand und Spannungsabfall der Wicklungen hinzu.
Meint man mit aktivem Freilauf, dass wenn der Motor von aussen schneller
gedreht wird, als es der Reglerspannung entspricht, dies nicht gebremst
wird?
Bei einer Regelung wuerde der Regler ja dem Effekt genau entgegenwirken
und bremsen, damit wieder die Solldrehzahl anliegt.
ps kann mich momentan leider nicht anmelden
Also, normalerweise sind in den FETs ja Freilaufdioden drin, oder man
hat halt externe Freilaufdioden an jeder Phase. Immer eine gegen +, die
andere gegen Masse.
Aktiver Freilauf wäre jetzt, wenn man nicht nur den lowside-FET ein- und
ausschaltet, sondern immer in der Ausschaltphase des lowside-FETs den
highside-FET einschaltet. Dadurch kann die induzierte Spannung im Motor
durch den FET fliessen, welcher viel niederohmiger ist, als jede
Freilaufdiode. In der Freilaufdiode wird sonst immer eine gewisse
Leistung verheizt; im FET ist die dann natürlich viel kleiner.
Ja, das stimmt ja auch, in der Off-Phase darf nichts fliessen. Aber nimm
mal an, Phase U ist an +, Phase V ist an GND und Phase W ist nicht
bestromt.
Wenn du jetzt beispielsweise Phase V nicht dauernd auf Masse legst,
sondern da mit einer PWM drauf gehst, dann kannst du das auf zwei Arten
machen:
- entweder, du schaltest Phase V gegen Masse, lässt sie danach offen,
und schaltest wieder gegen Masse.
- oder du schaltest Phase V abwechslungsweise schnell gegen Masse und
danach gegen VCC.
Das ganze natürlich als PWM!
Hm Verstehe trotzallem noch nicht ganz den Sinn:
1.Im Fall dass du sie offen laesst, sie also quasi floatet,
sollte doch definitiv kein Strom fliessen.
2.Im Fall hingegen, dass du sie nach + ziehst, musst du doch der
Induktionsspannung entgegen arbeiten oder?
bin verwirrt
Ah, hab das jetzt verstanden, die Spule versucht ja den Stromfluss
aufrecht zu erhalten, d.h. das Potential der geradeabgeschalteten Phase
steigt ueber das Versorgungsspannungspotential und es fliesst ein Strom
durch die Diode, sozusagen im Kreis?
interessanter Vorgang, sofern ich es richtig verstanden habe.
Das ganze ist unter passiven und aktivem Freilauf bekannt, soweit ich
weiß. Wobei der aktive Freilauf (wo gegen VCC und GND immer abwechselnd
ge-PWMt wird) "besser" ist. Sowohl für die Linearität der Kennlinie von
Drehzahl zu PWM Stellwert als auch für die Dioden (die müssen dann
nämlich kaum noch Strom leiten, das macht dann das aktive Schaltelement
im FET).
@Simon
ja, genau.
Wobei ich bezwifle, ob es wirklich einen Unterschied macht, wenn man
gute Dioden verwendet. Ich habe hier eine Brücke mit IGBTs, die eine
integrierte SiC-Diode haben (ist sauschnell). Damit kann ich auch
grössere Motoren schalten, ohne dass irgendwas warm wird. Und das mit
passivem Freilauf!
Kannste machen, ich mache das trotzdem lieber Aktiv. Das "Schaltelement"
im MOSFET ist immer besser als die Diode, da diese immer nur parasitär
ist. Also ein Nebeneffekt bei der Herstellung bzw. bei dem
MOSFET-Prinzip.
@Simon
ja klar, die Diode ist parasitär. Es gibt aber auch FETs und IGBTs, die
explizit eine speziell dafür geeignete Diode eingebaut haben (zusätzlich
zur parasitären!).
Noch kurz ne Frage:
ich mach jetzt eine simple Drehzahlmessung, indem ich per Input Capture
die Pulsdauer eines einzelnen Hallsensors messe. Ist dieses Vorgehen
richtig? Oder man man die Drehzahlmessung irgendwie anders?
Ist es vielleicht sinnvoller, die Pulsdauer an allen 3 Hallsensoren zu
messen?
Auf jeden Fall stellt das Programm dann den Tastgrad der PWM so ein,
dass die Pulsdauer einen bestimmten Sollwert nicht über- /
unterschreitet.
Dann noch was:
wie bremst man den Motor am besten? Alle Phasen auf Masse, oder wie?
Kann ich die Bremsenergie auch irgendwie zurückgewinnen, so wie bei
vielen FUs ?