Spisu treści:

Regulator PID VHDL: 10 kroków
Regulator PID VHDL: 10 kroków

Wideo: Regulator PID VHDL: 10 kroków

Wideo: Regulator PID VHDL: 10 kroków
Wideo: PID Controller Implementation in Software - Phil's Lab #6 2024, Lipiec
Anonim
Regulator PID VHDL
Regulator PID VHDL
Regulator PID VHDL
Regulator PID VHDL

Ten projekt był moim ostatnim projektem, aby ukończyć mój dyplom licencjata z wyróżnieniem na Cork Institute of Technology. Ten samouczek jest podzielony na dwie sekcje, pierwsza obejmie główną treść kodu PID, który jest głównym celem projektu, a druga sekcja obejmuje interfejs kodu, który został zaimplementowany na płycie rozwojowej Basys 3, a następnie połączony z piłką do ping ponga platforma lewitacyjna. Zestaw teoretyczny i zbudowany pokazano na załączonych zdjęciach.

Kieszonkowe dzieci

Symulacja

Apartament Vivado Design

Wdrożenie (w nawiasach jest to, co zostało użyte w moim projekcie)

  • Płyta FPGA, która może wprowadzać i wyprowadzać sygnały cyfrowe/analogowe (Basys 3)
  • system, który można kontrolować za pomocą jednego źródła sprzężenia zwrotnego (Ping Pong Ball Levitation Rig)

Takielunek

  • Rurka z poliwęglanu
  • Wentylator 5V
  • Czujnik podczerwieni
  • Drukowana podstawa 3D (Ten samouczek dokumentuje budowę platformy, do której dodano czujnik, aby zapewnić informacje zwrotne, ale platforma była zasadniczo taka sama)
  • Rezystory 1k
  • Płytka do krojenia chleba z szyną 5V i GND

Krok 1: Podstawowa teoria sterowania

Podstawowa teoria sterowania
Podstawowa teoria sterowania

Pomyślałem, że dodanie jakiejś podstawowej teorii sterowania da każdemu, kto chciałby spróbować zaimplementować ten kod, dobrą podstawę do rozpoczęcia.

Załączony schemat przedstawia układ sterownika z pojedynczą pętlą.

r- Czy odniesienie. Określa to, dokąd kontroler ma się udać.

e-Czy błąd. Jest to różnica między wartością na czujniku a wartością odniesienia. np. e=r-(d+wyjście czujnika).

K-To jest kontroler. Kontroler może składać się z trzech terminów. Te terminy to P, I i D. Wszystkie trzy terminy mają mnożniki zwane Kp, Ki i Kd. Te wartości określają reakcję sterownika.

  • P-proporcjonalny. Regulator stricte P będzie miał wyjście proporcjonalne do aktualnego błędu. Kontroler P jest prosty do zaimplementowania i działa szybko, ale nigdy nie osiągnie ustawionej wartości (odniesienia).
  • Ja-całka. Ściśle integralny sterownik zsumuje poprzedni błąd, który ostatecznie osiągnie żądaną wartość odniesienia. Ten kontroler jest generalnie zbyt wolny, aby go zaimplementować. Dodanie terminu P skróci czas potrzebny na dotarcie do odniesienia. Należy uwzględnić czas, w którym dane wejściowe są próbkowane, a człon całkowy jest całkowany względem czasu.
  • D-pochodna. Wyrażenie pochodne będzie miało wynik zależny od tempa zmiany błędu. Termin ten jest zwykle używany z terminem P lub z terminem PI. Ponieważ jest to proporcjonalne do tempa zmiany błędu, szum singla będzie miał wzmocniony, co może spowodować, że system będzie niestabilny. Należy również wziąć pod uwagę czas, ponieważ termin pochodny odnosi się również do czasu.

U- To jest sygnał kontrolny. Ten sygnał jest wejściem do platformy. W przypadku tego projektu u jest wejściem sygnału PWM do wentylatora w celu zmiany prędkości.

