Forum: Analoge Elektronik und Schaltungstechnik Verständnisfrage FU - was ist immer gleichzeitig an?


von Georg T. (microschorsch)


Lesenswert?

Hallo zusammen,

alles fing damit an, das mir jemand einen alten 3-phasen Servomotor 
geschenkt hat.. habe mir nun einen 3-phasen inverter besorgt und kann 
über einen Mikrocontrollerdie einzelnen "Schalter" der Inverter ein und 
ausschalten.

Das klappte erstaunlich einfach. Habe innerhalb kürzester Zeit eine 
Poor-Mens Schaltung aufgebaut, indem ich jeweils immer nur eine Phase 
für eine kurze Zeit bestrome, dann die nächste usw. Der Motor dreht 
sich.

Jetzt beschäftige ich mich schon seit zwei Tage damit wie man das 
richtig mit PWM-Ansteuerung machen müsste.

So weit bin ich gekommen:
Angenommen mein 3-phasen Inverter hat die drei Ausgänge U,V und W, die 
jeweils die Schalter 1,2 - 3,4 und 5,6 haben.

Überlege ich mir jetzt die Phasenlage bei phi=0° (U(phi)=sin(phi), 
V=sin(phi-120°) und W=sin(phi-240°) ) für UV und W gegen N gemessen so 
müssten die Schalter in folgender Stellung stehen (Die Prozentangaben 
sind die high-Anteile vom PWM-Signal)

1 0%
2 0%
3 15%
4 85%
5 85%
6 15%

wenn ich allerdings U und V gegeneinander verschalten will, wären die 
Anteile so:

1 85%
2 15%
3 15%
4 85%
5 egal
6 egal

ist Schalter 1 jetzt zu 85% ein, dann floatet doch U gegen N gemessen 
nach +V ????? Ich habe ebenso Fälle gefunden, so ich theoretisch einen 
Kurzschluss erzeugen würde, weil beide Schalter des gleichen Inverters 
eingeschaltet sein müssten.

Mache ich einen Denkfehler??

Einziger Ausweg, der mir momentan einfällt ist, dass bei den Grenzfällen 
(0°, 30°, usw) in keinem Fall ein PWM Signal 100% existieren kann, um im 
zeitlichen Mittel beide Fälle zu ermöglichen.

Kennt jemand vielleicht einen guten Link?

merci
Schorsch

von Georg T. (microschorsch)


Lesenswert?

Hallo,
vielleicht muss ich meine Frage anders formulieren:

Wenn man die PWM-Signale der sechs Schalter mal in Detail ansieht, so 
kann doch nur dann eine Leistung durch UVW, egal wie verschaltet 
fließen, wenn auf das PWM Niveau heruntergebrochen jeweils eine high- 
und eine low-seite eingeschaltet ist.
Meiner Meinung nach genügt es also nicht eine high- un deine low-seite 
mal irgendwann auf high zu haben (aber nicht unbedingt gleichzeitig).

Ich hoffe es wird klar, was ich sagen will

Georg

von W.S. (Gast)


Lesenswert?

Das is klar, es muß eben immer dafür gesorgt sein, daß tatsächlich Strom 
fließen kann. Lies mal bei Toshiba nach, die haben in der Vergangenheit 
ne Menge an µC speziell für 3 Phasen Motorsteuerungen gemacht.

W.S.

von Arsenico (Gast)


Lesenswert?

Hier wird alles schön erklärt:
http://www.youtube.com/watch?v=Dg5AIy0bY1A

Popcorn Schlagsahne und saure Gurken zur Seite .. perfekt !

von ge-nka (Gast)


Lesenswert?

http://de.wikipedia.org/wiki/Frequenzumrichter

Es sind die folgenden 8 Schaltzustände möglich:

Nummer  Eingeschaltet  Schaltzustand der Brückenzweige
0  V2,V4,V6  000
1  V1,V2,V3  110
2  V2,V3,V4  010
3  V3,V4,V5  011
4  V4,V5,V6  001
5  V5,V6,V1  101
6  V6,V1,V2  100
7  V1,V3,V5  111

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Für Drehstrom hilft dir vllt. auch diese Animation:
http://www.zum.de/dwu/depotan/apem112.htm

Georg T. schrieb:
> (aber nicht unbedingt gleichzeitig).

Gleichzeitig sowieso nicht, dann fliesst ja wieder kein Strom.

: Bearbeitet durch User
von Georg T. (microschorsch)


Lesenswert?

Hallo,


danke für die vielen Antworten.
das mit den 8 Schaltzuständen rall ich gar nicht, ich vermute, dass es 
sich um die Extremswerte der einzelnen Winkelfunktionen handelt, aber 
auch dann komme ich nur auf 6 Zustände, wie auch immer es beantwortet 
meine Frage nicht.

Das Video ist ebenso nett und umfangreich, beantwortet meine Frage aber 
ebensowenig, ebenso die nette Animation

Ich glaube einen wichtigen Punkt, habe ich schon herausbekommen, als ich 
mir den Quellcode hier 
http://www.mikrocontroller.net/articles/3-Phasen_Frequenzumrichter_mit_AVR 
angesehen habe:

Die PWM Signale müssen natürlich synchronisiert sein - das war mir nicht 
klar. Weiterhin dachte immer daran, dass sich die Signale einer der 
Flanken "teilen". Aber hier wird auf und abwärts gezählt, daher ist 
alles sauber und symmetrisch.

Danke nochmal
Schorsch

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Georg T. schrieb:
> Weiterhin dachte immer daran, dass sich die Signale einer der
> Flanken "teilen". Aber hier wird auf und abwärts gezählt, daher ist
> alles sauber und symmetrisch.

Flanken teilen? Wie meinst du das? In meinem 3-Phasen Umrichter wird 
nämlich tunlichst darauf geachtet, das sich innerhalb einer Halbbrücke 
nichts überschneidet, denn das würde wie bei jeder Halbbrücke zum 
'Shoot-Through' führen, dem gleichzeitigen Leiten des oberen und unteren 
Endstufentransistors (IGBT, MOSFet...).
Und abwärts zählen tu ich auch nicht, die Timer jedenfalls laufen 
durchgehend von 0 nach TOP.
Und klar, ein PMSM oder BLDC arbeitet mit 6 Sektoren und nicht mit 8. 
Eine reine Blockkommutation würde z.B. folgende Zustände im 
Vorwärtsbetrieb haben:

1 UL, WH
2 VL, UH
3 VL, WH
4 WL, VH
5 UL, VH
6 WL, UH

wobei das die jeweilige Phase (UVW) und die obere (H) oder untere(L) 
Halbbrücke darstellt.
Rückwärts läuft der Motor dann mit:
1 UH, WL
2 UL, VH
3 VH, WL
4 VL, WH
5 UH, VL
6 UL, WH

von Georg T. (microschorsch)


Lesenswert?

Matthias Sch. schrieb:
> Flanken teilen? Wie meinst du das? In meinem 3-Phasen Umrichter wird
> nämlich tunlichst darauf geachtet, das sich innerhalb einer Halbbrücke
> nichts überschneidet, denn das würde wie bei jeder Halbbrücke zum
> 'Shoot-Through' führen, dem gleichzeitigen Leiten des oberen und unteren
> Endstufentransistors (IGBT, MOSFet...).

Hi,

schon klar, hab mich blöd ausgedrückt.

Selbst wenn mehrere Timer die selbe Cycle-Time verwenden, kannst Du 
immer noch die Zyklen in verschiedenen Arten und Weisen 
übereinanderlegen. Betrachtest Du nur einen Zyklus und dieser fängt für 
PWM!=0% mit high an, so kommt die HL Flanke zuerst für das kleine PWM 
Signal, dann für das größere, die LH Flanke ist aber für beider wieder 
gleich. Man kann es aber auch genau anders herum machen.

Die dritte Möglichkeit und ich glaube, dass ist die, die Du verwendet 
hast ist die, das auf die Mitte des Zyklus synchronisiert wird, was man 
durch auf und abwärtszählen erreicht. Siehe dazu auch hier: 
http://www.mikrocontroller.net/wikifiles/a/a9/PWM_Theorie_3.gif

Ich habe mittlerweile eine gute Seite gefunden, die die meisten Fragen 
zu beantworten scheint, zumindest glaube ich das momentan :-)
http://de.wikipedia.org/wiki/Raumzeigermodulation

Danke für Eure Hilfe

Schorsch

von Georg T. (microschorsch)


Lesenswert?

Matthias Sch. schrieb:
>
> 1 UL, WH
> 2 VL, UH
> 3 VL, WH
> 4 WL, VH
> 5 UL, VH
> 6 WL, UH


Ich glaube nicht das das richtig ist. In meiner Poor-Mens Lösung, die im 
Prinzip der Blockkommutation entspricht, die Du beschreibst habe ich 
folgendes gemacht

1 UH VL
2 VL WH
3 WH UL
4 UL VH
5 VH WL
6 WL UH

Ein Schalter muss immer liegenbleiben

Georg

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Georg T. schrieb:
> Ein Schalter muss immer liegenbleiben

Jo, das stimmt, ist allerdings hier von der Sequenz der Hallgeneratoren 
abhängig und eher Definitionssache. Ich habe für verschiedene Motore 
auch einfach verschiedene Tabellen.
Die Sequenz der Hallgeneratoren in dem Motor ist hier nämlich 2, 3, 1, 
5, 4, 6 - und damit ist die Sequenz die gleiche wie bei dir.
Hatte vergessen zu erwähnen, das es ein Motor mit Sensoren ist.

von Georg T. (microschorsch)


Lesenswert?

Hallo,

find ich wirklich schön, deine Schaltung. Ich hätte mir für einen 
Versuchsaufbau das LCD gespart und lieber eine UART Verbindung 
drangebastelt, aber egal....

Hab die ganze Zeit gerätselt, warum Du den mega88 genommen hast und 
nicht den mega8 aber Du brauchst natürlich 6 PWM-Kanäle, sonst kannst Du 
die Amplitude nicht einstellen. -freu- hab was verstanden

Auf den ersten Blick verstehe ich nicht, weshalb Du deine sin-table 
nicht nur für eine Phase hinterlegen kannst. Für die anderen Phasen kann 
man doch den Index verschieben. Auch könntest Du sie während der 
Init-Routine erzeugen und im RAM hinterlegen anstelle alle in den flash 
zu schreiben.

Wenn ich Deinen Code richtig verstehe, benutzt Du das Deadband, um die 
Amplitude einzustellen. Klingt logisch - weil mehr Amplitude, wenn mehr 
an.
Aber, um zur Verständnisfrage zurückzukommen, in jedem Fall (mal 
ausgenommen vom Deadband) sind 3 Schalter an, zwei oben und einer unten 
oder andersherum. Müsstest Du nicht überprüfen, welcher der einzelne 
Schalter ist und diesen dann zu den anderen legen, um ins Deadband zu 
kommen??

Ich nehme an der IR2110 ist ein Treiber-IC für Mosfets und IGBTs?? Mir 
ist nicht ganz klar wofür man die braucht, ich schalte meine IGBTs 
momentan mit 6 Transistoren, geht auch, ich schalte aber auch wirklich 
langsam...

Ich verstehe nicht ganz was der PID Regler macht, also ich verstehe 
schon was ein PID Regler macht, aber nicht was er hier macht. Um V/f 
konstant zu halten brauchst Du doch nur V auzurechnen...das hab ich noch 
nicht kapiert.

Dann habe ich noch eine konzeptionelle Frage (und ich werde jetzt 
bestimmt verhauen, weil ich mit Konzepten aus Schrittmotorsteuerungen 
anfange):
Kann ich nicht die drei Sinus-Signale über PWM + Tiefpass erzeugen, den 
Strom der drei Phasen über Shunt-Widerstände messen und die 
Sinus-Signale als Vref1,2,3 zum choppen benutzen???? Auf diese Weise 
könnte ich mir V/f doch komplett sparen??? Ich müsste eine 
Blockkommutation, wie oben beschrieben aufbauen, und könnte den 
Chopper-Teil komplett in Logik-Bausteinen aufbauen.
Bestimmt mache ich irgendwo einen Denkfehler...

Gruß bis morgen und Danke

