MR1979 Napisano Czerwiec 11, 2020 Udostępnij Napisano Czerwiec 11, 2020 (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 Czerwiec 11, 2020 przez MR1979 1
Alvedro Czerwiec 11, 2020 Udostępnij Czerwiec 11, 2020 (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 Czerwiec 11, 2020 przez Alvedro 1
MR1979 Czerwiec 12, 2020 Autor tematu Udostępnij Czerwiec 12, 2020 (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 Czerwiec 12, 2020 przez MR1979 1
MR1979 Czerwiec 16, 2020 Autor tematu Udostępnij Czerwiec 16, 2020 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 2
Alvedro Czerwiec 17, 2020 Udostępnij Czerwiec 17, 2020 Czy planujesz do FOC'a (oprócz enkodera) wrzucać również prądy?
MR1979 Czerwiec 17, 2020 Autor tematu Udostępnij Czerwiec 17, 2020 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. 1
Popularny post MR1979 Czerwiec 19, 2020 Autor tematu Popularny post Udostępnij Czerwiec 19, 2020 (edytowany) Witam ponownie! Update z prac Zadowolony z siebie, gdy udało mi się wprawić w obroty silnik, postanowiłem posprawdzać jak wyglądają zakłócenia w układzie. Powiem tylko delikatnie że nie byłem zadowolony gdy zobaczyłem na oscyloskopie co się dzieje na linii 3.3V Miałem dużo szczęścia że nie uszkodziłem nowego NUCLEO, bo przepięcia dochodziły do 5.5v. Trochę poczytałem co mogę zrobić. Oczywiście beztroskie łączenie mas układów było przyczyną. Skończyło się na rozłożeniu i ponownym złożeniu całego układu, tym razem z poprawnym połączeniem mas (topologia gwiazdy itd..). W końcu odebrałem też encodery magnetyczne. Wydrukowałem podstawkę do testowania silnika i zmontowałem wszystko w całość. Szybka kalibracja wszystkiego i mam silnik sterowany metodą FOC. Od razu widać było różnicę w działaniu: - Moment obrotowy jest płynny bez znacznych skoków (jednak minimalne wahania da się wyczuć) - Prąd zmalał o rząd wielkości (dla tych samych obrotów bez enkodera miałem 200mA, teraz jest to około 20mA) - Silnik przestał się nagrzewać Poniżej efekt prac: Jak widać na powyższym filmiku, program cały czas stara się trzymać optymalny kąt 90 stopni pomiędzy wektorem pola od magnesów stałych a wypadkowym wektorem pola od uzwojeń. Przy takim przesunięciu uzyskujemy największy moment obrotowy. Kolejnym krokiem będzie przejście z modulacji SPWM na SVPWM. O tym czym jest SVPWM można poczytać tutaj: https://www.switchcraft.org/learning/2017/3/15/space-vector-pwm-intro Pozdrawiam, Marek Edytowano Czerwiec 19, 2020 przez MR1979 3
MR1979 Czerwiec 24, 2020 Autor tematu Udostępnij Czerwiec 24, 2020 (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 Czerwiec 24, 2020 przez MR1979 1
Alvedro Czerwiec 24, 2020 Udostępnij Czerwiec 24, 2020 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ł?
MR1979 Czerwiec 24, 2020 Autor tematu Udostępnij Czerwiec 24, 2020 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! 2
Popularny post MR1979 Czerwiec 29, 2020 Autor tematu Popularny post Udostępnij Czerwiec 29, 2020 Witam! Kolejny update. Eksperymentowałem trochę z obsługą wolnych obrotów. Pocztałem trochę na temat cogging torque (okazało się że po polsku nazywa się to moment zaczepowy ). Przetestowałem teorię z minimalną długością wektora i niestety nie zadziałała. Okazało się że gdy zmieniłem sposób sterowania silnika (w momencie gdy zmniejszany był kąt wyprzedzenia, a wektor miał stałą wartość), to PID sobie nie radził. Nic dziwnego w końcu był ustawiany dla sterowania silnikiem przy stałym kącie wyprzedzenia równym 90 stopni, oraz zmiennej długości wektora. Przy odwrotnej sytuacji współczynniki kp, ki, kd już nie pasowały. Musiałbym pewnie wprowadzić oddzielne współczynniki dla obu sytuacji. Na razie zarzuciłem walkę z momentem zaczepowym bo nie było to celem projektu. Wprowadziłem pomiar prądu silnika. Użyłem do pomiaru rezystora bocznikowego 0,1 ohm, oraz wzmacniacza x20 V/V (INA2181A). Wyjście wzmacniacza podłączyłem do ADC mikrokontrolera. Dodałem też prosty interfejs przez UART. Aktualnie można wydawać następujące komedy: 1. "torque [wartość]" - uruchamia tryb stałego momentu, wartość od -255 do +255 W tym trybie długość wektora jest zawsze stała i nie zależy ani od pozycji, ani od prędkości czy obciążenia 2. "speed [wartość]" - uruchamia tryb stałej prędkości, wartość to ilość obrotów/minutę ze znakiem. 3. "pos [wartość]" - uruchamia tryb stałej pozycji wału, wartość 0 do 360 stopni. 4. "current [wartość]" - ustawia makymalny prąd silnika. Ograniczenie to ma priorytet nad wszystkimi trybami pracy kontrolera. W międzyczasie spaliłem też mikrokontroler na płytce nucleo gdy przez nieuwagę do ADC zamiast wyjścia ze wzmacniacza podłączyłem jedną z linii zasilania silnika Na szczęście wlutowanie nowego układu załatwiło sprawę i płytka znów działa Poniżej filmik z działania ograniczenia prądu silnika: Pozdrawiam, Marek 3
Gieneq Czerwiec 30, 2020 Udostępnij Czerwiec 30, 2020 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 2
Popularny post MR1979 Lipiec 12, 2020 Autor tematu Popularny post Udostępnij Lipiec 12, 2020 Witam! Aktualizacja projektu: 1. Przyszły płytki pod enkodery, więc teraz pozycja układów w stosunku do osi silnika jest idealna 2. Zaimplementowałem wiele poprawek w oprogramowaniu układowym. 3. Pamięć EEPROM podłączona, więc teraz mam możliwość zapisu i odczytu danych kalibracyjnych dla danego układu silnik / enkoder 4. MPU6050 podłączony i mam już dostęp do danych z żyro i akcelerometru Plan na rozwój oprogramowania: 1. Dalsza optymalizacja oprogramowania (np użycie DMA do odczytu enkoderów oraz MPU). 2. Początkowo planuję użyć filtr komplementarny do ustalenia kąta wychylenia robota względem płaszczyzny pionowej. Później poeksperymentuję z filtrem Kalmana. 3. Zacznę od pojedynczego kontrolera PID który będzie miał za zadanie utrzymać zadany kąt wychylenia robota. Na wyjściu będzie długość wektora do sterowania FOC oraz kierunek obrotów (znak). 4. Gdy powyższy PID będzie działał prawidłowo, wtedy dodam kolejny PID który będzie utrzymywał zadaną prędkość robota, a na wyjściu będzie wymagany kąt wychylenia robota. Ta wartość będzie podawana jak referencyjna dla pierwszego kontrolera. 4. Kolejny PID do korygowania prędkości obrotowej lewego i prawego silnika. Będzie miał za zadanie utrzymanie robota na prostym kursie, lub skręcanie w zadanym kierunku Ponieważ czeka mnie kolejny wyjazd (obowiązki zawodowe) więc jestem zmuszony wstrzymać prototypownie do października. W między czasie w wolnej chwili dopracuję to co mogę nie mając dostępu do sprzętu, czyli schemat i projekt płytki drukowanej. Zacznę też projektować robota od strony mechanicznej (pewnie założę oddzielny wątek DIY gdy już będę miał co zaprezentować). Poniżej jedna z płytek enkodera: Obowiązkowe są tylko elementy IC1 i C1, reszta jest opcjonalna zależnie od tego jak chcemy wykorzystać sam układ i w jaki sposób podłączyć enkoder. Pozdrawiam i do następnego razu. 3
MR1979 Lipiec 25, 2020 Autor tematu Udostępnij Lipiec 25, 2020 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. 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 1
MR1979 Sierpień 3, 2020 Autor tematu Udostępnij Sierpień 3, 2020 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: Kolejnym krokiem będzie projekt płytki zasilającej. Pozdrawiam, Marek 1
Pomocna odpowiedź
Bądź aktywny - zaloguj się lub utwórz konto!
Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony
Utwórz konto w ~20 sekund!
Zarejestruj nowe konto, to proste!
Zarejestruj się »Zaloguj się
Posiadasz własne konto? Użyj go!
Zaloguj się »