Gawrił: To jest system, który jest kontrolowany. System ten można modelować matematycznie w domenie S lub Z. Systemy mogą być n-tego rzędu, ale dla kogoś, kto zaczyna pracę ze sterowaniem, prawdopodobnie należy założyć system pierwszego rzędu, ponieważ jest on znacznie łatwiejszy do obliczenia. Jest mnóstwo informacji na temat systemu modelowania, które można znaleźć w Internecie. W zależności od czasu próbkowania czujnika model systemu może być dyskretny lub ciągły. Ma to drastyczny wpływ na kontrolera, dlatego zaleca się zbadanie obu.

d- To jest zakłócenie, które jest dodawane do systemu. Zakłócenie to siły zewnętrzne, których model systemu nie uwzględnia. Prostym przykładem może być dron, nad którym chciałbyś zawisnąć na 5 metrach, nadchodzi podmuch wiatru i upuszcza drona na 1 metr, kontroler zmieni położenie drona po wystąpieniu zakłóceń. Nazywa się to zakłóceniem, ponieważ wiatr jest niepowtarzalny, więc nie można go modelować.

Aby dostroić kontroler, jest zbyt wiele zasad, aby wymienić, ale kilka dobrych, od których zacząłem, to Cohen Coon i Zieger Nichols.

Modelowanie systemu jest generalnie najważniejszą częścią bez dokładnego modelu, sterownik, który został zaprojektowany, nie będzie reagował zgodnie z oczekiwaniami.

Powinno być tu wystarczająco dużo informacji, aby zrozumieć, jak działa kontroler, wraz z niektórymi indywidualnymi badaniami, a kod poniżej kontrolera z dowolną kombinacją trzech terminów może zostać zaimplementowany.

Krok 2: Pisanie kodu PID

Zapisywanie kodu PID
Zapisywanie kodu PID

Podstawowa zasada kodu znaleziona pod poniższym linkiem została wzięta i zmodyfikowana, ponieważ ten kod nie działał, ale wiele zasad było właściwych, co stanowiło dobry punkt wyjścia. Oryginalny PID Kod zawierał kilka błędów, takich jak

  • Praca ciągła - kontroler jest dziedzicznie dyskretny, więc kontroler musiał być skonfigurowany tak, aby obliczał tylko wszystkie 3 składniki, gdy dostępne było nowe wejście. Obejściem tej symulacji było sprawdzenie, czy dane wejściowe zmieniły się od ostatniego razu. działa to tylko w celu symulacji kodu działającego poprawnie.
  • Czas próbkowania nie miał wpływu na człon całkujący i różniczkujący - sterownik nie brał również pod uwagę czasu, w którym próbka była pobierana, więc dodano wartość zwaną dzielnikiem czasu, aby upewnić się, że człony całkujące i różniczkujące działają poprawnie interwał.
  • Błąd mógł być tylko dodatni - podczas obliczania błędu pojawił się również problem, ponieważ błąd nigdy nie mógł być ujemny, co oznacza, że gdy sygnał sprzężenia zwrotnego przekroczył wartość odniesienia, sterownik będzie kontynuował inkrementację wyjścia, gdy powinien być zmniejszany.
  • Uzyskane wartości dla 3 terminów były liczbami całkowitymi - z mojego doświadczenia zawsze odkryłem, że wartości dla 3 terminów w kontrolerze zawsze były liczbami zmiennoprzecinkowymi, ponieważ Basys 3 nie ma liczby zmiennoprzecinkowej, wartościom należy nadać wartość licznika i wartość mianownika, która służyłaby jako obejście tego problemu.

Kod jest załączony poniżej, znajduje się główna część kodu i testbench do symulacji kodu. Folder zip zawiera kod i testbench już w Vivado, dzięki czemu można je otworzyć, aby zaoszczędzić czas. istnieje również symulowany test kodu, który pokazuje wyjście śledzące referencję, co dowodzi, że kod działa zgodnie z przeznaczeniem.

Krok 3: Jak zmodyfikować swój system

