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
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
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.
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
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
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
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
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.
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
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.
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
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
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.
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
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.
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
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
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
staticvoidTimersWaitForNextPWMCycle(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:
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
registervolatileVFDflags_tfastFlagsasm("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
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.
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
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
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.
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
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.
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
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.
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
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.
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
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.
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
}elseif(deg<181){
6
index0A=180-deg;
7
index0B=0;
8
}elseif(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
}elseif(deg<121){
20
index1A=0;
21
index1B=120-deg;
22
}elseif(deg<211){
23
index1A=deg-120;
24
index1B=0;
25
}elseif(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
}elseif(deg<151){
37
index2A=0;
38
index2B=deg-60;
39
}elseif(deg<241){
40
index2A=0;
41
index2B=240-deg;
42
}elseif(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