Chciałbym przedstawić jeden z możliwych sposobów wykonania cyfrowego regulatora PID Przestawiony regulator nie ma konkretnego zastosowania , to do czego zostanie wykorzystany zależy od czytelnika. Opis regulatora kieruję do osób które zaczynają przygodę z automatyką i układami regulacji. Spróbowałem wyjaśnić jak działa cyfrowy regulator PID, czemu ich używamy, do czego służą współczynniki równania regulatora KA, KB, KC , oraz jak zmiana tych współczynników wpływa na sygnał wyjściowy oraz jakie są ograniczenia tego regulatora. Przykłady działania zostały zaprezentowane na regulatorze PID zbudowanym na mikro-kontrolerze Microchip z rodziny dsPIC 33. Widok regulatora na poniższym zdjęciu
Zbudowałem regulator ponieważ nie udało mi się w sieci znaleźć „gotowca” i podczas szukania znalazłem ciekawą i prostą funkcje w kompilatorze XC16. Kiedy go już zbudowałem postanowiłem zweryfikować czy prawidłowo działa o czym napisałem w dalszej części postu do którego przeczytania zachęcam.
Przedstawię przygotowane w środowisku MPLABX trzy projekty programów w których umieściłem opisany regulator PID.
1. Reg_PID_Nastawy_Elektroda.X – projekt służy do weryfikacji nastaw regulatora PID oraz obserwacji jak zmienia się sygnał wyjściowy dla różnych współczynników Kp,Ki,Kd z otwartą pętlą sprzężenia zwrotnego.
2. Reg_temp_PID_obiekt_inercja_Elektroda.X Regulacja napięcia (temperatury) na obiekcie inercyjnym, pozwala obserwować jak przebiega proces regulacji przy zmianie nastaw regulatora, czy się wydłuża, skraca, wpada w oscylacje.
3. Reg_temp_PID_v1_DS18_Elektroda.X chłodziarko grzałka – z czujnikiem temperatury ds18b28 żeby wykorzystać komplementarny przebieg PWM
W większości przypadków kiedy sterujemy obiektem ( np. piecem ) chcemy utrzymać na zadanym poziomie jakąś wielkość fizyczną, w przypadku pieca będzie to temperatura. Żeby w piecu wzrosła temperatura należy dostarczyć energii . Rozpoczynając regulację dostarczamy energii do pieca i liczymy na to że temperatura w piecu zacznie od razu wzrastać. W praktyce tak się nie dzieję. Zanim zacznie wzrastać temperatura w piecu minie jakiś okres czasu. Długość tego opóźnienia zależy od elementów uczestniczących w procesie regulacji , zaczynając od grzałek przez obudowę pieca aż do czujnika temperatury. Okazuje się że im dłuższe opóźnienie w stosunku do stałej czasowej pieca tym trudniej regulować temperaturę . Żeby się o tym przekonać można przeprowadzić proste doświadczenie polegające na połączeniu na płytce stykowej prostego układ złożonego z rezystorów , kondensatorów i potencjometru jak na poniższym schemacie
Następnie podłączyć do potencjometru zasilanie np. 5 V i mierząc napięcie na ostatnim kondensatorze kręcić gałką potencjometru tak żeby ustawić 1,000 V. Okazuje się że to zadanie nie jest łatwe i zabiera trochę czasu.
W przypadku gdy chciałem wyręczyć się prostym regulatorem dwustanowym przedstawionym na poniższym rysunku.
otrzymałem poniższy przebieg
Widać na nim oscylacje wokół wartości odniesienia (czarny wykres) – można powiedzieć ze regulator dwustanowy (czerwony wykres) nie poradził sobie z zadaniem.
Przeprowadziłem również próbę używając do regulacji napięcia regulatora proporcjonalnego – czyli zwykłego wzmacniacza którego schemat przedstawiłem poniżej.
Uzyskany przebieg regulacji dla wzmacniacza o wzmocnieniu 10 który wygląda obiecująco.Znacznie lepiej niż ten z regulatorem dwustanowym, brak oscylacji i ustalona wartość napięcia . Można by powiedzieć że wzmacniacz przeszedł test pozytywnie i nie ma powodu stosować regulatora PID.
Jednak po rozciągnięciu osi napięcia w okolicy 2,5 V widać że wartość ustalona napięcia na poniższym rysunku nie osiągnęła wartości zadanej 2,500 V, pozostał niewielki uchyb. Ten uchyb to różnica pomiędzy wartością zadaną a tą którą udało się osiągnąć. Ten uchyb to wada wzmacniacza (regulatora proporcjonalnego)
Żeby zmniejszyć uchyb zwiększyłem wzmocnienie wzmacniacza do 20. Okazuje się ze zwiększanie wzmocnienia doprowadziło do oscylacji które widać na zdjęciu
Z tych powodów w wymagających procesach regulacji stosuje się regulatory PID które między innymi sprowadzają uchyb do zera. Za doprowadzenie uchybu do zera odpowiedzialny jest człon całkujący regulatora PID. Odbywa się to w następujący sposób: regulator zwiększa lub zmniejsza swój sygnał wyjściowy w tym kierunku aby osiągnąć uchyb równy zero. Jeżeli uchyb jest duży regulator zmienia sygnał wyjściowy szybko , jeżeli uchyb jest niewielki, powoli. Jeżeli nie ma uchybu (jest równy zero) nie robi nic zamraża sygnał wyjściowy na obecnym poziomie (utrzymuje wartość wyjściową taką jak jest dla uchybu = 0). Rozważę przypadek w którym nagle pojawia się uchyb e(t) = 0,01. Zakładam ze wzmocnienie całkowania ki jest równe 0,1. To na wyjściu regulatora z członem całkującym w pierwszym kroku sygnał wyjściowy będzie równy 0 + e(t)x0,1 po podstawieniu danych 0+ 0,01x0,1 = 0,001 , w drugim kroku wartością początkową nie będzie 0 tylko wcześniej obliczona wartość wyjściowa regulatora 0,001 i wówczas nowy sygnał wyjściowy wyniesie 0,001 +0,01x0,1 = 0,002 w kolejnym kroku 0,003 i jeśli uchyb się nie zmieni , to sygnał wyjściowy regulatora będzie narastał dopóki wartość wyjściowa regulatora dojdzie do maksymalnej możliwej wartości np. 1 . Taka czynność nazywa się całkowaniem czyli sumowaniem. Jeśli w procesie regulacji występuje uchyb różny od zera to człon całkujący regulatora będzie zawsze zwiększał lub zmniejszał sygnał wyjściowy regulatora w celu doprowadzenia uchybu do zera , ten człon liczy (całkuje) zawsze gdy występuje uchyb , nie pracuje tylko wtedy gdy uchyb jest równy zero.
Człon różniczkujący działa tylko wtedy gdy wartość uchybu się zmienia nie działa gdy wartość uchybu jest stała. Zadaniem członu różniczkującego jest zwiększenie lub zmniejszenie sygnału wyjściowego w momencie zmiany uchybu, takie doładowanie , żeby przez jakiś czas wzmocnić lub osłabić sygnał wyjściowy regulatora w zależności od znaku uchybu oraz szybkości jego zmian.
Prawdopodobnie każdy kto interesował się regulatorem PID wie że składa się z trzech członów: proporcjonalnego , całkującego i różniczkującego, oraz wiele razy widział poniższe równanie opisujące jak jest obliczany sygnał wyjściowy regulatora oraz schemat blokowy regulatora PID o działaniu ciągłym.
W cyfrowym regulatorze PID który zostanie przedstawiony do obliczenia sygnału wyjściowego regulatora PID wykorzystano tzw. algorytm przyrostowy , dostępny w bibliotece DSP dostarczonej z kompilatorem XC16 opisany zależnością
i schemacie blokowym
Schematy blokowe regulatorów PID z rys. 1 i 2 różnią się tym że w regulatorze analogowym sygnał uchybu jest najpierw doprowadzony do członu wzmocnienia Kp , wzmocniony ,następnie doprowadzony do członów całkujących i różniczkujących, natomiast w regulatorze cyfrowym uchyb bez wzmocnienia przychodzi do poszczególnych członów regulatora.
Dzięki dostępnej w bibliotece DSP funkcji do uruchomienia cyfrowego regulatora PID wystarczy w pętli głównej programu poza zdefiniowaniem i zainicjowaniem struktury danych napisać jedną linijkę kodu: PID(&fooPID); i gotowe.
Więcej szczegóły jak wywołać funkcję regulatora PID i jaki sposób wprowadzać do niego dane znajdują się w nocie CE019_PID , w komentarzach programu ,i dokumencie „16-bit language tools libraries - Microchip Technology”.
Cyfrowy regulator PID działa w następujący sposób: w stałych odstępach czasu mierzy i zapamiętuje wartość uchybu e(n), ten pomiar nazywamy próbkowaniem. Przedział czasowy pomiędzy kolejnymi pomiarami nazywamy okresem próbkowania „T”. Uchyb e(n) jest to różnica pomiędzy wartością zadaną np. temperaturą do której chcemy żeby nagrzał się przedmiot a rzeczywistą wartością temperatury przedmiotu w danej chwili. Litera „n” oznacza kolejną próbkę (kolejny pomiar).
Regulator żeby wykonać całkowanie i różniczkowanie sygnału wejściowego którym jest uchyb e(n) oraz obliczyć nową wartość sygnału na wyjściu regulatora u(n) potrzebuje trzech kolejnych próbek uchybu e(n), e(n-1), e(n-2) oraz poprzednio obliczoną wartość sygnału wyjściowego u(n-1). Następnie Regulator dodaje do siebie pomnożone przez współczynniki KA , KB , KC wartości uchybu kolejnych próbek e(n) oraz sygnału wyjściowego u(n-1) obliczonego podczas poprzedniego próbkowania. Na podstawie zebranych trzech próbek uchybu e i próbki sygnału wyjściowego u obliczany jest nowy bieżący sygnał wyjściowy regulatora u(n). Poniższy rysunek przedstawia przykładowy przebieg sygnału wejściowego e(n) i wyjściowego regulatora u(n) oraz zaznaczone chwile próbkowania i okres próbkowania.
KA , KB , KC to współczynniki zawierające informacje o wzmocnieniu , całkowaniu i różniczkowaniu.
u(n) – bieżąca wartość sygnału wyjściowego regulatora PID.
e(n) – bieżący uchyb (różnica pomiędzy wartością zadaną a rzeczywistą zmierzoną).
u(n-1) – wartość sygnału wyjściowego regulatora PID obliczona jedną próbkę wcześniej.
e(n-1) – uchyb obliczony jedną próbkę wcześniej
e(n-2) – uchyb obliczony dwie próbki wcześniej.
Po wpisaniu w miejsce współczynników KA , KB , KC informacji o wzmocnieniu ,całkowaniu , różniczkowaniu i okresie próbkowania algorytm regulatora wygląda w następujący sposób:
Na podstawie równia (3) można napisać równania definiujące współczynniki KA , KB , KC.
KA = Kp + Ki + Kd
KB = -(Kp + 2*Kd) (6)
KC = Kd.
Uwaga: należy pamiętać żeby dobierać współczynniki KA , KB , KC w taki sposób aby zawierały się w przedziale od -1 do 1. Jest to jedno z ograniczeń tego regulatora
Poniżej przedstawiłem schemat blokowy cyfrowego regulatora PID z nazwami danych
Do struktury wprowadzamy następujące dane:
PIDCoeffCalc - ta funkcja oczekuje od nas wpisania nastaw regulatora w postaci kp ki,kd następnie oblicza współczynniki równania KA , KB , KC
measuredOutput – zmierzona przez przetwornic ADC wartość regulowanej wielkości np. temperatury
controlReference – zadana (ustawiona) wartość wielkości regulowanej
ze struktury otrzymujemy:
controlOutput – sygnał wyjściowy regulatora PID.
Szczegółowy opis działania funkcji PID(&fooPID) można znaleźć na stronie:
http://microchipdeveloper.com/pwr3201:pid-basics
Program regulatora PID został napisany w języku C. Obliczenia w funkcji regulatora PID wykonywane są na danych typu fractional Q15. Ten format ma zalety i ograniczania. Do zalet należy szybkość wykonywania obliczeń. Wywołanie funkcji i obliczenie sygnału wyjściowego regulatora zajmuje 30 cykli zegarowych. W naszym przypadku dla mikrokontrolera pracującego z częstotliwością zegara 40 MHz ten czas wyniesie 0,75 µs. Ograniczeniem jest zakres liczbowy od -1 do około 1 a dokładnie do (0.999969482422) w którym muszą się znaleźć wszystkie liczby w formacie fractional Q15.
Nazwa formatu danych fractional może trochę straszyć , dlatego w tabeli przedstawiono różnice pomiędzy zwykłą liczbą integer (całkowitą ) a fractional (ułamkowy).
Więcej informacji można znaleźć http://microchipdeveloper.com/dsp0201:numerical-formats
W Regulatorze PID ustawiamy następujące parametry:
wzmocnienie Kp, stałą czasową całkowania Ti i stałą czasową różniczkowania Td.
Zmiany tych nastaw dokonuje się przez zmianę wartości kp, ki, kd które zostały opisane w równaniu (4),(5).
Poniżej przedstawiono schemat regulatora w załącznikach umieściłem schemat z płytką drukowaną wykonanymi w programie Kicad.
W eksperymencie regulator pracuje z otwartą pętlą sprzężenia zwrotnego. (Płytka regulatora jest zasilona i podłączona do portu USB komputera przez konwerter FTDI232). Oznacz to że sygnał wyjściowy z regulatora nie zmienia uchybu , nie jest odczytywana i wprowadzana do struktury danych wartość wielkości regulowanej , w ten sposób uchyb pozostaje stały i można obserwować jak działają człony regulatora. Taką sytuacje uzyskano wpisując w strukturze danych stałe wartości controlReference = 0.0 measuredOutput 0.2 daje to stały uchyb e=0,2. Schemat blokowy układu regulacji z zamkniętą (górny) i otwartą pętlą (dolny )sprzężenia zwrotnego
Pierwsze sprawdzenie dotyczy działania członu proporcjonalnego. W tym celu należy uruchomić projekt o nazwie Reg_PID_Nastawy_Elektroda i w pliku PID_main.c w miejscu inicjowania struktury proponuję wpisać wartości: kp= 0.5 , ki=0.0 , kd=0.0 zaprogramować mikrokontroler , nacisnąć reset i dane z wartością sygnału wyjściowego regulatora będą wysyłane przez łącze szeregowe usb do komputera.
Do odbioru danych użyłem programu Terminal V1.6 następnie wkleiłem dane do arkusza kalkulacyjnego. Dla nastaw (kp= 0.5 , ki=0.0 , kd=0.0) na rys. 21 przedstawiono sygnał wyjściowy regulatora oznaczony literą P , jest to pozioma linia o wartości 0,1 .
Pozostałe wykresy z tego rysunku oznaczone PI, PI-slow, PI-fast uzyskano przy nastawach :
PI –(kp=0.5 ki=0,1 kd =0,0) , PI-slow – ( kp=0.5 ki=0,05 kd =0,0) ,
PI-fast –( kp=0.5 ki=0,2 kd =0,0). Obserwując i porównując uzyskane sygnały wyjściowe regulatora PI widać że zwiększając wartość ki skracamy czas całkowania Ti (szybciej zmienia się sygnał na wyjściu regulatora PI-fast), zmniejszając ki wydłużamy czas całkowania Ti (wolniej zmienia się sygnał na wyjściu regulatora PI-slow) . Wykres PI-fast osiągnął maksymalną wartość równą 1 po 22 próbkach , wykres PI-slow po 90 próbkach. Oznacza to że jeśli chcemy żeby regulator działał „szybciej” wpisujemy większą wartość ki .Mając do dyspozycji wykresy i korzystając z definicji czasu całkowania można zweryfikować czas całkowania dla nastaw regulatora.
Definicja czasu całkowania inaczej nazywania czasem zdwojenia: „jest to czas potrzebny na to aby sygnał składowej całkowej będący wynikiem działania całkującego stał się równy
sygnałowi będącemu wynikiem działania proporcjonalnego „ i została przedstawiona na poniższym rysunku
Dla wykresu oznaczonego PI czas zdwojenia Ti= 0,5/0,1×T , zależy od okresu próbkowania oraz stosunku kp do ki . W przedstawionym powyżej przypadku dla okresu próbkowania T = 0,5 s otrzymujemy czas zdwojenia Ti = 2,5 sekundy . Z wykresu można odczytać że zdwojenie występuję przy piątej próbce co potwierdza czas zdwojenia obliczony ze wzoru.
Na czas całkowania mają wpływ trzy parametry:
okres próbkowania T, wzmocnienie kp oraz współczynnik ki , oznacza to że zmieniając wzmocnienie zmieniamy również czas zdwojenia chociaż nie zamierzaliśmy tego robić.
Żeby sprawdzić i pokazać działanie członu różniczkującego należy na wejście regulatora podać sygnał uchybu narastający liniowo. Czas różniczkowania lub inna nazwa wyprzedzenia definiuje się w następujący sposób : „czas wyprzedzenia jest to czas po którym sygnał wyjściowy z regulatora , związany z działaniem proporcjonalnym zrówna się z sygnałem pochodzącym od działania różniczkowego. Czas zdwojenia Td wyznaczany jest jako odpowiedź na zmienny w czasie uchyb regulacji e(t)”.
Graficzna definicja czasu wyprzedzenia został przedstawiona na rysunku
Weryfikację nastaw regulatora PD wykonano przy następujących warunkach:
w projekcie Reg_PID_nastawy usunięto komentarz aby uzyskać liniowo narastający uchyb e, wpisano fooPID.controlReference = 0 fooPID.measuredOutput = 0 oraz wpisano nowe wartości do Kp,Ki,Kd
uzyskane wyniki dla różnych kd przedstawiono na wykresie
kd-0 dla Kp=0.1 Ki=0,0 Kd =0,0 liniowo narastający sygnał uchybu
kd-0,1 dla Kp=0.1 Ki=0,0 Kd =0,1 dla tych nastaw Td = 0,5 s przy T = 0,5 s
kd-0,2 dla Kp=0.1 Ki=0,0 Kd =0,2 dla tych nastaw Td = 1,0 s przy T = 0,5 s
kd-0,3 dla Kp=0.1 Ki=0,0 Kd =0,3 dla tych nastaw Td = 1,5 s przy T = 0,5 s
kd-0,4 dla Kp=0.1 Ki=0,0 Kd =0,4 dla tych nastaw Td = 2,0 s przy T = 0,5 s
Uzyskane wyniki obliczone z zależności (5)pokrywają się z odczytanymi z wykresu. Zwiększając współczynnik kd zwiększamy czas różniczkowania, odwrotnie jak to ma
miejsce w przypadku całkowania gdzie zwiększanie ki skraca czas całkowania.
Na kolejnym rysunku przedstawiono odpowiedź regulatora PD dla zakłócenia w postaci skoku jednostkowego. W tym w celu wyłączono liniowo narastający uchybu wstawiając znaki komentarza w liniach programu Reg_PID_nastawy_Elektroda i ustawianąc następujące parametry controlReference = 0.0 measuredOutput 0.2 .
Z wykresu wynika że przy stałym uchybie (nie zmieniającym się ) człon różniczkujący nie działa , działanie widoczne jest tylko na początku kiedy regulator po raz pierwszy próbkuje i uzyskuje różnice uchybu 0,2 pomiędzy poprzednią a kolejną próbką. W kolejnych próbkach różnica uchybu pomiędzy kolejnymi próbkami wynosi 0, człon różniczkujący nie wpływa na sygnał wyjściowy regulatora , na wykresie widzimy tylko działanie tylko członu proporcjonalnego. Wykres potwierdza ze wzrostem kd rośnie amplituda sygnału wyjściowego regulatora w pierwszej próbce.
Na zakończenie badania regulatora przedstawiono odpowiedź regulatora PID dla zakłócenia w postaci skoku jednostkowego z otwartą pętlą przy nastawach :
PID-1 dla Kp=0.5 Ki=0,1 Kd =0,2 fooPID.measuredOutput = 0 fooPID.controlReference = 0,2
PID-2 dla Kp=0.2 Ki=0,1 Kd =0,35 fooPID.measuredOutput = 0 fooPID.controlReference = 0,2
PID-3 dla Kp=0.1 Ki=0,1 Kd =0,425 fooPID.measuredOutput = 0 fooPID.controlReference = 0,2
Kolejną czynnością którą wykonałem było sprawdzenie czy regulator działa w zamkniętej pętli sprzężenia zwrotnego. W tym celu zbudowałem obwód elektryczny który ma udawać obiekt. Obiekt został zbudowany z kondensatorów i rezystorów . Schemat przedstawia 4 obiekty o inercji pierwszego rzędu połączone ze sobą szeregowo tworząc w ten sposób kolejne obiekty wyższego rzędu . Stała czasowa obiektu o inercji 1 rzędu
wynosi 10s. Ja na wyjściu każdego „obiektu” wlutowałem goldpin .Dzięki takiemu połączeniu możliwe są eksperymenty z obiektami o różnej inercji.
Podłączenie obiektu do płytki mikro-kontrolerem (regulatorem PID) należy wykonać w następujący sposób: masy łączymy ze sobą , wejście obiektu (pin 2 złącza P1 ) łączymy z nóżką 17 mikro-kontrolera (PWM_H_OUT wyjście PWM mikro-kontrolera) , wyjście obiektu (P2- P5) podłączmy do wejścia AN5 mikro-kontrolera ( złącze P1 pin 7 na rys 6 wejście przetwornika A/D).W tym przykładzie wielkością wejściową dla regulatora PID jest napięcie przeliczone na temperaturę , wyjściem przebieg komplementarny PWM o częstotliwości około 1200 Hz. Kolejnym krokiem jest otwarcie w MPLAB X IDE projektu „Reg_temp_PID_obiekt_inercja_Elektroda” i zaprogramowanie mikrokontrolera
Po zaprogramowaniu i włączeniu zasilania powinniśmy otrzymać następujący widok jak na rzdjęciu. Program został przygotowany w taki sposób że napięcie 0 V na kondensatorze odpowiada temperaturze -125 °C natomiast 3,3V +125 °C
Do obsługi regulatora mamy cztery przyciski :
S- zapisuje ustawienia w pamięci flash mikrokontrolera (podczas zapisu na ułamek sekundy gaśnie dioda LED).
M- przycisk menu naciśnięcie (około 3 s) powoduje negację ekranu i możliwość edycji parametrów Kp, Ki,Kd ,set. Przejście do edycji kolejnego parametru ponowne wciśnięcie M
aż do wyjścia z menu edycji.
Znak „<” wskazuje edytowany parametr. Zmiana parametrów przyciskami ↑↓. Widok ekranu regulatora w trybie menu na rys 21.
↑↓ - zmieniają „set” wartość zadaną poza trybem menu.
RST – przycisk resetu mikrokontrolera
PIDout – sygnał wyjściowy regulatora PID od -1 do 1.
proc – wielkość regulowana (napięcie na kondensatorze przeliczone na temperaturę)
set – wielkość ustawiona (zadana wartość temperatury).
Przebiegi na wyjściu regulatora dla różnych wartości sygnału PIDout przedstawiłem na poniższych rysunkach.
Domyślne nastawy regulatora po włączeniu zasilania Kp = 0,5 Ki = 0,1 ,Kd = 0,0 działają z obiektem o inercji 1 ,2 rzędu , nie działają z obiektami o inercji 3 i 4 rzędu , temperatura cały czas oscyluje nie może osiągnąć zadanej wartości. Żeby uzyskać ustaloną wartość temperatury należy dobrać właściwe nastawy. W Internecie jest wiele sposobów opisujących dobór nastaw regulatorów PID dla obiektów z opóźnieniem.
Ja skorzystałem z poniższej tabeli którą znalazłem w Internecie. Na rysunku przedstawiłem odpowiedź badanego obiektu o inercji czwartego rzędu na skok jednostkowy.
Posługując się zależnościami z tabeli i wartościami odczytami z wykresu τ = 17 s i T = 121 s
dla kryterium regulacji k = 0% i tr → min dla regulatora PID wyznaczono następujące nastawy:
kp = 0,35 x T/ τ = 2,6
Ti = 2,4 x τ = 40,8 s
Td = 0,4 x τ = 6,8 s
Niestety takich nastaw nie uda się nastawić w przedstawionym regulatorze wzmocnienie Kp jest większe od jedności.
W tej sytuacji rozpocząłem od kp = 0,5 następnie obliczyłem ki=(kp×T)/Ti = 0,006 i na koniec maksymalną możliwą wartość dla kd pamiętając żeby nie przekroczyć dopuszczalnego zakresu (-1 - 1) podanego w zależności (6) ustawiłem kd = 0,245.
Obliczone nastawy wpisałem do regulatora i otrzymałem stabilny przebieg regulacji jak poniższym wykresie . Zachęcam do eksperymentów ze zmianą nastaw i prób które pomogą uzyskać krótszy czas regulacji oraz eksperymentowania z obiektem o inercji 1 ,2 i 3 rzędu.
Załączam jeszcze jeden projekt wykonany w MPLABX o nazwie Reg_temp_PID_v1_DS18_Elektroda
W tym przykładzie zastosowania regulatora PID chciałbym przedstawić układ który chłodzi i podgrzewa. Wielkością wejściową jest temperatura odczytywana z czujnika ,wielkością wyjściową komplementarny przebieg PWM .Pomiar temperatury układu zrealizowano czujnikiem ds18B20. Układ zbudowany jest z ogniwa peltiera do którego z jednej strony przymocowano czujnik temperatury zaś z drugiej radiator z wentylatorem. Ogniwo peltiera zostało zasilone z mostka zbudowanego z czterech tranzystorów popularnie nazywanego „mostkiem H” .Schemat podłączenia ogniwa peltiera i mostka H do płytki z mikro-kontrolerem przedstawiono na rysunku
Do sterownia ogniwem peltiera wykorzystano gotową płytkę z układem scalonym L298 od arduino który w swej strukturze posiada dwa mostki H.
Mostek jest sterowany z komplementarnych wyjść mikro-kontrolera . Częstotliwość przebiegu wyjściowego wynosi około 1200 Hz. W zależności od współczynnika wypełnienia przebiegu sterującego mostkiem na jego wyjściu zmienia się zwartość średnia napięcia oraz jego biegunowość . Zmieniając biegunowość powodujemy że strona ogniwa peltiera do której jest przyłożony czujnik temperatury będzie się grzała lub chłodziła . Zmieniając wartość średnią napięcia na ogniwie będzie ono chłodziło lub grzało mocniej lub słabiej. Przebieg sterujący mostkiem H przedstawiono na rysunku
Kiedy współczynniki wypełnienia PWM2H i PWM2L wynoszą 50% wyjściowe napięcie mostka H = 0V.
Jeśli współczynnik wypełnienia PWM2H > PWM2L napięcie wyjściowe mostka H jest dodatnie , a ujemne gdy PWM1H < PWM1L. W taki prosty sposób mogłem zmienić polaryzację napięcia i doprowadzić do grzania lub chłodzenia czujnika.
Zdaję sobie sprawę że nie jest to optymalne rozwiązanie ponieważ gdy wartość średnia napięcie na wyjściu mostka wynosi zero niepotrzebnie prąd przepływa przez ogniwo peltiera raz w jedną stronę (grzejąc) a później w drugą (chłodząc).
Ale eksperyment się powiódł.
Uwagi wymaga konfiguracja projektów MPLABX gdy używamy biblioteki dsp. Przypominają o tym komentarze w programie. Aby dokonać konfiguracji należy wykonać następujące czynności:
Otwarty projekt ustawić jako projekt główny W tym celu wybieramy projekt a następnie klikamy prawym klawiszem myszki i z rozwiniętego menu wybieramy set as main project .
W kolejnym kroku określamy ścieżkę dostępu do biblioteki dsp.
z paska menu wybieramy: production \ set Project configuration \ customize
Otworzy się kolejne okno z którego wybieramy libraries , naciskamy przycisk Add library/object file i wskazujemy ścieżkę dostępu do pliku libdsp-elf.a który znajduje w katalogu o nazwie wersji użytego kompilatora XC16.Jak widać użyłem v1.5
W tym samym oknie wybieramy XC16( global options) ustawiamy format pliku wyjściowego na ELF/DWARF.
W załączonych programach dokonałem uproszczenia . Funkcja regulatora PID jest wywoływana w głównej pętli z opóźnieniem programowym , lepszym rozwiązaniem jest umieszczenie jej w przerwaniu żeby regulator działał dokładniej . Pozwoliłem sobie na takie uproszczenie ponieważ okres próbkowania to 0,5 s , jest to długi czas w porównaniu z innymi operacjami wykonywanymi w pętli i ich wpływ na dokładność działania regulatora jest niewielka . W przypadku chłodziarko grzałki czas przetwarzania temperatury czujnika ds18b20 to około 750 ms i to jest w przybliżeniu okres próbkowania.

