Skocz do zawartości
MR1979

Robot balansujący - Sterownik silników

Pomocna odpowiedź

Napisano (edytowany)

Witam!

Rozpoczynam nowy projekt, którym będzie próba zbudowania robota balansującego. Będzie to mój pierwszy robot. Ponieważ temat jest obszerny, oraz sama elektronika robota będzie modułowa, więc postanowiłem podzielić projekt na kilka worklogów.

Zaczynam od modułu sterowania silników i tego będzie dotyczyć ten worklog.

Założenia:

1. Dwa kanały (2 silniki BLDC - do gimbali)
2. Sterowanie FOC z enkoderem magnetycznym
3. Zintegrowany mikrokontroler który będzie tylko do sterowania silnikami (utrzymywanie równowagi i zadanych parametrów ruchu)
4. Zintegrowany akcelerometr i żyroskop
5. Monitorowanie max prądu silników (zabezpieczenie przed przeciążeniem)
 

Zdecydowałem się na następujące główne komponenty:

1. Silniki BLDC do gimbali - 5208 - 2 szt.
2. Driver silników L6234 - 2 szt.
3. Enkodery magnetyczne AS5600 - 2 szt.
4. Akcelerometr i żyroskop - MPU6050 - 1 szt.
5. Mikrokontroler STM32F103RG (wersja XL-density bo ma dwa zaawansowane timery TIM1 i TIM8)

Pozdrawiam,
Marek

Edytowano przez MR1979
  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Bardzo ciekawy projekt, szczególnie, że planujesz wykorzystać silniki BLDC i sterowanie FOC, będę śledził. Zastanowiłbym się nad mikrokontrolerem, rodzina F1 jest już stosunkowo stara. Jak rozumiem jest to projekt rozwojowy, więc nie musisz jakoś specjalnie optymalizować sprzętu, żeby kosztował jak najmniej, a jednocześnie spełniał wszystkie założenia jak najoptymalniej. Polecałbym coś z FPU, już chociażby coś z rodziny F3 może być lepszym wyborem, ze względu na to, że będziesz wykorzystywał filtry do fuzji danych z IMU, może Kalman, Madgwick/Mahony, na pewno zauważysz różnice w czasach wykonywania się filtrów z FPU i bez niego, może warto jeszcze to przemyśleć. Dodatkowo, na przykładowo takim F303xx z zewnętrznym kwarcem będziesz mógł taktować timer z dwukrotnie większą częstotliwością niż sam rdzeń, czyli np. 144 MHz, więc będziesz mógł mieć jednocześnie większą rozdzielczość PWM, czy zauważysz różnicę, nie wiem, ale dlaczego kosztem paru złoty by się nie przekonać i nie potestować. 😉

Edytowano przez Alvedro
  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Dzięki za zainteresowanie.

13 godzin temu, Alvedro napisał:

Zastanowiłbym się nad mikrokontrolerem, rodzina F1 jest już stosunkowo stara. Jak rozumiem jest to projekt rozwojowy, więc nie musisz jakoś specjalnie optymalizować sprzętu, żeby kosztował jak najmniej, a jednocześnie spełniał wszystkie założenia jak najoptymalniej. Polecałbym coś z FPU, już chociażby coś z rodziny F3 może być lepszym wyborem

Wybrałem STM32F103 bo mam ich kilka sztuk na stanie. Ale przejrzałem dokumentację F3 i faktycznie wydaje się być stworzony do tego typu zastosowań. A możliwość taktowania timerów z dwukrotną prędkością zegara zapowiada się ciekawie. Do tego zintegrowane comparatory (możliwość realizacji zabezpieczenia overcurrent i overvoltage). Są też programowalne wzmacniacze operacyjne. Teoretycznie można je wykorzystać przy pomiarze spadku napięcia na rezystorach bocznikowych (ST  wydało krótką notę na ten temat - TP2289). Wydaje mi się jednak że bezpieczniejszą opcją (dla mikrokontrolera) będzie użycie do tego celu INA2181A1. Nie będę robić pomiaru prądu na każdej fazie oddzielnie bo i tak będę stosował 12-bitowy enkoder.

