Mikrokontrolery - Jak zacząć?

... czyli zbiór praktycznej wiedzy dot. mikrokontrolerów.

piątek, 25 marca 2011

Silnik BLDC: Podłączamy silnik i testujemy


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?




Postaraj się policzyć zanim klikniesz przycisk poniżej!







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
Faza123
U+NC-
V-+NC
WNC-+
NC - niepodłączony (Not Connected)

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:

Rys. Przebiegi sygnałów na wyjściach faz sterownika z podłączonym symulatorem
silnika (układem rezystorów). Faza U zdążyła się zarejestrować dwa razy
w czasie otwarcia migawki aparatu fotograficznego, stąd jest minimalnie przesunięta.

Jeżeli dokładnie się przyglądniesz i porównasz z tabelką komutacji powyżej, to zauważysz poszczególne kroki. Na oscylogramie widać prawie trzy pełne zmiany komutacji, czyli trzy razy wykonano wszystkie komutacje z powyższej tabelki komutacji.

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:

FazaKrok 1Krok 2Krok 3Krok 4Krok 5Krok 6
U++NC--NC
V-NC++NC-
WNC--NC++
NC - niepodłączony (Not Connected)


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


Oceń artykuł.
Wasze opinie są dla nas ważne, gdyż pozwalają dopracować poszczególne artykuły.
Pozdrawiamy, Autorzy
Ten artykuł oceniam na:

5 komentarzy:

  1. Jaka jest minimalna częstotliwość PWM dla danej prędkości obrotowej?

    OdpowiedzUsuń
  2. 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.

    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 :-)

    OdpowiedzUsuń
  3. wyświetla mi się brak dostępu do pliku z projektem... Można coś z tym zrobić?

    OdpowiedzUsuń
    Odpowiedzi
    1. Który link? Sprawdziłem i działają prawidłowo.

      Usuń
  4. 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ń

Działy
Działy dodatkowe
Inne
O blogu




Dzisiaj
--> za darmo!!! <--
1. USBasp
2. microBOARD M8


Napisz artykuł
--> i wygraj nagrodę. <--


Co nowego na blogu?
Śledź naszego Facebook-a



Co nowego na blogu?
Śledź nas na Google+

/* 20140911 Wyłączona prawa kolumna */
  • 00

    dni

  • 00

    godzin

  • :
  • 00

    minut

  • :
  • 00

    sekund

Nie czekaj do ostatniego dnia!
Jakość opisu projektu także jest istotna (pkt 9.2 regulaminu).

Sponsorzy:

Zapamiętaj ten artykuł w moim prywatnym spisie treści.