Zbudowałem regulator ponieważ nie udało mi się w sieci znaleźć „gotowca” i podczas szukania znalazłem ciekawą i prostą funkcje w kompilatorze XC16. Kiedy go już zbudowałem postanowiłem zweryfikować czy prawidłowo działa o czym napisałem w dalszej części postu do którego przeczytania zachęcam.
Przedstawię przygotowane w środowisku MPLABX trzy projekty programów w których umieściłem opisany regulator PID.
1. Reg_PID_Nastawy_Elektroda.X – projekt służy do weryfikacji nastaw regulatora PID oraz obserwacji jak zmienia się sygnał wyjściowy dla różnych współczynników Kp,Ki,Kd z otwartą pętlą sprzężenia zwrotnego.
2. Reg_temp_PID_obiekt_inercja_Elektroda.X Regulacja napięcia (temperatury) na obiekcie inercyjnym, pozwala obserwować jak przebiega proces regulacji przy zmianie nastaw regulatora, czy się wydłuża, skraca, wpada w oscylacje.
3. Reg_temp_PID_v1_DS18_Elektroda.X chłodziarko grzałka – z czujnikiem temperatury ds18b28 żeby wykorzystać komplementarny przebieg PWM
W większości przypadków kiedy sterujemy obiektem ( np. piecem ) chcemy utrzymać na zadanym poziomie jakąś wielkość fizyczną, w przypadku pieca będzie to temperatura. Żeby w piecu wzrosła temperatura należy dostarczyć energii . Rozpoczynając regulację dostarczamy energii do pieca i liczymy na to że temperatura w piecu zacznie od razu wzrastać. W praktyce tak się nie dzieję. Zanim zacznie wzrastać temperatura w piecu minie jakiś okres czasu. Długość tego opóźnienia zależy od elementów uczestniczących w procesie regulacji , zaczynając od grzałek przez obudowę pieca aż do czujnika temperatury. Okazuje się że im dłuższe opóźnienie w stosunku do stałej czasowej pieca tym trudniej regulować temperaturę . Żeby się o tym przekonać można przeprowadzić proste doświadczenie polegające na połączeniu na płytce stykowej prostego układ złożonego z rezystorów , kondensatorów i potencjometru jak na poniższym schemacie

