Forum: Mikrocontroller und Digitale Elektronik Brushless Regler


von Walz (Gast)


Lesenswert?

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?

von Ralf82k (Gast)


Lesenswert?

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.

von Walz (Gast)


Lesenswert?

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?

von Lupin (Gast)


Lesenswert?

Prüfst du pwm nicht auf Unter- bzw Überlauf?

von Walz (Gast)


Lesenswert?

Nein, eigentlich nicht..... schäm

von Walz (Gast)


Lesenswert?

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?

von Gast (Gast)


Lesenswert?

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

von Walter (Gast)


Lesenswert?

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.

von Gast (Gast)


Lesenswert?

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

von Walter (Gast)


Lesenswert?

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.

von Gast (Gast)


Lesenswert?

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

von Walter (Gast)


Lesenswert?

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.

von Gast (Gast)


Lesenswert?

Hmmm....
Ich dachte in der Off-Phase soll kein Strom fliessen?
Und du beziehst dich doch jetzt auf die FETS einer Halbbruecke oder?

von Walter (Gast)


Lesenswert?

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!

von Gast (Gast)


Lesenswert?

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

von Hauke R. (lafkaschar) Benutzerseite


Lesenswert?

Es geht um die induzierte Spannung in den Motorwicklungen, die energie 
die im Magnetfeld gespeichert ist muss ja irgendwo hin.

von Gast (Gast)


Lesenswert?

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.

von Simon K. (simon) Benutzerseite


Lesenswert?

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).

von Walter (Gast)


Lesenswert?

@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!

von Simon K. (simon) Benutzerseite


Lesenswert?

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.

von Walter (Gast)


Lesenswert?

@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!).

von Walter (Gast)


Lesenswert?

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 ?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.