Po pierwsze nie wszystkie systemy są takie same, trzeba przeanalizować wejścia i wyjścia systemu. W moim przypadku wyjściem mojego urządzenia, które podało mi wartość pozycji, był sygnał analogowy, a wejście z systemu to sygnał PWM. Oznacza to, że potrzebna była konwersja ADC. Na szczęście Basys 3 ma wbudowany ADC, więc nie stanowiło to problemu, wyjście czujnika podczerwieni musiało zostać przeskalowane do 0V-1V, ponieważ jest to maksymalny zasięg wbudowanego ADC. Dokonano tego za pomocą obwodu dzielnika napięcia, który został wykonany z rezystorów 1k ustawionych jako rezystor 3k połączony szeregowo z rezystorem 1k. Sygnał analogowy znalazł się teraz w zasięgu ADC. Wejście PWM do wentylatora może być bezpośrednio sterowane przez wyjście portu PMOD w Basys 3.

Krok 4: Wykorzystanie I/O w Basys 3

W Basys 3 znajduje się wiele wejść/wyjść, które pozwalają na łatwiejsze debugowanie, gdy kod był uruchomiony. We/Wy zostało skonfigurowane w następujący sposób.

  • Wyświetlacz siedmiosegmentowy - był używany do wyświetlania wartości odniesienia i wartości na ADC w woltach. Pierwsze dwie cyfry siedmiosegmentowego wyświetlacza pokazują dwie cyfry po miejscu dziesiętnym wartości ADC, ponieważ wartość mieści się w zakresie 0-1V. Cyfry trzy i cztery na siedmiosegmentowym wyświetlaczu pokazują wartość odniesienia w woltach, a także pierwsze dwie cyfry po miejscu dziesiętnym, ponieważ zakres również wynosi od 0 do 1 V.
  • 16 diod LED - Diody LED służyły do pokazywania wartości wyjścia, aby upewnić się, że wyjście było nasycone, a wyjście zmieniało się prawidłowo.

Krok 5: Szum na wyjściu czujnika podczerwieni

Na wyjściu czujnika wystąpił szum, aby rozwiązać ten problem, wprowadzono blok uśredniania, ponieważ było to wystarczające i wymagało bardzo niewiele pracy.

Krok 6: Ogólny układ kodu

Ogólny układ kodu
Ogólny układ kodu

Jest jeden fragment kodu, o którym jeszcze nie mówiono. Ten kod to dzielnik zegara zwany wyzwalaczem. ten bit kodu wyzwala próbkowanie kodu ADC. ukończenie kodu ADC zajmuje maksymalnie 2 us, więc bieżące wejście i poprzednie wejście są uśredniane. 1us po tym uśrednieniu sterownik oblicza warunki P, I i D. ogólny układ kodu i interfejsu pokazano na prowizorycznym schemacie połączeń.

Krok 7: Testowanie

Testowanie
Testowanie

Kod został wdrożony w Basys 3 i zarejestrowano następującą odpowiedź. odniesienie zmieniło się między 2 wartościami. co ma miejsce w załączonym kompletnym kodzie projektu. Załączony film pokazuje tę odpowiedź w czasie rzeczywistym. Drgania zanikają szybciej w górnej części rury, ponieważ sterownik został zaprojektowany do tego obszaru, ale dalej nie działa tak dobrze, ponieważ układ jest nieliniowy.

Krok 8: Modyfikacje w celu ulepszenia projektu

Projekt działał zgodnie z założeniami, ale było kilka modyfikacji, które wprowadziłbym, gdyby projekt mógł zostać rozszerzony.

  • Zastosuj filtr cyfrowy, aby całkowicie wytłumić hałas
  • skonfiguruj kolejno kod ADC, kod średni i kod integracji.
  • użyj innego czujnika do sprzężenia zwrotnego, ponieważ nieliniowa odpowiedź tego czujnika spowodowała wiele problemów w tym projekcie, ale dotyczy to raczej strony sterowania, a nie kodowania.

Krok 9: Dodatkowa praca

W ciągu lata napisałem kod dla sterownika kaskadowego i wprowadziłem modyfikacje, które zaleciłem dla jednopętlowego sterownika PID.