Następnie podłączyć do potencjometru zasilanie np. 5 V i mierząc napięcie na ostatnim kondensatorze kręcić gałką potencjometru tak żeby ustawić 1,000 V. Okazuje się że to zadanie nie jest łatwe i zabiera trochę czasu.
W przypadku gdy chciałem wyręczyć się prostym regulatorem dwustanowym przedstawionym na poniższym rysunku.

otrzymałem poniższy przebieg

Widać na nim oscylacje wokół wartości odniesienia (czarny wykres) – można powiedzieć ze regulator dwustanowy (czerwony wykres) nie poradził sobie z zadaniem.
Przeprowadziłem również próbę używając do regulacji napięcia regulatora proporcjonalnego – czyli zwykłego wzmacniacza którego schemat przedstawiłem poniżej.

Uzyskany przebieg regulacji dla wzmacniacza o wzmocnieniu 10 który wygląda obiecująco.Znacznie lepiej niż ten z regulatorem dwustanowym, brak oscylacji i ustalona wartość napięcia . Można by powiedzieć że wzmacniacz przeszedł test pozytywnie i nie ma powodu stosować regulatora PID.

Jednak po rozciągnięciu osi napięcia w okolicy 2,5 V widać że wartość ustalona napięcia na poniższym rysunku nie osiągnęła wartości zadanej 2,500 V, pozostał niewielki uchyb. Ten uchyb to różnica pomiędzy wartością zadaną a tą którą udało się osiągnąć. Ten uchyb to wada wzmacniacza (regulatora proporcjonalnego)

