Skocz do zawartości

Jak zaimplementować regulator PID dla silnika z enkoderem?


Komentator

Pomocna odpowiedź

html_mig_img
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

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

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

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

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

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

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

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

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

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ć?

  • Lubię! 1
Link do komentarza
Share on other sites

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

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 przez Gieneq
Zachęcam do używania bloku kodu
Link do komentarza
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...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.