Tak więc zamówiłem NUCLEO z STM32F303RE i jak tylko ją dostanę to się przesiadam.

Update z postępów:

Na razie udało mi się połaczyć L6234 z NUCLEO na F103, oraz wygenerować trzy sygnały PWM na wyjściu.

Wciąż czekam na silniki i zamówione części.

Edytowano przez MR1979
  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Witam!

Update z frontu. Mam już NUCLEO z STM32F303RE oraz silniki do robota. Na razie na szybko przerzuciłem kod na nowy mikrokontroler oraz podłączyłem silnik.

Wciąż brakuje mi enkoderów, więc nie można nazwać tej metody kontroli prawdziwym FOC. Bez feedbacku o położeniu wirnika, silnik tylko podąża za wirującym polem magnetycznym wygenerowanym przez uzwojenie. Jest to jakaś metoda sterowania, ale bardzo nieefektywna bo wektory pola magnetycznego od magnesów stałych i od uzwojenia praktycznie są w jednej linii.

Przebiegi PWM są generowane z częstotliwością 35kHz, więc silnik działa bezgłośnie. Nawet przy tym nieefektywnym sterowaniu moment obrotowy jest zaskakująco duży, a prądy nie przekraczają 0.5A (12V ,100% wypełnienia PWM, minimalne obroty).

Co do samego sterownika to postanowiłem wprowadzić następujące modyfikacje do założeń projektu:
1. Zabezpiecznie nadprądowe - pomiar ze wszystkich faz jednocześnie. Wykorzystam możliwość ustawienia poziomu maksymalnego prądu jaką daje mi mikrokontroler (comparator + DAC).
2. Monitorowanie prądu silnika - z wykorzystaniem przetwornika A/D
3. Dodam też zewnętrzną pamięć EEPROM I2C do przechowywania konfiguracji

Pozdrawiam,
Marek

 

 

  • Lubię! 2

Udostępnij ten post


Link to post
Share on other sites

Czy planujesz do FOC'a (oprócz enkodera) wrzucać również prądy? 

Udostępnij ten post


Link to post
Share on other sites

Nie planuje tego z dwóch powodów:

1. Myślę że w przypadku robota balansującego gdzie kierunek i prędkość silnika nieustannie się zmienia, określanie pozycji wirnika przez monitorowanie prądów może nie być skuteczne. Poza tym tego typu robot operuje raczej w niskich zakresach obrotów gdzie np Back EMF zawodzi.

2. Przyznam szczerze że nie do końca wiem jak takie rozwiązanie mogłoby działać w przypadku sterowania FOC. Jak masz jakiś link to podeślij.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Witam! Kolejny update!

W kwestii hardware na razie nie wiele się zmieniło od ostatniego wpisu. Za to popracowałem trochę nad oprogramowaniem:

1. Wprowadziłem modulację SVPWM zamiast SPWM. Silnik działą płynniej (szczególnie na wolnych obrotach). Powinien mieć też trochę większy moment obrotowy, ale różnica jest dość mała.

2. Dodałem funkcję testowania i autokalibracji zespołu silnika i enkodera. Sprawdzane są następujące parametry:

  • Komunikacja z enkoderem
  • Czy magnes enkodera znajduje się w odpowiedniej odległości
  • Czy enkoder zlicza impulsy w odpowiednim kierunku. Jeżeli nie, jest wprowadzana jest korekta
  • Sprawdzana jest ilość kroków enkodera na pełen obrót (rozdzielczość)
  • Wyliczana jest ilość kroków enkodeara na jeden cykl elektryczny
  • Sprawdzane jest przesunięcie mechaniczne zera enkodera względem zera pola magnetycznego silnika
  • Wyliczane są tablice komutacji (wyliczane są krzywe dla modulacji SVPWM z uwzględnieniem wszystkich powyższych parametrów)