Modyfikacje dokonane w zwykłym regulatorze PID

· Wdrożony szablon filtra FIR współczynniki muszą zostać zmienione, aby osiągnąć pożądaną częstotliwość odcięcia. Obecna implementacja to 5-punktowy filtr jodłowy.

· Czas kodu został ustawiony tak, że filtr będzie propagował nową próbkę, a gdy wyjście będzie gotowe, zostanie wyzwolony czas całkowania, co oznacza, że kod może być modyfikowany, aby działał w różnych odstępach czasu przy mniejszym wysiłku, aby zmienić kod.

· Główna pętla for, która steruje programem, została również zmniejszona, ponieważ ta pętla for zajmowała 7 cykli wcześniej, co spowolniło maksymalną prędkość działania kontrolera, ale zmniejszając stan pętli for t 4 oznacza to, że główny blok kodu może działać w ciągu 4 cykli zegarowych.

Testowanie

Ten kontroler został przetestowany i wykonany zgodnie z przeznaczeniem. Nie zrobiłem zdjęć tego dowodu, ponieważ ta część projektu miała tylko na celu utrzymanie aktywnego umysłu. Kod do testowania oraz testbench będą dostępne tutaj, dzięki czemu można przetestować program przed wdrożeniem.

Dlaczego warto korzystać z kontrolera kaskadowego?

Sterownik kaskadowy steruje dwiema częściami systemu. W takim przypadku sterownik kaskadowy miałby zewnętrzną pętlę, która jest sterownikiem, który ma sprzężenie zwrotne z czujnika podczerwieni. Pętla wewnętrzna posiada sprzężenie zwrotne w postaci czasu pomiędzy impulsami z obrotomierza, które określa prędkość obrotową wentylatora. Wdrażając kontrolę, można uzyskać lepszą reakcję poza systemem.

Jak działa sterownik kaskadowy?

Zewnętrzna pętla regulatora będzie podawać wartość czasu między impulsami do regulatora wewnętrznej pętli. Ten kontroler będzie następnie zwiększał lub zmniejszał cykl pracy, aby osiągnąć pożądany czas między impulsami.

Wdrażanie modyfikacji na rig

Niestety nie udało mi się zaimplementować tych modyfikacji na platformie, ponieważ nie miałem do niej dostępu. Przetestowałem poprawiony kontroler z pojedynczą pętlą, który działa zgodnie z przeznaczeniem. Nie testowałem jeszcze sterownika kaskadowego. Jestem przekonany, że kontroler będzie działał, ale może wymagać pewnych drobnych modyfikacji, aby działał zgodnie z przeznaczeniem.

Testowanie

Nie mogłem przetestować kontrolera, ponieważ trudno było zasymulować dwa źródła wejściowe. Jedyny problem, jaki widzę ze sterownikiem kaskadowym, polega na tym, że gdy zewnętrzna pętla próbuje zwiększyć wartość zadaną dostarczaną do pętli wewnętrznej, większa wartość zadana jest w rzeczywistości niższym RPS dla wentylatora, ale można to łatwo naprawić. pobierz wartość zadaną z maksymalnej wartości sygnału wartości zadanej (4095 - setpoint - tacho_result).

Krok 10: Wniosek

Ogólnie rzecz biorąc, projekt działa tak, jak zamierzałem, kiedy projekt się rozpoczął, więc jestem zadowolony z rezultatu. Dziękuję za poświęcenie czasu na przeczytanie mojej próby opracowania regulatora PID w VHDL. Jeśli ktoś próbuje zaimplementować jakąś odmianę tego w systemie i potrzebuje pomocy w zrozumieniu kodu, skontaktuj się ze mną, odpowiem jak najszybciej. Wszystkich, którzy spróbują dodatkowej pracy, która została ukończona, ale nie została wdrożona, proszę o kontakt w sprawie jakiejkolwiek ręki. Byłbym bardzo wdzięczny, gdyby ktoś, kto go zaimplementował, poinformował mnie, jak to działa.

Zalecana: