Elektroda.pl
Elektroda.pl
X
PCBway
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Regulator PID do regulacji przepływu wody.

29 Maj 2018 14:46 750 21
  • Poziom 8  
    Witam serdecznie - poszukując odpowiedzi na moje pytanie spędziłem już ponad tydzień i nadal nie mam rezultatów.
    Mianowicie chciałbym wykorzystać algorytm PID do regulacji przepływem wody względem temperatury w naczyniu.
    Do regulacji posiadam moto zawór z dwoma sygnałami sterującymi gdzie podając pierwszy domykam zawór a drugi otwieram.
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Niestety algorytm nie działa ponieważ występują liczby ujemne których nie umiem obsłużyć albo problem jeszcze gdzieś indziej tkwi - proszę o pomoc.

    Moderowany przez Marek_Skalski:

    Temat wydzieliłem, ponieważ niewiele ma wspólnego z poprzednim. Dodałem znaczki syntax, które poprawiają czytelność kodu i skracają posty.

  • PCBway
  • Specjalista - Mikrokontrolery
    Przyjrzyj się uważnie, co się stanie w funkcji sygnal_regulujący2(), kiedy sygnal > 0.
  • PCBway
  • Poziom 8  
    BlueDraco napisał:
    Przyjrzyj się uważnie, co się stanie w funkcji sygnal_regulujący2(), kiedy sygnal > 0.


    Według mnie wykona się to:
    Kod: c
    Zaloguj się, aby zobaczyć kod




    czyli zostanie wysterowane wyjście2 na 1 ms i tak aż sygnał osiągnie wartość 0
    Ale wszystko działa jeśli równania PID są dodatnie ale nic nie chce działać jeśli one są ujemne.
  • Specjalista - Mikrokontrolery
    O tak, po czym nastąpi wejście w drugi if() i wykona się coś odwrotnego, bo tak kazałeś.
  • Poziom 8  
    BlueDraco napisał:
    O tak, po czym nastąpi wejście w drugi if() i wykona się coś odwrotnego, bo tak kazałeś.


    Jeżeli zmienna sygnal przyjmie wartosc ujemną.

    if (sygnal < 0)

    Tutaj nie widzę błędu bynajmniej mi sie tak wydaję.
  • Poziom 1  
  • Poziom 8  
    I tutaj chyba widzę pierwszy błąd Marku - dziękuję.

    volatile uint16_t blad = 0;

    powinno być :

    volatile int16_t blad = 0;


    jednakże jest jeszcze jeden mankament - mianowicie jeśli wywołam funkcję:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    wolałbym zastąpić to powiedzmy w ten sposób :

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Ale niestety nie wiem jak to zrobić dla funkcji _delay_ms(); to było by już idealnie. Wówczas funkcja wykona się raz (poda określonej długości powiedzy sygnał przymkniecia zaworu i czeka na ponowne próbkowanie.

    W odpowiedzi na pytanie jak wywołuję funkcję sygnal_regulujacy2()
    odpowiadam iż w timerze mam tak:

    Kod: c
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    Poziom 1  
  • Poziom 8  
    Bardzo dziękuję Marku.
    Pracuję na AVRach docelowo atmega 32 i atmega128
    Dziś załaduję kod i postaram się przetestować. O wynikach poinformuję.

    Dodano po 9 [godziny] 14 [minuty]:

    A więc wyniki są następujące - układ ruszył były drobne błędy literowe w twojej propozycji.
    Nóż mogę dodać - działa teraz chyba najgorsze - strojenie - już siedzę 3 godz i za cholerę mi nie wychodzi.
  • Poziom 20  
    Napisz więcej szczegółów dot. problemów strojenia.
  • Poziom 8  
    Więc pierwsze co zrobiłem to ograniczyłem sygnały. Nic nie pomogło.
    Układ, jak zbliża się do setpointu, powinien już zmieniać sygnał sterujący na przeciwny. Tak się nie dzieje.
    Przekroczy wartość setpoint, dopiero po jakimś czasie zmienia sygnał.
    Próbując wiele możliwości nie mogę go wyregulować.

    Zaś próbkowanie ustawiłem na 7 sek.
    ki = 100;
    kp = 5;
    kd = 30;

    Przykładowo ustawione mam 60 C - to ledwo mieści się w przedziale 75 do 40, czyli jednym słowem katastrofa.
  • Poziom 20  
    Rozumiem, że kod prawidłowo liczy? Czy dla ki=0 oraz kd=0 sam człon proporcjonalny prawidłowo oblicza wartości przed oraz po przekroczeniu SP? Podczas strojenia ustaw tylko kp oraz ki. Człon kd na razie wyzeruj. Jaki charakter ma sygnał sterujący? Czy te 7s próbkowania na pewno odpowiada do szybkosci zmienności procesu jaki chcesz kontrolować (jego bezwładność reakcji na zmiany sygnału sterujacego)? Nie wszystkie procesy dają się w łatwy sposób regulować przez pid.
  • Poziom 8  
    Przepraszam za problem - lecz niestety nie mogłem pisać ponieważ miałem z powodu braku znacznika "syntax" blokadę.

    Powracając do samej regulacji to już nie wiem - poddałem się chwilowo bo kilka dni juz upłynęło i brak rezultatów. Układ dojeżdżając do wartości zadanej powinien przy samej końcówce już zmieniać stan na przeciwny i regulować w odwrotną stronę.
    Czyni to dopiero po przekroczeniu wartości SET POINT.
    Może znacie jakiś bardziej rozbudowane wzory które mogę wykorzystać - nie chodzi mi o wzór z teorii tylko taki który mogę od razu wstawić do języku C.
  • Poziom 8  
    Dziękuję ci bardzo za odpowiedź
    Będzie ciężko :)
    Fajnie prosto wykładniki opisał Marek_Skalski powyżej - tutaj nawet kurcze blada nie wiem od czego sie zabrać ale spróbuje.
  • Poziom 33  
    Czytałeś Atmelowską notę AVR221 i gotowca w C o PID ?
  • Poziom 8  
    Dziękuję za odpowiedź.
    Było sporo linków do tej dokumentacji ale niestety żaden aktywny - nie mogę znaleźć aktywnego linku.
  • Poziom 33  
    Spójrz tutaj:
    PDF do poczytania :

    https://www.google.pl/url?sa=t&rct=j&q=&esrc=...Fdoc2558.pdf&usg=AOvVaw0OblzB0OQn-hFowE3IrbHg

    A tu są źródła plików (klikaj w code):

    Here is a list of all files with brief descriptions:
    main.c [code] Example of use of general PID implementation for AVR
    pid.c [code] General PID implementation for AVR
    pid.h [code] Header file for pid.c
    stdint.h [code]

    https://homepages.uni-regensburg.de/~erc24492/PID-Regler/AVR221/IAR/doxygen/files.html

    Z tego co pamiętam to kiedyś chyba ciągnąłem je w zipowanej paczce, ale nie jestem pewien czy z serwerów atmela. Jestem tam to co potrzebne tylko że trzeba zrobić kopiuj wklej. Jeżeli jesteś bardziej zainteresowany to gdzieś też jest przykład z użycia PID w czyjejś pracy dyplomowej. Też mógłbyś poglądnąć, ale trzeba by poszukać.
  • Poziom 23  
    krzysiek_kutno napisał:
    Dziękuję za odpowiedź.
    Było sporo linków do tej dokumentacji ale niestety żaden aktywny - nie mogę znaleźć aktywnego linku.

    Hmm dziwne. Może masz coś z internetem
    http://ww1.microchip.com/downloads/en/AppNote...inyAVR-and-megaAVR_ApplicationNote_AVR221.pdf

    Wpisałem do gogli:
    "AVR221 i gotowca w C o PID" czyli pierwszy lepszy tekst z niniejszego wątku i mam:
    http://www.microchip.com/wwwappnotes/appnotes.aspx?appnote=en591227

    a tamże właśnie ten dokument AVR221. Są również źródła z przykładami.
  • Poziom 8  
    Przepraszam Panów po tak długiej - analizując materiały powierzone przez Panów powiem tak - jest ciężko i nie wiem czy nie poddam się. Nie wiem nie mam pomysłów jak to przerobić. Ponieważ ja potrzebuję 2 sygnałów sterowania (mikro sygnałów) - jeden na otwórz drugi na zamknij. Jedyny przykład który mniej więcej działa to przykład podany przez Marka Skalskiego ale i tak nie dokońca bo układ jest mało dokładny.
  • Poziom 1  
  • Poziom 8  
    Niestety Marku nie mam możliwości rejestracji parametrów. Ale strasznie działa gorzej niż termostat. Przeregulowywuję. Przykładowo jeśli temp zadana jest 62 C to przy około 58 powinien już przestać dławić a blisko temperatury zadanej winien już podnosić temperatury a on nadal dławi aż osiągnie 62 C. Myślałem że przy kolejnym cyklu będzie lepiej ale jest źle. Wiem kwestia jeszcze regulacji parametrów PID ale minęło sporo czasu i nie daje rady tak jakby wzór był za prosty.