Brushless Motor an DC.

Fighter

User
Hallo

Ich habe eine Frage.

Ich möchte an meiner Turbine den DC – Startermotor gegen einen Brushless Motor tauschen.

An der Turbinenelektronik kommen zur Drehzahl Regelung des Startermotors 0 – 12 Volt heraus.

Kann ich diese 0-12 Volt irgendwie verwenden und einen Brushless-Regler anzusteuern

um einen Brushless Innenläufer zu regeln.

MfG. Joachim
 

S_a_S

User
hallo Joachim,
frei nach Radio Eriwan: ja, aber...

Die PWM von der Bürstenmotoransteuerung könnte man digital abgreifen und als Prozentwert verarbeiten (alternativ über RC-Glied, Analogspannung und ggf. A/D-Wandler), daraus ein Servosignal berechnen und damit an den Eingang der Brushless-Stellers gehen.
Weil der aber vermutlich noch eine Startsequenz hat (Anlaufschutz...) wird das nicht als einfache NE555-Timerschaltung zu realisieren sein, sondern in der Regel einen kleinen Microprozessor (z.B. unter Arduino) dazu brauchen.
Inwieweit die Turbinenelektronik da noch Kennfeld/Regelung für den Bürstenmotor anwendet, das bei Verwendung des Brushless dann nicht mehr optimiert ist, müsste man noch genauer ansehen.

Grüße Stefan
 
Noch einfacher wäre es, einen Brushlessregler anzuschließen, dem an dem Eingang einen Servotester zu spendieren und die Drehzahlregelung auf feste 12V einzustellen.
 

UweHD

User
Noch einfacher wäre es, einen Brushlessregler anzuschließen, dem an dem Eingang einen Servotester zu spendieren und die Drehzahlregelung auf feste 12V einzustellen.
Ich fürchte, dass so ein Turbinen-Startermotor nicht einfach mit einer festen Drehzahl bzw. Leistung betrieben wird.
Aber dazu können die Turbinenspezis hier sicher mehr sagen
 
Achja, es gibt natürlich auch fest verbaute Startermotoren. An einem Rowenta Staubsaugermotor (Brushless) ist eine kleine Platine, die direkt mit DC ohne weiteres Signal betrieben wird, hier bestimmt die DC Spannung die Drehzahl (im begrenztem Spannungsbereich). vielleicht gibt es auf dem Markt einfache Steuerplatinen ohne PWM Eingang.
 

Fighter

User
Hallo
Es ist so das die Turbinenelektronik den Starter-Motor Proportional ansteuert.
Zum Beispiel 3V beim Vorheizen dann auf 5V hochdrehen und dann von 5V
bis 12V die Drehzahl erhöht.
MfG. Joachim
 

S_a_S

User
Joachim,
das könnte von der Beschreibung auch nur ein Stellen auf 25%, 40% und dann linear bis 100% hoch. Wenn die Drehzahl dann nicht erreicht wird, gibt es Fehlermeldung zum Austausch des Motors... Mit anderem Motor kommen andere Drehzahlen zusammen - und wenn das nicht passt, vielleicht auch zur Fehlermeldung.
Der Ansatz, da einen "spannungsgesteuerten" Auto-Kommutator (Staubsauger) dahinter zu hängen, ist bei nur 3V vermutlich nicht zielführend. Und wenn das getaktetes Signal ist (üblicherweise Leistungs-PWM), kommt die Elektronik auch nicht ohne weitere Glättung klar.

Aber ich gehe davon aus, dass dies eine Regelung ist, die Turbine hat ja einen Drehzahlsensor. Ist das Drehzahlniveau zu niedrig, wird die Spannung so langen erhöht, bis die Zieldrehzahl erreicht ist, und auch angepasst, wenn der Motor abgebremst wird. Bei Deinem Motor eben die 3V/5V...).
Mit Umsetzer und Brushlessregler dazwischen kommt es dann zu anderen Spannungslagen, aber ggf. auch zu zusätzlichen Verzögerungen - und das kann dann zu Instabilität der Regelung führen (Pendeln der Drehzahl). Ob die Biene dann immer noch startet, kann man dann ja testen.

Grüße Stefan
 

Gerd Giese

Moderator
Teammitglied
Ich möchte an meiner Turbine den DC – Startermotor gegen einen Brushless Motor tauschen.
Frage: welchen Vorteil erwartest Du dadurch?🤔
Ich täte den wieder durch einen gleichen Gleichstrommotor auswechseln.
Einfacher und zuverlässiger geht's nimmer ... 😉
 

Fighter

