Autor: Dondu
Artykuł z cyklu: Silnik BLDC: Spis treści
W poprzednim artykule zmontowaliśmy układ sterowania faz silnika oraz przetestowaliśmy go na diodach LED. Dodatkowo opracowaliśmy programowy bezpiecznik, który ustrzeże nas przed ewentualnymi błędami programu sterownika, które mogłyby uszkodzić tranzystory MOSFET.
W niniejszym artykule zajmiemy się podłączeniem silnika oraz pierwszymi próbami jego sterowania.
Zaczniemy od:
Schemat sterownika
Nasz schemat powinien wyglądać następująco:
Szczegółowy opis schematu znajdziesz we wcześniejszych artykułach z tego cyklu. Do testów w tym artykule możesz spokojnie pominąć dławik L1, podłączając pin AVcc bezpośrednio do +5V.
Symulator silnika
Zanim podłączymy silnik, proponuję testować sterowanie za pomocą trzech rezystorów połączonych w gwiazdę.
Ja wykorzystałem do tego rezystory 130Ω o mocy 2W. Takie miałem pod ręką stąd prąd sterownika w czasie testów z rezystorami będzie wynosił zaledwie:
a moc wydzielona na każdym rezystorze nie przekroczy:
Można oczywiście zastosować inne rezystory pamiętając jednak, by były odpowiedniej mocy.
Dzięki tym rezystorom, zwiększymy bezpieczeństwo naszego sterownika w czasie testów. Pozwolą nam także zaobserwować pracę tranzystorów MOSFET sterownika.
Schodkowe wykresy - dlaczego?
Zanim przejdziesz dalej odpowiedz na poniższe pytanie!
Jaki potencjał (napięcie względem masy) będzie na fazie U (rysunek poniżej), gdy faza U nie jest podłączona (NC) do sterownika lub sterownik ustawia na niej stan wysokiej impedancji?
Kręcimy korbą
W dalszej części artykułu, będziemy testować silnik. Jednakże:
Poniższe wersje programów sterowania silnikiem BLDC, nie zawierają procedury startu silnika. Dlatego niezbędne może być użycie zewnętrznej siły w postaci korby* :-)
*Mam na myśli oczywiście zakręcenie ręką silnikiem we właściwą stronę.
Temat rozruchu silnika, to "temat rzeka" i omówimy go w osobnym artykule.
Utrata synchronizacji
Jeżeli dokonujesz komutacji:
- zbyt szybko do możliwości silnika,
- zbyt szybko przyspieszasz lub zwalniasz (bezwładność silnika),
- zatrzymasz lub znacznie zwolnisz silnik (np. ręką) nie zmniejszając szybkości komutacji,
może dojść do utraty synchronizacji silnika.
Chodzi o to, że nasz wirnik nie nadąży z obrotami w stosunku do szybko wirującego pola elektromagnetycznego wytwarzanego przez stojan.
W takiej sytuacji powinieneś słyszeć charakterystyczne piszczenie - krótkie impulsy lub ciągłe.
SILNIK SIĘ GRZEJE!!!
W niniejszym artykule dopiero w ostatnim przykładzie zajmiemy się regulacją mocy silnika za pomocą PWM. Do tego momentu będziemy nim sterować za pomocą maksymalnego możliwego do osiągnięcia prądu.
Silnik posiada uzwojenie, którego rezystancja liczona jest w zaledwie kilku Ohm'ach, stąd spodziewany prąd (w zależności od silnika) będzie oscylował w okolicach 2A. Tak duży prąd oznacza wydzielanie się sporej ilości ciepła.
Wprawdzie silniki BLDC z dysków twardych, ze względu na swoją konstrukcję odprowadzają bardzo dużo ciepła na zewnątrz, niemniej jednak:
Rób krótkie testy i kontroluj temperaturę silnika!!!
Program - część wspólna
Do poniższych algorytmów sterowania, używać będziemy wspólnych części programu.Wszystkie znajdziesz w załączonych do pobrania plikach. Dlatego w artykule poniżej zamieszczę jedynie istotne fragmenty.
Pętla główna w main.c, będzie wspólna dla obu przypadków:
int main (void) { //inicjujemy sterownik bldc_inicjuj_sterownik(); //pętla główna while(1){ bldc_komutacja(); //odstęp komutacji reguluje prędkość obrotów _delay_ms(12); } }
W pętli tej możesz regulować prędkość obrotową silnika zmieniając opóźnienie pomiędzy komutacjami. Jeżeli przesadzisz to silnik albo się zatrzyma, albo straci synchronizację, i ... także może się zatrzymać.
Do szczegółowej analizy proszę wykorzystać pliki zawarte w plikach do pobrania.
Sterowanie najprostsze
Najprostszym algorytmem sterowania silnikiem BLDC jest kolejne przełączanie (komutacja) napięcia na dwóch sąsiednich fazach w sposób, który wykorzystywaliśmy do identyfikacji przewodów silnika oraz wyznaczenia krotności biegunów, o czym pisałem w artykule: Silnk BLDC: Oznaczenie faz.
Dla silnika o wartości krotności biegunów równej jeden wygląda to tak:
czyli wykonany zostanie jeden pełny obrót.
Dla silnika o krotności biegunów równej 4 (moje silniki) tak wykonane 3 kroki komutacji spowodują wykonanie obrotu wirnika zaledwie o:
Tabelka komutacji:
Komutajca | |||
---|---|---|---|
Faza | 1 | 2 | 3 |
U | + | NC | - |
V | - | + | NC |
W | NC | - | + |
Wykonując podawanie napięcia na poszczególne fazy zgodnie z tabelką powyżej, silnik będzie się kręcić.
Funkcja komutacji powinna wyglądać więc tak:
void bldc_komutacja(void){ //zależnie od numeru aktualnej komutacji switch (polozenie_wirnika++){ case (KOMUT_1): //komutacja 1 W_TR_G_OFF U_TR_D_OFF U_TR_G_ON V_TR_D_ON break; case (KOMUT_2): //komutacja 2 U_TR_G_OFF V_TR_D_OFF V_TR_G_ON W_TR_D_ON break; case (KOMUT_3): //komutacja 3 V_TR_G_OFF W_TR_D_OFF W_TR_G_ON U_TR_D_ON polozenie_wirnika = KOMUT_1; //komutacja od początku break; } //sprawdzamy konflikty sterowania bldc_bezpiecznik(); }
Do pobrania: Kompletny projekt AVR Studio 4 (pliki: main.c, bldc.c, bldc.h): BLDC-02.zip
Podłączamy symulator silnika
Na oscyloskopie podłączonym do wyjść faz sterownika (czyli także na wejściach symulatora silnika) zobaczysz przesunięte względem siebie przebiegi prostokątne, nie zachodzące na siebie. Obraz dla dwóch faz mojego sterownika:
Oscyloskop, którym dysponowałem ma jedynie dwa kanały, stąd fazę W musisz sobie wyobrazić :-)
Nie jest to trudne, ponieważ wystarczy wyobrazić sobie fazę W jako fazę V przesuniętą o jeden krok komutacji w prawo.
Podłączamy silnik
Teraz śmiało możesz podłączyć silnik. Nie zapomnij zakręcić wirnikiem silnika w odpowiednią stronę, by nadać mu początkową prędkość obrotową. Dalej silnik powinien już kręcić się samoistnie, utrzymując stałą ilość rpm (obrotów na minutę).
Uwaga!!! Test ten wykonuj krótko, ponieważ silnik może się szybko nagrzewać. Kontroluj to, by nie uszkodzić uzwojeń silnika!
W powyższym programie, możesz eksperymentować zmieniając czasy odstępów komutacji. Zachęcam do prób ustanowienia rekordu ilości rpm. Da Ci to porównanie do następnych sposobów sterowania.
Sterowanie właściwe
Powyższy sposób sterowania silnikiem, jest nieekonomiczny. O wiele bardziej wydajnym jest sterowanie nieco bardziej skomplikowane.
Dla silnika o wartości krotności biegunów równej jeden wygląda to tak:
Jeżeli silnik ma kręcić się w przeciwną stronę, komutacje zachodzą w odwrotnej kolejności, od komutacji 6 do komutacji 1.
Tabelka komutacji wygląda więc tak:
Faza | Krok 1 | Krok 2 | Krok 3 | Krok 4 | Krok 5 | Krok 6 |
---|---|---|---|---|---|---|
U | + | + | NC | - | - | NC |
V | - | NC | + | + | NC | - |
W | NC | - | - | NC | + | + |
Przy takiej kolejności komutacji, silnik o krotności biegunów równej jeden wykona jeden pełny obrót, a silnik o krotności biegunów równej cztery (moje silniki) nadal tylko o 90°. W tym zakresie nie różni się to od sposobu pokazanego wcześniej.
Co w takim razie zyskamy? Przede wszystkim płynność pracy silnika, poprzez dwukrotne zmniejszenie tętnień, ale także zwiększenie jego momentu obrotowego.
Funkcja komutacji powinna wyglądać więc tak:
void bldc_komutacja(void){ //zależnie od numeru aktualnej komutacji switch (polozenie_wirnika++){ case (KOMUT_1): //komutacja 1 W_TR_G_OFF U_TR_G_ON break; case (KOMUT_2): //komutacja 2 V_TR_D_OFF W_TR_D_ON break; case (KOMUT_3): //komutacja 3 U_TR_G_OFF V_TR_G_ON break; case (KOMUT_4): //komutacja 4 W_TR_D_OFF U_TR_D_ON break; case (KOMUT_5): //komutacja 5 V_TR_G_OFF W_TR_G_ON break; case (KOMUT_6): //komutacja 6 U_TR_D_OFF polozenie_wirnika = KOMUT_1; //komutacja od początku V_TR_D_ON break; } //sprawdzamy konflikty sterowania bldc_bezpiecznik(); }
Do pobrania: Kompletny projekt AVR Studio 4 (pliki: main.c, bldc.c, bldc.h): BLDC-03.zip
Podłączamy symulator silnika
Postępujemy podobnie jak w poprzednim przypadku, a na oscyloskopie podłączonym do wyjść faz sterownika (czyli także na wejściach symulatora silnika) zobaczymy zgoła odmienny obraz. Obraz dla dwóch faz mojego sterownika:
Czy rozumiesz dlaczego wykres sygnałów na fazach wygląda tak, a nie inaczej? Jeżeli nie, to przyglądnij się tabelce komutacji oraz rysunkowi poszczególnych 6 kroków silnika i zwróć szczególną uwagę, na zmieniające się kierunki prądów w poszczególnych fazach i krokach.
Podłączamy silnik
Teraz śmiało możesz podłączyć silnik. Ponownie nie zapomnij zakręcić wirnikiem silnika w odpowiednią stronę, by nadać mu początkową prędkość obrotową.
Uwaga!!!
Test ten wykonuj krótko, ponieważ silnik może się szybko nagrzewać. Kontroluj to, by nie uszkodzić uzwojeń silnika!
Tutaj także zachęcam do prób ustanowienia rekordu ilości rpm. Da Ci to porównanie do wyniku uzyskanego wcześniej oraz do następnych sposobów sterowania, które omówimy w następnych artykułach.
Ale podobnie jak w poprzednim przypadku, nawet gdy dokonujesz komutacji we właściwy sposób, nie uda Ci się uzyskać znaczących prędkości obrotowych.
Włączamy PWM
Znasz już sposób właściwego komutowania faz silnika BLDC, czas więc dodać regulowanie jego mocy za pomocą PWM.
W tym celu ustawiamy zegar mikrokontrolera na wewnętrzny o częstotliwości 8MHz.
Możesz oczywiście wykorzystać zewnętrzny kwarc 8MHz.
Wkleję ponownie schemat byś nie musiał wracać do początku artykułu:
Zauważ, że podłączyliśmy górne tranzystory do wyjść OC1A, OC1B oraz OC2. Są to wyjścia PWM, o których pisałem w artykule: Sterownik - schemat, obliczenia
Mamy przygotowany układ, więc wystarczy włączyć jednakowy sygnał PWM dla wszystkich trzech faz.
Ponieważ mamy do dyspozycji jeden timer 8-bit i jeden 16-bit, ustawimy oba w tryb Fast PWM 8bit, z preskalerem 1:1 co da nam podstawę PWM o częstotliwości:
Dodamy więc do funkcji inicjującej sterownik następujący kod (w pliku bldc.c):
//--- T I M E R Y P W M ------------------- //Timer1 //Obsługa PWM dla wyjść OC1A oraz OC1B //Mode 5 (Fast PWM, 8bit) //Clear OC1A/OC1B on Compare Match, set OC1A/OC1B at BOTTOM, (non-inverting mode) //preskaler 1 TCCR1A |= (1<<WGM10) | (1<<COM1A1) | (1<<COM1B1); TCCR1B |= (1<<WGM12) | (1<<CS10); //Timer2 //Obsługa PWM dla wyjścia OC2 //Mode 3 (Fast PWM, 8bit) //Clear OC2 on Compare Match, set OC2 at BOTTOM, (non-inverting mode) //preskaler 1 TCCR2 |= (1<<WGM21) | (1<<WGM20) | (1<<COM21) | (1<<CS20); //ustaw wartość początkową PWM OCR1A = PWM_MIN; OCR1B = PWM_MIN; OCR2 = PWM_MIN;
Do kompletu jest nam jeszcze potrzebna definicja (w pliku bldc.h):
//--- D E F I N I C J E P W M --- #define PWM_MIN 50 //początkowa wartość wypełnienia PWM
Musimy jeszcze zmienić w pliku bldc.h definicje włączania, wyłączania i testowania tranzystorów górnych na następujące:
//Faza U #define U_TR_G_ON TCCR1A |= (1<<COM1A1); //włącz tranzystor #define U_TR_G_OFF TCCR1A &= ~(1<<COM1A1); //wyłącz tranzystor #define U_TR_G_SPRAW_STAN (TCCR1A & (1<<COM1A1)) //warunek stanu //Faza V #define V_TR_G_ON TCCR2 |= (1<<COM21); //włącz tranzystor #define V_TR_G_OFF TCCR2 &= ~(1<<COM21); //wyłącz tranzystor #define V_TR_G_SPRAW_STAN (TCCR2 & (1<<COM21)) //warunek stanu //Faza W #define W_TR_G_ON TCCR1A |= (1<<COM1B1); //włącz tranzystor #define W_TR_G_OFF TCCR1A &= ~(1<<COM1B1); //wyłącz tranzystor #define W_TR_G_SPRAW_STAN (TCCR1A & (1<<COM1B1)) //warunek stanu
Jest to niezbędne, ponieważ teraz będziemy sterować tranzystory górne sygnałem PWM, a nie tylko prostym włączeniem zera lub jedynki.
Do pobrania: Kompletny projekt AVR Studio 4 (pliki: main.c, bldc.c, bldc.h): BLDC-04.zip
Podłączamy symulator i/lub silnik
Teraz możemy spokojniej testować (najpierw symulator a później silnik), ponieważ możemy regulować prąd dostarczany do silnika, przez co nie będzie się tak mocno nagrzewał.
Oscylogram pokazuje przełączanie fazy (górny) i sygnał PWM (dolny):
Podsumowanie
Opisane powyżej proste metody sterowania silnikiem BLDC (sterownik + program), nie zapewniają otrzymywania przez program sterownika jednej fundamentalnej danej - wiedzy o położeniu wirnika względem stojana. Powoduje to łatwą utratę synchronizacji i co najważniejsze, nieekonomiczne wykorzystanie silnika i energii.
Dlatego sterowniki silników BLDC powinny posiadać moduł elektroniczno-programowy, który dostarczy mu wiedzę, o położeniu wirnika względem stojana i tym zajmiemy się w następnych artykułach z tego cyklu.
Artykuł z cyklu: Silnik BLDC: Spis treści
Jaka jest minimalna częstotliwość PWM dla danej prędkości obrotowej?
OdpowiedzUsuńZ częstotliwością PWM można schodzić bardzo nisko. Warto jednak, by okres sygnału PWM nie był dłuższy niż czas trwania jednej komutacji. W tym zakresie warto eksperymentować, bo wiele zależy od samego silnika i zadań jakie przed nim stawiamy.
OdpowiedzUsuńPoza tym, częstotliwość PWM może się zmieniać wraz ze zmianą prędkości obrotowej. Tutaj pole do popisu jest bardzo szerokie, bo wszystko zależy od nas :-)
wyświetla mi się brak dostępu do pliku z projektem... Można coś z tym zrobić?
OdpowiedzUsuńKtóry link? Sprawdziłem i działają prawidłowo.
UsuńWitam. Mógłbym prosić o ponowne dodanie linku do projektu? Po kliknięciu w link i przekierowaniu wyświetla się "Server not found"
OdpowiedzUsuń