Żeby zmniejszyć uchyb zwiększyłem wzmocnienie wzmacniacza do 20. Okazuje się ze zwiększanie wzmocnienia doprowadziło do oscylacji które widać na zdjęciu

Z tych powodów w wymagających procesach regulacji stosuje się regulatory PID które między innymi sprowadzają uchyb do zera. Za doprowadzenie uchybu do zera odpowiedzialny jest człon całkujący regulatora PID. Odbywa się to w następujący sposób: regulator zwiększa lub zmniejsza swój sygnał wyjściowy w tym kierunku aby osiągnąć uchyb równy zero. Jeżeli uchyb jest duży regulator zmienia sygnał wyjściowy szybko , jeżeli uchyb jest niewielki, powoli. Jeżeli nie ma uchybu (jest równy zero) nie robi nic zamraża sygnał wyjściowy na obecnym poziomie (utrzymuje wartość wyjściową taką jak jest dla uchybu = 0). Rozważę przypadek w którym nagle pojawia się uchyb e(t) = 0,01. Zakładam ze wzmocnienie całkowania ki jest równe 0,1. To na wyjściu regulatora z członem całkującym w pierwszym kroku sygnał wyjściowy będzie równy 0 + e(t)x0,1 po podstawieniu danych 0+ 0,01x0,1 = 0,001 , w drugim kroku wartością początkową nie będzie 0 tylko wcześniej obliczona wartość wyjściowa regulatora 0,001 i wówczas nowy sygnał wyjściowy wyniesie 0,001 +0,01x0,1 = 0,002 w kolejnym kroku 0,003 i jeśli uchyb się nie zmieni , to sygnał wyjściowy regulatora będzie narastał dopóki wartość wyjściowa regulatora dojdzie do maksymalnej możliwej wartości np. 1 . Taka czynność nazywa się całkowaniem czyli sumowaniem. Jeśli w procesie regulacji występuje uchyb różny od zera to człon całkujący regulatora będzie zawsze zwiększał lub zmniejszał sygnał wyjściowy regulatora w celu doprowadzenia uchybu do zera , ten człon liczy (całkuje) zawsze gdy występuje uchyb , nie pracuje tylko wtedy gdy uchyb jest równy zero.
Człon różniczkujący działa tylko wtedy gdy wartość uchybu się zmienia nie działa gdy wartość uchybu jest stała. Zadaniem członu różniczkującego jest zwiększenie lub zmniejszenie sygnału wyjściowego w momencie zmiany uchybu, takie doładowanie , żeby przez jakiś czas wzmocnić lub osłabić sygnał wyjściowy regulatora w zależności od znaku uchybu oraz szybkości jego zmian.
Prawdopodobnie każdy kto interesował się regulatorem PID wie że składa się z trzech członów: proporcjonalnego , całkującego i różniczkującego, oraz wiele razy widział poniższe równanie opisujące jak jest obliczany sygnał wyjściowy regulatora oraz schemat blokowy regulatora PID o działaniu ciągłym.


