Řízení Brushless DC motoru 57BLF03 s driverem BLDC-8015A pomocí Arduina autor: Johny, arduino, dne 1.1.2020 Rozhodl jsem se vyzkoušet BLDC motoru od Longs motor vybavený hallovou sondou. Konkrétně jde o motor 57BLF03 a řídící desku BLDC-8015A – na odkazu je jiný driver (DCBL-0115A), ale zdá se, že jde jen o jiné označení pro stejné zařízení. Vše ostatní sedí. Motor i driver jsem koupil na eBay za v přepočtu cca 3000 Kč. Příjemě mě potěšila rychlost dopravy – z Číny do ČR to zvládli za 2 dny! Bohužel další 3 dny to vyselo na celnici a bylo mi dopočteno DPH asi 550Kč + 490Kč za zprostředkování proclení firmou DHL. Mizerové!!! Ukázka zapojení Funkční zapojení na mém stole. Brushless DC motor 57BLF03 Jedná se o kombinaci krokového a Brushless DC motoru. V podstatě jde o obyčejný brushless DC motor (inrunner), který navíc obsahuje 3× hallovu sonda. Díky tomu má řídící jednotka informaci o tom, jak se motor „otáčí“ a může počítat „kroky“, případně motor krátkodobě přetížit bez rizika poškození – ví, že se pootočil. Motor tak spojuje výhody krokového a DC motoru. Rozsah otáček je od nuly do cca 3000 ot/m a co je největší výhoda – v celém rozsahu otáček má téměř konstantní kroutící moment 0.6Nm−1. V peaku pak dokáže až 1.8Nm−1. Efektivita motoru je kolem 0.066 N-m−1/A. Udávaný výkon motoru je 188W, maximální otáčky jsou 3000RPM. Řídící jednotka dokáže motor ovládat na základě analogového vstupu nebo PWM signálu. Je třeba ovládat i směr (samostatně) a navíc je možné využít elektronickou brzdu. (Tu zatím nepoužívám). Příjemné je, že řídící jednotka očekává 5V signál a deklaruje max. spotřebu 5mA – což nám dá možnost přímého připojení Arduina. Videoukázka zapojení a funkce Finální podoba testovacího zapojení včetně ukázky debug výpisu v serial monitoru. Zapojení motoru a napájení Napájení je libovolné stejnosměrné napětí 24V a cca 200W. Já bohužel na testování 24V zdroj nemám, napájím tedy motor i driver 18V a vše funguje. Označení na driveru Color Barva kabelu DC+ VCC +24V + napájení 24V DC- GND – neboli zem 24V U YELLOW Žlutý kabel V GREEN Zelený kabel W BLUE Modrý kabel Zapojení motoru – hallovy sondy Hallovy sondy potřebují napájení. To nám poskytuje přímo driver. Dle výrobce by napájení hallových sond mělo být mezi 5V a 20V. Z driveru jde asi 14V. Dále motor obsahuje tři vodiče, žlutý, zelený a modrý. Každá barva analogicky odpovídá cívce z napájení, tedy je zde analogie HW=W(modrá), HU=U(žlutá), HV=V(zelená). Označení na driveru Kabel Popis REF- BLACK – GND Černý kablík (zem) HW BLUE Modrý HV GREEN Zelený HU YELLOW Žlutý REF- RED – VCC Červený Driver dále obsahuje dva přepínače – dipswitche. Pro nás je důležitý hlavně switch 2 – je třeba ho přepnout do polohy OFF – tím dáme najevo, že chceme driver řídit PWM signálem. Samozřejmě nesmíme zapomenout propojit GND s ENBL – tím aktivujeme otáčení. Zapojení arduina a vysílačky Používám Arduino pro mini, tedy verze adruida bez USB portu. Programuje se pomocí samostatného převodníku USB na seriovou linku (5V logika). Pokud máte arduino s USB portem, tak se TX a RX portem zabývat nemusíte a prostě arduino připojíte do USB a fungujete. Výhoda arduina bez USB je zejména ve velikosti a ceně – dá se sehnat už kolem 30Kč. USB je stejně třeba jen na programování, dále už potřeba není a jen překáží ;-) ARDUINO Použití Poznámka VCC Napájení 5V napájení, zatím beru z USB GND GND – zem Propojím všechny země, GND driveru, GND vysílačky a GND z USB RX RX / FTDI pro programování z PC TX TX / FTDI pro programování z PC PIN2 Radio Připojeno do přijímače vysílačky, kanál 1 (PWM režim) PIN3 Driver AVI Pro řízení rychlosti přes PWM PIN4 Driver R/F Pro řízení směru otáčení CW/CCW Programování Arduina Tak, pokud je vše zapojeno dle popisu, tak teď stačí arduino naprogramovat aby vykonávalo požadovanou funkci – řídilo motor. Celé řízení se v podstatě omezuje na dekódování modelářského PWM signálu a jeho přepočet na řídící signál pro motor. Do budoucna bude možné snadno implementovat dorazové snímače pro automatické zastavení motoru při dojetí na konec dráhy. PWM signál z vysílačky čtu pomocí interuptu – při každé změně napětí přijímače se zavolá funkce, která spočítá čas od poslední změny. Tím získávám číslo (v mikrosekundách) které po přepočtu používám na řízení motoru. V případě modelářského PWM signálu je pro minimální hodnotu cca 1000us, maximální hodnota pak je cca 2000us. Středová pozice páčky odpovídá cca 1500us. Protože každá vysílačka má tyto hodnoty trochu jiné a navíc střední poloha páčky může mírně kolístat, rozhodl jsem se do programu implementovat pole 4 hodnot reciever_ranges. První a poslední hodnota určuje rozsah vysílačky, prostřední hodnoty vymezují tzv. deadband – tedy mrtvé pásmo kdy se nic neděje – rozuměj kdy se motor netočí. Ukázka „minimální“ (po přejetí myší maximální) hodnoty na osciloskopu (dílek má 500us, tedy dva dílky odpovídají 1000us). Inicializace proměnných První část programu deklaruje proměnné. Jsou zde popsané piny pro řízení rychlosti a směru. Pozor při změnách – pin pro řízení rychlosti musí podporovat PWM! Pin pro vysílačku zase musí podporovat interupt. int pinMotorSpeed = 3; int pinMotorDir = 4; int actMotorSpeed= 0; int actMotorDir = 1; int actMotorDirLast = 1; int rx_pulse_width=0; int rx_last_pwm_error=0; unsigned long reviever_pwm_pulse_width = 0; unsigned long reviever_pwm_pulse_width_last = 0; //Radio constant: 0-1 CCW speedm, 1-2 deadband, 2-3 CW speed int reciever_ranges[4] = {983,1488,1500,2010}; Nastavení arduina po zapnutí Tento blok kódu je zde kvůli nastaveni po zapnutí. Nastaví se nějaké výchozí hodnoty, nastaví se režimy fungování portů (vstupy, výstupy) a hlavně se zaregistruje funkce pro interupt na pinu 3 pro změnu stavu. Dále se nastaví rychlost seriového portu pro pozdější testovací a ladící výpisy. void setup() { pinMode(pinMotorSpeed, OUTPUT); //setup motor speed pinMode(pinMotorDir, OUTPUT); //setup direction, LOW=CCW, HIGH=CW pinMode(2, INPUT); //connect PWM from reciever attachInterrupt(0, RECIEVER_Interrupt, CHANGE); //default direction CW digitalWrite(pinMotorDir, HIGH); //for debug only Serial.begin(115200); } hlavní smyčka – Loop() Hlavní smyčka – každých 50ms aktualizuje chování motoru. V podstatě jen zapíše proměnou actMotorSpeed a actMotorDir. Pokud se ale v podmínce zistí, že došlo k změně směru, tak je motor zastaven a čeká se 150ms. Důvodem je, aby neměnil motor rychlost ve vyšších otáčkách – zabrání se tak ohromnému přetížení driveru a zbytečnému mechanickému namáhání motoru. Podle druhu motoru lze s hodnotama různě hýbat a otestovat, co nejlépe sedí. void loop() { //if direction change then stop motor and wait 150ms if(actMotorDir!=actMotorDirLast){ Serial.println("#### DIRECTION CHANGE ####"); actMotorDirLast=actMotorDir; analogWrite(pinMotorSpeed, 0); delay(150); } /* Serial.print("Reciever PWM: "); Serial.print (reviever_pwm_pulse_width); Serial.print(", Direction: "); Serial.print(actMotorDir); Serial.print(", Speed: "); Serial.print(actMotorSpeed); Serial.print(", last PWM Error: "); Serial.println (rx_last_pwm_error); */ analogWrite(pinMotorSpeed, actMotorSpeed); digitalWrite(pinMotorDir, actMotorDir); delay(50); } RECIEVER_Interupt() Funkce interuptu pro zpracování signálu vysílačky. Zde je implementován deadband, přemapování hodnoty z načtených hodnot do rozsahu 0–255 a detekce směru otáčení. Mimo jiné se ukládá i do rx_last_pwm_error hodnoty, pokud jsou mimo definovaný rozsah. Vodné pro ladění. //call every time when change PWM signal from reciever void RECIEVER_Interrupt() { rx_pulse_width=micros()-reviever_pwm_pulse_width_last; if(rx_pulse_width>reciever_ranges[0] and rx_pulse_width<reciever_ranges[3]){ reviever_pwm_pulse_width = rx_pulse_width; if(reviever_pwm_pulse_width>reciever_ranges[0] and reviever_pwm_pulse_width<reciever_ranges[1]){ actMotorDir=LOW; actMotorSpeed = map(reviever_pwm_pulse_width,reciever_ranges[0],reciever_ranges[1],255,0); } if(reviever_pwm_pulse_width>reciever_ranges[2] and reviever_pwm_pulse_width<reciever_ranges[3]){ actMotorDir = HIGH; actMotorSpeed = map(reviever_pwm_pulse_width,reciever_ranges[2],reciever_ranges[3],0,255); } if(reviever_pwm_pulse_width>reciever_ranges[1] and reviever_pwm_pulse_width<reciever_ranges[2]){ actMotorSpeed = 0; } } else{ rx_last_pwm_error = rx_pulse_width; } reviever_pwm_pulse_width_last = micros(); } A to je všechno! Ať to funguje ;-) Připojená fotogalerie: 2015/ilustrace/ Podobné články: Arduino a RC vysílačka 9.12.2014 Arduino a krokový motor potřetí 20.11.2014 Arduino a motor 28BYJ-48 podruhé 17.11.2014 Arduino - řízení krokového motoru 11.11.2014 Štítky tohoto článku: arduino motor Diskuze: Řízení Brushless DC motoru 57BLF03 s driverem BLDC-8015A pomocí Arduina 1. Pierre MATHYS (26.2.2017, 19:19) Hello I use the same hardware to drive my wife's potter wheel. Works fine excepted that I can't reach more than 2/3 of max speed (i.e. 2000rpm) with 99% duty-cycle @1kHz on AVI input. Full speed can only be obtained with internal RV pot. Did you experiment the same? Thanks for your reply. Best regards PM Reagovat na tento příspěvek Diskuze: Řízení Brushless DC motoru 57BLF03 s driverem BLDC-8015A pomocí Arduina Vaše jméno Váš email (povinné) (nebude zveřejněn, povinný) WEB (bude zveřejněn, pište s http://) Text vzkazu: Kolik je 3×2? (ochrana proti spamu) Vložit příspěvek PDF vygenerováno 9.6.2017 10:44:30 z webu http://nul.cz. URL dokumentu je http://nul.cz/arduino/rozeni-motoru-57BLF03-BLDC-8015A/