Forum: Mikrocontroller und Digitale Elektronik BLDC Driver Ansteuerung


von grundschüler (Gast)


Lesenswert?

Ich möchte einen STK621 3-Phasen-Motor-Driver möglichst einfach 
ansteuern. Mein code/m328:
1
u8 sinetable[24]=
2
    {49,99,148,198, 241,254,241,198, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0};
3
#define ul_OCR0A OCR0A
4
#define uh_OCR0B OCR0B
5
#define vl_OCR1A OCR1A
6
#define vh_OCR1B OCR1B
7
#define wl_OCR2A OCR2A
8
#define wh_OCR2B OCR2B
9
v u16 zlxx;
10
v u8 sine_step;
11
u16 zl_led;
12
ISR(TIMER0_COMPA_vect)
13
{
14
zlxx++;
15
    if (zlxx>5){//Schwellwert steuert Frequenz
16
17
        if(sine_step!=8){//no deadtime
18
            ul_OCR0A=sinetable[sine_step];
19
            uh_OCR0B=sinetable[(39-sine_step)%24];
20
        }
21
22
        if(sine_step!=16){//no deadtime
23
            vl_OCR1A=sinetable[(16+sine_step)%24];
24
            vh_OCR1B=sinetable[(23-sine_step)%24];
25
        }
26
 
27
        wl_OCR2A=sinetable[(8+sine_step)%24];
28
          if(sine_step==0){//deadtime
29
                _delay_us(3);
30
            }
31
        wh_OCR2B=sinetable[(31-sine_step)%24];
32
 
33
34
 
35
        if(sine_step==8){//deadtime
36
            ul_OCR0A=sinetable[sine_step];
37
            _delay_us(3);
38
            uh_OCR0B=sinetable[(39-sine_step)%24];
39
        }
40
        
41
        if(sine_step==16){//no deadtime
42
            vl_OCR1A=sinetable[(16+sine_step)%24];
43
             _delay_us(3);
44
            vh_OCR1B=sinetable[(23-sine_step)%24];
45
        }
46
47
   zlxx=0;
48
    sine_step++;
49
    if(sine_step>23){
50
        sine_step=0;
51
        zl_led++;
52
        if(zl_led>600){
53
        zl_led=0;
54
        led1_tog;//Anzeige der Frequenz über Blinkdauer
55
        }
56
     }
57
//    timer_proc_10ms();
58
 
59
   }
60
}

Wenns irgend geht, würde ich gerne was Fertiges nehmen.
Gibts passende fertige Frequenzumrichter für einen GMCC DA110S1C-30FZ 
BLDC ca.1500W max?
Gibts fertige einfach einzusetzende chips für die Ansteuerung des 
stk621?
Gibts fertigen verständlichen code?

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


Lesenswert?

Ein 1500W BLDC? Hat der Motor denn keine Sensoren? Und mit den paar 
Stufen in deiner Sinustabelle kommt da nie im Leben was anständiges 
raus. Wenn du einen Mega328 benutzt, dann schau dir mal die AVR444 für 
sensorlose BLDC an oder die AVR447 für Motoren mit Sensoren (letztere 
macht auch gleich Sinusmodulation).

Wenn du nur Blockkommutation brauchst, ist es übrigens viel einfacher, 
die OC PWM einfach aktiv zu lassen und nur das Ausgangsmuster über DDR 
Masken weiterzuschalten. Das ist dann eine Tabelle mit 6 Schritten für 
die 6 Sektoren des Motors.

grundschüler schrieb:
> GMCC DA110S1C-30FZ

Darunter finde ich nur irgendeinen komischen Lüftermotor.

: Bearbeitet durch User
von grundschüler (Gast)


Lesenswert?

Matthias S. schrieb:
> Darunter finde ich nur irgendeinen komischen Lüftermotor.

Danke erstmal für dein Interessre. Ich kenne natürlich dein FU-Projekt 
und AN AVR447, auf die du verweist.

Die Tabellenwerte habe ich aus AN AVR447 ausgemessen. 24 Steps, um 
erstmal zu sehen, ob es mit dem m328 prinzipiell funktioniert. Das ist 
der erste Code-Entwurf. Die Anzahl der Steps kann sicher noch erhöht 
werden, wenn die Rechenleistung des m328 es hergibt. Um die 
Rechenleistung in der ISR zu reduzieren, werde ich für jede Halbbrücke 
eine eigene sinetable anlegen.  Bestellt habe ich bereits den m328pb, 
der hat zwei zusätzliche Timer, so dass ein separater Timer fürs 
Hauptprogramm zur Verfügung steht.

Aussagen zum Motor findet man z.B. hier:
http://www.areacooling.de/produkt/vollhermetischer-rollkolbenverdichter-gmcc/da110s1c-30fz
Er hat nur drei Anschlüsse, ist also sensorless.

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


Lesenswert?