W cyfrowym regulatorze PID który zostanie przedstawiony do obliczenia sygnału wyjściowego regulatora PID wykorzystano tzw. algorytm przyrostowy , dostępny w bibliotece DSP dostarczonej z kompilatorem XC16 opisany zależnością

i schemacie blokowym

Schematy blokowe regulatorów PID z rys. 1 i 2 różnią się tym że w regulatorze analogowym sygnał uchybu jest najpierw doprowadzony do członu wzmocnienia Kp , wzmocniony ,następnie doprowadzony do członów całkujących i różniczkujących, natomiast w regulatorze cyfrowym uchyb bez wzmocnienia przychodzi do poszczególnych członów regulatora.
Dzięki dostępnej w bibliotece DSP funkcji do uruchomienia cyfrowego regulatora PID wystarczy w pętli głównej programu poza zdefiniowaniem i zainicjowaniem struktury danych napisać jedną linijkę kodu: PID(&fooPID); i gotowe.
Code: c
Więcej szczegóły jak wywołać funkcję regulatora PID i jaki sposób wprowadzać do niego dane znajdują się w nocie CE019_PID , w komentarzach programu ,i dokumencie „16-bit language tools libraries - Microchip Technology”.
Cyfrowy regulator PID działa w następujący sposób: w stałych odstępach czasu mierzy i zapamiętuje wartość uchybu e(n), ten pomiar nazywamy próbkowaniem. Przedział czasowy pomiędzy kolejnymi pomiarami nazywamy okresem próbkowania „T”. Uchyb e(n) jest to różnica pomiędzy wartością zadaną np. temperaturą do której chcemy żeby nagrzał się przedmiot a rzeczywistą wartością temperatury przedmiotu w danej chwili. Litera „n” oznacza kolejną próbkę (kolejny pomiar).
Regulator żeby wykonać całkowanie i różniczkowanie sygnału wejściowego którym jest uchyb e(n) oraz obliczyć nową wartość sygnału na wyjściu regulatora u(n) potrzebuje trzech kolejnych próbek uchybu e(n), e(n-1), e(n-2) oraz poprzednio obliczoną wartość sygnału wyjściowego u(n-1). Następnie Regulator dodaje do siebie pomnożone przez współczynniki KA , KB , KC wartości uchybu kolejnych próbek e(n) oraz sygnału wyjściowego u(n-1) obliczonego podczas poprzedniego próbkowania. Na podstawie zebranych trzech próbek uchybu e i próbki sygnału wyjściowego u obliczany jest nowy bieżący sygnał wyjściowy regulatora u(n). Poniższy rysunek przedstawia przykładowy przebieg sygnału wejściowego e(n) i wyjściowego regulatora u(n) oraz zaznaczone chwile próbkowania i okres próbkowania.

