Forum: Mikrocontroller und Digitale Elektronik Problem beim Anlauf eines BLDC mit AT90PWM3B


von U. B. (ub007)


Lesenswert?

Hallo !

Ich habe soweit ein Board gemacht, dass den PWM3B zur Ansteuerung eines 
BLDC Motors mit Hall-Sensoren verwendet.
Läuft er einmal, dann ist alles O.K. Nur mit dem Anlaufen ist das so 
eine Sache. Ich habe es so gemacht, dass durch die Hall Sensoren ein 
Interrupt ausgelöst wird wenn er die Stelle passiert. Doch nur auf einer 
Stelle (z.B. Stelle U tut sich etwas (wenn man mal noch von V und W 
ausgeht). Ich dachte dass eigentlich an jeder der drei Stellen U V und W 
ein anlaufen stattfinden müßte, aber irgendwie denkt der Motor gar nicht 
dran. Bei Stelle U wackelt er wenn man ihn bis dahin zurückdrehen 
möchte. Die Hall-Sensoren bringen auch ein exaktes Signal. Irgendwie 
sollte doch gerade bei Hall-Sensoren der Anlauf in jeder Stellung ohne 
Probleme sein - denke ich.
Ich habe es so programmiert, dass bei der steigenden Flanke ein 
Interrupt ausgelöst wird nur jetzt wollte ich mal sehen ob das auch auf 
Pegel-gesteuert funktioniert, aber offensichtlich kann das der PWM3B gar 
nicht - glaube ich.
Irgendwie komm ich da nicht weiter.

Gruß Uli

von Andreas R. (rebirama)


Lesenswert?

hab nur ich die Frage übersehen?

von U. B. (ub007)


Lesenswert?

Hallo !

Die Frage bzw. die Aussage ist im Betreff.
Kurz - trotz Hall-Sensoren läuft er nicht an !
Anker mit dem Finger einbischen drehen und schon läuft der Motor, aber 
dies ist ja nicht Sinn der Sache.
Ich habe den PSC auf positiver Flanken-Erkennung eingestellt -> damit 
Interrupt ausgelöst wird. Aber wenn er komplett steht - wie soll dann 
ein Interrupt ausgelöst werden. D.h. irgendwie muss der Motor erst 
gedreht werden bevor er losläuft und das trotz Hall-Sensoren.

   Gruß Uli

von Purzel H. (hacky)


Lesenswert?

Das ist viel zuwenig Info. Bring mal ein paar Kurven. zB die drei 
Phasenspannungen und das Hallsignal. Dann vielleicht noch die Stroeme 
dazu. Der Anker hat ein Massentraegheitsmoment, das ist bekannt ?

von xGast (Gast)


Lesenswert?

Sein Problem ist, dass er nur bei Änderung der hallsensorwerte 
kommutiert. Beim Stillstand des Motors (beim starten bzw. anlauf) hat er 
eben diese Änderung nicht. Das ganze ist ein Softwareproblem mehr nicht.
Kannst du beim Start nicht einfach die Interruptfunktion von Hand 
aufrufen und auf den aktuellen Zustand bestromen?

von avion23 (Gast)


Lesenswert?

Beim Start hast du eh eine init Funktion, bevor du in dein while loop 
über gehst. Dort einmal von Hand den Hallsensor-Zustand abfragen und die 
erste Kommutierung anstoßen. Habe ich dein Problem verstanden?

von U. B. (ub007)


Lesenswert?

Hallo !

Der xGast hats absolut richtig erfaßt.
Hier über den Motor genaue Diagramme oder Ansteuerungen zu bringen würde 
denke ich nicht viel bringen, denn wie gesagt wenn man ihn dreht läuft 
er sauber und die Ansteuerungen sehen eben so aus wie sie sollen.
Ich glaube auch dass es nur ein "einfaches" Software-Problem ist.
Ich konnte mittlerweile die Flanken-Erkennung auf Pegel-Triggerung 
umstellen, aber das hat auch nichts gebracht.
Ich vermute dass wie der xGast schon richtig sagte, die einzige 
Möglichkeit ist, die Spulen wie in einem Openloop erstmal zu bestromen, 
sodass der Anker sich irgendwie mal bewegt.
Ich werds ausprobieren.

Gruß Uli

von yGast (Gast)


Lesenswert?

Hallo,

ich habs nicht mehr ganz genau in Erinnerung. Für den Start müssen die 
Phasen in einer anderen Reihenfolge bestromt werden, als für den 
normalen Lauf. Mir hat damals eine Appnote von Renesas weitergeholfen. 
Muss mal meine Sourcen für einen Tiny861 raussuchen.
oder bist du schon weitergekommen ?

Gruß Bagi

von gist (Gast)


Lesenswert?

Der Motor kann doch auch im Open-Loop ohne Hall Info´s gestartet werden 
=> erst mal Drehmoment aufbauen ! Ab Drehzahl x in den Closed-Loop 
schalten und mit den Informationen der Hall-Sensoren arbeiten.

Ggf. nach Open-Loop Start-/Anlauframpe googln.

von U. B. (ub007)


Lesenswert?

---- Oh es kamen schon zwei Antworten während ich schrieb, aber der gist 
hats auch erfasst. ----

Hallo !

HHmm, jetzt ist das irgendwie eine nicht ganz so einfache Geschichte.
Ich weiß nicht ob ich einfach so die Ausgänge von den PSCs mal so 
"händisch (per Befehle)" setzen kann (Ich würde die PSC vorher 
initialisieren aber noch nicht starten). Ich hab ja die Bootstrap 
Treiber sowie die Low-and High-Side-Treiber dranhängen. D.h. ich muss 
nur aufpassen, dass nicht beide MOSFETs einer Halfbridge gleichzeitig 
geschaltet werden (Cross Conduction).
Wenn ich z.B. nur die High-Side Treiber nacheinander bestrome, sollte 
doch irgendwie ein Wackeln sichtbar sein.
Ich hab mir auch gedacht, nachdem ich die Tabelle von ATMEL zur 
Bestromung der Spulen genommen habe - ob ich anhand dessen die Ausgänge 
"händisch" auf 1 bzw. 0 setze.
Wenn ich dann sehe er dreht sich bzw. macht einen Wackler so kann ich ja 
anschließend die PSCs nachstarten.

Gruß Uli

von avr (Gast)


Lesenswert?

Hier in der AVR492 von Atmel ist genau das programmiert.
http://www.atmel.com/dyn/resources/prod_documents/doc7518.pdf

Schau mal dort die Startroutine
1
mc_interface.h:
2
void mci_run(void)
3
 Used to start the motor. The regulation loop function is launched to set the duty
4
cycle. Then the first phases commutation is executed.
an.

http://www.atmel.com/dyn/products/tools_card.asp?tool_id=3764

avr

von U. B. (ub007)


Lesenswert?

Hallo !

Erstmal danke für die Antworten !
Ja, dieses Listing kannte ich schon aus einem anderen Projekt aber nützt 
mir im Augenblick eher weniger.
Jetzt habe ich folgendes versucht (nur da ist noch ein Gedanken-Fehler 
drin - glaub ich.)
Ich habe jede einzelne Spule mal angesteuert ohne den PSC zu starten.
Der Motor zeigt aber noch nicht mal ein zucken oder sonstiges. Nun ich 
glaube aber das dies keinen Sinn macht, denn der Sternpunkt ist ja so 
gesehen nicht erreichbar (um ein Potential drauf-zu-schalten).
D.h. ich müßte also mindestens zwei Spulen gleichzeitig bestromen um 
überhaupt einen Strom zu erzielen (kam ich leider noch nicht dazu das zu 
testen). Das ganze dann in der Reihenfolge der Spulen UVW z.B. U-V dann 
V-W und als letztes W-U auf die z.B. High-Side-Treiber ausgeben. 
Zumindest müßte ja dann ein Strom durch beide Spulen fließen, sodass das 
Netzteil auch mal was anzeigt.
Gut das mag keine elegante Lösung sein, aber vielleicht...
Könnte das letzt-gesagte in etwa hinkommen ?

Gruß Uli

von Bernd R. (Firma: Promaxx.net) (bigwumpus)


Lesenswert?

Hallo,

ich arbeite gerade mal wieder mit einem BLDC mit Hall-Sensoren.

Wenn Du mit Block-Kommutierung arbeitest, ist es doch ganz einfach:
Jede Kombination der Hall-Sensoren (6 mögliche!) entspricht einer 
Ansteuerung der 3 Anschlüsse: high/low/open

Da wird der Motor optimal angedreht.

Das mußt Du immer sicherstellen. Beim Start fragst Du die Sensoren ab 
und aktivierst die entsprechenden Ausgänge, im Betrieb kannst Du ja 
Interrupts nutzen...

Wo soll das Problem liegen ?

von U. B. (ub007)


Lesenswert?

Hallo !

So, jetzt konnte ich folgende Experimente durchführen.
Wenn ich die Reihenfolge 1.) U-V 2.) V-W 3.) W-U nehme bewegt sich der 
Anker schon (ohne die Hall-Sensoren zu überprüfen).

