Skocz do zawartości

Przeszukaj forum

Pokazywanie wyników dla tagów 'pid'.

  • Szukaj wg tagów

    Wpisz tagi, oddzielając przecinkami.
  • Szukaj wg autora

Typ zawartości


Kategorie forum

  • Elektronika i programowanie
    • Elektronika
    • Arduino i ESP
    • Mikrokontrolery
    • Raspberry Pi
    • Inne komputery jednopłytkowe
    • Układy programowalne
    • Programowanie
    • Zasilanie
  • Artykuły, projekty, DIY
    • Artykuły redakcji (blog)
    • Artykuły użytkowników
    • Projekty - DIY
    • Projekty - DIY roboty
    • Projekty - DIY (mini)
    • Projekty - DIY (początkujący)
    • Projekty - DIY w budowie (worklogi)
    • Wiadomości
  • Pozostałe
    • Oprogramowanie CAD
    • Druk 3D
    • Napędy
    • Mechanika
    • Zawody/Konkursy/Wydarzenia
    • Sprzedam/Kupię/Zamienię/Praca
    • Inne
  • Ogólne
    • Ogłoszenia organizacyjne
    • Dyskusje o FORBOT.pl
    • Na luzie

Kategorie

  • Quizy o elektronice
  • Quizy do kursu elektroniki I
  • Quizy do kursu elektroniki II
  • Quizy do kursów Arduino
  • Quizy do kursu STM32L4
  • Quizy do pozostałych kursów

Szukaj wyników w...

Znajdź wyniki, które zawierają...


Data utworzenia

  • Rozpocznij

    Koniec


Ostatnia aktualizacja

  • Rozpocznij

    Koniec


Filtruj po ilości...

Data dołączenia

  • Rozpocznij

    Koniec


Grupa


Imię


Strona