KA , KB , KC to współczynniki zawierające informacje o wzmocnieniu , całkowaniu i różniczkowaniu.
u(n) – bieżąca wartość sygnału wyjściowego regulatora PID.
e(n) – bieżący uchyb (różnica pomiędzy wartością zadaną a rzeczywistą zmierzoną).
u(n-1) – wartość sygnału wyjściowego regulatora PID obliczona jedną próbkę wcześniej.
e(n-1) – uchyb obliczony jedną próbkę wcześniej
e(n-2) – uchyb obliczony dwie próbki wcześniej.
Po wpisaniu w miejsce współczynników KA , KB , KC informacji o wzmocnieniu ,całkowaniu , różniczkowaniu i okresie próbkowania algorytm regulatora wygląda w następujący sposób:

Na podstawie równia (3) można napisać równania definiujące współczynniki KA , KB , KC.
KA = Kp + Ki + Kd
KB = -(Kp + 2*Kd) (6)
KC = Kd.
Uwaga: należy pamiętać żeby dobierać współczynniki KA , KB , KC w taki sposób aby zawierały się w przedziale od -1 do 1. Jest to jedno z ograniczeń tego regulatora
Poniżej przedstawiłem schemat blokowy cyfrowego regulatora PID z nazwami danych
Do struktury wprowadzamy następujące dane:
PIDCoeffCalc - ta funkcja oczekuje od nas wpisania nastaw regulatora w postaci kp ki,kd następnie oblicza współczynniki równania KA , KB , KC
measuredOutput – zmierzona przez przetwornic ADC wartość regulowanej wielkości np. temperatury
controlReference – zadana (ustawiona) wartość wielkości regulowanej
ze struktury otrzymujemy:
controlOutput – sygnał wyjściowy regulatora PID.
Szczegółowy opis działania funkcji PID(&fooPID) można znaleźć na stronie:
http://microchipdeveloper.com/pwr3201:pid-basics

Program regulatora PID został napisany w języku C. Obliczenia w funkcji regulatora PID wykonywane są na danych typu fractional Q15. Ten format ma zalety i ograniczania. Do zalet należy szybkość wykonywania obliczeń. Wywołanie funkcji i obliczenie sygnału wyjściowego regulatora zajmuje 30 cykli zegarowych. W naszym przypadku dla mikrokontrolera pracującego z częstotliwością zegara 40 MHz ten czas wyniesie 0,75 µs. Ograniczeniem jest zakres liczbowy od -1 do około 1 a dokładnie do (0.999969482422) w którym muszą się znaleźć wszystkie liczby w formacie fractional Q15.
Nazwa formatu danych fractional może trochę straszyć , dlatego w tabeli przedstawiono różnice pomiędzy zwykłą liczbą integer (całkowitą ) a fractional (ułamkowy).
Więcej informacji można znaleźć http://microchipdeveloper.com/dsp0201:numerical-formats

W Regulatorze PID ustawiamy następujące parametry:
wzmocnienie Kp, stałą czasową całkowania Ti i stałą czasową różniczkowania Td.
Zmiany tych nastaw dokonuje się przez zmianę wartości kp, ki, kd które zostały opisane w równaniu (4),(5).
Poniżej przedstawiono schemat regulatora w załącznikach umieściłem schemat z płytką drukowaną wykonanymi w programie Kicad.


W eksperymencie regulator pracuje z otwartą pętlą sprzężenia zwrotnego. (Płytka regulatora jest zasilona i podłączona do portu USB komputera przez konwerter FTDI232). Oznacz to że sygnał wyjściowy z regulatora nie zmienia uchybu , nie jest odczytywana i wprowadzana do struktury danych wartość wielkości regulowanej , w ten sposób uchyb pozostaje stały i można obserwować jak działają człony regulatora. Taką sytuacje uzyskano wpisując w strukturze danych stałe wartości controlReference = 0.0 measuredOutput 0.2 daje to stały uchyb e=0,2. Schemat blokowy układu regulacji z zamkniętą (górny) i otwartą pętlą (dolny )sprzężenia zwrotnego

Pierwsze sprawdzenie dotyczy działania członu proporcjonalnego. W tym celu należy uruchomić projekt o nazwie Reg_PID_Nastawy_Elektroda i w pliku PID_main.c w miejscu inicjowania struktury proponuję wpisać wartości: kp= 0.5 , ki=0.0 , kd=0.0 zaprogramować mikrokontroler , nacisnąć reset i dane z wartością sygnału wyjściowego regulatora będą wysyłane przez łącze szeregowe usb do komputera.
Code: c