Schorsch

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Georg T. schrieb:
> Auf den ersten Blick verstehe ich nicht, weshalb Du deine sin-table
> nicht nur für eine Phase hinterlegen kannst. Für die anderen Phasen kann
> man doch den Index verschieben.

Klar, aber es gibt für gesparten Flashspeicher kein Geld zurück und das 
Laden der Timer geht so sehr flott vonstatten. Ob ich nun 576 Bytes in 
die Tabelle stecke oder nur 192, ist letztendlich egal.

> Auch könntest Du sie während der
> Init-Routine erzeugen und im RAM hinterlegen anstelle alle in den flash
> zu schreiben.
Warum denn das? Das belegt nur doppelt Speicher (Flash und RAM) und 
hat null Vorteile.

Georg T. schrieb:
> Aber, um zur Verständnisfrage zurückzukommen, in jedem Fall (mal
> ausgenommen vom Deadband) sind 3 Schalter an, zwei oben und einer unten
> oder andersherum. Müsstest Du nicht überprüfen, welcher der einzelne
> Schalter ist und diesen dann zu den anderen legen, um ins Deadband zu
> kommen??

Das kapier ich nicht. Der beschriebene FU hat in dem Sinne gar keine 
Schalter, sondern 3 mit komplementärer PWM erzeugte Sinusgeneratoren. 
Der oben beschriebene Fall der Blockkommutierung hat mit dem 3-Phasen 
Umrichter nichts zu tun und wird in dem Projekt nicht verwendet.

Schau dir Atmels Application Note AVR447 mal an, aus dieser 
Motorsteuerung wurde der Umrichter entwickelt. Im zugehörigen PDF bei 
Atmel wird auch nochmal ausführlich das Prinzip beschrieben. Ich habe 
den gesamten Blockkommutierungskram und die Sensorabfrage gestrichen.

> Ich hätte mir für einen
> Versuchsaufbau das LCD gespart und lieber eine UART Verbindung
> drangebastelt, aber egal....

Mach doch - das einzige was du dafür ändern musst, ist der 
Kommandointerpreter und eine Routine für UART Ein- und Ausgabe. Das ist 
wirklich simpel.

> Ich nehme an der IR2110 ist ein Treiber-IC für Mosfets und IGBTs?? Mir
> ist nicht ganz klar wofür man die braucht, ich schalte meine IGBTs
> momentan mit 6 Transistoren, geht auch, ich schalte aber auch wirklich
> langsam...
Mit 6 Transistoren kannst du mal probieren, eine an 325 Volt 
angeschlossenene H-Brücke sauber zu schalten. Der Aufwand dafür 
übersteigt die Kosten für den IR2110/2113 um Längen.
Wie ich aber im Artikel geschrieben habe, ist der Aufbau der Endstufe ja 
nicht zwingend, du kannst da nehmen, was du möchtest. Da das Dings eine 
frei wählbare Totzeit hat, kannst du ranbauen, was du willst.

Georg T. schrieb:
> Ich verstehe nicht ganz was der PID Regler macht, also ich verstehe
> schon was ein PID Regler macht, aber nicht was er hier macht. Um V/f
> konstant zu halten brauchst Du doch nur V auzurechnen...das hab ich noch
> nicht kapiert.

Der PID Regler wird nur dann benutzt, wenn du externe Analogsignale für 
f und V/f anlegst, um den FU aus einer externen Quelle zu regeln. Wenn 
du z.B. phasenstarr einen Motor regeln möchtest, ist der PID Regler dazu 
sinnvoll, um Mechanik und Regelgeschwindigkeit, Überschwingen usw. 
auszuregeln. Solche Anwendungen sind z.B. Kopftrommeln in 
Videorecordern, Festplattenmotore, Capstan in Magnetspeichern, 
Nipkowscheiben usw.

Georg T. schrieb:
> Kann ich nicht die drei Sinus-Signale über PWM + Tiefpass erzeugen, den
> Strom der drei Phasen über Shunt-Widerstände messen und die
> Sinus-Signale als Vref1,2,3 zum choppen benutzen???? Auf diese Weise
> könnte ich mir V/f doch komplett sparen??? Ich müsste eine
> Blockkommutation, wie oben beschrieben aufbauen, und könnte den
> Chopper-Teil komplett in Logik-Bausteinen aufbauen.

Bestimmt - wenn du das sagst :-P Ich habe mit Schrittmotoren keine 
Erfahrung, der FU hat damit auch gar nichts zu tun, der ist für 
Drehstrommotore gedacht.
Logikgatter sind eben von gestern, das presst man heute in einen MC. 
Einer der Gründe zur Veröffentlichung meines FU war ja, zu 
demonstrieren, was heute alles mit einem einzigen Chip (vom LCD mal 
abgesehen) geht, ohne das die kleine Kiste ins Schwitzen kommt.

von Georg T. (microschorsch)


Lesenswert?

Matthias Sch. schrieb:
> Der PID Regler wird nur dann benutzt, wenn du externe Analogsignale für
> f und V/f anlegst, um den FU aus einer externen Quelle zu regeln. Wenn
> du z.B. phasenstarr einen Motor regeln möchtest, ist der PID Regler dazu
> sinnvoll, um Mechanik und Regelgeschwindigkeit, Überschwingen usw.
> auszuregeln.

Das ist cool!
Das heißt ich könnte einen Servo-Motor mit Resolver quasi direkt 
anschließen und der PID-Regler würde den Motor genau auf die 
Sollposition einstellen??

Das ist wirklich cool

> Das kapier ich nicht. Der beschriebene FU hat in dem Sinne gar keine
> Schalter, sondern 3 mit komplementärer PWM erzeugte Sinusgeneratoren.
> Der oben beschriebene Fall der Blockkommutierung hat mit dem 3-Phasen
> Umrichter nichts zu tun und wird in dem Projekt nicht verwendet.