Das mache ich im schematischem C-Code bei 16MHz Taktung wie folgt:

Schleife-beginn
 Ports setzen
 2us warten            //damit Spannung lang genug anliegt
 alle Ports wieder auf Null setzen
 12us warten
Schleife-ende

Das wiederhole ich ca. 1000 mal. Kurz dreht er sich rückwärts und dann 
springt er manchmal an - in der richtigen Richtung. An manchen 
Stellungen des Ankers aber tut sich gar nichts oder er dreht sich 
piepsend stotternd nur rückwärts. Debugger stoppen - wieder anstarten 
und ein paar Grad weiter springt er event. wieder an. Jetzt habe ich die 
Ansteuerung so gemacht wie sie im Atmel-Diagramm vorgeschrieben ist ( 
wie du schon sagtest 6 mögliche Stellungen ).
Doch hierbei bewegt sich zwar der Anker aber nicht kraftvoll um eine 
kleine Drehung zu vollführen.
Ich benütze hierzu den IR2301S und der Gatewiderstand der MOSFETS liegt 
bei 47 Ohm. Der Ausgangsseitige Kapazität des IR... liegt bei 470nF. 
Vielleicht sollte ich da etwas ändern.
Ich möchte im Openloop nur eine ganze Drehbewegung erzeugen, damit ich 
sofort in den closed-Loop reinspringen kann. Ich überprüfe aber im 
Openloop keine Hall-Sensoren.

Gruß Uli

von Floh (Gast)


Lesenswert?

Anfahrrampe.

von Ben _. (burning_silicon)


Lesenswert?

fahr doch beim start für 100-200ms einen festen pattern für 500-1000 
u/min ohne die hallsensoren zu beachten. sollte reichen damit das feld 
den anker mitnimmt. evtl. mit dem strom aufpassen, wenn du sehr 
niederohmige wicklungen hast mußt du per PMW oder so den strom 
begrenzen.

von U. B. (ub007)


Lesenswert?

Hallo !

Hallo Ben. Genau an das dachte ich auch.
Diesen Pattern gebe ich ja so gesehen aus. Schau mal oben bei "2us 
warten"
Die 2us sind nämlich genau das: 2 x    asm volatile("nop");
O.K. diese Zeiten stimmen natürlich nicht, sondern waren nur Annahme. 
Bei 16Mhz Takt wäre die Ausführungszeit pro Befehl bzw. nop dann exakt 
0.0625us.
D.h. ich lasse das Signal ungefähr 2*0.0625us an der Spule anliegen.
Danach setze ich per PORTx = (0<<...) an den entsprechenden Ausgängen 
und dann kommt
12*0.0625us Warten -> also 12x asm volatile("nop");

Wenn ich jetzt statt den 2*nop nun 3*nop nehme dann tut sich am Motor so 
gut wie gar nichts mehr.
Bei 1*nop sieht es ähnlich aus wie bei 3*nop.
Deshalb denke ich werden 100ms viel-zu-viel sein um das Ding zum drehen 
zu bewegen.
Am Oszi konnte ich im laufenden Betrieb bei mittlerer Geschwindigkeit 
folgendes am Gate eines der MOSFETs messen:
High-Phase ca. 4us und Low-Phase ca. 12us.
Vielleicht bringt es ja was wenn ich diese Zeiten auf die genaue 
Ausführungszeit umrechne, sodass das PWM-Signal zumindest einigermaßen 
stimmt.
Werde ich morgen im Geschäft machen.

Gruß Uli

von Simon K. (simon) Benutzerseite


Lesenswert?

Ohje ohje, so wird das nichts. Auch wenn der Motor Hall-Sensoren zur 
Kommutierung hat, wirst du nicht drumherum kommen eine Open-Loop Rampe 
zu fahren. Natürlich ist das mit dem PSC der AT90PWM3B möglich. Wie 
sonst soll man mit dem Chip sonst Sensorless BLDC ans Laufen kriegen? 
Und dass das möglich ist, kann man auch in der entsprechenden AppNote 
zum ATAVRMC100 nachlesen. Da gibts sogar einen kompilierbaren 
Source-Code dabei.

Die Open-Loop Rampe für den Start macht man dann eigentlich mit Timern 
und nicht mit "Warte 3µs" oder sowas. Das ist zu ungenau.

von Ben _. (burning_silicon)


Lesenswert?

ich finde das sind verdammt kurze impulse. im betrieb okay, aber ich 
denke beim start brauchts längere. die abstände zwischen den impulsen 
sollten auch einigermaßen stimmen sonst kommt kein vernünftiges drehfeld 
zustande. denk auch dran, daß eine phase wahrscheinlich nicht reicht, du 
mußt das komplette drehfeld für alle drei phasen in software vorgeben. 
oder schreib dir einen algoritmus dazu, der dir das drehfeld aus 
eingabewerten wie pausen (zur strombegrenzung) und soll-drehzahl 
berechnet. dieses programm würde ich dann für 100-200ms beim start des 
motors laufen lassen (nicht die impulsbreite soll 100ms betragen), 
danach sollte der motor schnell genug drehen, daß du auf die 
hallgeber-steuerung wechseln kannst.

wird bei automotoren genauso gemacht. zum starten kriegen die einfach 
eine bestimmte startmenge an sprit mit der sie auf jeden fall anspringen 
und erst wenn die leerlaufdrehzahl erreicht ist wird zur steuerung nach 
parametern wie abgasverhalten, drehmomentverlauf oder 
leerlaufstabilisierung übergeben.

von Simon K. (simon) Benutzerseite


Lesenswert?

Was denn für Impulse? Natürlich muss man das Drehfeld beim Starten auf 
allen Phasen anlegen! Wie soll der Motor sonst anfangen zu drehen?!
Dabei kommutiert man einfach "von Hand" mit einem gewissen Zeitabstand. 
Dabei gibt man aber keine Impulse aus, sondern legt die PWM immer auf 
die entsprechende Brücke(n).

Ich würde wesentlich länger als 200ms den Motor beschleunigen. Du musst 
dabei vor allem bei einer kleinen Drehfeld-Frequenz anfangen.

von U. B. (ub007)


Lesenswert?

Hallo !

Oh Sorry ! Das ging wohl bei meiner Erklärung etwas unter.
Ich habe die Beschreibungen nur für eine "Spule" gemacht - in meinem 
Programm werden natürlich alle drei Spulen angesteuert und zwar nach 
ATMEL-Beschreibung, da gibt es ja die Tabelle mit den Schaltern.
Ich werde das morgen mal im Geschäft ausprobieren, aber falls das nicht 
hinaut: Wie sieht denn eine Anfahrrampe aus ?
Ich könnte mir vorstellen, dass allmählich die High-Signale jeder Spule 
kontinuierlich länger werden bis der Anker bei einer bestimmten 
Dauerbestromung bzw. das Magnetfeld ausreicht dann den "Überschwinger" 
zu schaffen und dann so gesehen zur nächsten Kommutierung gehen kann.
Wie sieht es aber dann mit den Low-Zeiten aus - aus Sicht des 
PWM-Signals beim Anlauf ?
Wie schon erwähnt das gilt nur für den Anlauf, denn wenn ich ihn von 
Hand drehe dann läuft er ja.

Gruß Uli

von Simon K. (simon) Benutzerseite


Lesenswert?

Uli B. schrieb:
> Ich könnte mir vorstellen, dass allmählich die High-Signale jeder Spule
> kontinuierlich länger werden bis der Anker bei einer bestimmten
> Dauerbestromung bzw. das Magnetfeld ausreicht dann den "Überschwinger"
> zu schaffen und dann so gesehen zur nächsten Kommutierung gehen kann.
> Wie sieht es aber dann mit den Low-Zeiten aus - aus Sicht des
> PWM-Signals beim Anlauf ?
Du zäumst das falsch auf. Die PWM (also der PSC im AT90PWM3B) läuft 
immer.
Dann gibst du vor dem Starten einen bestimmten (festen) PWM Wert vor 
(oder benutzt einen Stromregler) und führst dann die Kommutierungen aus.
Anfahrrampe bedeutet jetzt, dass du mit ganz langsamen Kommutierungen 
anfängst und diese immer schneller werden. Der Rotor folgt diesem 
Drehfeld dann. Irgendwann sagst du, dass du die manuellen Kommutierungen 
einstellst und aktivierst die Komparatoren, bzw. die Hall Sensoren, 
sodass die automatische Kommutierung in Kraft tritt.