Do odbioru danych użyłem programu Terminal V1.6 następnie wkleiłem dane do arkusza kalkulacyjnego. Dla nastaw (kp= 0.5 , ki=0.0 , kd=0.0) na rys. 21 przedstawiono sygnał wyjściowy regulatora oznaczony literą P , jest to pozioma linia o wartości 0,1 .
Pozostałe wykresy z tego rysunku oznaczone PI, PI-slow, PI-fast uzyskano przy nastawach :
PI –(kp=0.5 ki=0,1 kd =0,0) , PI-slow – ( kp=0.5 ki=0,05 kd =0,0) ,
PI-fast –( kp=0.5 ki=0,2 kd =0,0). Obserwując i porównując uzyskane sygnały wyjściowe regulatora PI widać że zwiększając wartość ki skracamy czas całkowania Ti (szybciej zmienia się sygnał na wyjściu regulatora PI-fast), zmniejszając ki wydłużamy czas całkowania Ti (wolniej zmienia się sygnał na wyjściu regulatora PI-slow) . Wykres PI-fast osiągnął maksymalną wartość równą 1 po 22 próbkach , wykres PI-slow po 90 próbkach. Oznacza to że jeśli chcemy żeby regulator działał „szybciej” wpisujemy większą wartość ki .Mając do dyspozycji wykresy i korzystając z definicji czasu całkowania można zweryfikować czas całkowania dla nastaw regulatora.

Definicja czasu całkowania inaczej nazywania czasem zdwojenia: „jest to czas potrzebny na to aby sygnał składowej całkowej będący wynikiem działania całkującego stał się równy
sygnałowi będącemu wynikiem działania proporcjonalnego „ i została przedstawiona na poniższym rysunku


Dla wykresu oznaczonego PI czas zdwojenia Ti= 0,5/0,1×T , zależy od okresu próbkowania oraz stosunku kp do ki . W przedstawionym powyżej przypadku dla okresu próbkowania T = 0,5 s otrzymujemy czas zdwojenia Ti = 2,5 sekundy . Z wykresu można odczytać że zdwojenie występuję przy piątej próbce co potwierdza czas zdwojenia obliczony ze wzoru.
Na czas całkowania mają wpływ trzy parametry:
okres próbkowania T, wzmocnienie kp oraz współczynnik ki , oznacza to że zmieniając wzmocnienie zmieniamy również czas zdwojenia chociaż nie zamierzaliśmy tego robić.
Żeby sprawdzić i pokazać działanie członu różniczkującego należy na wejście regulatora podać sygnał uchybu narastający liniowo. Czas różniczkowania lub inna nazwa wyprzedzenia definiuje się w następujący sposób : „czas wyprzedzenia jest to czas po którym sygnał wyjściowy z regulatora , związany z działaniem proporcjonalnym zrówna się z sygnałem pochodzącym od działania różniczkowego. Czas zdwojenia Td wyznaczany jest jako odpowiedź na zmienny w czasie uchyb regulacji e(t)”.
Graficzna definicja czasu wyprzedzenia został przedstawiona na rysunku


Weryfikację nastaw regulatora PD wykonano przy następujących warunkach:
w projekcie Reg_PID_nastawy usunięto komentarz aby uzyskać liniowo narastający uchyb e, wpisano fooPID.controlReference = 0 fooPID.measuredOutput = 0 oraz wpisano nowe wartości do Kp,Ki,Kd
Code: c
uzyskane wyniki dla różnych kd przedstawiono na wykresie
kd-0 dla Kp=0.1 Ki=0,0 Kd =0,0 liniowo narastający sygnał uchybu
kd-0,1 dla Kp=0.1 Ki=0,0 Kd =0,1 dla tych nastaw Td = 0,5 s przy T = 0,5 s
kd-0,2 dla Kp=0.1 Ki=0,0 Kd =0,2 dla tych nastaw Td = 1,0 s przy T = 0,5 s
kd-0,3 dla Kp=0.1 Ki=0,0 Kd =0,3 dla tych nastaw Td = 1,5 s przy T = 0,5 s
kd-0,4 dla Kp=0.1 Ki=0,0 Kd =0,4 dla tych nastaw Td = 2,0 s przy T = 0,5 s

Uzyskane wyniki obliczone z zależności (5)pokrywają się z odczytanymi z wykresu. Zwiększając współczynnik kd zwiększamy czas różniczkowania, odwrotnie jak to ma
miejsce w przypadku całkowania gdzie zwiększanie ki skraca czas całkowania.
Na kolejnym rysunku przedstawiono odpowiedź regulatora PD dla zakłócenia w postaci skoku jednostkowego. W tym w celu wyłączono liniowo narastający uchybu wstawiając znaki komentarza w liniach programu Reg_PID_nastawy_Elektroda i ustawianąc następujące parametry controlReference = 0.0 measuredOutput 0.2 .

Z wykresu wynika że przy stałym uchybie (nie zmieniającym się ) człon różniczkujący nie działa , działanie widoczne jest tylko na początku kiedy regulator po raz pierwszy próbkuje i uzyskuje różnice uchybu 0,2 pomiędzy poprzednią a kolejną próbką. W kolejnych próbkach różnica uchybu pomiędzy kolejnymi próbkami wynosi 0, człon różniczkujący nie wpływa na sygnał wyjściowy regulatora , na wykresie widzimy tylko działanie tylko członu proporcjonalnego. Wykres potwierdza ze wzrostem kd rośnie amplituda sygnału wyjściowego regulatora w pierwszej próbce.
Na zakończenie badania regulatora przedstawiono odpowiedź regulatora PID dla zakłócenia w postaci skoku jednostkowego z otwartą pętlą przy nastawach :
PID-1 dla Kp=0.5 Ki=0,1 Kd =0,2 fooPID.measuredOutput = 0 fooPID.controlReference = 0,2
PID-2 dla Kp=0.2 Ki=0,1 Kd =0,35 fooPID.measuredOutput = 0 fooPID.controlReference = 0,2
PID-3 dla Kp=0.1 Ki=0,1 Kd =0,425 fooPID.measuredOutput = 0 fooPID.controlReference = 0,2

Kolejną czynnością którą wykonałem było sprawdzenie czy regulator działa w zamkniętej pętli sprzężenia zwrotnego. W tym celu zbudowałem obwód elektryczny który ma udawać obiekt. Obiekt został zbudowany z kondensatorów i rezystorów . Schemat przedstawia 4 obiekty o inercji pierwszego rzędu połączone ze sobą szeregowo tworząc w ten sposób kolejne obiekty wyższego rzędu . Stała czasowa obiektu o inercji 1 rzędu
wynosi 10s. Ja na wyjściu każdego „obiektu” wlutowałem goldpin .Dzięki takiemu połączeniu możliwe są eksperymenty z obiektami o różnej inercji.

Podłączenie obiektu do płytki mikro-kontrolerem (regulatorem PID) należy wykonać w następujący sposób: masy łączymy ze sobą , wejście obiektu (pin 2 złącza P1 ) łączymy z nóżką 17 mikro-kontrolera (PWM_H_OUT wyjście PWM mikro-kontrolera) , wyjście obiektu (P2- P5) podłączmy do wejścia AN5 mikro-kontrolera ( złącze P1 pin 7 na rys 6 wejście przetwornika A/D).W tym przykładzie wielkością wejściową dla regulatora PID jest napięcie przeliczone na temperaturę , wyjściem przebieg komplementarny PWM o częstotliwości około 1200 Hz. Kolejnym krokiem jest otwarcie w MPLAB X IDE projektu „Reg_temp_PID_obiekt_inercja_Elektroda” i zaprogramowanie mikrokontrolera

