Popularny post Karor111 Napisano Marzec 15, 2020 Popularny post Udostępnij Napisano Marzec 15, 2020 Regulator PID (proporcjonalno-całkująco-różniczkujący) jest jednym z podstawowych typów regulatorów. Znalazł swoje miejsce w niezliczonej liczbie układów regulacji. Implementacja i testowanie algorytmu sterowania na rzeczywistym obiekcie pozwoli na łatwiejsze zapoznamie się z zasadami nim rządzącymi. W artykule zostanie zwrócona uwaga na wpływ poszczególnych członów regulatora na zachowanie obiektu. Co więcej zwrócimy uwagę na problem nasycania się całki (ang. integral windup) i zrealizujemy przykładowy układ do jego przeciwdziałania. Ten wpis brał udział konkursie na najlepszy artykuł o elektronice lub programowaniu. Sprawdź wyniki oraz listę wszystkich prac » Partnerem tej edycji konkursu (marzec 2020) był popularny producent obwodów drukowanych, firma PCBWay. Zarys struktury Obiektem sterowania jest śmigło (opis projektu wkrótce) z 8-bitowym mikrokontrolerem AVR w którym zaimplementujemy nasz regulator. Urządzeniem wykonawczym jest silnik prądu stałego. Jego sterowanie odbywa się za pomocą 10-bitowej modulacji szerokości impulsu. Sprzężenie zwrotne pozyskiwane jest z czujnika odległości zamontowanego na płytce. Jednostką odczytywanych wartości jest milimetr. Celem regulacji jest utrzymanie śmigła na zadanej wysokości - w naszym przypadku 1m. Jak wygląda schemat blokowy zaimplementowanego układu regulacji? Wykorzystane rozwiązanie przedstawione jest na poniższym obrazku. Kod algorytmu Nazwy zmiennych w kodzie programu są nazwane analogiczne do nazw sygnałów na schemacie blokowym. Kod pętli głównej programu został przedstawiony poniżej. while(1) { // czas próbkowania Ts=50ms // kod odpowiedzialny za pobranie i zapisanie w zmiennej height odległości od powierzchni w mm while(dataReady == 0) VL53L1X_CheckForDataReady(dev, &dataReady); dataReady = 0; VL53L1X_GetDistance(dev, &height); VL53L1X_ClearInterrupt(dev); error = height_setpoint - height; // obliczanie wartości uchybu sterowania // sterowanie niebieską diodą led sygnalizującą zawieranie się wartości uchybu w przedziale +-5cm if(abs(error) < 50) PORTD |= (1<<PD3); else PORTD &= ~(1<<PD3); // obliczanie całki metodą prostokątów z uwzględznieniem sprzężenia od mechanizmu anti-windup integral = integral + error*Ts + Kaw*integral_correction; // obliczanie pochodnej derivative = (error-last_error)/Ts; // równanie obliczające wartość wielkości sterującej przed ograniczeniem cv_before_sat = Kp*error + Ki*integral + Kd*derivative; if(cv_before_sat > 1023) control_value = 1023; // ograniczenie wartości sterującej else if(cv_before_sat < 0) control_value = 0; else control_value = cv_before_sat; // warunek zatrzymujący śmigło na czas 3s w przypadku wysokości mniejszej niż 10cm if(height < 100) { control_value = 0; OCR1A = (uint16_t)control_value; for(int i = 0; i < 6; i++) { // mruganie diodą PORTD ^= (1<<PD3); _delay_ms(500); } integral = 0; // zerowanie całki } else OCR1A = (uint16_t)control_value; // przypisanie wartości cv jako wypełnienie PWM integral_correction = control_value - cv_before_sat // różnica wartości sterujących last_error = error; // zapamiętanie wartości uchybu jako ostatni uchyb } Badanie działania poszczególnych członów Wstępny dobór nastaw regulatora zrealizowano metodą testów symulacyjnych: Kp=1.6, Ki=0.75, Kd=0.3, Kaw=0.1. W celu przebadania sposobu działania regulatora sprawdzimy zachowanie obiektu w kilku przypadkach, włączając kolejne człony regulatora. Śmigło po włączeniu zapamiętuje 400 ostatnich próbek aktualnej wysokości, lub wielkości sterującej. Z mikrokontrolera wyciągniemy je dzięki komunikacji UART, a następnie naszkicujemy odpowiednie wykresy. Przejdźmy do analizy działania członu proporcjonalnego. Jaka jest jego idea? W skrócie generuje tym silniejszy sygnał im większa jest różnica między wartością zadaną a wartością sterującą. Niżej przedstawione zostało zachowanie naszego obiektu z regulatorem tylko wykorzystującym człon proporcjonalny. Odpowiedź obiektu sterowanego jest daleka od ideału. Korzystanie tylko z członu P w obiektach często prowadzi do utraty stabilności, tak jak w naszym przypadku. Zajmijmy się członem różniczkującym. Człon różniczkujący jak nazwa wskazuje liczy pochodną. Im większy przyrost uchybu tym większa wartość sygnału sterującego. Jak sprawił się w naszym przypadku razem z członem P? Zastosowanie członu D pozwoliło na stabilizację obiektu, jednak uchyb w stanie stanie ustalonym nie jest do przyjęcia. Rozwiązaniem problemu jest dodanie członu I. Działanie członu całkującego polega na obliczaniu całki, czyli w najprostszym wypadku w systemach dyskretnych na ciągłym sumowaniu kolejnych uchybów z uwzględnieniem czasu próbkowania. Regulator PI w naszym obiekcie zareagował dosyć drastycznie. Człon całkujący korzystnie wpływa na powstawanie oscylacji, oraz na destabilizowanie układu regulacji. Sprawdźmy zachowanie obiektu regulacji z wykorzystaniem pełnego regulatora PID. Szczęśliwie dla nas, po zastosowaniu różniczki obiekt został doprowadzony do stabilności, a dzięki całkowaniu uchyb w stanie ustalonym został wyeliminowany. Jednak przy członie całkującym należy zachować ostrożność i powrócić do wspomnianego wcześniej nasycania się całki. Brak mechanizmu anti-windup, może doprowadzić do zdominowania przez człon całkujący sygnału sterującego! W naszym przypadku taką sytuację możemy wygenerować przytrzymując przez chwilę śmigło w miejscu lekko oddalonym od wartości ustalonej. Lepszą analizę tego problemu można przeprowadzić obserwując wartość sterującą w czasie. Zaimplementowanie mechanizmu anti-windup do naszego regulatora spowodowało odpowiedzi jak niżej. Użyty przez nas mechanizm skutecznie osłabił człon I w chwilach kiedy całka została nasycona, a dodatkowo przyrost wartości sterującej został nieznacznie ograniczony. Moje zmagania z regulatorem PID prezentuje poniższy filmik. Podsumowanie Mam nadzieję, że temat regulatora PID został nieco bardziej przybliżony. Zrozumienie jego działania jest podstawą do poznania bardziej zaawansowanych algorytmów, które kiedyś będziesz mógł wykorzystać w swoich projektach! Cały kod programu dostępny jest na moim GitHubie. Pozdrawiam, Karol 4 Cytuj Link do komentarza Share on other sites More sharing options...
Treker (Damian Szymański) Marzec 16, 2020 Udostępnij Marzec 16, 2020 Artykuł został opublikowany, więc podbijam, aby wszyscy widzieli go jako nowy temat 🙂 1 Cytuj Link do komentarza Share on other sites More sharing options...
Anonim Marzec 20, 2020 Udostępnij Marzec 20, 2020 O PIDach nigdy zbyt wiele 🙂 Cytuj Link do komentarza Share on other sites More sharing options...
Sabre Marzec 26, 2020 Udostępnij Marzec 26, 2020 Artykuł dość ciekawy choć prawdę mówiąc spodziewałem się trochę lepszych opisów poszczególnych składowych. Tak naprawdę z artykułu w ogóle nie wynika czym są dane na wykresach w jaki sposób zostały zebrane itp. Mnie zaciekawił mechanizm anti-windup, ale nie dowiedziałem się w ogóle czym jest i jak został zrealizowany. Ciekawie natomiast zrealizowałeś filmik z pokazaniem poszczególnych składowych, ale tak jak napisałem wcześniej zbyt mało szczegółów i podstawowych informacji co z czego wynikało jak np. początkowe nastawy wynikające z symulacji. W jaki sposób została przeprowadzona symulacja, w jakim środowisku, na podstawie jakich danych. Myślę, że te informacje w znacznym stopniu wzbogaciłyby ten artykuł. 1 Cytuj 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
Karor111 Marzec 31, 2020 Autor tematu Udostępnij Marzec 31, 2020 (edytowany) Dnia 26.03.2020 o 12:14, Sabre napisał: Artykuł dość ciekawy choć prawdę mówiąc spodziewałem się trochę lepszych opisów poszczególnych składowych. Tak naprawdę z artykułu w ogóle nie wynika czym są dane na wykresach w jaki sposób zostały zebrane itp. Mnie zaciekawił mechanizm anti-windup, ale nie dowiedziałem się w ogóle czym jest i jak został zrealizowany. Ciekawie natomiast zrealizowałeś filmik z pokazaniem poszczególnych składowych, ale tak jak napisałem wcześniej zbyt mało szczegółów i podstawowych informacji co z czego wynikało jak np. początkowe nastawy wynikające z symulacji. W jaki sposób została przeprowadzona symulacja, w jakim środowisku, na podstawie jakich danych. Myślę, że te informacje w znacznym stopniu wzbogaciłyby ten artykuł. Osobiście bardzo nie lubię długich artykułów. Moim pomysłem dotyczącym tego było zainteresowanie i zachęcenie czytelnika do dalszego studiowania tego tematu. Jednak rzeczywiście, mogę przyznać rację, że artykuł jest, lekko mówiąc, lakoniczny. Im więcej razy go czytam tym więcej widzę rzeczy wartych do dodania, czy nieświadomie pominiętych. Przy moich kolejnych tekstach na forum postaram się, aby było lepiej. 😀 Edytowano Marzec 31, 2020 przez Karor111 2 Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
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!