Mit "High Zeiten" oder "Low Zeiten" ist da nix. Beziehungsweise, die PWM 
kümmert sich darum.

> Wie schon erwähnt das gilt nur für den Anlauf, denn wenn ich ihn von
> Hand drehe dann läuft er ja.
Ja.

von U. B. (ub007)


Lesenswert?

Hallo Simon !

Diese Methode ist O.K.
Ich hab das schon begriffen dass die PSCs laufen. Ich hab sie aber mit 
Absicht gestoppt, sodass ich diese PWM von Hand generieren muss.
Sicher, mein Vorhaben ist wohl die schlechteste Methode, aber zum 
damaligen Zeitpunkt dachte ich dass die PSCs mir irgendwie in die quere 
kommen, sodass ein Anlaufen nicht möglich ist.
Nachdem ich das schon in Variablen vorgesehen habe, würde das heißen, 
ich könnte für ein paar Millisekunden z.B. die Variable Neue_PWM von 1 
bis 2048 langsam hochzählen lassen (ich setze dann die PWM in einer 
entspr. Routine in den Registern des PSCs), bis bei einer bestimmten 
Frequenz dann der Motor von allein loslaufen müsste - theoretisch.
Werde ich morgen ausprobieren.

Gruß Uli

von Ben _. (burning_silicon)


Lesenswert?

der motor läuft nicht bei irgendeiner frequenz wie von wunderhand los. 
der rotor des motors folgt dem drehfeld, das du in den spulen erzeugst. 
sprich erzeug ein drehfeld was langsam und stark genug ist um den 
stehenden rotor samt dem anlaufmoment der anzutreibenden last 
mitzunehmen DANN rennt das ding auch los, wird aber nicht schneller 
drehen als das drehfeld es erlaubt... irgendwie kommts mir so vor du 
hast die funktionsgrundlagen solcher motoren noch nicht verstanden.

von Simon K. (simon) Benutzerseite


Lesenswert?

Genau, es reicht nicht einfach nur die PWM von 0% auf 100% hochzufahren. 
Genauer gesagt ist das sogar Quatsch! Die PWM kann (bei kleineren 
Motoren) sogar konstant sein beim hochfahren.
Du musst aber ein Drehfeld erzeugen, indem du kommutierst (von Phase zu 
Phase weiterschalten). Und DAS muss in der Geschwindigkeit schneller 
werden. Also die Zeit bis zur nächsten Kommutierung muss immer kürzer 
werden.

von Bernd R. (Firma: Promaxx.net) (bigwumpus)


Lesenswert?

Aus meiner Arbeit mit BLDC-Motoren mit Hallsensoren kann ich nur sagen: 
Ich glaub den ganzen Kram nicht.

Bei Blockkummutierung schaltest Du die Phasen gemäß den Stellungen der 
Hallsensoren. Das erzeugt immer ein Drehfeld, das den Rotor dreht. 
Basta.

Die Regelung der Drehzahl erfolgt NUR über die PWM, also Strom bzw. 
Spannung.

Das ganze Anlaufen braucht man doch nur bei sensorlosen Motoren.

Es fehlt nur die Schaltung der Phasen beim Einschalten des Motors, wo es 
keine Hall-Sensor-Wechsel gibt, die Interrupst erzeugen können um Phasen 
zu schalten.

von Ben _. (burning_silicon)


Lesenswert?

eben, deswegen muß er die ersten umdrehungen mit einer anfahr-steuerung 
machen welche die hallgeber nicht braucht.

von BigWumpus (Gast)


Lesenswert?


von U. B. (ub007)


Lesenswert?

Hallo !

Nun, ich arbeite so gesehen erst seit 2 Monaten mit BLDC Motoren und als 
ich damit anfing war ich erstmal ziemlich damit beschäftigt mir lesbares 
Material für BLDC zu besorgen. Die Vorgänge am Motor sind mir klar (auch 
wenn es nicht so aussieht, aber vielleicht sind Störungen im Spiel die 
das ganze deshalb nicht lauffähig machen - siehe unten) nur im Geschäft 
hatte ein Arbeitskollege die ganze Sache mit dem Controller AT...16M1 
realisiert.

Nachdem der Controller aber erst nächstes Jahr zu kriegen ist, gaben wir 
es nach wochenlanger Suche auf und ich musste mich dann auf den PWM3B 
einarbeiten und so schrieb ich das Programm auf dem PWM3B um. Der hat 
etwas andere Register und somit war die Sache für mich nicht ganz 
einfach, aber ich habe es geschafft - zumindest durch "anschucken" des 
Ankers damit er sich dreht. Laut Oszi waren die Phasen der PSC an den 
MOSFETS korrekt. Heute allerdings habe ich die gigantischen Stützelkos 
(12 Stück in Reihe = 500 mF / mit 32V) direkt am Motor abgetrennt weil 
wir die Vermutung hatten dass diese Stützelkos event. etwas mit dem 
schlechten Anlaufverhalten zu tun haben könnten und wollte den Motor 
ohne diese laufen lassen. Ich hab ohne Elkos brechend massivste 
Einstreuungen von Spikes sodass alles zu spät ist. Ich habe einen 
AD-Wandler Eingang dazu verwendet um die PWM zu generieren und konnte 
per Poti die Geschw. auch ändern. Das funktionierte bis "gestern".
(Anmerkung zu den Elkos: Unter Belastung zieht der Motor zwischen 10-15A 
für ein paar millisekunden).
Ich denke es macht im Augenblick keinen Sinn hier, da ich erst diese 
Störungen irgendwie beseitigen muss.
Was ich allerdings hier nicht verstanden habe ist, ich habe nur eine 
Möglichkeit an der Geschwindigkeit etwas zu ändern, nämlich die PWM zw. 
0 und 100% zu variieren (während des laufs) - wie sollte ich aber beim 
PWM3B das Drehfeld beeinflussen ? Gut ich könnte beim PLL von fast Clock 
auf slow Clock umschalten aber ob das was bringt kann ich nicht sagen.
Ich würde mich auch gerne mit jemanden telefonisch oder persönlich 
unterhalten, falls das jemand mitmacht (Ich komme aus dem Raum zwischen 
Stuttgart und Ulm.) Er sollte sich halt beim PWM3B auskennen. Der Kaffee 
oder das Bier geht auf meine Rechnung.