Ja.. Du hast recht, ich hatte gestern Abend einen Denkfehler gemacht. 
Das bedeutet aber auch, dass man nicht 6 unabhängige PWM Signale 
braucht, sondern nur 3. Die drei weiteren sind IMMER EXAKT das inverse 
der drei ersten. Oder sind in deinem Deadband wirklich alle Schalter 
aus???
Ich überlege gerade ob man nicht einen Dual-IGBT driver nehmen könnte 
und den nur mit dem high-signal betreiben kann. Vermutlich kann man sich 
das mit Invertern und Monoflops ebenfalls aufbauen, könnte sein, dass Du 
recht hast und die Version mit 6 PWM Kanälen die einfacherere ist :-)

> Bestimmt - wenn du das sagst :-P Ich habe mit Schrittmotoren keine
> Erfahrung, der FU hat damit auch gar nichts zu tun, der ist für
> Drehstrommotore gedacht.

Ich will nur darauf hinaus, ob es nicht mehr Sinn machen würde auf den 
Strom anstelle auf die Spannung zu regeln??

Gruß vom Schorsch

von Georg T. (microschorsch)


Lesenswert?

Lieber Matthias,

ich habe Deine Schaltung soeben auf einem Steckbrett nachgebaut!

Kleine Unterschiede:
Habe ein EasyPIM Modul FP10R06KL4 für die Endstufe benutzt
Andere Optokopplerer, auf den Überstomschutz habe ich mal verzichtet, 
kann an meinem Netzteil eine Strombegrenzung einstellen. Auf die 18Ohm 
Widerstände vor den Gates habe ich auch verzichtet, sowie auf das ein 
oder andere C und auf alle Ls (meine Leitungen sind lang genug...)

Ich betreibe das ganze erstmal nur mit etwa 15V, dann tuts nicht weh, 
wenn man was falsch macht

Schließe ich eine Phase H/L an, spüre ich ein Brummen, Strom ca 0.4A,
zweite Phase H/L, immer noch ein Brummen, Strom geht ein wenig hoch
dritte Phase (nur H), Strom geht immer noch ein bisschen hoch
dritte Phase (L) Strom fällt auf Null! Kein Brummen mehr am Motor.

Was ich irre finde, ich kann jetzt die Phasen wieder abziehen, Strom 
bleibt auf Null, selbst wenn ich die Gates auf GND ziehe immer noch 
Null. 10min warten, dann Brummsts wieder


Was kann das sein???

Schorsch

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Georg T. schrieb:
> Auf die 18Ohm
> Widerstände vor den Gates habe ich auch verzichtet

Das solltest du nicht tun, ohne vorher zu rechnen. Die Gatekapazität 
muss ja auf- und entladen werden in möglichst kurzer Zeit (Anstiegs- und 
Abfallzeit des Treiberausgangs) - das kann evtl. den maximalen 
Ausgangsstrom des Treibers übersteigen, wenn er nicht begrenzt wird.

Georg T. schrieb:
> Oder sind in deinem Deadband wirklich alle Schalter
> aus???

Jo, klar, das ist der Sinn der Totzeit. Würde ich genau invertierte 
Signale nehmen, besteht die Gefahr, das während ein Transistor anfängt 
zu sperren, der andere schon anfängt zu leiten -> Shoot Through. Eine 
simple Möglichkeit für dich und dein Labornetzteil, die Totzeit 
einzustelllen, ist es, die Stromaufnahme zu messen (am besten an einem 
Shunt mit parallelem Oszi) und die Totzeit ohne Last soweit zu 
verringern, bis die ersten Spannungsspitzen über dem Shunt zu sehen sind 
und der Strom anfängt zu steigen. Dann drehst du die Zeit wieder ein 
wenig grösser.
Die Endstufe sollte also ohne Last im Betrieb keinen merkbaren Strom 
ziehen.

Georg T. schrieb:
> Schließe ich eine Phase H/L an, spüre ich ein Brummen, Strom ca 0.4A,
> zweite Phase H/L, immer noch ein Brummen

Was brummt denn? Du schreibst leider nichts über den Versuchsaufbau, für 
mich klingt es ein wenig danach, als würden da Endstufen Transistoren 
auf der Kippe betrieben, also nicht voll sperrend oder voll leitend.Ein 
zügiges Durchsteuern und vollständiges Sperren der Endstufen ist 
unbedingt notwendig.

: Bearbeitet durch User
von Georg T. (microschorsch)


Lesenswert?

Matthias Sch. schrieb:
> Was brummt denn? Du schreibst leider nichts über den Versuchsaufbau, für
> mich klingt es ein wenig danach, als würden da Endstufen Transistoren
> auf der Kippe betrieben, also nicht voll sperrend oder voll leitend.Ein
> zügiges Durchsteuern und vollständiges Sperren der Endstufen ist
> unbedingt notwendig.

Hi,

Du hast recht, vielleicht habe ich ein bisschen wenig beschrieben...

Ich habe an die drei Phasen-Ausgänge UVW die drei Phasen eines 
Servo-Motors angeschlossen. Eben diesen Servo-Motor konnte ich über die 
oben genannte Blockschaltung auch schon drehen lassen.

Vielleicht verstehe ich noch nicht was Deine Schaltung im Anfangszustand 
genau tut! Hab noch nicht so intensiv in den Quellcode geschaut.
Ich sehe eine eingestellte Frequenz, das U/f Verhältnis und die 
Amplitude. Ich habe mit nem oszi gemessen. Ich sehe PWM Pulse auf 
einigen Ausgängen. Kömischer Weise aber nur auf einer Seite, vielleicht 
habe ich mich aber auch vermessen. Ich vermute, der Motor sollte sich 
drehen, wenn das Ding eingeschaltet wird???

Das was brummt ist der Motor

Schorsch

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Georg T. schrieb:
> Ich sehe PWM Pulse auf
> einigen Ausgängen.

Es müssen an allen PWM Ausgängen aller 3 Timer PWM Signale auftauchen, 
ingesamt also 6 Signale. (UH,UL,VH,VL,WH und WL)

Georg T. schrieb:
> Ich vermute, der Motor sollte sich
> drehen, wenn das Ding eingeschaltet wird???

Ich weiss nicht, was du mit einem 'Servo' Motor meinst, Servos kenne ich 
mit integrierter Elektronik, die die Steuerung eines Motos übernimmt. 
Wenn das auf irgendeine Weise ein 3-Phasen Motor ist, sollte er sich 
drehen, solange Frequenz und Leistung des Generators auf ihn passen.