User
Hallo.
Die 3V 5V und 12V waren nur anhaltswerte. Ich gebe in der Turbinen - Steuerung
die werte an. Ich kann auch 1.7V und 4,3V und 9,9V eingeben.
Welcher Vorteil: Es ist eine Kleine Turbine und die brauicht schon min 30000 U/min auf dem
Anlasser. Es gibt keinen guten 300er Motor der das kann. Und der Brushless ist Kugellgelagert.
MfG. Joachim
 
Hallo Joachim,

mit einem kleinen PIC Controller sollte die BLDC-Steuerung gehen.
Das folgende gcbasic Programm gibt alle 10 ms einen Pulse mit der Länge zwischen 1 ms und 2 ms abhängig von der eingelesenen
Spannung (RPM_COMD) der Turbinenelektronik aus. Die Spannung am ADC muss zwischen 0 V und 5 V liegen.

0 V = 1ms (0 %)
2.5 V = 1.5 ms (50 %)
5 V = 2 ms (100 %)

Das Programm (Main Loop) wird über einen Timer Interrupt (Overflow) alle 100 us aufgerufen. Das Drehzahlkommando wird am ADC Eingang (RPM_COMD) eingelesen. Der ADC-Wert ist eine 8-Bit (255) Größe und wird auf max. 255/25 (= 5V) normiert.
Die eingelesene Spannung (0V - 5V) wird mit einer Auflösung von 100 us als PPM Signal ausgegeben.

Zum PIC wird ein 5 Volt Spannungsregler (z. B.) µA 78L05 als Supply benötigt. Die Spannung aus der Turbinenelektronik
zur Drehzahlregelung muss über einen Spannungsteiler auf 5 V heruntergeteilt werden.

Das Programm ist so gestaltet, dass keine spezielle Hardwarefunktion (PWM-Modul) vom PIC oder ATtiny Controller benötigt wird.
Es geht also jeder kleine 8-bit PIC oder ATtiny Controller mit einem ADC.


Code:
'  Voltage to PPM
'  0 V   = 1 ms
'  2.5 V = 1.5 ms
'  5 V    = 2 ms
'
'              -----------
'  V+        -| 1       8 |- GND
'  RA5       -| 2       7 |- RA0 RPM_COMD (0V - 5V)
'  RA4       -| 3       6 |- RA1
'  RA3       -| 4       5 |- RA2 PWM
'              -----------
'
'Chip model
#chip 12F1572,16
#config OSC=INTOSC, PWRTE = ON

#define FRAME_RATE_10ms 100 '100*100us

#define RPM_COMD AN0 'ADC
dir PORTA.0 in

#define PWM PORTA.2
dir PWM out

dim counter_pwm as byte
dim counter, counter1 as byte
dim task_go as bit

counter_pwm = 0
counter = 0
counter1 = 0
task_go = 0


'------------------------------------------------------------------------------
'Initialize the timer1 with prescaler of 1:4, 1 timer tick = 1 us
InitTimer1 Osc, PS1_4

'Set timer1 overflow to 100 timer ticks (100 us)
#define OVERFLOW_TICKS 100
#define TIMER_TICKS_16BIT 65535
#define TIMER_1H (TIMER_TICKS_16BIT - OVERFLOW_TICKS) / 256
#define TIMER_1L (TIMER_TICKS_16BIT - OVERFLOW_TICKS) % 256

TMR1L = TIMER_1L
TMR1H = TIMER_1H
StartTimer 1

On Interrupt Timer1Overflow Call Timer1_ISR

'----------------------------- Main Loop --------------------------------------
Do ' every 100 us
   if (task_go = 1) then
       if (counter1 = FRAME_RATE_10ms) then
          counter1 = 0
          counter = 0
       end if

       if (counter1 = 1) then
          counter_pwm = ReadAD(RPM_COMD)/25 + 10
          set PWM on
       end if

       if (counter > counter_pwm) then
          set PWM off
       end if

       task_go = 0
   end if
Loop
'----------------------- subs -------------------------------------------------
sub Timer1_ISR 'every 100 us
    TMR1L = TIMER_1L
    TMR1H = TIMER_1H
    counter++
    counter1++
    task_go = 1
end sub
'------------------------------------------------------------------------------

Gruss
Micha
 
Zuletzt bearbeitet:

S_a_S

User
Micha,
nettes Programm und sehr kompakte Lösung.
Aber das sind ja nur 10 Drehzahlstufen (1000...2000µs in 100µs Schritten) + Aus.
Kann der Chip das auch mit kürzerer Schleifenzeit - oder ist da Basic bzw. die HW am Limit?

Grüße Stefan
 
Hallo Stefan,

das Basic wird in einen sehr effizienten ASM-Code übersetzt. Das Hauptprogramm wird vom Timer Overflow getriggert, ich kann die
OVERFLOW_TICKS z. B. auch auf 50 us setzen, dann wären das 20 Drehzahlstufen. Allerdings müssen die Counter dann angepasst werden.
Für eine Drehzahlregelung zum Starten sollte das so genügen.