Gruß Uli

von Simon K. (simon) Benutzerseite


Lesenswert?

Uli B. schrieb:
> Nachdem der Controller aber erst nächstes Jahr zu kriegen ist, gaben wir
> es nach wochenlanger Suche auf und ich musste mich dann auf den PWM3B
> einarbeiten und so schrieb ich das Programm auf dem PWM3B um.
Der AT90PWM316 ist übrigens kompatibel zum AT90PWM3B. Aber wo genau 
jetzt der Unterschied zum ATmega16M1 ist, konnte ich noch nicht 
rausfinden (außer dem Gehäuse und dass der ATmega16M1 nicht gut 
beschaffbar ist).

> Der hat
> etwas andere Register und somit war die Sache für mich nicht ganz
> einfach, aber ich habe es geschafft - zumindest durch "anschucken" des
> Ankers damit er sich dreht. Laut Oszi waren die Phasen der PSC an den
> MOSFETS korrekt. Heute allerdings habe ich die gigantischen Stützelkos
> (12 Stück in Reihe = 500 mF / mit 32V)
12 Stück in Reihe?!

> direkt am Motor abgetrennt weil
> wir die Vermutung hatten dass diese Stützelkos event. etwas mit dem
> schlechten Anlaufverhalten zu tun haben könnten und wollte den Motor
> ohne diese laufen lassen.
Wie kommt ihr auf diese Vermutung?

> Ich hab ohne Elkos brechend massivste
> Einstreuungen von Spikes sodass alles zu spät ist.
Das kann ich mir vorstellen.

> Ich habe einen
> AD-Wandler Eingang dazu verwendet um die PWM zu generieren und konnte
> per Poti die Geschw. auch ändern.
Wie erzeugt man denn per A/D Wandler eine PWM? ;-)

> Das funktionierte bis "gestern".
> (Anmerkung zu den Elkos: Unter Belastung zieht der Motor zwischen 10-15A
> für ein paar millisekunden).
Sicher, dass es der Motor ist? Ich denke nicht. Der Motor ist induktiv 
und kann seinen Strom gar nicht so schnell ändern. Ich vermute eher, 
dass das Cross-Conduction in eurer MOSFET-Brücke ist. Also für kurze 
Zeit sind zwei MOSFETs einer Seite gleichzeitig eingeschaltet -> 
Kurzschluss. Erhöhe mal die Dead Time.

> Ich denke es macht im Augenblick keinen Sinn hier, da ich erst diese
> Störungen irgendwie beseitigen muss.
Siehe oben. Wie hoch ist eure Dead Time, und mit welchen FETs und mit 
welchen Treibern arbeitet ihr?

> Was ich allerdings hier nicht verstanden habe ist, ich habe nur eine
> Möglichkeit an der Geschwindigkeit etwas zu ändern, nämlich die PWM zw.
> 0 und 100% zu variieren (während des laufs) - wie sollte ich aber beim
> PWM3B das Drehfeld beeinflussen ?
Im Closed Loop Modus kannst du nur über die PWM (also die Spannung am 
Motor quasi) die Drehzahl ändern.
Im Open Loop (Ramp-Up) musst du das Drehfeld selber erzeugen. Und wie 
ich schon 3 mal geschrieben habe, musst du einfach manuell kommutieren. 
Die Geschwindigkeit der Kommutation bestimmt die Drehzahl. Synchronmotor 
eben.
Weißt du überhaupt, was Closed-Loop und Open-Loop ist? Was eine 
Kommutierung ist?

Du hast eigentlich einen Motor mit Hall Sensoren, ich glaube da muss ich 
meine Meinung von oben noch mal revidieren. Ich denke, du brauchst gar 
kein Open Loop Ramp-Up, da du ja schon im Stillstand weißt, wo der Rotor 
sich befindet und kannst sofort Closed-Loop vorgeben.

> Gut ich könnte beim PLL von fast Clock
> auf slow Clock umschalten aber ob das was bringt kann ich nicht sagen.
Hallohooo. PWM und Kommutierungsfrequenz sind völlig unabhängig 
voneinander. Du hast einen Drehstrommotor. Der Rotor dreht sich genau so 
schnell, wie das Feld, was du ihm vorgibst (Oder halt Vielfache/Teiler 
von dieser Feldfrequenz).


Es gibt übrigens eine Unmenge von Informationen über BLDC Ansteuerung im 
Internet. Ok, die sind nicht alle für AVRs gemacht, sondern auch für 
Philips oder Renesas Mikrocontroller. Aber du sollst und willst ja auch 
keinen Code kopieren. Du willst nur wissen, wie der Motor funktioniert 
und das ist ja unabhängig vom verwendeten Mikrocontroller.
Für den Anfang hier was nettes:
http://scholar.lib.vt.edu/theses/available/etd-09152003-171904/unrestricted/T.pdf

Ist aber für sensorlose Motoren.

von U. B. (ub007)


Lesenswert?

Hallo Simon !