von Georg T. (microschorsch)


Lesenswert?

Hallo,

es werden definitiv nicht auf allen 6 Ausgängen PWM Signale erzeugt, ich 
schaue mir den Quellcode mal heute Abend an

Ein Servo-Motor ist ein Synchron oder Asynchron-Motor. In meinem Fall 
hat er 3 Phasen und kann mit "handelsüblichem Drehstrom" betrieben 
werden. Typischer Weise sitzt ein Resolver direkt auf dem Motor, so auch 
bei mir. Mit dem Resolver kann man den anliegenden Winkel, bzw die 
Winkeländerung ermitteln. Daher finde ich deine PID Lösung so schön, 
weil ich vorhabe den Ausgang des Resolvers als Eingang für den PID zu 
nehmen, auf diese Weise kann ich dem Motor sagen, "Drehe Dich genau 
88.5°" und dass passiert dann auch!

Ich möchte den Servo-Motor an meiner CNC-Fräse benutzen, momentan 
verwende ich hier Schrittmotoren. Das alles soweit zum laufen zu 
bekommen, dass die Trajektorien hinterher immer noch so aussehen wie sie 
aussehen sollen, wird sicherlich noch ein Stück arbeit :-)

Georg

von Georg T. (microschorsch)


Lesenswert?

Hallo Matthias et al,


so sitze gerade wieder vor dem Steckbrett und probiere rum.

Definitiv sehe ich nur PWM Signale an den H-Seiten (Pins 5,11 und 16) 
das sind jeweils die B-Signale.

Hab mal grob durch Deinen Code geguckt. Ich schätze
1
  //Set all timers in "Phase correct mode". Do not enable outputs yet.
2
  TCCR0A = (1 << WGM00);
3
  TCCR1A = (1 << WGM11);  
4
  TCCR2A = (1 << WGM20);
5
//Set top value of Timer/counter1.
6
  ICR1 = 0xff;
7
//Synchronize timers. These values were determined by running the simulator
8
  TCNT0 = 0;
9
  TCNT1 = 3;
10
  TCNT2 = 5;
11
  // Start all 3 timers.
12
  TCCR0B = (0 << CS01) | (1 << CS00);
13
  TCCR1B = (1 << WGM13) | (0 << CS11) | (1 << CS10);
14
  TCCR2B = (0 << CS21) | (1 << CS20);

soll die 6 PWM Register in Gang bringen. Ich kenne den mega88 nicht so 
gut, und hab mich selten mit PWM beschäftigt, wie werden die A-Timer 
gestartet?? Ebenfalls durch das TCCRxB Register?? Warum lässt Du den 
Timer 1 nicht auch im 8-bit Modus laufen??? Ich glaube hier ist noch 
irgendwo ein Software-Problem??? Laufen bei Dir wirklich alle Ausgänge?? 
Hast Du Deine Fuses irgendwie speziell gesetzt??

Danke
Schorsch

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Georg T. schrieb:
> Laufen bei Dir wirklich alle Ausgänge??
> Hast Du Deine Fuses irgendwie speziell gesetzt??

Ja natürlich laufen alle Ausgänge, sondern wären hier schon einigen 
Leuten Sachen um die Ohren geflogen :-)

Georg T. schrieb:
> wie werden die A-Timer
> gestartet?? Ebenfalls durch das TCCRxB Register??

Äh, welche A Timer? Es gibt Timer 0, Timer 1 und Timer 2. Jeder dieser 
Timer hat ein TCCRxA und ein TCCRxB Register, wobei das kleine x für die 
Timernummer steht. Das starten eines Timer erfolgt durch das setzen der 
Prescaler Bits (CSx) und diese sind bei allen 3 Timern im TCCRxB 
Register.
Timer läuft nur deswegen im 16-bit Modus, weil ich den CAPT Interrupt 
benutze. Spielt praktisch keine Rolle, aber Timer 1 löst den Interrupt 
aus, der die Sinuserzeugung antreibt und da es so sehr gut funktioniert, 
lasse ich das einfach so. ICR ist ja auf 0xFF gesetzt, damit arbeitet 
Timer 1 wie ein 8-bit Timer. Das ICF Capture Flag wird ausserdem in der 
Routine benutzt:
1
/*! \brief Waits for the start of the next PWM cycle.
2
 *
3
 *  Can be used to make sure that a shoot-through
4
 *  does not occur in the transition between two output waveform generation modes.
5
 */
6
static void TimersWaitForNextPWMCycle(void)
7
{
8
  //Clear Timer1 Capture event flag.
9
  TIFR1 = (1 << ICF1);
10
11
  //Wait for new Timer1 Capture event flag.
12
  while ( !(TIFR1 & (1 << ICF1)) )
13
  {
14
  }
15
}

> Hast Du Deine Fuses irgendwie speziell gesetzt??
Die Fuses spielen hier keine grosse Rolle. Da ich einen Quarz benutze, 
setze ich die Fuses auf Ext.High Frequency Crystal mit langer Reset 
Zeit, die Software läuft aber auch mit den internen RC Oszillator.

Ich habe den Eindruck, das du in den Ports irgendwo eine falsche 
Deklaration eingesetzt hast:
1
//! Bit pattern of PWM pins placed on PORTB.
2
#define PWM_PATTERN_PORTB   ((1 << PB1) | (1 << PB2) | (1 << PB3))
3
4
//! Bit pattern of PWM pins placed on PORTD.
5
#define PWM_PATTERN_PORTD   ((1 << PD3) | (1 << PD5) | (1 << PD6))
Und dann:
1
/*! \brief Enables PWM output pins
2
 *
3
 *  This function enables PWM outputs by setting the port direction for
4
 *  all PWM pins as output. The PWM configuration itself is not altered
5
 *  in any way by running this function.
6
 */
7
static void EnablePWMOutputs(void)
8
{
9
  DDRB |= PWM_PATTERN_PORTB;
10
  DDRD |= PWM_PATTERN_PORTD;
11
}
Da stimmt irgendwas bei dir nicht. Du benutzt auch wirklich keinen 
Mega8?

von Georg T. (microschorsch)


Lesenswert?

Hi,