Man kann auch über das Capture and Compare Modul (CCP) vom 12F1572 einen PWM mit einem 16 Bit Timer realisieren.
So was mache ich dann jedoch mit Inline Assembler im gcbasic und würde hier zu weit gehen. Zudem hat nicht jeder kleine
DIP-8 PIC ein Hardware CCP-Modul.

Copy vom Compiler Ergebnis:
Compiler Version: 0.98.07 2021-07-24 (Windows 64 bit) : Build 1005 Program Memory: 255/2048 words (12,45%) RAM: 13/256 bytes (5,08%)

Mit einer eigenen ADC Funktion wird das Programm noch schneller und kleiner. :D

Code:
'ADC channel AN0, Vref = 5 Volt
'ADC init

'set PORTA.0 as RPM_COMD input
bsf TRISA,0

'AN0 is ADC input
bcf ADCON0,CHS0
bcf ADCON0,CHS1
bcf ADCON0,CHS2
bcf ADCON0,CHS3
bcf ADCON0,CHS4

movlw B'00100000' ;Left justify, FOSC/32, Vref = Vdd
movwf ADCON1
bsf ADCON0,ADON   ;Turn ADC On
'------------------------------------------------------------------------------
function GET_ADC as byte
    dim A_Delay as byte

    ;Acquisiton delay
    A_Delay = 8 '22 us delay
    LABEL_INC:
    A_Delay--
    if (A_Delay <> 0) then goto LABEL_INC
    ;end Acquisiton delay
    ADCON0.GO = 1 ;Start conversion
    LABEL_ADCONV:
    if (ADCON0.GO = 1) then goto LABEL_ADCONV  ;Is conversion done? No, test again
    GET_ADC = ADRESH   ;Store upper 8 bits
end function

Gruss
Micha
 
Hallo Stefan,

noch die hochauflösende und sehr kompakte Lösung. Das Servo oder ESC Kommando wird über den 10-BIT ADC eingelesen.
Die Pulslänge wird dann in das 16-Bit Timer 1 Register geschrieben. Der PPM Ausgang wird auf High (5V) gesetz.
Nach ablauf der counter_ppm Ticks wir ein Interrupt (Timer 1 Überlauf) ausgelöst, das Unterprogramm Timer1_ISR wir aufgerufen und der PPM Ausgang wird auf Low (0V) gesetzt. Nach beendigung vom Timer1_ISR Unterprogramm wird das Hauptprogramm fortgesetzt.

Hab es gerade auf einem alten Testbord mit einem 5V Regler und Poti als Kommandogeber mit einem Servo getestet. :D

Code:
'  DC Voltage to PPM
'  0 V   = 1 ms
'  2.5 V = 1.5 ms
'  5V    = 2 ms
'
'
'              -----------
'  V+        -| 1       8 |- GND
'  RA5       -| 2       7 |- RA0 DC_CMD (0V - 5V)
'  RA4       -| 3       6 |- RA1
'  RA3       -| 4       5 |- RA2 PPM
'              -----------
'
'Chip model
#chip 12F1572,8
#config OSC=INTOSC, PWRTE=ON

#define OVERFLOW_TICKS_1ms 1000 ' us ticks
#define TIMER_TICKS_16BIT 0xFFFF

#define DC_CMD AN0 'ADC
dir PORTA.0 in

#define PPM PORTA.2
dir PPM out

dim counter_ppm as word
dim servo_cmd as word ' FS = 1023 (10-bit ADC) eq. to 1023 us

counter_ppm = 0
servo_cmd = 0
'------------------------------------------------------------------------------
'Initialize the timer1 with prescaler of 1:2, 1 timer tick = 1 us
InitTimer1 Osc, PS1_2 ' 16-BIT Timer

On Interrupt Timer1Overflow Call Timer1_ISR

'----------------------------- Main Loop --------------------------------------
Do
  servo_cmd = ReadAD10(DC_CMD)
  counter_ppm = (TIMER_TICKS_16BIT - OVERFLOW_TICKS_1ms) - servo_cmd
  TMR1H = counter_ppm_h ' Timer 1 register high byte
  TMR1L = counter_ppm   ' Timer 1 register low byte
  'StartTimer 1
  set TMR1ON on
  set PPM on
  wait 20 ms ' 20 ms für Analog Servos, z. B. 7 ms beim Futaba FAST als Frame Rate
Loop
'----------------------- subs -------------------------------------------------
sub Timer1_ISR ' called on Timer 1 (counter_ppm us ticks) overflow
    set PPM off
    'StopTimer 1
    set TMR1ON OFF
end sub
'------------------------------------------------------------------------------

Gruss
Micha
 
Ansicht hell / dunkel umschalten
Oben Unten