Komentator Napisano Sierpień 4, 2015 Udostępnij Napisano Sierpień 4, 2015 W artykule przedstawię proces projektowania regulatora PID do kontroli prędkości silnika DC wyposażonego w enkoder.Najpierw zajmiemy się identyfikacją modelu silnika. Następnie dostroimy dla niego regulator PID, po czym sprawdzimy jak gotowy regulator działa w praktyce. UWAGA, to tylko wstęp! Dalsza część artykułu dostępna jest na blogu.Przeczytaj całość »Poniżej znajdują się komentarze powiązane z tym wpisem. Link do komentarza Share on other sites More sharing options...
lukas.ch Sierpień 5, 2015 Udostępnij Sierpień 5, 2015 Mam jedno zastrzeżenie. Brak jednostek na osiach! Wydaje mi się, że to jest bardzo poważne niedopatrzenie. Ogólnie artykuł bardzo spoko 🙂 Link do komentarza Share on other sites More sharing options...
Treker (Damian Szymański) Sierpień 5, 2015 Udostępnij Sierpień 5, 2015 lukas.ch, GAndalF wróci z urlopu, to się będzie tłumaczył 😉 Link do komentarza Share on other sites More sharing options...
adam19_91 Sierpień 8, 2015 Udostępnij Sierpień 8, 2015 Wreszcie jakiś ciekawy artykuł z teorii sterowania. Takie pytanie czemu w matlabie dobierasz nastawy dla regulatora dyskretnego a w programie stosujesz wzór dla ciągłego , w ogóle nie odejmujesz poprzedniej wartości sterowania ani nie uwzględniasz czasu próbkowania we wzorze? http://images.slideplayer.pl/2/840379/slides/slide_4.jpg Czy to trik polegający na tym, że wywołujesz przerwanie co okres próbkowania i wówczas można użyć regulatora ciągłego? Napisz z czego wynika wartość makra do antiwindup? #define ERR_SUM_MAX 1000 I ostatnie najtrudniejsze patrząc na model matematyczny silnika DC można zauważyć, że sterowaniem jest napięcie zasilające wirnik i moment obciążenia. Natomiast ty w swoim artykule jako wyjście z regulatora PID czyli sterowanie używasz wartości PWM, która najoględniej mówiąc steruje prędkością kątową(liczbą obrotów w jednostce czasu). I tu moje pytanie czy nie należy wyjścia z regulatora jakoś przeliczyć na prędkość i dopiero podać na obiekt? X1=Iw X2=omega U1=Uz U2=Mobc X2'=km/J*X1-B/J*X2+0*U1-1/J*U2; i z tego całka, otrzymujemy wartość prędkości wymaganej do zrealizowania sterowania, którą przeliczasz na PWM. Chodzi mi o to, czy wyjście regulatora może być czymkolwiek jest to wartość bez jednostki, za którą podstawiasz co ci pasuje? Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Produkcja i montaż PCB - wybierz sprawdzone PCBWay! • Darmowe płytki dla studentów i projektów non-profit • Tylko 5$ za 10 prototypów PCB w 24 godziny • Usługa projektowania PCB na zlecenie • Montaż PCB od 30$ + bezpłatna dostawa i szablony • Darmowe narzędzie do podglądu plików Gerber Zobacz również » Film z fabryki PCBWay
r_bot Sierpień 9, 2015 Udostępnij Sierpień 9, 2015 Warto zamieścić jeszcze plik out001.txt. Mam też problem z rozczytaniem wykresu "Odpowiedź skokowa silnika w pętli otwartej". Czy dobrze rozumiem, czerwona linia to wypełnienie PWM, a niebieska to liczba obrotów na minutę/sekundę? Link do komentarza Share on other sites More sharing options...
Bobby Sierpień 9, 2015 Udostępnij Sierpień 9, 2015 adam19_91, nie jest przypadkiem tak, że to napięcie zasilania silnika jest wprost proporcjonalne do jego prędkości obrotowej? Przy odpowiednio dużej częstotliwości PWM można uprościć, że jest to tak naprawdę zmienne napięcie. I co do regulatora dyskretnego/ciągłego - nie mogę poprzeć się stuprocentowo jakimś papierem, ale wydaje mi się, że jeśli wywołujesz regulator co jakiś stały okres czasu, robi się dyskretny. Czasu próbkowania nie trzeba uwzględniać, bo jest to stała, która została już wliczona we współczynniki: Po osiągnięciu zadowalającej charakterystyki klikamy Update block i parametry PID zostają zaktualizowane. Moje wartości to P = 5.94, I = 347.19 i D = -0.03. Warto zauważyć, że wartości I oraz D są znormalizowane względem czasu próbkowania. Widać to na wzorze w oknie bloku PID. Tak więc wartość I jest mnożona przez czas próbkowania, a wartość D dzielona. r_bot prawidłowo odczytujesz wykres 😉 Odpowiedź jednak nie zbiega do wartości sterowania, bo są podane w różnych jednostkach - PWM to wypełnienie od 0-100, a niebieski to ilość ticków enkodera w jednostkowym czasie (okresie próbkowania). Link do komentarza Share on other sites More sharing options...
GAndaLF Sierpień 10, 2015 Udostępnij Sierpień 10, 2015 lukas.ch, faktycznie zapomniałem o podpisaniu osi w wykresach. Na uczelni już by nie przyjęli 😃 Oś pozioma na każdym wykresie to szas w sekundach. Na pierwszym wykresie czerwona linia to wypełnienie PWM w procentach, a niebieska to ilość ticków enkodera na okres próbkowania. Na drugim wykresie czerwona linia to wyjście układu w Simulinku, niebieska to wyjście rzeczywistego układu. W obu przypadkach jednostką jest liczba ticków enkodera na okres próbkowania. Na ostatnim wykresie oś pionowa to również ilość ticków enkodera na okres próbkowania. adam19_91, w programie stosuję dyskretny PID tak samo jak w Matlabie. Odejmuję poprzednią wartość sterowania przy wyliczaniu err_d. Czasu próbkowania nie uwzględniam we wzorze dlatego, że jest już uwzględniony w matlabowym tunerze. Tak jak napisał Bobby. Napisz z czego wynika wartość makra do antiwindup? #define ERR_SUM_MAX 1000 Wartość ta jest ustawiana na oko. Znając ki można sobie policzyć jaki wpływ na sterowanie będzie miał człon całkujący w najgorszym wypadku i wybrać zadowalającą wartość. I ostatnie najtrudniejsze patrząc na model matematyczny silnika DC można zauważyć, że sterowaniem jest napięcie zasilające wirnik i moment obciążenia. Natomiast ty w swoim artykule jako wyjście z regulatora PID czyli sterowanie używasz wartości PWM, która najoględniej mówiąc steruje prędkością kątową(liczbą obrotów w jednostce czasu). I tu moje pytanie czy nie należy wyjścia z regulatora jakoś przeliczyć na prędkość i dopiero podać na obiekt? X1=Iw X2=omega U1=Uz U2=Mobc X2'=km/J*X1-B/J*X2+0*U1-1/J*U2; i z tego całka, otrzymujemy wartość prędkości wymaganej do zrealizowania sterowania, którą przeliczasz na PWM. Chodzi mi o to, czy wyjście regulatora może być czymkolwiek jest to wartość bez jednostki, za którą podstawiasz co ci pasuje? Projektując regulator mogę sobie wybrać co ma być wejściem, a co wyjściem. Wybrałem na wejściu regulatora sygnał z enkodera, na wyjściu PWM, bo na takich wartościach bezpośrednio działa mikrokontroler i nic nie trzeba przeliczać. Tak samo obiekt u mnie przyjmuje na wejściu PWM, a na wyjściu zwraca prędkość jako odczyt z enkodera. Po prostu tak jest wygodniej - unikamy przekształceń i nie musimy znać wszystkich parametrów silnika. Link do komentarza Share on other sites More sharing options...
adam19_91 Sierpień 10, 2015 Udostępnij Sierpień 10, 2015 Wybacz mi dociekliwość ale nie potrafię zrozumieć jak regulator, który ma na wejściu uchyb prędkości na wyjściu generuje wypełnienie PWM? Skąd on ma wiedzieć na przykład jaką rozdzielczość ma PWM w twoim uC? Czy nie jest tak po prostu, że na wejściu regulatora jest uchyb prędkości to na wyjściu jest również wartość oznaczająca prędkość, o którą należy np. zwiększyć obroty? A dopiero tą wartość przeliczyć na PWM? A jak będzie w przypadku drona albo wahadła odwróconego gdzie wyjściem jest kąt, który wchodzi na regulator? Podaję kąt a on mi wylicza PWM czy kąt, o który należy zmienić położenie? To ważne pytanie jeśli chodzi o praktyczne podejście do tematu na zajęciach funkcjonują tylko pojęcia uchyb->regulator->sterowanie. Pozdrawiam Link do komentarza Share on other sites More sharing options...
GAndaLF Sierpień 17, 2015 Udostępnij Sierpień 17, 2015 Regulator może mieć na wejściu i wyjściu wartości w obojętnie jakich jednostkach. Jego zasada działania pozostaje taka sama. Dlatego nic nie stoi na przeszkodzie, żeby zwracał wypełnienie PWM. Należy tylko pamiętać, że regulator może zwracać wartości spoza zakresu -100-100%. Wartości jakie regulator przyjmuje na wejściu i wyjściu określamy w fazie projektowania. Ja jako wejście obiektu (czyli wyjście regulatora) przyjąłem PWM i w takich jednostkach zebrałem odpowiedź skokową. W przypadku drona, wahadła, albo jakiegokolwiek innego układu również możesz zaprojektować regulator tak, żeby wyjściem regulatora był PWM. [ Dodano: 17-08-2015, 23:18 ] W załączniku brakujący plik out001.txt out001.txt Link do komentarza Share on other sites More sharing options...
Treker (Damian Szymański) Sierpień 19, 2015 Udostępnij Sierpień 19, 2015 Dodałem wspomniany załącznik jeszcze dla pewności do samego artykułu 🙂 Link do komentarza Share on other sites More sharing options...
r_bot Czerwiec 1, 2017 Udostępnij Czerwiec 1, 2017 Cześć po dłuższej przerwie. Przejrzałem dziś kod źródłowy regulatora PID, plik pid.c i jedna rzecz mnie zastananwia. Składowa struktury pid_params, err_last jest cały czas równa 0. Według mnie w funkcji pid_calculate powinnno się znajdować następujące przypisanie: pid_params.err_last = pid_params.err; Czy ktoś z forumowiczów mógłby to zweryfikować? 1 Link do komentarza Share on other sites More sharing options...
GAndaLF Czerwiec 1, 2017 Udostępnij Czerwiec 1, 2017 Masz rację, w kodzie brakuje aktualizacji zmiennej pid_params.err_last. Dzięki za wyłapanie. 1 Link do komentarza Share on other sites More sharing options...
Pikej Czerwiec 15, 2019 Udostępnij Czerwiec 15, 2019 Witam chciałbym zaimplementować regulator PID do sterowania pozycją (kątem obrotu) wirnika silnika prądu stałego. Mam pytanie czy matematyczny model silnika wyznaczam tak samo jak w artykule czy jednak inaczej prosiłbym o jakieś wskazówki jak do tego podejść. Link do komentarza Share on other sites More sharing options...
RomekAtomek Kwiecień 11, 2020 Udostępnij Kwiecień 11, 2020 (edytowany) W tekście możemy przeczytać: "e_sum to suma wszystkich wartości uchybu od początku sterowania". Pytanie do autora: dlaczego przyjęto takie rozwiązanie? Z jakiego powodu zostało przyjęte, że obecna regulacja ma zależeć od tego co działo się w odległej przeszłości? Funkcja pid_calculate zawiera warunki: if (pid_params.err_sum > ERR_SUM_MAX) { pid_params.err_sum = ERR_SUM_MAX; } else if (pid_params.err_sum < -ERR_SUM_MAX) { pid_params.err_sum = -ERR_SUM_MAX; } przy niekończącym się sumowaniu uchybu może nastąpić "przekręcenie" wartości ale zastosowanie tych warunków może wprowadzać dodatkowe błędy w sterowaniu. W teorii, czynnik całkujący zawiera dzielenie przez Tc - czas całkowania. W opisanym przypadku czas całkowania stale rośnie (do nieskończoności), czyli czynnik całkujący powinien zanikać z czasem a nic takiego nie ma miejsca. Co było przyczyną takiego rozwiązania? Tylko uproszczenie całkowania czy może coś jeszcze? Zaprezentowane wyniki pokazują, że regulator działa ale algorytm nie pasuje mi do teorii. Czy coś przeoczyłem? Edytowano Kwiecień 12, 2020 przez Gieneq Zachęcam do używania bloku kodu Link do komentarza Share on other sites More sharing options...
Treker (Damian Szymański) Kwiecień 14, 2020 Udostępnij Kwiecień 14, 2020 @RomekAtomek artykuł jest już dość "starty", więc dla formalności zawołam autora: @GAndaLF, zerkniesz? 😉 Link do komentarza Share on other sites More sharing options...
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ę »