1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

Weitere Controllerbasteleien

Dieses Thema im Forum "Controller/Regler, Fahrerinformation, Elektronik" wurde erstellt von Joe23, 28.11.16.

  1. Joe23

    Joe23

    Beiträge:
    3.632
    Details E-Antrieb:
    XDURO2011,2XBofeili 1st Gen
    Die Situation war noch einfach, als ich mich mit mit einem 8-Bit-Atmelprozessor daran machte, meinen ersten Controller zu basteln. Da hat man nur bei Änderung eines der drei Hallsignale einen Interrupt ausgelöst und konnte dann in der Interruptserviceroutine das entsprechende Bestromungsmuster ausgeben. Als Gasgriff oder vielmehr als vielstufigen Unterstützungsstufenschalter habe ich damals einen Quadrature-Drehschaltet verwendet, der in einem Quadraturecounter vor- und rückwärts die Stufen gezählt hat. Um die Strombegrenzung habe ich mich damals gedrückt, weil ich die softwaremäßige Bedienung der A/D-Wandler nicht lernen wollte.


    Um dann eine Sinusansteuerung zu verwiklichen habe ich dann den Prozessor gewechselt und einen STM-32 eingesetzt. Damit wurden dann die Schwierigkeiten größer.

    Es fing schon damit an dass der Pin-Change-Interrupt nicht vorhanden war. Ich hab dann schließlich eine Applikation gefunden, bei der die 3 Hallsignale über exclusiv Oder zusammengefasst wurden und dieses Signal von einem Timer ausgetimed wurden. Jedesmal am Ende eines Austime-Zyclus wurde ein Kommutierungs-Kommando per Hardware zum PWM-Timer gegeben, das bereits vorher den eingespeicherten Bestromungszustand zur Wirkung brachte. Außerdem wurde ein Interrupt ausgelöst, der den nächsten Kommutierungzustand vorbereiten sollte. Irgendwann wurde mir das Nachvollziehen dieses Softwarevorschlages zu viel, behielt zwar das Austimen der Hallintervalle samt vorhandenem Interrupteintritt, schrieb aber selbst einen Kommutierungsvorgang, den ich in der Endlosschleife der Hauptprogramms ablaufen ließ. Das brachte ich zwar zum funktionieren, aber mir wurde auch bewusst, wie problematisch eine Kommutierung sein kann, die einen zuvor eingespeichten Kommutierzustand nur aktiv schaltet, weil das aus dem Stillstand heraus nicht funktioniert. Das ganze wurde damit zum unendlichen Flickwerk.

    Ich habe dann die Blockkommutierung aufgegeben und mich auf eine Sinuskommutierung vorbereitet:

    Dazu brauchte ich erst mal einen besseren Rotorlagegeber als die üblichen Hallsensoren . Und weil so ein Geber nachträglich schwer zu montieren ist, habe ich bei meiner ehemaligen Firma nachgefragt, ob sie nicht für einen armen Ruheständler ein entsprechenden Geber, am besten mit dranhängendem Motor hätten.

    Ich habe mir dann den kleinsten verfügbaren ausgesucht und auch gleich darauf das Interface zum Quadrature-Eingang eines der verfügbaren Timer des STM32 gebastelt. Die Auswertung läuft einwandfrei selbst dann, wenn der Motor an einem sensorless Lishui Controller läuft. Da sind keine Einstreuungen zu sehen und ist auch kein Verzählen feststellbar.

    Das Ganze war inzwischen abgebaut und weggeräumt. Ich habs nun wieder hergeholt und versteh sogar den Anfangs des Jahres geschriebenen Code noch einigermaßen. Ich habe nun eine Umcodierung des 13Bit Zählerstandes in Kommutierungszustände 0 bis 5 hinzugefügt. Über einen bedingten Debugger Printout habe ich Zugang zu Zählerwerten und Kommutierzustaenden. Der Debugger Printout wird durch ein Weiterschalten des Gasdrehschalters ausgelöst.

    Durch statische Bestromung 2er Phasenleitungen (Autoakku über 18 Ohm an zwei Phasenleitunge gelegt) konnte ich festlegen, welche Bestromung in welchen Kommutierzustand führt:

    ge+ bl- -> comnr=4

    ge+ gn- -> comnr=5

    bl+ gn- -> comnr=0

    bl+ ge- -> comnr=1

    gn+ge- -> comnr=2

    gn+ bl- -> comnr=3

    Die genannte Folge von Kommutierzustände hat eine ccw-Drehung (auf die Motorwelle gesehen) zur Folge.
     
    Pete3 und marci gefällt das.
  2. Joe23

    Joe23

    Beiträge:
    3.632
    Details E-Antrieb:
    XDURO2011,2XBofeili 1st Gen
    Eigentlich war mir klar, dass der Motor nun schnell zum laufen kommen müsste. Es waren ja nur einige schon erstellte Softwareteile hinein zu kopieren. Bei meiner guten Ordnung habe ich wohl von der falschen Software kopiert. Da war dann doch noch ein Fehler zu suchen. Statt die jeweils freie Halbbrücke floating zu schalten, wurde diese durchgeschaltet. Mein Glück, dass ich doch erst den Oszi bemüht habe um zuerst die Ansteuerung des MOSFET-Treibers anzusehen. Jetzt habe ich zum ersten Mal die Möglichkeit die Kommutierung fein abzugleichen. Und zur Weihnachtsfeier meiner Firma kann ich jetzt auch gehen, Bei der letzjährigen Feier hab ich den Motor erbettelt. Hätt doch dumm ausgesehen, wenn ich ihn ein Jahr später noch immer nicht zum Laufen gebracht hätte. Unschön ist noch, dass ich den Motor nach Power On eine Umdrehung von Hand drehen muss, damit die Nullposition übernommen werden kann. Dafür wäre am Encoder noch eine Sinus/Cosinus-Spur mit einer Periode pro Umdrehung vorhanden.
    Davon könnte man grobe Absolutwerte ableiten.
     
    Pete3 gefällt das.
  3. marci

    marci

    Beiträge:
    1.623
    Alben:
    1
    Ort:
    82402
    Details E-Antrieb:
    einige Eigen(um)bauten und Nostalgie
    Hmm, ich glaube es ist Zeit, den armen Ruheständler wieder aus dem Ruhestand zu holen, viel zu schade ihn in Ruhe rumstehen zu lassen :)

    Tolle Aufführung Deiner Arbeit, ich glaube in Alaska wärest Du trotz Ruhestand ein gefragter Generator Master / Lead Mechanican :)
     
  4. Joe23

    Joe23

    Beiträge:
    3.632
    Details E-Antrieb:
    XDURO2011,2XBofeili 1st Gen
    Ja, zum Holzspalten wär ich noch von Nutzen, aber nur mit hydraulischer Unterstützung. Ich hab mein Alaska schon im eigenen Garten.Von der letzten Holzfällaktion sind noch 3 Ster zu spalten.
     
    marci gefällt das.
  5. wholeinthewall

    wholeinthewall

    Beiträge:
    288
    Details E-Antrieb:
    SHIMANO STePS 36V - 250 W, Shimano Akku 36V/11,6Ah
    @Joe23,

    Hut ab vor deinen Controllerkenntnissen.

    LG
     
    marci gefällt das.
  6. Joe23

    Joe23

    Beiträge:
    3.632
    Details E-Antrieb:
    XDURO2011,2XBofeili 1st Gen
    @wholeinthewall

    Danke für die Blumen. Die habe ich in diesem Fall aber nicht verdient. Bis jetzt habe ich nur einen Handelsüblichen Servomotor mit eingebautem Rotorlagegeber an meinen Versuchsaufbau eines Controllers angeschlossen. Dabei wurde ein Timer als Qudrature-Counter verwendet, um eine Rotorumdrehung auf 8192 Winkelintervalle aufzulösen. Um der Sache etwas Leben einzhauchen, habe ich das ganze noch zum Blockkommutierer erweitert, was ich ursprünglich nicht wollte, aber der Weg dahin war recht einfach zu in ca. 3 Tagen zu verwirklichen. Jetzt stehe ich da und verstehe noch nicht mal, warum dieser Blockkommutierer sich sehr viel anders verhält als viele käuflichen Kontroller und auch anders als meine zuvor gebastelten Blockkommutierer.
    Dass der Motor für 36V Speisung etwas ungünstig ist, sieht man aus den Daten:

    http://www.pedelecforum.de/forum/in...rollerversuchsaufbau.30082/page-7#post-620573

    Der Motor hat sehr viel Selbstinduktion, der Motorstrom hat mehr Ähnlichkeit mit Sinus, als mit dem Blockschema.
     
  7. Joe23

    Joe23

    Beiträge:
    3.632
    Details E-Antrieb:
    XDURO2011,2XBofeili 1st Gen
    Ich habe inzwischen nochmals in dem Link von #6 nachgeschaut. Da habe ich seinerzeit den Motor mit einem sensorless Controller von Lishui betrieben, da zeigen Phasenspannung und Phasenstrom ein ganz normales verhalten. Also kann es nicht am Motor liegen. Natürlich hat die EMK dieselben Abweichungen wie die idealen Kommutierpunkte
    Ich orientiere meine Kommutierungsintervalle am absoluten Nullwert des Geber, kann aber diese Orientierung durch Addition von beliebigen Winkelwerten verschieben. 8192/12=682,66 bedeutet dabei 60° (2 Polpaare also 12 Kommutierungsintervalle pro Umdrehung). Ich habe zwar versucht durch unterschiedliche Winkelverschiebungen ein Strom-Minimum einzustellen . Aber das bringt nur 2 Kommutierzustände in Ordnung . Alle 12Kommutierzustaende mit anfanswinkel und Endwinkel individuell zu korrigieren ist mir zuviel Arbeit. da müsste man schon eine Idee für einen selbstlernenden Algorithmus haben. Indessen ist mir die Blockkommutierung kein Anliegen, was ich unbedingt durchziehen muss.
     
    Zuletzt bearbeitet: 01.12.16
  8. Joe23

    Joe23

    Beiträge:
    3.632
    Details E-Antrieb:
    XDURO2011,2XBofeili 1st Gen
    Vielleicht hat der STM32 einen Fehler, oder ich habe die Programmierung nicht richtig verstanden. Mir fällt halt auf, dass ich mit dem STM32 noch kein sauberes Kommutiermuster zustande gebracht habe. Mit Hallsensor nicht und nun mit dem optischen Encoder auch nicht.
    Allerdings lief der Motor bei beiden Versuchen.
     
    Zuletzt bearbeitet: 02.12.16
  9. Joe23

    Joe23

    Beiträge:
    3.632
    Details E-Antrieb:
    XDURO2011,2XBofeili 1st Gen
    Ich habe jetzt doch noch viel Zeit aufwenden müssen um noch einen Softwarefehler zu beheben und habe dann heute schließlich die Kommutierung mit der EMK phasengleich gestellt.
    In der Anlage zwei Oszigramme:
    Bild1: CH1:Referenzimpuls des Drehgebers CH2: Phasenspannung an der blauen Phasenleitung bei 12v Batteriespannung
    Bild2: CH1:Referenzimpuls des Drehgebers CH2: Phasenspannung an der blauen Phasenleitung bei 40v Batteriespannung
    Einstellkriterium für Phasegleichheit war zentrische Lage der Trapezanstiege zwischen den beiden Rechteckdächern.
    Beide Oszigramme wurden gemacht um zu überprüfen, Ob sich bei hoher Drehzahl die Phasenlage ändert.
    Bild1.jpg Bild2.jpg
    D.h. die senkrechtenAnstiege in einem Bild müssen gleich hoch sein.
     
    Pete3 gefällt das.
  10. Joe23

    Joe23

    Beiträge:
    3.632
    Details E-Antrieb:
    XDURO2011,2XBofeili 1st Gen
    Heute konnte ich auch noch den letzten Negativpunkt ausräumen, dass der Blockkommutierer empfindlicher gegen PWM-Einstreungen in die Strommesswerte sei.
    -DerStrommess-Sensor war ohne Spannungsversorgung. Umstecken des Netzanschlusses brachte Abhilfe.
    - Der vermutliche PWM-Nebel lag im Oszi begründet. Abhilfe: Automatische Kalibrierung. Effekt ist schon länger bekannt, war jedoch in Vergessenheit geraten.
    Damit ist für mich der gebastelte Blockkommutierer abgeschlossen.
    In der Anlage noch 4 Bildchen:
    Bild1: 12V Batteriespannung mit Vollgas ohne Belastung
    Bild2: 12V Batteriespannung mit Vollgas mit Belastung
    Bild3: 39 V Batteriespannung mit Vollgas ohne Belastung
    Bild4: 39V Batteriespannung mit Vollgas mit Belastung
    Wegen der geringen Maximalströme des Motor 1,6A Dauer/zu 6,15A Spitze ist der Stromsensor mit 8A/25A nicht gut geeignet.
    Bild001.jpg Bild002.jpg Bild003.jpg Bild004.jpg
     
    Zuletzt bearbeitet: 06.12.16
    Pete3 gefällt das.
  11. Joe23

    Joe23

    Beiträge:
    3.632
    Details E-Antrieb:
    XDURO2011,2XBofeili 1st Gen
    Habe jetzt doch mal auf 3-phasige Blockkommutierung umgestellt und viel Zeit damit verbracht, durch winkelmäßige Verschiebung der Kommutierung ein Batteriestromminimum zu finden.Es war deshalb so Zeitaufwendig weil ich im Sourcecode den geänderten Verschiebebetrag eineditiert habe und danach neu compilieren mussste und auch wieder den Debugger starten mußte. Ich fand schließlich eine Orientierun bei der zwar der Motor in Gegenrichtung zur 2-phasigen Kommutierung lief mit 350mA bei 12V Versorgung in 100% PWM.

    Bild008.jpg
     
    marci gefällt das.
  12. Joe23

    Joe23

    Beiträge:
    3.632
    Details E-Antrieb:
    XDURO2011,2XBofeili 1st Gen
    Ich habe heute noch eine Aufnahme unter Belastung gemacht (0,9A Batteriestrom). Der Motor war kurz vor dem Stillstand. So gefällt mir das Stromsignal viel besser. Jedoch kann man beim Bremsen von Hand keine gleichförmige Drehzahl bekommen.

    Bild010.jpg

    Der Zufall hat mich begünstigt, beide Bilder zeigen dieselbe Anzahl von Kommutierungstati.
     
    Zuletzt bearbeitet: 11.12.16
    Pete3 gefällt das.
  13. Joe23

    Joe23

    Beiträge:
    3.632
    Details E-Antrieb:
    XDURO2011,2XBofeili 1st Gen
    Trotz dieser schönen Stromkurven, hatte ich immer wieder Zustände bei wenig Gas bei denen der Motor hängen blieb und nach kurzer Zeit sogar den Batteriestrom auf Null reduzierte. Nachdem ich wie ein Verückter gesucht habe, ob ich etwa einen Kommutierzustand falsch programmiert hätte, so, dass kein Strom floss, bin ich heute darauf gekommen, dass ich die Rechnung ohne den Wirt, äh!, ohne den Bootstrapkondensator gemacht hatte. Ich wollte besonders schlau sein und habe die PWM-Aufschaltung immer in der Phase gemacht, die ohne eine parallelgeschaltete war. Da musste ich eben auch die Untertransistoren beaufschlagen. Dass dabei das Bootstrapprinzip nicht mehr funktioniert, war mir nicht in den Sinn gekommen. Es hat mich aber auch keiner danach gefragt:p.
     
    Pete3 gefällt das.
  14. Joe23

    Joe23

    Beiträge:
    3.632
    Details E-Antrieb:
    XDURO2011,2XBofeili 1st Gen
    Damit ich auch einige Messwerte habe, die als Beleg dafür dienen könnten, dass die 3-fache Bestromung ineffizienter wäre, habe ich gestern noch die Leerlaufverluste beider Kommutierarten aufgenommen. Ergebnis war dass diese im Drezahlbereich, der für beide Kommutierarten erreichbar war gleich sind . Allerdings erreichte die 3-phasige Bestromung bei 100% PWM mit 485 rpm eine höhere Drehzahl als die 2-phasige Bestromung mit 431 rpm. Dabei war die Versorgung 12V .
    Die Drehzahlunterschiede kann man sich leicht erklären, denn EMK und Wicklungswiderstand sind bei beiden Anordnungen unterschiedlich. Außerdem könnte es sein dass ich das Stromminimum der 3-phasigen Bestromung nicht genügend genau ermittelt habe.
    Als nächstes werde ich dann die Sinusspannungseinspeisung probieren, allerdings ohne feldorientierte Stromregelung weil dazu mein Leistungsteil um Stromsensoren erweitert werden müßte, was .einen Neuaufbau bedeuten würde.
     
    Pete3 gefällt das.
  15. Joe23

    Joe23

    Beiträge:
    3.632
    Details E-Antrieb:
    XDURO2011,2XBofeili 1st Gen
    So, nun läuft die Sinuseinspeisung schon einige Tage. Jedoch ist noch viel zu tun.
    Von Anfang an habe ich noch keinen Gasgriff vorgesehen, weil ich den Quadrature-Drehschalter für Änderung von Einstellwerten verwenden möchte. Also mache ich die ersten Laufversuche mit Vollgas, allerdings nur mit 12 V.
    Zudem habe ich einen 18 Ohm Widerstand in der Batteriezuleitung.
    Es scheint prinzipiell zu funktionieren. jedoch habe je ich eine Störstelle im sinusförmigen Verlauf aller 3 Phasenspannungen (siehe anliegendes Bild). Meine Sinustabelle ist es nicht, ich habe diese aus dem Sourcetext herauseditiert und in Excel importiert um eine Grafik anzuzeigen.
    Die Oszigramme der Sinuskurven sind invertiert, weil ich direkt am STM32 über RC-Filter gemessen habe. Die negative Halbwelle, in der sich die störende Spitze befindet, kommt als aus der Leistungstufe positiv heraus.
    Bild000.jpg
    Langsam gehen mir dir Ideen aus, wovon der Fehler bewirkt werden könnte
     
    Zuletzt bearbeitet: 22.12.16
    Pete3 gefällt das.
  16. Hochsitzcola

    Hochsitzcola

    Beiträge:
    940
    Details E-Antrieb:
    NC FH154 mit EB306 und EB-Precontroller
    Da das genau am Maximalwert passiert, tippe ich auf einen Variablenüberlauf oder eine Division durch Null...

    Gruß
    hochsitzcola
     
    Pete3 gefällt das.
  17. Joe23

    Joe23

    Beiträge:
    3.632
    Details E-Antrieb:
    XDURO2011,2XBofeili 1st Gen
    Division durch Null kann ich ausschließen. Aber das Mixtum von unsigned und signed Arithmetik kann schon zu Fehlern führen. Das habe ich schon bei der Subtraktion des Referenzwerts des Encoders gemerkt.
    Besonders bei Wortlängen, die in C nicht definierbar sind:
    Rotary Encoder 13Bit
    PWM Timer 12 Bit
    Da kanns leicht sein, dass weiter oben im Typ uint16_t was hängen bleibt.
    Nachdemich den Fehler bisher nicht gefunden habe, muss ich halt warten, bis der Fehler mich findet.
     
    Pete3 gefällt das.
  18. Joe23

    Joe23

    Beiträge:
    3.632
    Details E-Antrieb:
    XDURO2011,2XBofeili 1st Gen
    Und natürlich habe ich auch versucht die Sinustabelle auf halbe Amplitude umzustellen. Damit läuft der Notor nicht mehr, jedoch der Spike bleibt, wenn man von Hand dreht.
     
  19. labella-baron

    labella-baron

    Beiträge:
    9.471
    Details E-Antrieb:
    Crystalyte 209, LiFePo 36V 4,6Ah von A123
    Vielleicht ein Umschaltvorgang, welcher trotz Sinus-Nachbildung zur Kommutierung bei dir notwendig ist?
     
  20. Joe23

    Joe23

    Beiträge:
    3.632
    Details E-Antrieb:
    XDURO2011,2XBofeili 1st Gen
    In der Tat hatte ich sowas wie einen Umschaltvorgang drinn, da wurde der PWM-Ausgang disabled , nochmal neu die Polaritäten eingestellt und danach wieder enabled. Ich hätte wetten wollen, dass es das ist. Jedoch, der Spike ist unverändert.
    Natürlich darf man einen derartigen Fehler nicht zulassen, ich habe aber trotzdem die praktischen Auswirkungen auf den Phasenstrom heut mal oszillografiert. Das Motörchen habe ich dabei von Hand auf ca. 0,5 A Batteriestrom gebremst.
    Phasenstrom_u_Refsgn.jpg
    Die Auswirkungen des systematischen Spikes sind dabei in der selben Größenordnung wie anderer Schmutz.
    Da wird die Vesuchung groß, es so zu lassen, wie es ist. Was anderes bleibt mir eh nicht übrig.
     
    Pete3 gefällt das.