Ta strona używa ciasteczek (plików cookies), dzięki którym może działać lepiej. Dowiedz się więcejRozumiem i akceptuję
PCB.center

Jak zaimplementować regulator PID dla silnika z enkoderem?

Autor Wiadomość
Komentator 




Posty: 865
Otrzymał 17 piw(a)
Wysłany: 04-08-2015, 22:56   Jak zaimplementować regulator PID dla silnika z enkoderem?

motor_enc
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 darmowym blogu Forbota.

Kliknij, aby przeczytać całość!


Poniżej znajdują się komentarze naszych użytkowników powiązane z tym artykułem.


Przeczytałeś artykuł? Dodaj komentarz!
Postaw piwo autorowi tego posta
 
 
lukas.ch 




Posty: 60
Pomógł: 1 raz
Otrzymał 2 piw(a)
Skąd: Wrocław, Kalisz
Programuję w:
C, C++, Python
Należę do:
KoNaR
Moje roboty:
Falka

Wysłany: 05-08-2015, 21:43   

Mam jedno zastrzeżenie. Brak jednostek na osiach! Wydaje mi się, że to jest bardzo poważne niedopatrzenie.

Ogólnie artykuł bardzo spoko :)

Postaw piwo autorowi tego posta
 
 
Treker 




Posty: 7721
Pomógł: 116 razy
Otrzymał 499 piw(a)
Skąd: Gdynia
Programuję w:
C, Arduino
Moje roboty:
Spectrum, Fuzzy

Wysłany: 05-08-2015, 22:14   

lukas.ch, GAndalF wróci z urlopu, to się będzie tłumaczył ;-)


Zachęcam do korzystania z forum - nie pomagam indywidualnie przez PW/maila.
Sprawdź » Kurs ARDUINOKurs podstaw elektronikiZbuduj swojego robota - kurs!
Postaw piwo autorowi tego posta
 
 
adam19_91 



Posty: 10
Programuję w:
c
Wysłany: 08-08-2015, 02:49   

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?

Postaw piwo autorowi tego posta
 
 
r_bot 



Posty: 52
Otrzymał 1 piw(a)
Skąd: Polska
Programuję w:
C
Wysłany: 09-08-2015, 14:32   

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

Ostatnio zmieniony przez r_bot 09-08-2015, 14:41, w całości zmieniany 1 raz  
Postaw piwo autorowi tego posta
 
 
Bobby 
Krzysztof Pochwała




Posty: 2386
Pomógł: 85 razy
Otrzymał 206 piw(a)
Skąd: Katowice/Wrocław
Programuję w:
C/C++
Należę do:
KoNaR
Moje roboty:
Pępki, Nugget

Wysłany: 09-08-2015, 17:19   

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:

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


Ostatnio zmieniony przez Bobby 09-08-2015, 17:22, w całości zmieniany 1 raz  
Postaw piwo autorowi tego posta
 
 
 
GAndaLF 



Posty: 276
Pomógł: 6 razy
Otrzymał 67 piw(a)
Skąd: Koszalin/Gdańsk
Programuję w:
C, ASM
Należę do:
SKALP
Wysłany: 10-08-2015, 17:31   

lukas.ch, faktycznie zapomniałem o podpisaniu osi w wykresach. Na uczelni już by nie przyjęli :D
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.

adam19_91 napisał/a:
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ść.

adam19_91 napisał/a:
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.


walczę jak lew, padam jak mucha
Postaw piwo autorowi tego posta
 
 
adam19_91 



Posty: 10
Programuję w:
c
Wysłany: 10-08-2015, 22:53   

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

Postaw piwo autorowi tego posta
 
 
GAndaLF 



Posty: 276
Pomógł: 6 razy
Otrzymał 67 piw(a)
Skąd: Koszalin/Gdańsk
Programuję w:
C, ASM
Należę do:
SKALP
Wysłany: 17-08-2015, 09:27   

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
Pobierz Plik ściągnięto 76 raz(y) 2.97 KB

Postaw piwo autorowi tego posta
 
 
Treker 




Posty: 7721
Pomógł: 116 razy
Otrzymał 499 piw(a)
Skąd: Gdynia
Programuję w:
C, Arduino
Moje roboty:
Spectrum, Fuzzy

Wysłany: 19-08-2015, 10:55   

Dodałem wspomniany załącznik jeszcze dla pewności do samego artykułu :)


Zachęcam do korzystania z forum - nie pomagam indywidualnie przez PW/maila.
Sprawdź » Kurs ARDUINOKurs podstaw elektronikiZbuduj swojego robota - kurs!
Postaw piwo autorowi tego posta
 
 
r_bot 



Posty: 52
Otrzymał 1 piw(a)
Skąd: Polska
Programuję w:
C
Wysłany: 01-06-2017, 11:18   

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

Postaw piwo autorowi tego posta
 
 
Więcej szczegółów
Wystawiono 1 piw(a):
Treker
GAndaLF 



Posty: 276
Pomógł: 6 razy
Otrzymał 67 piw(a)
Skąd: Koszalin/Gdańsk
Programuję w:
C, ASM
Należę do:
SKALP
Wysłany: 01-06-2017, 23:41   

Masz rację, w kodzie brakuje aktualizacji zmiennej pid_params.err_last. Dzięki za wyłapanie.


walczę jak lew, padam jak mucha
Postaw piwo autorowi tego posta
 
 
Więcej szczegółów
Wystawiono 1 piw(a):
Treker
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Możesz ściągać załączniki na tym forum
Wersja do druku

Skocz do:  

Nie rozwiązałeś swojego problemu? Zobacz podobne tematy: Intel Edison, czyli ... Kurs STM32 - #5 - Ko... Kurs STM32 - #4 - St... Intel Edison - wysył...
lub przeszukaj forum po wybranych tagach: artykul, automatyka, elektronika, poradnik, robotyka


Powered by phpBB modified by Przemo © 2003 phpBB Group
Popularne kursy: Arduinopodstawy elektroniki