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.
Hmmm.... Ich dachte in der Off-Phase soll kein Strom fliessen? Und du beziehst dich doch jetzt auf die FETS einer Halbbruecke oder?
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
Es geht um die induzierte Spannung in den Motorwicklungen, die energie die im Magnetfeld gespeichert ist muss ja irgendwo hin.
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 ?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.