hab nochmal alle Pins überprüft, sie stimmen exakt meinem Deinem 
Schaltbild und auch mit dem Quellcode überein.

Mir ist aufgefallen, dass Du etliche spezielle FLASH und EEPROM Flags in 
deinem Makefile benutzt, soetwas habe ich bisher noch nicht gebraucht, 
ebenso wenig wie
1
register volatile VFDflags_t fastFlags asm ("r9");
usw. Auch wenn ich nicht glaube, das die nicht funktionierenden PWM 
Ausgänge damit etwas zu tun haben, habe ich jetzt exakt dein Makefile 
benutzt, vorher hatte ich mein eigenes, aber immer noch genau das selbe.
Ich habe Deinen Quellcode bis jetzt nicht verändert, es ist eine exakte 
Kopie.

Der mega88 ist auch wirklich ein mega88 :-) aber ich hab auch nochmal 
nachgeguckt

Schorsch

: Bearbeitet durch User
von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Es haben schon einige Leute den FU nachgebaut, sollte eigentlich 
klappen. Evtl. hast du die Portpins zerschossen?

Georg T. schrieb:
> soetwas habe ich bisher noch nicht gebraucht,
> ebenso wenig wieregister volatile VFDflags_t fastFlags asm ("r9");

Ja, das ist ein schöner Spass - diese Variable liegt direkt im Register 
und das beschleunigt den Ablauf etwas. Aber keine Angst, das 
funktioniert, wie oben schon erwähnt, recht gut.
Du musst allerdings mal schauen, ob bei dir die Totzeit nicht auf einem 
irrsinnig hohen Wert steht. Wenn da z.B. 0xFF drin steht (wie bei einem 
leeren EEPROM üblich), dann werden keine sinnvollen Ausgänge möglich 
sein, da die Totzeit dann so lang ist wie der Timerzyklus.

: Bearbeitet durch User
von Georg T. (microschorsch)


Lesenswert?

Matthias Sch. schrieb:
> Du musst allerdings mal schauen, ob bei dir die Totzeit nicht auf einem
> irrsinnig hohen Wert steht. Wenn da z.B. 0xFF drin steht (wie bei einem
> leeren EEPROM üblich), dann werden keine sinnvollen Ausgänge möglich
> sein, da die Totzeit dann so lang ist wie der Timerzyklus.

Hi,

ja genau das wars!
Habe die Totzeit jetzt auf dem Minimum (08). Jetzt sehe ich PWM Signale 
auf allen 6 Leitungen. Vielen Dank