3. Pozbyłem się wszelkich obliczeń zmiennoprzecinkowych z głównej pętli (korzystam z tablic gdzie to możliwe)

4. Wprowadziłem trzy tryby pracy sterownika:

  • Stały moment obrotowy - w tym trybie zadaje się stały cykl pracy w modulacji PWM, który nie zmienia się niezależnie od obciązenia i położenia.
  • Stała prędkość obrotowa - pętla PID automatycznie kontroluje cykl pracy PWM aby utrzymać stałą prędkość obrotową nawet przy zmiennym obciązeniu
  • Tryb serwa gdzie silnik utrzymuje zadaną pozycję (0-360 deg). Tu znów posłużyłem się pętlą PID.

Plany na kolejne dni:

1. Podłączenie pamięci do zapisywania ustawień z autokalibracji
2. Implementacja prostej komunikacji przez USART do testowania i sterowania układem
3. Dodanie pomiaru prądu oraz zabezpieczenia nadprądowego
4. Podłączenie i komunikacja z czujnikiem akcelerometru i żyro

Poniżej kilka filmików:

1. Autokalibracja

 

2. Tryb stałej prędkości obrotowej

 

3. Tryb stałej pozycji (tryb serwo)

 

Pozdrawiam,
Marek

 

Edytowano przez MR1979
  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

W jaki sposób wyznaczasz prędkość do trybu stałej prędkości obrotowej? Czy na obliczoną prędkość nakładasz jeszcze jakieś filtry? Twoim wejściem do pid'a jak rozumiem jest różnica między aktualną prędkością, a docelową, co jest wyjściem regulatora, czy to jest parametr vq, który podajesz później do algorytmu foc'a? Słyszałeś o cogging torque (nie wiem jaki jest polski odpowiednik), jeśli tak to czy planujesz rozwinąć algorytm, który by ten efekt minimalizował?

Udostępnij ten post


Link to post
Share on other sites
40 minut temu, Alvedro napisał:

W jaki sposób wyznaczasz prędkość do trybu stałej prędkości obrotowej? Czy na obliczoną prędkość nakładasz jeszcze jakieś filtry? Twoim wejściem do pid'a jak rozumiem jest różnica między aktualną prędkością, a docelową, co jest wyjściem regulatora, czy to jest parametr vq, który podajesz później do algorytmu foc'a?

Próbkuję pozycję enkodera co 0,1s i wyznaczam różnicę. Z tą wyliczoną wartością oraz wartością referencyjną wchodzę do regulatora PID gdzie wyjściem jest bezpośrednio wartość dla generatora PWM. Myślałem też o wrzuceniu do regulatora średniej z kilku pomiarów, ale wydaje mi się że mogłoby to wprowadzić niepotrzebne opóźnienie w reakcji układu. Może jakaś średnia ważona, gdzie ostatni pomiar miałby najwyższą wagę. Jeszcze nie miałem czasu na takie eksperymenty.

40 minut temu, Alvedro napisał:

Słyszałeś o cogging torque (nie wiem jaki jest polski odpowiednik), jeśli tak to czy planujesz rozwinąć algorytm, który by ten efekt minimalizował?

Nigdy nie słyszałem (bo elektronika to tylko moje hobby), ale z opisu wynika że doświadczyłem tego zjawiska. Przy niskich obrotach dało się zauważyć pewną nieregularność. Szczególnie widać to w trybie serwo gdzie przy niektórych kątach układ ma problem z utrzymaniem pozycji. Myślę że w moim przypadku nałożyły się dwa zjawiska:
1. Charakterystyka samego silnika oraz wspomniany przez ciebie "cogging torque"
2. Odczyty z enkodera magnetycznego nie są regularne. Enkoder ma 4096 kroków, ale np na 1 stopień przypada czasem więcej a czasem mniej kroków. Myślę że duże znaczenie ma dokładność umieszczenia magnesu nad układem (w moim przypadku to wciąż prowizorka, więc pewnie mam jakieś odchyły). Zamówiłem PCB pod enkodery, czekam aż przyjdzie.