Folgendes habe ich heute getestet und meine Vermutung mit den Spikes hat 
sich nachher bestätigt das der Mikrocontroller einen Schuß bekommen hat, 
denn mit Kondensatoren hätte er wie gehabt laufen müssen - tat er aber 
nicht. Nachdem ich den Controller ausgetauscht habe lief wieder alles 
wie gehabt, aber halt ohne Anlauf. Anschucken - läuft. Ich habe 
allerdings heute ein Vierkanal-Oszi drangehängt und dann jede Spule mir 
anzeigen lassen und dann sah man folgendes:
PWM-Signal steht erst an Spule U. Danach kam sofort Spule V mit dem 
PWM-Signal, aber bei der Spule W ist das PWM-Signal über die ganze länge 
von U und V dran.
          _________
U   _____           ___________


                   _________
V  _______________           __


          __________________
W  ______                    ___

Wenn der Strich oben ist, dann ist das PWM-Signal da.
Gut das sieht man hier nicht so gut, aber dass das PWM-Signal der Spule 
W über die ganze Zeit von U und V an ist, ist seltsam.
Vielleicht ist bem Umschreiben der Konfiguration vom 16M1 zum PWM3B 
etwas nicht richtig. Ich benütze den One-Ramp-Mode.
Die Antworten schreib ich Dir zwischen die Zeilen.

Simon K. schrieb:
> Uli B. schrieb:
>> Nachdem der Controller aber erst nächstes Jahr zu kriegen ist, gaben wir
>> es nach wochenlanger Suche auf und ich musste mich dann auf den PWM3B
>> einarbeiten und so schrieb ich das Programm auf dem PWM3B um.
> Der AT90PWM316 ist übrigens kompatibel zum AT90PWM3B. Aber wo genau
> jetzt der Unterschied zum ATmega16M1 ist, konnte ich noch nicht
> rausfinden (außer dem Gehäuse und dass der ATmega16M1 nicht gut
> beschaffbar ist).

O.K. aber Vorgabe ist PWM3B.

>> Der hat
>> etwas andere Register und somit war die Sache für mich nicht ganz
>> einfach, aber ich habe es geschafft - zumindest durch "anschucken" des
>> Ankers damit er sich dreht. Laut Oszi waren die Phasen der PSC an den
>> MOSFETS korrekt. Heute allerdings habe ich die gigantischen Stützelkos
>> (12 Stück in Reihe = 500 mF / mit 32V)
> 12 Stück in Reihe?!

Ja, 12 Stück in Reihe. Einer hat 5F mit 2.7V

>> direkt am Motor abgetrennt weil
>> wir die Vermutung hatten dass diese Stützelkos event. etwas mit dem
>> schlechten Anlaufverhalten zu tun haben könnten und wollte den Motor
>> ohne diese laufen lassen.
> Wie kommt ihr auf diese Vermutung?

Wir haben Messungen gemacht (mit dem 16M1) und mussten durch Vorgaben 
vom Kunden die PWM von 1% schlagartig auf 99% erhöhen unter Last. Also 
fast von Stillstand auf volle Last erhöhen. Die aufgezeichneten Ströme 
zeigten etwas zw. 8-12A und mehr.

>> Ich hab ohne Elkos brechend massivste Einstreuungen von Spikes sodass >> alles 
zu spät ist.
> Das kann ich mir vorstellen.
>
>> Ich habe einen
>> AD-Wandler Eingang dazu verwendet um die PWM zu generieren und konnte
>> per Poti die Geschw. auch ändern.
> Wie erzeugt man denn per A/D Wandler eine PWM? ;-)
>
>> Das funktionierte bis "gestern".
>> (Anmerkung zu den Elkos: Unter Belastung zieht der Motor zwischen 10-15A
>> für ein paar millisekunden).
> Sicher, dass es der Motor ist? Ich denke nicht. Der Motor ist induktiv
> und kann seinen Strom gar nicht so schnell ändern. Ich vermute eher,
> dass das Cross-Conduction in eurer MOSFET-Brücke ist. Also für kurze
> Zeit sind zwei MOSFETs einer Seite gleichzeitig eingeschaltet ->
> Kurzschluss. Erhöhe mal die Dead Time.

An das hatte ich auch schon gedacht, nur der Kollege der das auf dem 
16M1 programmiert hat, ist nicht mehr im Konzern. Er hatte aber an der 
Dead-Time nichts "rumgeschraubt". Bevor er ging sagte er nur das es 
keine Überlappungen und damit Cross-Conductions gibt.

>> Ich denke es macht im Augenblick keinen Sinn hier, da ich erst diese
>> Störungen irgendwie beseitigen muss.
> Siehe oben. Wie hoch ist eure Dead Time, und mit welchen FETs und mit
> welchen Treibern arbeitet ihr?

Wir benutzen den IR2301S und MOSFET IRF1010z...

>> Was ich allerdings hier nicht verstanden habe ist, ich habe nur eine
>> Möglichkeit an der Geschwindigkeit etwas zu ändern, nämlich die PWM zw.
>> 0 und 100% zu variieren (während des laufs) - wie sollte ich aber beim
>> PWM3B das Drehfeld beeinflussen ?
> Im Closed Loop Modus kannst du nur über die PWM (also die Spannung am
> Motor quasi) die Drehzahl ändern.
> Im Open Loop (Ramp-Up) musst du das Drehfeld selber erzeugen. Und wie
> ich schon 3 mal geschrieben habe, musst du einfach manuell kommutieren.
> Die Geschwindigkeit der Kommutation bestimmt die Drehzahl. Synchronmotor
> eben.
> Weißt du überhaupt, was Closed-Loop und Open-Loop ist? Was eine
> Kommutierung ist?

Willst Du mich jetzt ärgern ? Warum erklärst du mir das 3 mal ?

> Du hast eigentlich einen Motor mit Hall Sensoren, ich glaube da muss ich
> meine Meinung von oben noch mal revidieren. Ich denke, du brauchst gar
> kein Open Loop Ramp-Up, da du ja schon im Stillstand weißt, wo der Rotor
> sich befindet und kannst sofort Closed-Loop vorgeben.