Leider dreht sich mein Motor immer noch nicht :-(

Er brummt jetzt in der jeweiligen Frequenz, die ich anlege, aber dreht 
sich nicht. Man kann auch eine deutliche zitternde Bewegung sehen. Ich 
habe den Verdacht, dass die Kommutationsreihenfolge noch nicht stimmt.

Habe also die Frequenz ganz langsam gedreht und mir das alles mal 
"Schritt für Schritt" angesehen und es scheint alles zu stimmen (W ist 
der früheste, dann kommt V, dann U) Bei meinem Motor weiß ich nicht was 
UV und W ist, ist hier aber auch egal, das ändert ja nur die 
Drehrichtung.

Zusätzlich habe ich noch alle H/L Signale durchgetauscht, keine 
Verbesserung.. Was ich merkwürdig finde:

Ziehe ich die Gate-Leitungen von 2 der drei 3 Phasen ab und stelle die 
Frequenz langsam (1 Hz), so würde ich erwarten, dass der Motor nur etwas 
1/3 der Zeit sein Drehmoment hält, es tut es aber stetig????

Any hint?

Schorsch

von Georg T. (microschorsch)


Lesenswert?

Hallo zusammen,

ich bin ein bisschen weiter gekommen.

Habe jetzt mal auf Basis des Mega88 ein einfaches Programm geschrieben, 
dass bei einer Fixen Frequenz die 6 PWM Ausgänge als benutzt um eine 
Dreieckspannung zu erzeugen. Habe die Ausgänge mit einem Logic-Analyser 
nachgemessen. Alles ist inverted pair und die Phasen sind jeweils um 
120° verschoben. Ich musste allerdings TCNT1 und TCNT2 auf 30 und 44 
setzen. Keine Ahnung...

Leider brummte mein Motor in etwa so, wie bei der Schaltung zuvor auch, 
daher habe ich mit dann nochmal die Verkabelung angesehen und entdeckt 
dass ich den Vs-Pin am IR2110 nur mit dem Elko verbunden hatte, somit 
konnte natürlich die High-Seite niemals leitend werden. Ich habe dann in 
den mega88 die Software mit der Blockkommutation eingeladen und dass 
lief dann auch eine Weile, dann verabschiedete sich der erste IR2110....

was habe ich da falsch gemacht???

Ich habe Vs jetzt direkt an U,V und W, also die Leitungen, die zum Motor 
führen angeschlossen. So habe ich zumindest das Datenblatt verstanden. 
Ich finde das allerdings unlogisch, ich verstehe nicht, weshalb ich Vs 
nicht an GND anschließen sollte?? (Man betrachte das Functional Block 
Diagramm aus dem Datenblatt)

Schorsch

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Georg T. schrieb:
> ich verstehe nicht, weshalb ich Vs
> nicht an GND anschließen sollte?? (Man betrachte das Functional Block
> Diagramm aus dem Datenblatt)

Die Funktion der Ladungspumpe ist im Datenblatt wirklich nur 
schematisch. Du musst dir einfach klarmachen, das der Mosfet ( in der 
Highside) immer nur die Spannung zwischen Gate und Source sieht, er hat 
keine Ahnung von Ground. Die Ladungspumpe im IR 'stapelt' auf Vs die Vcc 
oben rauf und erzeugt so die notwendige Gate-Source Spannung zum 
durchsteuern der Highside.
Egal, auf welchen Potential die Source also gerade ist, HO = Vs + Vcc. 
Die Diode muss übrigens die volle Motorspannung sperren können, sollte 
im Zweifelsfall also was besseres als eine 1N4148 sein. Ich habe mit der 
BA159 gute Erfahrungen gemacht.

: Bearbeitet durch User
von Georg T. (microschorsch)


Lesenswert?

Hi,
danke für die schnelle Antwort.
Wo ist denn dein zweiter Bootstap-C. Oder hast Du den weggelassen, da 
der in deiner Schaltung eh nur zwischen VSS und VDD hängen würde??

Die Diode ist eine N4148, meine Motorspannung hängt aber Momentan nur 
bei 10-11V, ich denke, dass schafft die 4148.

Hast Du eine Ahnung, warum mir ein IR abgeraucht ist?? Die anderen 
werden auch schon ganz schön warm. Ich hab noch keine Rs vor dem Gate. 
Meinste das kann daran liegen?? Ich mein warm werden hat immer was mit 
zuviel Strom zu tun....


merci
Schorsch

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Georg T. schrieb:
> Wo ist denn dein zweiter Bootstap-C. Oder hast Du den weggelassen, da
> der in deiner Schaltung eh nur zwischen VSS und VDD hängen würde??

Der IR2110/2113 benötigt nur einen Bootstrap-C und der ist in meiner 
Schaltung der C6. Das die Versorgung der Treiber gut abgeblockt werden 
sollte, ist klar, hat aber nichts mit dem Bootstrap zu tun. C6 kann 
übrignes auch ein 100µF sein, sollte aber wenigstens 50V spannungsfest 
sein, damit er länger lebt.

Georg T. schrieb:
> Ich hab noch keine Rs vor dem Gate.
> Meinste das kann daran liegen??

Die Widerstände sind doch nicht nur als Spass gemeint. Ja, die müssen 
rein, denn sie begrenzen den max. Treiberstrom während des Auf- und 
Entladens der Gatekapazität. Immerhin arbeitet die Schaltung mit 31 kHz 
PWM Frequenz, die Auf- und Entladung findet also alle 32µs statt. Da 
kommt schnell mal Überstrom zustande.

Georg T. schrieb:
> Die Diode ist eine N4148

Ja super. Diese Diode muss den Strom liefern, um die Bootstrap Schaltung 
zu versorgen, d.h. darüber wird C6 aufgeladen. Nimm also wenigstens eine 
1N4001-4007, die kostet auch nix.

von Georg T. (microschorsch)


Lesenswert?

Hi,

hab jetzt jeweils eine 1N4001, aber die IRs werden immer noch sau heiß. 
Ich betreibe sie jetzt immer nur kurz, damit sie nicht durchbrennen. Was 
kann man denn da falsch machen??

Kann man Vs nicht über einen Spannungsteiler zuführen?? Ich glaube, die 
kriegen da gehen die ganzen Amperes durch den Chip

Schorsch

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Georg T. schrieb:
> Kann man Vs nicht über einen Spannungsteiler zuführen??

Nein, damit hebelst du die Funktion der Ladungspumpe aus. Vs gehört 
direkt an den Phasenausgang, den Mittelpunkt der Halbbrücke.

Georg T. schrieb:
> Ich glaube, die
> kriegen da gehen die ganzen Amperes durch den Chip

Nö, auch das nicht. Vs ist der Bezugspunkt für die Ladungspumpe und den 
Highside Driver. Da gehen keine Ampere durch, wenn du Gatewiderstände 
einfügst. Ich schlage dir vor, die Schaltung zuerst genauso aufzubauen 
wie im Schaltbild. Wenn alles richtig läuft, fängst du dann Änderungen 
an, von denen du dir was versprichst. Immerhin laufen die IR bei mir an 
325V und da wird nix warm.
Es haben schon einige Leute nachgebaut, aber heisse IR waren da nicht 
bei. Finde also deinen Fehler.

von Georg T. (microschorsch)


Lesenswert?

Hi,

die Schaltungen sind meiner Meinung nach jetzt identisch. Folgende 
Unterschiede sind mir dennoch aufgefallen.

Ich benutze Mein Labornetzteil sowohl für das Betreiben der Gates als 
auch für die Spannungsversorgung des Motors (VCCIO = VCC)

Ich habe keine Stromüberwachung, keinen Shunt-Widerstand, SD hängt bei 
mir in der Luft (sollte intern nach GND gezogen werden)

ich habe keine 18 Ohm vor den Gates sondern 22
ich habe keine BAT 159 sondern eine 1N4001
ich benutze andere Optokoppler

ich benutze keine "G20N20" (was ist das) sondern ein EasyPIM Modul

habe gerade den zweiten IR2110 "verloren"

Was kann einen IR2110 umbringen???

aso, ich experimentiere momentan mit eigenem Code, habe noch keine 
Deadtime implementiert, aber dass würde mir doch höchstens die IGBTs 
durchhauen, oder??
Schorsch

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Georg T. schrieb:
> ich benutze keine "G20N20" (was ist das) sondern ein EasyPIM Modul

Der G20N20 ist so etwas ähnliches wie das hier:
http://www.pollin.de/shop/dt/MzkwOTY4OTk-/Bauelemente_Bauteile/Aktive_Bauelemente/Transistoren/HGTG20N60B3D_30_Stueck.html

Ein ganz normaler schneller IGBT. Das EasyPIM sollte genauso gehen, 
vorausgesetzt, die Anschlussbelegung ist 100% korrekt und du hältst die 
Totzeiten ein. Was passiert, wenn du die Brücken ohne Last betreibst? 
Miss dabei mal die Stromaufnahme der Endstufe, sie sollte bei Null 
liegen, wenn die Totzeit korrekt eingestellt ist, und an jedem 
Phasenausgang sollte eine sinusmodulierte PWM stehen.

Dann stelle sicher, das die Vcc der IR nicht höher als ca. 18V liegt. 
20V sind zwar erlaubt, aber wenn du Vcc und Motorendstufe aus der 
gleichen Versorgung betreibst, sind da durchaus heftige Spitzen drauf. 
Deswegen sollte die Abblockung der Motorendstufe auch direkt am EasyPIM 
plaziert sein. Lange Kabel zum Netzteil sind da problematisch. Die 
Spannung sollte stabil und sauber sein.

Georg T. schrieb:
> aso, ich experimentiere momentan mit eigenem Code, habe noch keine
> Deadtime implementiert

Tja, dazu kann ich nichts sagen, da der Betrieb ohne Totzeit m.M.n. 
überflüssig ist. Der IR hat eine Sperre drin, die verhindern soll, das 
HIN und LIN gleichzeitig high sind, die nicht im Datenblatt steht, aber 
das muss nicht unbedingt funktionieren. Zurückgesetzt wird dieser 
Zustand durch ein Signal auf LIN.

: Bearbeitet durch User
von Georg T. (microschorsch)


Angehängte Dateien:

Lesenswert?

Hallo,

heute habe ich mich mit einem Kollegen über dieses Thema unterhalten. Er 
hat mir zwei Tipps gegeben.
1. VCCIO und VCC unbedingt trennen
2. Frequenz tiefer machen

Die Spannungen trennen war kein Problem, habe noch ein weiteres Netzteil 
in der Grabbelkiste gefunden. Dann habe ich mal die Frequenzen 
nachgemssen. Da ich einen 7-komma-nochwas quarz benutze komme ich auf 
eine PWM-Frequenz von etwa 14kHz. Das freiverdrahtet ist ambitioniert. 
Ich hab also den Prescaler auf 8 gesetzt.

Seit dem ich diese beide Dinge geändert habe rauchen meine IRs nicht 
mehr ab!! Matthias, was für einen Quarz benutzt du?? 1MHz?? Ich 
persönlich denke aber, dass das Trennen der Spannungsversorgungen 
größeren Einfluss hatte.

Ich habe noch eine Frage:
Habe nachdem ich die oben genannten Punkte geändert hatte gleich mal 
Matthias Code ausprobiert (hier die Prescaler auf 8 gesetzt). Habe die 
Signale dann mit einem Logik-Analyser angesehen (siehe Anhang). Ich 
halte es für sinnvoll was die High-Signale da tun, aber was tun denn da 
die Lows??? Zumindest erklärt das weshalb der Motor nur zuckt

Wie funktioniert das mit dem Bootstrap, wenn das Low-Signal so lange auf 
Null liegt??

Schorsch

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Georg T. schrieb:
> Matthias, was für einen Quarz benutzt du?? 1MHz??

Steht im Schaltplan: 16MHz.

Georg T. schrieb:
> Ich
> halte es für sinnvoll was die High-Signale da tun, aber was tun denn da
> die Lows???

Nee, du hast völlig übersteuert. Dreh mal bitte das V/f Verhältnis 
runter auf normale Werte. Du siehst dann zwei invertierte Sinus-PWM auf 
jeder Phase.

von Georg T. (microschorsch)


Lesenswert?

Hallo zusammen,

geschafft: Der Motor dreht sich. Es waren doch nochmal zwei IRs kaputt 
gegangen ohne Rauchwolken von sich zu geben, neue eingebaut und dann 
gings los:

Ich habe einen einfachen Code geschrieben, mit dem ich es schaffe, den 
Motor zum drehen zu bringen (hier nur die ISR, der Rest sollte in etwa 
klar sein):
1
ISR(TIMER1_CAPT_vect) {
2
  if (deg < 91) {
3
    index0A = deg;
4
    index0B = 0;
5
  } else if (deg < 181) {
6
    index0A = 180-deg;
7
    index0B = 0;  
8
  } else if (deg < 271) {
9
    index0A = 0;
10
    index0B = deg -180;
11
  } else {
12
    index0A = 0;
13
    index0B = 360-deg;  
14
  }
15
  
16
  if (deg < 31) {
17
    index1A = 0;
18
    index1B = deg + 60;  
19
  } else if (deg < 121) {
20
    index1A = 0;
21
    index1B = 120 -deg;  
22
  } else if (deg < 211) {
23
    index1A = deg - 120;
24
    index1B = 0; 
25
  } else if (deg < 301) {
26
    index1A = 300 -deg;
27
    index1B = 0;
28
  } else {
29
    index1A =0;
30
    index1B =deg - 300;
31
  }
32
  
33
  if (deg < 61) {
34
    index2A = 60 - deg;
35
    index2B = 0;
36
  } else if (deg < 151) {
37
    index2A = 0;
38
    index2B = deg - 60;  
39
  } else if (deg < 241) {
40
    index2A = 0;
41
    index2B = 240 -deg;
42
  } else if (deg < 331) {
43
    index2A = deg - 240;
44
    index2B = 0;
45
  } else {
46
    index2A = 420 - deg;
47
    index2B = 0;
48
  }  
49
    
50
   
51
  
52
  OCR0A = sinTab[index0A];
53
  OCR0B = 255-sinTab[index0B];
54
  OCR1A = sinTab[index1A];
55
  OCR1B = 255-sinTab[index1B];
56
  OCR2A = sinTab[index2A];
57
  OCR2B = 255-sinTab[index2B];
58
  counter++;
59
  if (counter == 30) {
60
    deg += 30;
61
    counter = 0;
62
  }
63
  if (deg >= 360) deg = deg-360;  
64
  
65
  
66
}

Ob ich in der sinTab (ein array von 0-90 für sin(0) bis sin(90)) einen 
reinen Sinus hinterlege, oder das was Matthias eine Popokurve nennt, 
spielt keine Rolle, in etwa selbe Performance, möglicherweise ist das 
bei anderen Spannungen aber anders.

Nun zu meiner Frage - ich habe mir ansehen, wie Matthias das in seinem 
Code gemacht hat, anscheinend kann er einfach indices in der Tabelle 
überspringen - gewissermaßen, ohne das counter-gedöns am ende der ISR 
einfach deg+=2 machen. Wenn ich das versuche, dreht sich der Motor zwar, 
schüttelt sich dabei allerdings. Das selbe, wenn ich deg gewissermaßen 
halbiere (mit counter nur jedes zweite mal inkrementiere) ich habe aber 
den Eindruck, dass der Motor mehr Drehmoment bekommt, je weniger 
Schritte ich insgesamt mache, also counter und deg auf 10, 20 oder gar 
30.

Ich freu mich, dass ich so weit gekommen bin, aber ich würde mich noch 
mehr freuen, wenn ich die Geschwindigkeit verändern könnte.... 
Vorschläge??

Schorsch

: Bearbeitet durch User
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.