Regulator PID w praktyce
Często w robotyce spotykamy się z problemem automatycznego sterowania i regulacji pewnych parametrów, na podstawie pomiarów z czujników, aby osiągnąć określony cel. Przykładowo kiedy budujemy robota podążającego za linią, chcemy aby na podstawie odczytów z czujników reagujących na linię, nastąpiła automatyczna regulacja prędkości obrotowej silników, tak aby robot mógł jechać wzdłuż linii. Możemy próbować napisać program sterowania takim robotem opierając się tylko na swojej intuicji tworząc wiele operacji warunkowych i takie rozwiązanie też będzie działać. Jest jednak prosty przepis na automatyczną regulację – jest to regulator PID.
Odrobina teorii o układach sterowania
To czym będziemy sterować, czyli np. silnik, grzałka żarówka, itd. nazywamy obiektem sterowania. Możemy zastosować sterowanie w otwartej pętli, gdzie u(t) to nasz sygnał wejściowy , będący sygnałem pobudzającym nasz obiekt w danej chwili czasu, może być to np. wartość napięcia elektrycznego. Natomiast nasze y(t) to sygnał wyjściowy naszego obiektu wdanej chwili czasu, którym może być np. prędkość obrotowa, czy temperatura. W pętli otwartej nie posiadamy informacji na temat sygnału wyjściowego, sterujemy „na ślepo”. Wierzymy że jeśli producent podaje że grzałka przy pobudzeniu sygnałem o danym napięciu uzyskamy daną temperaturę. Jest to słabe rozwiązanie ponieważ nie jesteśmy w stanie reagować na zmieniające się warunki otoczenia.
Dlatego bardziej powszechne jest stosowanie sterowania w pętli zamkniętej. Przy zastosowaniu pętli zamkniętej wykorzystujemy czujnik, który pozwala nam mierzyć sygnał wyjściowy naszego obiektu. Sygnał r(t) jest to wartość którą chcemy uzyskać na wyjściu obiektu. Natomiast e(t) jest to uchyb sterowania, czyli różnica pomiędzy sygnałem zadanym r(t) oraz sygnałem wyjściowym y(t). Regulator na podstawie uchybu sterowania dobierze taka wartość sygnału u(t) pobudzającego obiekt, tak aby go zminimalizować, czyli będzie dążył do tego aby wartość sygnału wyjściowego była taka sama jak sygnału zadanego. Regulacja za pomocą regulatora PID odbywa się właśnie w pętli zamkniętej.
Czym jest regulator PID?
Regulator PID jest to algorytm sterowania, który można zrealizować w różnej materii. Algorytm ten można zrealizować w postaci analogowej poprzez zaprojektowanie i zbudowanie odpowiedniego obwodu elektrycznego. Rzadko jednak teraz stosuje się to podejście. Częściej wykorzystujemy regulator PID w formie cyfrowej, czyli w postaci kodu w jakimś języku programowania.
Tak jak już wcześniej wspomniałem regulator PID dąży do zminimalizowania uchybu e(t). Składa się z trzech członów:
- Członu proporcjonalnego oznaczanego literą P – jego rolą jest kompensacja uchybu bieżącego;
- Członu całującego oznaczanego literą I – kompensuje on akumulację uchybów z przeszłości.
- Członu różniczkującego oznaczanego literą D – kompensuje on przewidywane uchyby z przyszłości
Stąd wynika nazwa regulatora PID. Każdy z tych członów charakteryzuje się własnym współczynnikiem wzmocnienia, odpowiednio Kp dla członu proporcjonalnego, Ki dla człony całkującego oraz Kd dla człony różniczkującego. Natomiast suma wyników działania tych trzech członów stanowi sygnał sterujący procesem. Strojenie regulatora PID polega właśnie na ustaleniu wartości tych parametrów tak aby sterowanie procesem spełniało nasze oczekiwania. Nie musimy zawsze wykorzystywać wszystkich członów regulatora PID, możemy wykorzystać tylko dwa lub jeden. Jest wiele analitycznych metod dobierania parametrów regulatora PID, omówię je w osobnym artykule. Zatem działanie regulatora PID można opisać równaniem:
Ten wzór nie jest jednak użyteczny do zaimplementowania. Aby tak się stało należy przyjąć pewne numeryczne uproszczenia całki i różniczki. Tak więc całkę możemy przedstawić jako sumę kumulacyjną uchybów ze wszystkich dyskretnych chwil czasu, natomiast różniczkę możemy przedstawić jako różnicę wartości uchybu z obecnej chwili i wartości uchybu z chwili poprzedniej. Wówczas otrzymamy wzór który łatwo zaimplementować w dowolnym języku programowania:
Skąd wziąć wartość uchybu?
Nie zawsze oczywiste jest skąd uzyskać wartość uchybu w układzie sterowania. O ile w prostych przypadkach jak np. sterowanie temperaturą nie jest to problemem, gdyż jesteśmy w stanie użyć czujnik temperatury, który w prost poda nam wartość w postaci liczbowej. Tak w przypadku zastosowania czujników cyfrowych, które dają nam tylko informację „1” kiedy występuje dane zjawisko i „0” kiedy go nie ma nie jest już tak łatwo. Właśnie z takim problemem mamy do czynienia przy budowie robota typu LineFollower. Posiadamy linijkę czujników odbiciowych które zwracają nam „1” kiedy wykrywają linię i „0” kiedy linii nie ma. Wówczas aby wykorzystać regulator PID należy wykazać się pewną kreatywnością i pomysłowością. Możemy na przykład określić wagę każdego z czujników, i obliczyć średnią. Tak więc jeśli przyjmiemy wagi tak jak na rysunku poniżej, kiedy sensor 4 i sensor 5 wykrywa linię wówczas wartość uchyby wyniesie 75, jeśli tylko sensor 3 wykrywa linię wówczas uchyb jest równy 0.
Windup - co to jest i jak temu przeciwdziałać?
Regulator PID zakłada że świat zewnętrzny jest liniowy, co oczywiście jest kłamstwem. Nasze urządzenia wykonawcze, takie jak grzałka, czy silnik mają pewną ograniczona moc, czyli charakteryzują się nasyceniem. Oznacza to że nie możemy uruchomić naszej grzałki na 120% mocy, natomiast regulator PID będzie tego oczekiwał. Zestawienie członu całkującego z regulatora PID oraz nasycenia może skutkować pojawieniem się zjawiska określanego jako windup całkowania. Wyobraźmy sobie sytuację kiedy chcemy w systemie regulacji temperaturą uzyskać wartość 100 stopni Celsjusza, kiedy temperatura obecna wynosi 20 stopni. Regulator PID uruchamia grzałkę na 100% mocy, jednak jej moc jest ograniczona, przez co uchyb będzie redukowany wolniej niż oczekuje tego regulator. W tym czasie wartość całki może osiągnąć olbrzymie wartości. Nawet kiedy osiągniemy zadaną temperaturę, wartość całki zacznie maleć dopiero wtedy kiedy temperatura będzie większa od zadanej. Może pojawić się ogromne przesterowanie i wydłuży się czas stabilizacji. Jest wiele metod przeciwdziałania temu zjawisku, najprostszym sposobem jest ograniczenie wartości całki do skończonych wartości.
Przykład implementacji regulatora PID
double integral = 0;
double err_old = 0;
double PID(double Kp,double Ki,double Kd,double err){
integral=integral+err;
if (integral>100000) integral = 100000;
if (integral<-100000) integral = -100000;
diff=err-err_old;
double response = Kp*err+ Ki*integral+Kd*diff;
if (response>100) response = 100;
if (response<-100) response = -100;
err_old = err;
return response;
}
Na początku kodu tworzymy sobie zmienną „integral” w której będziemy przechowywać wartość całki oraz zmienną „err_old” w której będziemy przechowywać wartość uchybu z poprzedniej iteracji. Tworzymy funkcję „PID” którą będziemy mogli wywołać w dowolnym miejscu naszego programu wprowadzając odpowiednie parametry regulatora i wartość uchybu. Na początku obliczamy nową wartość całki i obcinamy jej wartość jeśli jest zbyt duża lub zbyt mała, w ten sposób realizujemy „anti windup”. Następnie obliczamy wartość różniczki. Teraz obliczamy odpowiedź regulatora PID i ją również ograniczamy, gdyż przeważnie nasz układ sterujący ma również ograniczoną moc. W tym przypadku zakres wartości regulatora PID wynosi -100 : 100 i oznacza moc układu sterującego w procentach. Na końcu aktualizujemy zmienną „err_old”.
No related posts.