grundschüler schrieb:
> Aussagen zum Motor findet man z.B. hier:
> 
http://www.areacooling.de/produkt/vollhermetischer-rollkolbenverdichter-gmcc/da110s1c-30fz
Da finde ich aber einen 1-phasigen 3,3 kW Motor.
> 24 Steps, um
> erstmal zu sehen, ob es mit dem m328 prinzipiell funktioniert.

Das ist unnötig, denn sowohl AVR447 als auch der 3-Phasenumrichter 
zeigen ja, das es geht. Ich will dir den Spass ja nicht nehmen, das Rad 
neu zu erfinden, aber im Allgemeinen kommt man schneller zum Ziel, wenn 
man schon was fertiges nimmt und darauf aufbaut. In deinem Fall wäre das 
die Konstruktion einer Mörder-Endstufe, um deinen Motor anzusteuern.

von grundschüler (Gast)


Lesenswert?

Matthias S. schrieb:
> Da finde ich aber einen 1-phasigen 3,3 kW Motor.

In den Details:
Motorart DC Inverter

3,3kW ist die Kälteleistung bei 846Watt elektrischer Aufnahme bei 
bestimmten Randbedingungen. Das Teil hat drei Anschlüsse und wird 
mittels STK621/Inverter angesteuert. Es ist ein BLDC-Kompressor, der in 
vielen Inverter-Klimaanlagen eingebaut wird.

>Ich will dir den Spass ja nicht nehmen...
Ich will das Rad nicht neu erfinden und soweit möglich auf Vorhandenes 
zurückgreifen. Die Mörder-Endstufe ist mit dem stk621 ja bereits fertig 
vorhanden.

Es fehlt halt nur die logiclevel-Ansteuerung der 6 Halbbrücken. Das 
code-example zu AVR447 scheint nur eine Blockkommutierung und keine 
pwm-Ansteuerung zu enthalten. Ich werde mir dein FU-Projekt aber auch 
nochmal daraufhin ansehen, ob man die sinetable für einen BLDC abänder 
kann. Wahrscheinlich ist dann aber die Entwicklung eines eigenen 
BLDC-Programms einfacher, zumal ich den m328pb verwenden kann.

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


Lesenswert?

grundschüler schrieb:
> Das
> code-example zu AVR447 scheint nur eine Blockkommutierung

Aber keineswegs. AVR447 startet einen Sensor-BLDC zwar im Blockmodus, 
schaltet aber dann auf Sinus um. Der Titel lautet:
> AVR447: Sinusoidal driving of three-phase
> permanent magnet motor using
> ATmega48/88/168

von karl (Gast)


Lesenswert?

Welche Form hat die induzierte Spannung? Sinus ist nicht immer das 
Mittel der Wahl. Bei dem was man  üblicherweise BLDC nennt ist es 
richtig gehend falsch. Blockkommutierung FTW.

von grundschüler (Gast)


Lesenswert?

Matthias S. schrieb:
> Aber keineswegs.
1
 * \par Application note:
2
 * AVR443: Sensorbased control of three-phase BLDC motor
3
 * \par
4
5
/*! \brief Set motor speed.
6
 *
7
 * Updates the output compare registers of the timer 0 and timer 2 which
8
 * control the duty cycle of the PWM output and thereby the speed of the
9
 * motor. The method used ensures that that all PWM channels are behaving
10
 * same duty cycle.
11
 *
12
 *  \param speed Compare match value that defines PWM duty cycle.
13
 *
14
 *  \return void
15
 */
16
static void Set_Speed(unsigned char speed)
17
{
18
  TIFR0 = TIFR0;    // Clear TC0 interrupt flags
19
  while( !(TIFR0 & (1<<TOV0)));  // Wait for TOV to ensure that all registers are
20
                            //  updated in the same timer cycle
21
  __disable_interrupt();
22
  OCR0A = speed;        // Change the duty cycle
23
  OCR0B = speed;
24
  OCR2B = speed;
25
  __enable_interrupt();
26
}

Ich finde in dem code weder Sinustable noch Sinusberechnung. Außerdem 
habe ich weder Hallsensoren noch shunt, also sensorless. Wenn ich den 
code nicht verstehe - bin kein Informatiker - schreib ich ihn lieber 
vereinfacht selbst.


karl schrieb:
> Welche Form hat die induzierte Spannung?
> Bei dem was man  üblicherweise BLDC nennt ist Sinus richtig gehend
> falsch.

Oh je, wenn ich das wüsste. Das Datenblatt stk621 gibt zur Ansteuerung 
nicht viel her. Ich warte noch auf ein 15V Steckernetzteil für die 
Versorgung des stk621, wenn ich das habe, werde ich Sinus und Block mit 
20Hz einfach mal ausprobieren. Lässt sich in der sinetable ja leicht 
ändern.



Am besten wär wohl ein fertiger -passender- BLDC-FU. Wäre für 
Empfehlungen dankbar.

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.