Ja, genau das ist das Problem. Normalerweise kannst Du ja sogar bei 
Hall-Sensoren unter Voll-Last anfahren. Das ist ja das was ich nicht 
verstehe. Ich glaube aber, dass es an den oben "gezeichneten" 
U-V-W-Diagramm der Fehler zu suchen ist. Wenn alle drei Spulen sauber 
angesteuert werden, dann vermute ich das der Motor sofort ohne 
"anschucken" laufen wird. Um deine Frage zu beantworten, der Open-Loop 
Ramp-up ist ja so gesehen dazu da um den Motor erstmal durch seine 
Trägheit in Bewegung zu versetzen, sodass man die Position ermitteln 
kann (gerade bei BLDC ohne Hall-Sensoren) sobald er in einer 
Drehbewegung ist, kann man dann in die closed Loop umschalten.
Sicher kann man jetzt an meiner Erklärung rumnörgeln, aber ich möchte 
hier keine Haarspalterei betreiben. Im übrigen wenn ich das Prinzip der 
Kommutierung nicht verstanden hätte, warum läuft der Motor ? Ich habe 
die Kommutierung aus einer ATMEL-Tabelle. Und was noch schlimmer ist, in 
dieser Kommutierungs-Tabelle hat ATMEL selbst einen Fehler !!!!!!!!!!!
(Ich bin heute mit einem Arbeitskollegen die Kommutierung zum dritten 
mal duchgegangen - keine Fehler ! )

>> Gut ich könnte beim PLL von fast Clock
>> auf slow Clock umschalten aber ob das was bringt kann ich nicht sagen.
> Hallohooo. PWM und Kommutierungsfrequenz sind völlig unabhängig
> voneinander. Du hast einen Drehstrommotor. Der Rotor dreht sich genau so
> schnell, wie das Feld, was du ihm vorgibst (Oder halt Vielfache/Teiler
> von dieser Feldfrequenz).
>
> Es gibt übrigens eine Unmenge von Informationen über BLDC Ansteuerung im
> Internet. Ok, die sind nicht alle für AVRs gemacht, sondern auch für
> Philips oder Renesas Mikrocontroller. Aber du sollst und willst ja auch
> keinen Code kopieren. Du willst nur wissen, wie der Motor funktioniert
> und das ist ja unabhängig vom verwendeten Mikrocontroller.
> Für den Anfang hier was nettes:
> 
http://scholar.lib.vt.edu/theses/available/etd-09152003-171904/unrestricted/T.pdf
>
> Ist aber für sensorlose Motoren.

Gruß Uli

von Simon K. (simon) Benutzerseite


Lesenswert?

Ah, das sieht doch schon besser aus. Nein, natürlich möchte ich dich 
nicht ärgern :-D

Verändert sich der PWM-Dutycycle, während die jeweilige Phase aktiviert 
ist? Sieht nach einem "Halbschritt" Betrieb analog zu Stepper Motoren 
aus. Oder sogar 3 "schöne" um 120° versetzte Sinüsse. Ist der Strom in 
den Phasen ähnlich einem Sinus?
Das geht mit einem Sensorless Brushless nicht, da macht man die 
"einfache" Kommutierungsmethode (Blockkommutierung). Aber du hast ja 
auch keinen.
Zumindest ist das meine Vermutung. Wenn der Motor aber damit läuft, 
sollte das so funktionieren.

Bist du die Spikes denn losgeworden?

von U. B. (ub007)


Lesenswert?

Hallo Simon !

Die Spikes sind mit den Elkos fast weg und sind jetzt in einem 
akzeptablen Bereich, sodass auch der Dragon nicht mehr aussteigt !
Aber Kopfzerbrechen macht mir gerade dieses Verhalten mit dem Diagramm 
immer noch. Ich verwende z.B. nicht dieses Compare ...OCRnRAH/L usw. 
Register. Soviel ich weiß ist das nur dazu da wenn Du den internen 
Waveform-Genrator verwenden willst.
Mit unserem Vierkanal Oszi sieht das halt so aus als ob nur der PSC 0 
(Master) gut läuft und die anderen (Slave) zwar auch aber irgendwie 
nicht so wie es sein soll.
Die PWM-Burst der Spulen sollten ja quasi nacheinander (überlappend) 
kommen und daran liegt es dass er nicht anläuft. Also quasi so:
              ________
U   _________          ___________________


                   ________
V   ______________          ______________


                        ________
W   ___________________          _________


Hast du vielleicht eine minimale Initialisierungs-Routine z.B. Mode 
One-Ramp ohne diese OCRnRAH/L-Register ?
Ich weiß, da gibts schon ein Demo-Prog von ATMEL aber die arbeiten mit 
diesem OCR... und das wollte ich nicht verwenden.
Außer Du würdest jetzt sagen ohne dieses OCR... gehts nicht, dann weiß 
ich wo der Fehler liegt, nur irgendwie weiß ich nicht wie das Register 
einzusetzen ist.

Gruß Uli

von Simon K. (simon) Benutzerseite


Lesenswert?

Uli B. schrieb:
> Hallo Simon !
>
> Die Spikes sind mit den Elkos fast weg und sind jetzt in einem
> akzeptablen Bereich, sodass auch der Dragon nicht mehr aussteigt !
Sind die Spikes etwa auf die 5V/3.3V Versorgung durchgeschlagen? :-O

> Aber Kopfzerbrechen macht mir gerade dieses Verhalten mit dem Diagramm
> immer noch. Ich verwende z.B. nicht dieses Compare ...OCRnRAH/L usw.
> Register. Soviel ich weiß ist das nur dazu da wenn Du den internen
> Waveform-Genrator verwenden willst.
"Waveform Generator", ja sowas in der Art. Also die PSC kann für jeden 
Ausgang eine Dead-Time, sowie eine PWM erzeugen. Dafür sind die Register 
gedacht.
Jede "Sub-PSC" (Also PSC0, 1, 2) hat einen eigenen Zähler, der ständig 
hochzählt, bis er einen bestimmten Wert erreicht hat und dann wieder von 
vorne anfängt. Dadurch wird ein mal die PWM erzeugt, sowie die Dead Time 
beim Umschalten.