Po zaprogramowaniu i włączeniu zasilania powinniśmy otrzymać następujący widok jak na rzdjęciu. Program został przygotowany w taki sposób że napięcie 0 V na kondensatorze odpowiada temperaturze -125 °C natomiast 3,3V +125 °C
Do obsługi regulatora mamy cztery przyciski :
S- zapisuje ustawienia w pamięci flash mikrokontrolera (podczas zapisu na ułamek sekundy gaśnie dioda LED).
M- przycisk menu naciśnięcie (około 3 s) powoduje negację ekranu i możliwość edycji parametrów Kp, Ki,Kd ,set. Przejście do edycji kolejnego parametru ponowne wciśnięcie M
aż do wyjścia z menu edycji.
Znak „<” wskazuje edytowany parametr. Zmiana parametrów przyciskami ↑↓. Widok ekranu regulatora w trybie menu na rys 21.
↑↓ - zmieniają „set” wartość zadaną poza trybem menu.
RST – przycisk resetu mikrokontrolera
PIDout – sygnał wyjściowy regulatora PID od -1 do 1.
proc – wielkość regulowana (napięcie na kondensatorze przeliczone na temperaturę)
set – wielkość ustawiona (zadana wartość temperatury).
Przebiegi na wyjściu regulatora dla różnych wartości sygnału PIDout przedstawiłem na poniższych rysunkach.



Domyślne nastawy regulatora po włączeniu zasilania Kp = 0,5 Ki = 0,1 ,Kd = 0,0 działają z obiektem o inercji 1 ,2 rzędu , nie działają z obiektami o inercji 3 i 4 rzędu , temperatura cały czas oscyluje nie może osiągnąć zadanej wartości. Żeby uzyskać ustaloną wartość temperatury należy dobrać właściwe nastawy. W Internecie jest wiele sposobów opisujących dobór nastaw regulatorów PID dla obiektów z opóźnieniem.
Ja skorzystałem z poniższej tabeli którą znalazłem w Internecie. Na rysunku przedstawiłem odpowiedź badanego obiektu o inercji czwartego rzędu na skok jednostkowy.


Posługując się zależnościami z tabeli i wartościami odczytami z wykresu τ = 17 s i T = 121 s
dla kryterium regulacji k = 0% i tr → min dla regulatora PID wyznaczono następujące nastawy:
kp = 0,35 x T/ τ = 2,6
Ti = 2,4 x τ = 40,8 s
Td = 0,4 x τ = 6,8 s
Niestety takich nastaw nie uda się nastawić w przedstawionym regulatorze wzmocnienie Kp jest większe od jedności.
W tej sytuacji rozpocząłem od kp = 0,5 następnie obliczyłem ki=(kp×T)/Ti = 0,006 i na koniec maksymalną możliwą wartość dla kd pamiętając żeby nie przekroczyć dopuszczalnego zakresu (-1 - 1) podanego w zależności (6) ustawiłem kd = 0,245.
Obliczone nastawy wpisałem do regulatora i otrzymałem stabilny przebieg regulacji jak poniższym wykresie . Zachęcam do eksperymentów ze zmianą nastaw i prób które pomogą uzyskać krótszy czas regulacji oraz eksperymentowania z obiektem o inercji 1 ,2 i 3 rzędu.

Załączam jeszcze jeden projekt wykonany w MPLABX o nazwie Reg_temp_PID_v1_DS18_Elektroda
W tym przykładzie zastosowania regulatora PID chciałbym przedstawić układ który chłodzi i podgrzewa. Wielkością wejściową jest temperatura odczytywana z czujnika ,wielkością wyjściową komplementarny przebieg PWM .Pomiar temperatury układu zrealizowano czujnikiem ds18B20. Układ zbudowany jest z ogniwa peltiera do którego z jednej strony przymocowano czujnik temperatury zaś z drugiej radiator z wentylatorem. Ogniwo peltiera zostało zasilone z mostka zbudowanego z czterech tranzystorów popularnie nazywanego „mostkiem H” .Schemat podłączenia ogniwa peltiera i mostka H do płytki z mikro-kontrolerem przedstawiono na rysunku


Do sterownia ogniwem peltiera wykorzystano gotową płytkę z układem scalonym L298 od arduino który w swej strukturze posiada dwa mostki H.

Mostek jest sterowany z komplementarnych wyjść mikro-kontrolera . Częstotliwość przebiegu wyjściowego wynosi około 1200 Hz. W zależności od współczynnika wypełnienia przebiegu sterującego mostkiem na jego wyjściu zmienia się zwartość średnia napięcia oraz jego biegunowość . Zmieniając biegunowość powodujemy że strona ogniwa peltiera do której jest przyłożony czujnik temperatury będzie się grzała lub chłodziła . Zmieniając wartość średnią napięcia na ogniwie będzie ono chłodziło lub grzało mocniej lub słabiej. Przebieg sterujący mostkiem H przedstawiono na rysunku

Kiedy współczynniki wypełnienia PWM2H i PWM2L wynoszą 50% wyjściowe napięcie mostka H = 0V.
Jeśli współczynnik wypełnienia PWM2H > PWM2L napięcie wyjściowe mostka H jest dodatnie , a ujemne gdy PWM1H < PWM1L. W taki prosty sposób mogłem zmienić polaryzację napięcia i doprowadzić do grzania lub chłodzenia czujnika.
Zdaję sobie sprawę że nie jest to optymalne rozwiązanie ponieważ gdy wartość średnia napięcie na wyjściu mostka wynosi zero niepotrzebnie prąd przepływa przez ogniwo peltiera raz w jedną stronę (grzejąc) a później w drugą (chłodząc).
Ale eksperyment się powiódł.
Uwagi wymaga konfiguracja projektów MPLABX gdy używamy biblioteki dsp. Przypominają o tym komentarze w programie. Aby dokonać konfiguracji należy wykonać następujące czynności:
Otwarty projekt ustawić jako projekt główny W tym celu wybieramy projekt a następnie klikamy prawym klawiszem myszki i z rozwiniętego menu wybieramy set as main project .

W kolejnym kroku określamy ścieżkę dostępu do biblioteki dsp.
z paska menu wybieramy: production \ set Project configuration \ customize

Otworzy się kolejne okno z którego wybieramy libraries , naciskamy przycisk Add library/object file i wskazujemy ścieżkę dostępu do pliku libdsp-elf.a który znajduje w katalogu o nazwie wersji użytego kompilatora XC16.Jak widać użyłem v1.5

W tym samym oknie wybieramy XC16( global options) ustawiamy format pliku wyjściowego na ELF/DWARF.

W załączonych programach dokonałem uproszczenia . Funkcja regulatora PID jest wywoływana w głównej pętli z opóźnieniem programowym , lepszym rozwiązaniem jest umieszczenie jej w przerwaniu żeby regulator działał dokładniej . Pozwoliłem sobie na takie uproszczenie ponieważ okres próbkowania to 0,5 s , jest to długi czas w porównaniu z innymi operacjami wykonywanymi w pętli i ich wpływ na dokładność działania regulatora jest niewielka . W przypadku chłodziarko grzałki czas przetwarzania temperatury czujnika ds18b20 to około 750 ms i to jest w przybliżeniu okres próbkowania.
Cool? Ranking DIY