Forum: Mikrocontroller und Digitale Elektronik BLDC ansteuerung die x-te


von Tom F. (tomfox)


Lesenswert?

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 ?

von ich (Gast)


Lesenswert?

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.

von Tom F. (tomfox)


Lesenswert?

ä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...

von ich (Gast)


Angehängte Dateien:

Lesenswert?

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.

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


Lesenswert?

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.

von ich (Gast)


Lesenswert?

Danke für die Ergänzung, Matthias!

von Tom F. (tomfox)


Lesenswert?

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 ?

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


Lesenswert?

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.

von Tom F. (tomfox)


Angehängte Dateien:

Lesenswert?

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 ?

von Tom F. (tomfox)


Lesenswert?

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 ?

von Dennis H. (t1w2i3s4t5e6r)


Lesenswert?

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

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


Lesenswert?

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
von Tom F. (tomfox)


Lesenswert?

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 ?

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


Lesenswert?

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
von Dennis H. (t1w2i3s4t5e6r)


Lesenswert?

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
Noch kein Account? Hier anmelden.