Znaleziono 3 wyniki

  1. Cześć, mam pytanie o regulator PID z biblioteki dla procesorów ARM: arm_math.h. W bibliotece tej są 3 funkcje do obsługi regulatora: - arm_pid_f32(), - arm_pid_q31(), - arm_pid_q15(). 1. W jakich przypadkach powinno się używać której wersji? 2. Której wersji najlepiej użyć w przypadku potrzeby regulacji prądu generowanego przez PWM? Prąd jest regulowany poprzez ustawianie odpowiedniego wypełnienia sygnału PWM.
  2. Witam serdecznie 🤗 Chciałbym przedstawić Państwu robota mobilnego, o wdzięcznej nazwie "Drewniak". Praca ta została wykonana na potrzeby projektu "Roboty Mobilne" na Politechnice Opolskiej. Poniżej krótka prezentacja robota na filmie, w dalszej części szczegółowy opis. 1. Cel projektu. Celem projektu było stworzenie robota mobilnego zdolnego do pokonania labiryntu. Postawione wymagania przed realizacją projektu to: całkowita autonomiczność robota, brak możliwości wpływu na trajektorię podczas jazdy robota, pokonanie labiryntu w obie strony w czasie poniżej dwóch minut. Zakres prac koniecznych do wykonania w celu realizacji projektu obejmuje: zaprojektowanie konstrukcji mechanicznej oraz elektronicznej, budowa robota, stworzenie oprogramowania robota, wykonanie testów potwierdzających poprawność działania konstrukcji. Na poniższym rysunku przedstawiono zwymiarowany schemat labiryntu, który musi zostać pokonany przez projektowanego robota. 2. Budowa układu mechanicznego, napędy Do stworzenia platformy jezdnej robota zdecydowano się na użycie materiałów drewnianych. Podwozie wykonane zostało z płyty pilśniowej oraz przymocowanych do nich drewnianych listew. Rzeczywiste wymiary platformy jezdnej robota to: 18 cm długości, 12 cm szerokości, oraz 5,5 cm wysokości, mierząc od podłoża do platformy podwozia. Robot napędzamy jest dwoma silnikami DC o następujących parametrach: napięcie zasilania od 5 V do 7 V, pobór prądu w stanie „bez obciążenia” około 180 mA, prędkość obrotowa za przekładnią: ok. 80 obr/min, moment obrotowy za przekładnią: ok. 0,5 kg*cm (0,049 Nm). Dodatkowo, kompletny zespół napędowy wyposażony jest w przekładnię o przełożeniu 48:1, a także koła wykonane z materiałów sztucznych o średnicy 65 mm oraz szerokości 26 mm. Ostatnim elementem zestawu napędowego robota jest prototypowe koło samonastawne, stworzone z zestawu klocków „Lego”, zapewniające trzeci punkt podparcia robota. Na poniższych rysunkach ukazano podwozie robota wraz z przymocowanymi napędami. 3. Budowa układu elektronicznego 3.1. Układ zasilania Na układ zasilania konstrukcji robota składają się cztery ogniwa litowo-jonowe, pozyskane ze starej baterii laptopa. Pojemność jednego ogniwa wynosi 2200 mAh. Ogniwa połączono równolegle. Uzyskano w ten sposób źródło zasilania o napięciu równym od 3 do 4,2 V, w zależności od stanu naładowania ogniw, oraz pojemności ponad 8000 mAh. W celu zabezpieczenia ogniw przed nadmiernym rozładowaniem oraz możliwości ich ładowania, zastosowano układ ładowarki akumulatorów jedno-celowych z zabezpieczeniem o oznaczeniu TP4056. Napięcie ładowania ogniw wynosi 4,2 V, maksymalny prąd ładowania to 1000 mA. Zabezpieczenie przed rozładowaniem ogniw poniżej napięcia równego 2,5 V, oraz przed poborem prądu ponad 3 A. Zastosowane rozwiązanie pozwala na ciągłe pobieranie prądu równego 3 A przez niespełna 3 godziny, bez uwzględniania strat. Aby podnieść napięcie zasilania do poziomu napięcia równego 7 V (maksymalne napięcie zasilania zastosowanych silników), użyto regulowanej przetwornicy impulsowej Step-Up o oznaczeniu XL6009E1. Jej napięcie wejściowe wynosi od 3 do 30 V, natomiast możliwe do regulacji napięcie wyjściowe od 5 do 35 V. Maksymalny prąd wyjściowy równa się 3 A, a sprawność układu zawiera się na poziomie 80-94%. Napięcie wyjściowe z przetwornicy zostało doprowadzone do sterownika silników oraz układu z mikroprocesorem. 3.2. Sterownik silników W celu precyzyjnej kontroli prędkości oraz kierunku obrotu silników napędowych, zastosowano dwukanałowy sterownik silników prądu stałego o oznaczeniu L298N. Pozwala on na pobór prądu maksymalnego przez silniki do 2 A na kanał, przy maksymalnym napięciu zasilania równym 12 V. Sterownik posiada wbudowany regulator napięcia 5 V, do zasilania części logicznej. 3.3. Czujniki odległości Aby możliwe było określenie położenia robota mobilnego, zdecydowano się na wykorzystanie dwóch analogowych czujników odległości firmy Sharp. Pierwszy z nich, o oznaczeniu GP2Y0A41SK0F i zakresie pracy od 4 do 30 cm, został umieszczony na prawym boku platformy jezdnej, pozwalając tym samym na określenie jej odległości od prawej ściany. Drugi czujnik, o oznaczeniu GP2Y0A21YK0F i zakresie pracy od 10 do 80 cm, został umieszczony na przodzie platformy jezdnej. Jego zadaniem jest wykrywanie przeszkody w postaci ściany przez robotem w momencie, gdy tunel zakręca w lewo pod kątem większym bądź równym 90 stopni. Czujniki zasilane są napięciem z zakresu od 4,5 do 5,5 V, ich średni pobór prądu to 30 mA. Wyjściem jest sygnał analogowy, którego wartość zależna jest od odległości pomiędzy wykrytym obiektem a sensorem. Im obiekt znajduje się bliżej, tym napięcie na wyjściu jest wyższe. 3.4. Mikrokontroler sterujący Jako jednostkę sterującą układem wybrano mikrokontroler AVR Atmega328 w obudowie do montażu przewlekanego DIP. Jest to ośmiobitowy mikrokontroler, posiadający 23 programowalne układy wejścia-wyjścia. Oferuje on 32 KB programowalnej pamięci Flash, 1 KB pamięci EEPROM, a także 2 KB pamięci SRAM, natomiast maksymalna częstotliwość taktowania wynosi 20 MHz przy użyciu zewnętrznego rezonatora kwarcowego lub 8 MHz przy użyciu wbudowanego. Na potrzeby projektu stworzono płytkę PCB metoda termotransferu, zawierającą opisywany mikrokontroler, wraz z niezbędnymi do jego poprawnej pracy elementami, tj. stabilizator napięcia 5 V, kondensatory i rezystory filtrujące zasilanie, rezonator kwarcowy o częstotliwości 16 MHz, dwie kontrolne diody LED, złącza na moduł Bluetooth, złącza na czujniki odległości, złącza do wyprowadzeń sterownika silnika. 4. Oprogramowanie mikrokontrolera Program sterujący mikrokontrolerem napisany został w języku C++ z użyciem środowiska Arduino. Następnie, po jego skompilowaniu, wgrano wsad do pamięci mikroprocesora. Użycie środowiska Arduino pozwoliło na łatwiejsze zaprojektowanie oprogramowania z racji dostępności wielu bibliotek, które w łatwy sposób można zaimportować do projektu. Działanie programu można zobrazować za pomocą poniższego schematu blokowego. W kodzie programu, na samym początku zadeklarowano odpowiednie pliki nagłówkowe, zdefiniowano stałe oraz zmienne globalne, które wykorzystywane są podczas działania oprogramowania. Zadeklarowano również obiekt FastPID, odpowiedzialny za użycie biblioteki regulatora PID. W funkcji setup() znalazły się inicjalizacje kolejnych modułów mikrokontrolera, tj. modułu ADC, mierzącego analogowe napięcie, oraz modułu PWM, pozwalającego wygenerować sygnał o zmiennym wypełnieniu. Ustalono również stany na pinach wyjściowych oraz zainicjalizowano moduł obsługujący komunikację szeregową UART, w celu przesyłania podstawowych informacji o pracy mikrokontrolera. W funkcji loop(), czyli w głównej pętli programu, na samym początku algorytmu sprawdzany jest czas, w celu odmierzenia 25 milisekund, za pomocą wbudowanej funkcji millis(). Następnie, po jego upływie, dokonuje się odczyt wartości analogowej napięcia z czujników Sharp. Wyznaczana jest odległość w milimetrach dla czujnika umiejscowionego z prawej strony robota, za pomocą własnej funkcji. Kolejno obliczany jest uchyb, a następnie dane przekazywane są do funkcji regulatora PID. W kolejnej części funkcji loop() sprawdzane jest, czy przed robotem nie ma przeszkody w postaci ściany. Odległość z przodu robota nie została przeliczona na jednostki miary, a jedynie ustalono pewną stałą „granicę”, po której przekroczeniu platforma jezdna skręca maksymalnie w lewo. Jeśli „granica” nie została przekroczona, wykonuje się regulacja za pomocą PID. Dodatkowo zadeklarowano przesyłanie podstawowych informacji, m.in. wartości z obu modułów ADC, wyznaczonej odległości, uchybu, za pomocą interfejsu UART, w celu kontrolowania działania programu mikrokontrolera. Wlutowane w płytkę diody również sygnalizują w odpowiedni sposób o poprawnym działaniu programu. Program mikrokontrolera nie może się zakończyć. Działa nieprzerwanie, aż do zaniku zasilania. Dzięki takiemu rozwiązaniu, robot jest w pełni autonomiczny. 5. Wnioski Celem projektu było stworzenie robota mobilnego zdolnego do pokonania labiryntu bez ingerencji użytkownika w tor jazdy, podczas jego pokonywania. Cel ten został osiągnięty, jednak podczas pracy natknięto się na kilka problemów. Przede wszystkim użyte silniki napędowe okazały się być średniej jakości. Po ustawieniu identycznego wypełnienia dla sygnału PWM dla obu silników, ich prędkości obrotowe znacznie się różniły. Jednak zastosowanie regulatora PID pozwoliło na odpowiednie kontrolowanie toru jazdy platformy robota mobilnego. Parametry regulatora PID zostały dobrane podczas przeprowadzanych testów. Wzmocnienie członu proporcjonalnego ustalono na wartość 1.30, wzmocnienie członu różniczkującego na wartość 2.15, natomiast wzmocnienie członu całkującego na wartość 0. W konstrukcji tego typu, gdzie zachodzi potrzeba szybkiego działania regulatora, człon całkujący mógłby wprowadzić niechciane opóźnienie w układzie regulacji. Robot pokonuje labirynt w czasie niecałych 30 sekund, co jest bardzo dobrym wynikiem. Stworzenie własnej konstrukcji, układu elektronicznego oraz oprogramowania wymagało dużego nakładu pracy, jednak końcowy efekt daje wiele satysfakcji. Ostateczna forma robota mobilnego została przedstawiona na poniższym rysunku. Projekt i wykonanie: Jakub Kinder / Politechnika Opolska 2019. Wszelkie prawa zastrzeżone! Kopiowanie, powielanie i wykorzystywanie zdjęć bez pisemnej zgody autora zabronione!
  3. 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
×
×
  • 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.