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.
Hier wird alles schön erklärt: http://www.youtube.com/watch?v=Dg5AIy0bY1A Popcorn Schlagsahne und saure Gurken zur Seite .. perfekt !
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
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
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.
:
Bearbeitet durch User
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 | 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?
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
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
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.
:
Bearbeitet durch User
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.
:
Bearbeitet durch User
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 | } 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.