Für mein Projekt würde ich gerne einen BLDC via FET-Halbbrücke und PWM mittels STM32 controller und Blockkommutierung ansteuern. Leider scheitere ich schon an der Theorie. Ich habe gelesen das Hi- und Low Side Transistoren invers gesteuert werden müssen mit deadtime wegen shoot-through. OK hab ich verstanden. Weiterhin habe ich gelesen dass für die MOSFET Treiber (z.B. IR2183) meist eine Bootstrap Schaltung verwendet wird und daher der Lowside FET mit PWM angesteuert wird um den Bootstrapzweig zu laden. OK leuchtet auch ein. Wenn aber nun laut vorgegebenem Pattern die Phase1 Lowside und Phase2 Highside angesteuert werden sollen, wie soll da ein Stromfluss zustande kommen wenn die beiden FETs invers mit deadtime angesteuert werden ? Wo liegt mein denkfehler ?
Tom Fox schrieb: > Wenn aber nun laut vorgegebenem Pattern die Phase1 Lowside und Phase2 > Highside angesteuert werden sollen, wie soll da ein Stromfluss zustande > kommen wenn die beiden FETs invers mit deadtime angesteuert werden ? Die Deadtime gilt für jeweils eine Halbbrücke, spricht Phase. Deren Highside und Lowside dürfen nicht gleichzeitig angesteuert werden. Dein Beispiel passt schon. Phase1-low und Phase2-high verursacht einen Stromfluß durch die Motorwicklungen 1 und 2, bis zur nächste Kommutation.
äh, deadtime innerhalb eine halbbrücke ist logisch. Aber es wird doch auch brückenübergreifend invers angesteuert oder ? Wenn Phase1-Lowside 1 ist und gleichzeitig Phase2-High 0 (inverse Ansteuerung) dann gibt es doch keinen Stromfluss. kopfkratz...
Tom Fox schrieb: > äh, > deadtime innerhalb eine halbbrücke ist logisch. > Aber es wird doch auch brückenübergreifend invers angesteuert oder ? > Wenn Phase1-Lowside 1 ist und gleichzeitig Phase2-High 0 (inverse > Ansteuerung) dann gibt es doch keinen Stromfluss. > > kopfkratz... Dann ist eben Phase3-highside eingeschaltet. Es ist immer genau eine Phase low und eine Phase high durchgeschaltet, niemals zwei oder gar keine. Schau dir mal das Kommutations-Diagramm an, da ist immer nur eine highside und eine lowside aktiv.
ich hat den bei PWM gegebenenen Fall für 'Vollgas' (100% PWM) gezeichnet. Jetzt stell dir nur noch vor, die ansteuernden Blöcke sind PWM moduliert. Am einfachsten erreichst du das beim STM32, indem du ganz simpel die Timer PWM (am besten einen der Advanced Timer) auf die GPIO Pins routest, und diese nach Kommutierungsschema jeweils auf Input stellst zum Sperren. Die drei Compare Register CC1,CC2 und CC3 schreibst du mit dem gewünschten Amplitudenwert. Das hat übrigens den Vorteil, das du in Zukunft auch mit SVM bzw. Sinusmodulation spielen kannst.
sorry ich habe leider immer noch nicht begriffen also ich schrieb: >Phase1-low und Phase2-high verursacht einen >Stromfluß durch die Motorwicklungen 1 und 2, bis zur nächste >Kommutation. Ja aber nur wenn beide FETs gleichzeitig durchgesteuert werden. Wenn Phase2 high invers zu Phase1-Low ist dann nicht. Ich habe mir diesen Artikel angesehen. http://www.mikrocontroller.net/articles/STM32_BLDC_Control_with_HALL_Sensor So wie ich das verstehe sind alle 3 High-side und Low-side Ausgänge complementär zueinander. D.h. wenn der Lowside an ist ist der Higside (auch die der anderen Phasen)aus. Wenn jetzt z.B. TIM_CC2N_Enable(Lowside Phase2) und TIM_CC3_Enable(Highside Phase3) sind dann werden doch nie beide FETs gleichzeitig durchgesteuert sondern immer komplementär, also kein Stromfluss. Kann mir das noch einmal einer erklären ?
Tom Fox schrieb: > Kann mir das noch einmal einer erklären ? Klar - die Highside und die Lowside schalten ja im Rhythmus der PWM abwechselnd ihren Knotenpunkt zwischen High und Low. Resultierend daraus steht da also eine (über die Induktivität der Last) gerundete Analogspannung. Wenn die Highside also z.B. 90% der Zeit durchsteuert und die Lowside die restliche 10% (von der Totzeit sehen wir mal ab), steht da also gemittelt 90% der verfügbaren Versorgungsspannung. Das gilt natürlich für alle 3 Brücken. BLDC Motore richten sich in ihrer Drehzahl nach dem Strom, der durch sie fliesst. Drehst du die PWM auf, dreht der Motor schneller. Ein Motor mit Sensoren schaltet durch die 3 Signale einfach die Kommutierung weiter - siehe ichs Schema. Die PWM bleibt dabei gleich auf allen 3 Phasen, es wird nur Brücke aktiviert oder deaktiviert. Hier z.B. ist die Kernroutine für Block Kommutation aus einem meiner STM32 Projekte, STM32F103, Timer 1 ist hier der Advanced Timer:
1 | // PHASES to position in TIMx_CCER register
|
2 | |
3 | #define UH 0x0004
|
4 | #define UL 0x0001
|
5 | |
6 | #define VH 0x0040
|
7 | #define VL 0x0010
|
8 | |
9 | #define WH 0x0400
|
10 | #define WL 0x0100
|
11 | // tables organized for enabling bits in TIMx_CCER
|
12 | const uint16_t blockCommutationTableForward[8] = |
13 | {
|
14 | 0, // illegal value |
15 | WH | UL, |
16 | UH | VL, |
17 | WH | VL, |
18 | VH | WL, |
19 | VH | UL, |
20 | UH | WL, |
21 | 0 // illegal value |
22 | };
|
23 | /*! \brief Block commutation port direction masks, reverse driving.
|
24 | *
|
25 | * This array contains port direction masks for block commutation
|
26 | * when running in the reverse direction.
|
27 | */
|
28 | const uint16_t blockCommutationTableReverse[8] = |
29 | {
|
30 | 0, |
31 | UH | VL, |
32 | VH | WL, |
33 | UH | WL, |
34 | WH | UL, |
35 | WH | VL, |
36 | VH | UL, |
37 | 0
|
38 | };
|
39 | |
40 | /* Block Commutate does the activation of OC outputs according to the
|
41 | * supplied Hall Sensor Code
|
42 | */
|
43 | void BlockCommutate(uint16_t hall) |
44 | {
|
45 | if (fastFlags.desiredDirection == DIRECTION_REVERSE) |
46 | {
|
47 | TIM1->CCER = blockCommutationTableReverse[hall] ; |
48 | }
|
49 | else
|
50 | {
|
51 | TIM1->CCER = blockCommutationTableForward[hall] ; |
52 | }
|
53 | }
|
Die BlockCommutate() Routine wird hier von allen 3 Pin Interrupts der Hallsensoren aufgerufen und bekommt als Eingangswert den Stand der Sensoren (Position 0x001 bis 0x110). 0x000 und 0x111 kommen nie vor.
Vielen Dank für euere Geduld mit mir Matthias Sch. schrieb: >const uint16_t blockCommutationTableForward[8] = >{ > 0, // illegal value > WH | UL, > UH | VL, ... d.h im Falle von WH | UL bei 50% PWM (Totzeit nicht gezeigt) müssen die Signale der Hallbrücken W und U so aussehen wie auf meinem ok Bild und nicht wie auf dem nok Bild. Richtig ?
tomfox schrieb: >müssen die Signale der Hallbrücken W und U so aussehen wie auf meinem ok >Bild und nicht wie auf dem nok Bild. >Richtig ? hat keiner eine Antwort ?
auf dem NOK-Bild würde nie Strom fließen, wenn entweder High oder Low angeschalten sind. Es muss schon Strom fließen können. Also wenn dann wie auf dem OK-Bild. Aber auch dort sieht es zumindest bei mir anders aus. Die Low-Side lasse ich dauerhaft durchgeschalten. Also bis zur nächsten Kommutierung, dann ist natürlich ne andere Low-Side dran. Und nur die High-Side versorge ich mit PWM. Und in dem Zweig, der gerade mit High-Side versorgt wird, kannst du während der Off-Zeit die Low-Side durchschalten. Das hält die Fets kühler. Das nennt man dann aktiven Freilauf. Wenn du das umsetzen willst, benötigst du die Totzeit beim umschalten. Falls du das jetzt nicht ganz verstanden hast, sags einfach, ich mal dir auch gern noch ein Bild, wo es vielleicht verständlicher wird. Dennis
Schau dir das Bild in ichs Beitrag doch nochmal an. Da sind die verschiedenen Phasen Ia, Ib und Ic. Am unteren Rand des Bildes sind die 6 Sektoren abgebildet. Meine Hallnummern müssen jetzt nicht unbedingt mit dem Bild übereinstimmen, aber das Prinzip ist in der Tabelle immer, das eine Phase high ist (optional mit PWM) und eine Phase auf Low, die dritte ist inaktiv. Dadurch fliesst Strom im Motor. Das siehst du auch im Bild. Tom Fox schrieb: >> WH | UL, heist zum Beispiel Phase W ist high und Phase U ist Low. Meine #defines erleichtern einfach nur den Überblick. Ich kann dann einfach das gewünschte Phasenmuster ins CC Enable Register schreiben.
:
Bearbeitet durch User
Dennis H. schrieb: > Die Low-Side lasse ich dauerhaft durchgeschalten. Da ich Bootstrapping für die FET-Treiber einsetzen wollte muss ich wohl auch die Lowside FETs mit PWM betreiben. Nochmal zum Verständnis In meinem obigen Link wird TIM1 so bedated: TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High; Ich dachte dies führt genau zu dem Komplementärverhalten in meinem Nok Bild. Ist das so oder gilt Komplementär nur innerhalb einer Halbbrücke ?
Tom Fox schrieb: > In meinem obigen Link wird TIM1 so bedated: Sieht richtig aus, wenn du Brückentreiber oder andere positive Logik benutzt - high führt zum Durchschalten der jeweiligen Endstufe. Hast du den 'OutputState' freigegeben?
1 | /* Channel 1, 2 and 3 Configuration in PWM mode */
|
2 | TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; |
3 | TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; |
4 | TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; |
5 | TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; |
6 | TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High; |
7 | TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set; |
8 | TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Set; |
9 | // preset to OFF
|
10 | TIM_OCInitStructure.TIM_Pulse = 0x0000; |
11 | TIM_OC1Init(TIM1, &TIM_OCInitStructure); |
12 | TIM_OC2Init(TIM1, &TIM_OCInitStructure); |
13 | TIM_OC3Init(TIM1, &TIM_OCInitStructure); |
:
Bearbeitet durch User
Tom Fox schrieb: > Da ich Bootstrapping für die FET-Treiber einsetzen wollte muss ich wohl > auch die Lowside FETs mit PWM betreiben. Nein, da hast du bisschen was falsch verstanden. Ich nutze auch IR2101 und mache das genau so. Die Low-Side kannst du ohne Probleme dauerhaft einschalten, da ist nur ein einfacher Transistor dahinter. Aber die High-Side kannst du nicht dauerhaft einschalten. Diese musst du mit PWm betreiben und in den Pausen die Lowside durchschalten, damit sich der Kondi wieder aufladen kann. Ich dachte erst, es reicht, die High-Side einfach kurz auszuschalten und dann wieder ein, funktioniert aber nicht, die Lowside muss durchgeschalten werden, um den Kondi zu laden. So wars zumindest mit meinen IR21xx. Dennis
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.