- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 9 von 9

Thema: Brushlessmotor Controller Softwareablauf

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    24.06.2008
    Beiträge
    158

    Brushlessmotor Controller Softwareablauf

    Anzeige

    Praxistest und DIY Projekte
    Hallo,

    ich hab mir einen Brushlessmotor Controller auf einem Steckboard mit 3x IR2101(Mosfethalbbrückentreiber), 6x F3205Z(Mosfets) und einem Atmega8A aufgebaut. Kommutierung erfolgt über eine BEMF-Schaltung.
    Genauso aufgebaut wie auf dieser Seite: http://www.mikrocontroller.net/artic...BEMF-Schaltung

    Meine Software ist in Bascom geschrieben und funktioniert. Ich weiß nur nicht ob das Glück ist oder ein Denkfehler meinerseits.

    Situation bei meinem Aufbau:
    -lege Spannung an
    -Motor fiept hörbar (obwohl die PWM-Frequenz bei ca 30khz liegt)
    -wenn der Motor angestoßen wird dreht er hoch und kann auch belastet werden

    Mich hat dieses fiepen verwundert. Das rührt daher das im Stillstand der Komparator ständig auslöst, ununterbrochen. Es werden also alle 6 Zustände durchgeschalten.
    In dem Artikel über Brushlesscontroller steht "So, das war jetzt die Beschreibung für einen Motor, der bereits läuft. Bis der Motor allerdings mal dreht, muss man anders vorgehen, weil der stillstehende Motor ja keine Komparator-Interrupts auslöst, da keine BEMF vorhanden ist."
    Bei mir scheint allerdings eine BEMF vorhanden zu sein.

    Gut, mal ganz einfach etwas ausprobiert--> Kommutierungszustand 1 eingeschalten. Das heißt Phase A liegt mit dem PWM-Signal an Vcc, Phase B hängt in der Luft und Phase C ist auf GND. Nun hab ich mir bei einem Komparatorinterrupt etwas via UART ausgeben lassen. Wenn ich die in der Luft hängende Phase messe löst ständig der interrupt aus, unabhängig ob der Motor gedreht wird oder nicht. Wenn ich allerdings Phase A messe, funktioniert es. Der Interrupt löst erst aus wenn der Motor mit Hand gedreht wird.
    Doch das ist doch falsch?!
    Wenn ich nun alles umschreibe und via Admux auf die anderen Phasen (also nicht auf die in der Luft hängenden) umschalte, funktioniert es fast garnicht. Nur mit sehr niedriger PWM bekomm ich ihn von Hand gestartet.

    Hoffe das ist irgendwie verständlich geworden .
    Mir fehlt auch noch im Programm eine 30Grad verzögerte Kommutierung. Doch bevor ich das in Angriff nehme will ich mir sicher sein keinen Fehler gemacht zu haben.

    D35troy3r
    Angehängte Dateien Angehängte Dateien
    Geändert von D35troy3r (02.05.2014 um 22:33 Uhr)

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied Avatar von derNeue
    Registriert seit
    01.01.2011
    Ort
    Bierstadt Radeberg
    Alter
    38
    Beiträge
    101
    Ich kann dir bei Bascom nicht wirklich weiter helfen, ich bin in C unterwegs, habe allerdings gerade auch einen BLDC REgler fertig gestellt. Ich nutze auch IR2101. Meine PWM ist 8-bit breit. Ich lade in das PWM-Register den Wert 20, also einen Duty-Cycle von etwa 6-8% zum starten. Mal ein kleiner Tip: Ich bestrome ganz zum Anfang mit diesem niedrigen Duty-Cycle zwei Phasen. Also U und V an PWM, W an Masse, etwa 300ms lang. So zuckt der Motor mal kurz und du hast ihn erstmal in einer festen Position. Dann V einfach wieder unbeschaltet lassen und etwa 20x noch starr kommutieren, mit Timer-Interrupt oder so. Und dann alles laufen lassen. klappt bei mir wunderbar. Natürlich musst du bisschen rumspielen mit ein paar Werten, aber einfach mal als Ausgangspunkt.

    Aber ehrlich gesagt ist der Atmega8 nicht wirklich geeignet dafür, der Atmega88 geht da wesentlich besser. Der hat einfach ein paar Timer-Modi mehr, die du für
    eine 30Grad verzögerte Kommutierung
    gut gebrauchen kannst. Das ist auch ganz einfach gelöst. In der Funktion, in der du die Phasen umschaltest setzt du einen Timer auf Zählerstand 0. Kommt der Komparator-Interrupt, liest du den Zählerstand aus, schreibst diesen Wert in ein OCR-Register und stellst den Timer-Modi auf CTC und mit Top-Wert auf das gerade beschriebene OCR-Register. Ich hoffe, das war halbwegs verständlich, ansonsten frag einfach nochmal nach, was du nicht genau verstanden hast.


    Dennis
    Ich studiere die Wirkung der Sonnenstrahlen auf das Liebesleben der Pflastersteine

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    24.06.2008
    Beiträge
    158
    Hey,

    Danke für die Antwort!
    Ich hab gestern noch eine Diplomarbeit über Brushlessregler gefunden. Dort gibt es folgenden Abschnitt:

    Befindet sich ein Motor im Normalbetrieb, muss die Update-Funktion überprüfen,

    ob dieser stehengeblieben ist. Dazu wird der Wert des Timercounter ausgelesen, den
    dieser im letzten Kommutierungszyklus erreicht hat (capture-Register). Aus diesem
    wird ein gleitender Mittelwert über die letzten 10 Messwerte gebildet. Erreicht dieser
    den maximalen Wert des Counters, wurde keine Kommutierung mehr erkannt und der
    Motor steht. Es kommt aber auch häufig vor, dass das System unkontrolliert schwingt,
    weil bei stehendem Motor die durch eine Kommutierung ausgelöste Umschaltung der
    Phasen sofort die nächste Kommutierung auslöst und der Messwert somit ein Minimum,
    nämlich die eingestellte Blockierzeitspanne, erreicht. Es muss also auch auf
    Er
    reichen dieses Minimums geprüft werden. Wird erkannt, dass der Motor steht, wird
    dieser in den Anlauf-Zustand versetzt.
    Sehr gut, somit weiß ich schon mal das kein Fehler vorhanden ist, meine Schaltung jediglich bei einem stillstehenden Motor schwingt.

    Echt gute Tipps von dir! ...die mit der Software werde ich mir sofort mal einfügen. Einen Atmega88 hab ich leider nicht hier, der muss erst bestellt werden.
    Doch da das ganze später in SMD aufgebaut werden soll, kaufe ich vorerst keinen atmega88 in DIP.

    Die 30Grad Verzögerung teste ich heute mal aus. Ich berichte nachher darüber.

    D35troy3r

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied Avatar von derNeue
    Registriert seit
    01.01.2011
    Ort
    Bierstadt Radeberg
    Alter
    38
    Beiträge
    101
    Hast du einen Link zu der Diplomarbeit?

    Weil was hier angesprochen wird, sollte man schon auch detektieren, dass der Controller abschaltet, wenn sich der Motor offensichtlich nicht mehr dreht. Mich würde eben interessieren, was so alles an Fehler detektiert werden kann, da hab ich nicht so wirklich eine Vorstellung davon.


    Dennis
    Ich studiere die Wirkung der Sonnenstrahlen auf das Liebesleben der Pflastersteine

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    24.06.2008
    Beiträge
    158
    http://www8.informatik.uni-wuerzburg..._Dilger_DA.pdf

    Sehr gute Arbeit von ihm.
    Mein Controller schaltet sich nicht ab, lediglich die BEMF Spannung schwingt im Stillstand.

    Zu der Verzögerung:
    Den CTC Mode habe ich in Bascom leider nicht aktiviert bekommen. Hab das ganze anders gelöst.
    -Timer0 misst die Zeit zwischen einer Kommutierung und einem AC-Interrupt
    -diese Zeit wird in den Timer1 geladen, dieser löst dann die nächste Kommutierung nach der Zeit aus

    Meine Frage wäre jetzt nurnoch, woher weiß ich welche Zeit 30Grad entspricht? Muss ich dazu nicht die Polpaarzahl wissen?

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied Avatar von derNeue
    Registriert seit
    01.01.2011
    Ort
    Bierstadt Radeberg
    Alter
    38
    Beiträge
    101
    Nein, musst du nicht. Für deinen Regler gibts nur die elektrische Umdrehung. Ich habe Motoren mit 7 Polpaaren. Soll heißen, ich benötige 7 elektrische Umdrehungen für eine mechanische. Alle 60 Grad schaltest du auf eine neue Phase(eben die 6 Zustände, die es gibt, hab kein passendes Wort gerade dafür). Und du möchtest genau 30 Grad nachdem der Komparator sich gemeldet hat kommutieren. Somit kannst du die Zeit, die er von der Kommutierung bis zum Komparator-Interrupt braucht, messen. Das ist dann genau die Zeit, die der Motor für 30Grad braucht. Deswegen reicht es zu, diese Zeit einfach nochmal abzuwarten, und dann erst umzuschalten. Die Grad-Angaben beziehen sich alle auf die elektrische Umdrehung. Manche fangen dann an, bei höheren Drehzahlen die Kommutierungszeitpunkt auf 25 oder sogar 20 Grad zu schieben. Ist nicht unbedingt nötig, wäre eben ein zusätzliches Feature, was nicht unbedingt gebraucht wird.

    Den CTC Mode habe ich in Bascom leider nicht aktiviert bekommen.
    Das hat doch mit Bascom nichts zu tun. Das liegt am Atmega8, weil der Timer0 keinen CTC Modus hat. Deswegen ja auch den Atmega88. Oder eben wie du es gelöst hast. Ist umständlich, aber geht. Du kannst aber auch gleich mit dem Timer1 die Zeit messen, da hast du mehr Spielraum, weil der Timer 16bit breit ist.


    Dennis
    Geändert von derNeue (03.05.2014 um 15:01 Uhr)
    Ich studiere die Wirkung der Sonnenstrahlen auf das Liebesleben der Pflastersteine

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    24.06.2008
    Beiträge
    158
    Okay danke, soweit hab ich alles verstanden. Den Ablauf und alle zusammenhänge

    Nun bin ich an einem Punkt angekommen einen Atxmega mit AweX zu nutzen. In meinem Versuchsaufbau werden meine drei IR2101 von 6 AweX Pwm-Pins angesteuert.
    Damit das funktioniert wurden 3 invertierte AweX Pins erneut invertiert um auf allen 6 Pins die gleichen PWM-Flanken zu erzeugen.
    Ausgegeben bekomme ich ein 12Bit 31,6Khz PWM-Signal.

    Nun würde ich gerne, soweit es möglich ist, die Ansteuerung des Brushlessmotors komplett über das DMA- und Eventsystem laufen lassen. Da meine Erfahrung diesbezüglich
    gleich null ist bräuchte ich eure Hilfe wie der Ablauf sein muss. So richtig weiß ich nicht welches Event was auslösen soll bzw wie ich das DMA benutze .

    Mein Gedanke ist:

    1. Analog Comparator auf Event_Ch0
    2. Timer1 wird bei jedem Event_Ch0 interrupt ausgelesen und in den Timer2 kopiert (mithilfe vom DMA?), anschließend wird Timer1 gestoppt.
    3. Timer2 startet bei einem Event_Ch0 interrupt mit 0 und zählt bis zu dem zuvor reinkopierten "Timer2-Wert"
    4. Timer2 interrupt löst das DMA aus, dieses kopiert eine Variable(mit den nötigen Bits für die richtigen Phasen) in das Awexc_outoven Register. Anschließend muss Timer2 wieder von 0 gestartet werden.

    Wofür ich keine Lösung habe ist bei dem setzen der Variable damit später die richtigen HS- und LS-Mosfets geschalten werden. Und ein weiterer DMA-Kanal muss das umstellen des AC_Mux Register vornehmen.

    Oh Gott, ich Blick das bald nicht mehr . Ist es überhaupt möglich einen Brushless-Motor gänzlich mit dem Event- und DMA-System anzusteuern?
    Tja also, welcher DMA-Kanal und welcher Event-Kanal muss WAS machen?
    Leider gibt es keinen Code: http://www.jtronics.de/avr-projekte/...ontroller.html

    Vielen Dank im vorraus!

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied Avatar von derNeue
    Registriert seit
    01.01.2011
    Ort
    Bierstadt Radeberg
    Alter
    38
    Beiträge
    101
    Also bei ATXmega bin ich raus. Ich möchte zwar auch demnächst einen verwenden, aber bis jetzt habe ich noch keinen in der Hand gehalten, geschweige denn programmiert. Ich denke aber, dass du hier niemanden finden wirst, der dir diesbezüglich helfen kann/will. Ich denke, das musst du allein hinbekommen. Mach halt eins nach dem anderen, also zuerst muss es funktionieren, dann eine kleine Änderung. Funktioniert es immer noch, war die Änderung erfolgreich, funktionierts nicht, musst du nochmal nachbessern. Es hilft vielleicht auch, die Abläufe sich aufzumalen. Allerdings denke ich auch, dass ein ATXmega für einen Brushless Regler bisschen overkill ist.


    Dennis
    Ich studiere die Wirkung der Sonnenstrahlen auf das Liebesleben der Pflastersteine

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    24.06.2008
    Beiträge
    158
    Mist, ich hab es geahnt lol. Sehr viel habe ich bisher mit einem Atxmega auch noch nicht gemacht, jedoch bin ich von der Leistung bisher sehr überzeugt!
    Eben noch entdeckt: Atxmega16d4 für 1,13Euro das Stück bei Voelkner. Ein Atmega88 kostet bei Reichelt 1,80Euro.
    Also kann ich auch gleich einen Brushlesscontroller mit dem Atxmega aufbauen und erhalte ein schönes 12Bit 32Khz PWM-Signal.

    Falls doch jemand noch eine Idee hat, bitte melden!
    Wie gesagt, ich blick das nur nicht mehr mit dem Ablaufplan, welches Event und welcher DMA Kanal wo verknüpft werden müsste.

Ähnliche Themen

  1. Brushlessmotor ansteuern
    Von datatom im Forum Motoren
    Antworten: 26
    Letzter Beitrag: 23.11.2016, 12:43
  2. Brushlessmotor entkoppeln
    Von Manta22 im Forum Suche bestimmtes Bauteil bzw. Empfehlung
    Antworten: 15
    Letzter Beitrag: 02.05.2014, 23:01
  3. Brushlessmotor Getriebe?
    Von Cool3000 im Forum Motoren
    Antworten: 6
    Letzter Beitrag: 19.01.2012, 21:35
  4. Brushlessmotor steuern
    Von datatom im Forum Suche bestimmtes Bauteil bzw. Empfehlung
    Antworten: 14
    Letzter Beitrag: 20.06.2011, 20:07
  5. [ERLEDIGT] Brushlessmotor mit mc73110
    Von martinheidelberg im Forum Motoren
    Antworten: 6
    Letzter Beitrag: 04.05.2011, 19:44

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test