Zauważyłem że w tak prostej implementacji FOC największe nieregularności pojawiają się przy najniższych wartościach wektora pola magnetycznego. Mam taką teorię (wciąż nie sprawdzoną), że mógłbym wprowadzić minimalną długość wektora, a gdy zajdzie potrzeba zejścia niżej, to płynnie zmiejszałbym kąt wyprzedzenia z 90 stopni do zera (zależnie od potrzeb). Myślę że zwiększyłoby to kontrolę kosztem zmniejszenia sprawności przy niskich obrotach. Sprawdzę moją teorię niedługo i dam znać 🙂

Pozdro!

  • Lubię! 2

Udostępnij ten post


Link to post
Share on other sites

Przeglądam Twoje aktualizacje i muszę Cię pochwalić za profesjonalne podejście do tematu. Są eksperymenty, wnioski i rzeczowe poprawki. Nie łapiesz się od razu za sam cel tylko pomału do niego brniesz (tu takie nawiązanie do podejścia, które ostatnio się w wielu miejscach panoszy - Chcę bibliotekę Arduino która zrobi wszystko...) Mało jest ludzi z takim podejściem, także tak trzymaj 🙂 

  • Lubię! 2

Udostępnij ten post


Link to post
Share on other sites

Witam po przerwie.

Wciąż na wyjeździe więc pozostała mi tylko zabawa w schematy. Poniżej wstępna wersja sterownika silników do mojego robota balansującego. Wszelkie uwagi sugestie jak zwykle będą mile widziane.

1.thumb.PNG.23c83a8130326d8bc6fa53b9789366af.PNG2.thumb.PNG.25401a1c89ff57672ee0ebd6fbea7580.PNG

3.thumb.PNG.feaa343fb9461b03b4b79663e37432c2.PNG4.thumb.PNG.d64ccbcbbf807bb22efd62073d7b3d7c.PNG

Połączenie z baterią i obwody zasilania będą na osobnej płytce. Jednostką centralną samego robota będzie Raspberry Pi 4. Komunikacja pomiędzy poszczególnymi modułami będzie odbywać się przez SPI. Złącze J1 na schemacie to będzie gniazdo "gold pin" z długimi nóżkami (z jednej strony jest gniazdo, a od spodu jest wtyczką). Pozostałe złącza będą JSC seria SH i PH.

Pozdrawiam,
Marek

 

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Kolejny update

Wprowadziłem trochę poprawek do schematu. Od teraz układ będzie mógł sterować:
2 x silnik BLDC metodą FOC
8 x serwo motor

Powinno to wystarczyć do wybudowania fajnego robota 🙂

Dodanie kolejnych połączeń dla serw od strony programowej nic nie kosztowało bo sygnał PWM niezbędny do sterowania jest generowany przez Timery, więc czemu nie wykorzystać wolnych nóżek. Dodałem też diody LED do sygnalizacji statusu i błędów. Zrezygnowałem z przycisku BOOT.

Projekt płytki PCB prawie gotowy. Zostało kilka drobnostek do poprawienia. W porównaniu z renderem, gotowa płytka będzie miała pin header z długimi nóżkami aby można było łączyć płytki warstwami. Płytka będzie się prezentować następująco:

pcb01.thumb.png.30ed95c70b6b0f73e5b63a9c11922c80.pngpcb02.thumb.png.e293771c8e559e10eb77d809045722b1.png

pcb03.thumb.png.29145608c3199f1f0f3d9af098586a43.pngpcb04.thumb.png.cfdee923d224fdadb83b0f36514182df.png

Kolejnym krokiem będzie projekt płytki zasilającej.

Pozdrawiam,
Marek

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...