> Mit unserem Vierkanal Oszi sieht das halt so aus als ob nur der PSC 0
> (Master) gut läuft und die anderen (Slave) zwar auch aber irgendwie
> nicht so wie es sein soll.
Kannst du eventuell ein Bild davon machen?

> Die PWM-Burst der Spulen sollten ja quasi nacheinander (überlappend)
> kommen und daran liegt es dass er nicht anläuft. Also quasi so:
> ...
Hm, hm. So viel Ahnung habe ich davon jetzt auch nicht. Aber es würde 
eventuell schon der verwendete Motor helfen. Ist es eine "echte" 
permanenterregte Synchronmaschine (mit "echter" 3 Phasen Wicklung), oder 
ist es ein Brushless-DC (zB Modellbau), die so gewickelt sind, dass man 
mit Blockkommutierung arbeiten kann?
Da der Motor Hall Sensoren besitzt, tippe ich fast auf ersteres.
Weißt du, welche Kommutierungsart verwendet wird, bei deinem Gerät?
Kannst du den Strom der Phasen mal oszilloskopieren?

> Hast du vielleicht eine minimale Initialisierungs-Routine z.B. Mode
> One-Ramp ohne diese OCRnRAH/L-Register ?
Leider nicht. Ich habe (noch) nichts mit dem AT90PWM3B am Hut, nur 
letztens schon mal durchgelesen, da ich einen kleinen FU bauen möchte.

> Ich weiß, da gibts schon ein Demo-Prog von ATMEL aber die arbeiten mit
> diesem OCR... und das wollte ich nicht verwenden.
Warum nicht? Bzw. wie erzeugst du dann die PWM? Software?

> Außer Du würdest jetzt sagen ohne dieses OCR... gehts nicht, dann weiß
> ich wo der Fehler liegt, nur irgendwie weiß ich nicht wie das Register
> einzusetzen ist.
Ich sag mal so: Ohne OCR wüsste ich gar nicht, wie man das machen sollte 
;-)
Auch die Dead-Time Erzeugung wird ja damit gemacht. Sofern du keine 
externe Dead Time Erzeugung hast (hat der IR2301 nicht), solltest du 
schon den Waveform Generator bzw. den PSC dafür benutzen. Wenn du das 
nicht machst, kommt es eben zu den Strompeaks, die du gesehen hast. 
Klar, ganz kurzzeitig (<100ns) mal 10A ist (thermisch) nicht viel, aber 
kann sehr gut unter anderem EMV Störungen erzeugen.

von U. B. (ub007)


Lesenswert?

Hi Simon !

Du sitzt gerade auch vor der Kiste.
In meinem leichtsinn, habe ich gerade gesehen, dass mein Vorgänger die 
Prozedur eingebaut hat und ich die nur einmal vom 16M1 zum PWM3B 
umgesetzt habe und danach nie wieder angeschaut habe. Insofern ist das 
schon dringewesen.
Jetzt bin ich gerade am analysieren, was er da genau eingestellt hat, 
vielleicht mit den richtigen Zeiten komme ich dann auf meine PWM.

Gruß Uli

von U. B. (ub007)


Lesenswert?

Hi Simon !

Um es kurz zu machen. Jetzt funzt er !
Das kam dadurch, dass ich mir halt die Timing-Diagramme von OCR... 
intravenös anschauen musste. Danach stellte ich fest das während der 
Übersetzung vom 16M1 zum PWM3B ich eine Sache nicht gewusst habe und auf 
später verschieben wollte. Nun das war nicht gut, hätte ich gleich 
prüfen müssen. Als ich den Fehler beseitigt hatte lief er lammfromm an 
und die Diagramme sind jetzt so wie sie auch in der Literatur zu sehen 
sind.
Das heißt wenn es jetzt einen Danke-Button für Dich hier im Forum gäbe, 
dann müsste ich 10 mal draufdrücken - mindestens.

Danke Gruß Uli

von Simon K. (simon) Benutzerseite


Lesenswert?

So viel hilfreiches habe ich doch gar nicht beigetragen :-)

Was hast du denn genau geändert an den Timings? Bzw. an den OCR 
Registern. Ich dachte da sind beide Chips gleich.

von U. B. (ub007)


Lesenswert?

Hi Simon !

Das war so.
Beim umsetzen des Programms las ich nur ein OCRnRB-Register. Beim 16M1 
gabs ein einziges Register für alle drei PSC. Deshalb musste mein 
Kollege nur ein Register beschreiben.
Ich hab das zwar übernommen und seltsamerweise hat der Compiler nicht 
gemeckert. Erst als ich ja von Dir erfuhr dass der OCR-Teil für die PWM 
Erzeugung zwingend erforderlich ist, habe ich den Teil vom Kollegen 
nochmals angeschaut und bemerkt, dass hier im Atmel-Datenbuch dafür 
nicht ein Befehl sondern für alle drei Register explizit gesetzt werden 
sollte/muss.
Das erklärt jetzt auch, warum PSC0 gefunzt hat und PSC1 und 2 nur 
halb-lebig.
Vielleicht täusche ich mich da auch, denn vielleicht muss man für den 
16M1 ebenfalls alle 3 OCRnRB reinschreiben. Mein anderer Kollege 
erzählte mir heute das der Programmierer irgendwas an den Header-Dateien 
vom PWM3B geändert hatte - und diese Änderungen waren auf meinem anderen 
PC nicht drauf.
Aber gut - wo ein Wille ist - ist auch ein Bit.

Gruß Uli

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.