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

Algorytm samostrojenia PID.

15 Gru 2008 12:05 9068 17
  • Poziom 16  
    Witam,
    potrzebuję algorytm samostrojenia parametrów dla regulatora PID.
    Może być też jakiś programik w C lub Bascomie.

    Pozdrawiam
  • MetalworkMetalwork
  • Poziom 38  
    Powodzenia w poszukiwaniu:>
    Jedne z najbardziej strzeżonych algorytmów przez producentów:>
  • Poziom 11  
    Zobacz do Elektroniki Praktycznej, nr 10, 11 i 12 /2007 "Mikroprocesorowy regulator temperatury PID z interfejsem Modbus". Do tego projektu są nawet źródła w C.
  • Poziom 16  
    W ep10/07 jest projekt "Mikroprocesorowy regulator PID z interfejsem MODBUS"

    W programie mikroprocesora jest funkcja samostrojenia, o ile sam program rozumiem to za bardzo nie wiem dlaczego to jest tak wyznaczane.
    Poniżej funkcja samostrojenia z tego projektu.

    Code:

    #define MAX_TUNE_TIME (20*3600*10)

    //Samonastrajanie...
    //0 - Samonastrajanie zakonczone powodzeniem
    //1 - Wystapil Blad Przy samonastrajaniu
    //2 - Samonastrajanie w trakcie
    unsigned char SelfTunning(unsigned char *stan)
    {
       static idata float BegTemp;               //Komorka Tymczasowa Temperatury
       static idata float TPocz;
       idata float TDelay,T,K;
       switch(*stan)
       {
       //Stan Poczatkowy.. Wartosci poczatkowe Temperatury i czasu...
       case 0:
          TimL = MAX_TUNE_TIME;
          BegTemp = ActTemp;
          TPocz = ActTemp;
          pwm_p = 255;
          *stan = 1;
          break;
       //Wyznaczanie czasu Opoznienia
       case 1:
          if(!TimL) {*stan = 2;}               //Jezeli czas sie skonczyl to wyjdz z bledem
          else if(ActTemp + 0.1 < BegTemp) { *stan = 2; }
          else if(ActTemp > BegTemp + 0.25)
          {
             TDelay = (MAX_TUNE_TIME - TimL)/20;
             *stan = 4;
             TimL = TDelay * 20.0 * 1.5;
             T = 0;
             BegTemp = ActTemp;
          }
          break;
       //Wyjscie z bledem
       case 2:
          pwm_p = 0;               //Wylacz PWM
          D1 = 1;                  //Wylacz Diode
          TimL = 0;               //Skasuj Timer
          return 1;
       //Wyjscie bez bledu
       case 3:
          pwm_p = 0;
          D1 = 1;
          T = T - 3 * TDelay;            //Wyznaczenie Czasu T obiektu
          K = (K - TPocz)/8.0;         //Wyznaczenie wzmocnienia obiektu
          Pid[_TP] = T * 0.005 + 1;      //Czas Probkowania Regulatora
          Pid[_TI] = 2.5 * TDelay;      //Czas Calkowania Regulatora
          Pid[_TD] = 0.4 * TDelay;      //Czas rozniczkowania
          Pid[_KP] = T/(K * TDelay);      //Wzmocnienie Regulatora
          SaveBytes(0,(unsigned char*)Pid,sizeof(Pid));      //Zapamietaj nastawy Regulatora..
          TimL = 0;                  //Wyzeruj Timer
          return 0;
       //Znalezienie czasu T i wzmocnienia   
       case 4:
          if(!TimL)
          {
             T += TDelay * 1.5;
             if(ActTemp + 0.5 < BegTemp) *stan = 2;
             else if(ActTemp <= BegTemp + 0.2)
             {
                K = ActTemp;
                *stan = 3;
             }
             else
             {
                TimL = TDelay * 20.0 * 1.5;
                BegTemp = ActTemp;
                D1 = !D1;
             }
                
          }
          break;
        }
       
       return 2;
    }
  • Specjalista - oświetlenie sceniczne
    W sumie kod chyba próbuje "wyczaić" bezwładnosć obiektu, nie mniej jednak też nie widzę, co podmiot liryczny miał na myśli.

    Na chłopski rozum, to jak to samostrojenie powinno wygladać?
  • Poziom 18  
    Hej,

    Nie analizowałem zamieszczonego kodu ale szukajcie z googlami "dobór nastaw regulatora PID" a coś na pewno znajdziecie. Metod doboru nastaw jest kilka. Jedną, chyba bardziej znaną ("szkolną") jest metoda Zieglera-Nicholsa (np. https://www.elektroda.pl/rtvforum/topic199993.html Nie pomoże ona dobrać nastaw optymalnych ale gwarantuje, że układ regulacji będzie stabilny. Ponadto w tej metodzie trzeba w obiekcie wzbudzić oscylacje...a to może być niełatwe (czasochłonne) w procesach wolnozmiennych. Nastawy PID otrzymane z Z-N można przyjąć za punkty startowe optymalizcji by dostać nastawy "idealne" dla określonego kryterium optymalizacji...ale jeżeli w kosmos to nie leci ;) to nastawy zgrubne zapewne wystarczą. Warto też dobrać strukturę regulatora do obiektu sterowania...być może nie wszystkie człony PID-a będą potrzebne?

    Podsumowując...
    Napisałem się trochę ale czy coś z tego wynika to nie wiem :) Najlepiej chyba poszukać metody doboru nadającej się do określonego obiektu i strzelić sobie program na jej podstawie...bo czasem analiza zajmuje więcej czasu niż synteza :)

    Pozdrawiam
  • MetalworkMetalwork
  • Poziom 12  
    Jeśli chodzi o samostrojenie ja zrobiłem w ten sposób:
    1. najpierw przeprowadzam regulacje dwustanową (za duże wyłącz, za małe włącz) równocześnie całkując sygnał wejściowy i wyjściowy
    2. po paru machnięciach sygnałem otrzymuję przybliżone wzmocnienie układu k=Całka(y)/Całka(u)
    3. Z wyliczonego k wyznaczam wartość u taką żeby wyjście było pod wartością zadaną u = zad*0.9/k, czekam aż się ustali i robię skok jednostkowy u = zad*1.1/k. Zbieram próbki i mam charakterystykę skokową z której mogę wyznaczyć model 1 rzędu
    4. na podstawie modelu wyznaczam nastawy PID.
    Może nie jest to sposób specjalnie prosty, ale autorski wymyślony przeze mnie, i podczas strojenia pozwala mi na utrzymywanie wyjścia w okolicy wartości zadanej.
    Symulacji robiłem na atmega8 połączonej z simulink'iem przez port rs. Z racji ograniczeń czasowych próbkowanie mam co 1 sek więc mogę tak stroić układy wolne.
  • Poziom 31  
    Wypróbuj metodę przekaźnikową. Stosowana w większości rozwiązań przemysłowych. Ale ma też ograniczenia. Trzeba to inteligentnie używać!
  • Poziom 16  
    Witam,
    dziękuje za zainteresowanie tematem, dodam że celem regulacji w moim przypadku ma być utrzymanie stałej temperatury cieczy(wody).

    ->d3zerter mógłbyś przybliżyć jak z ch-ki skokowej wyznaczasz model i później nastawy??

    Googlując metodę przekaźnikową natknąłem się na "ciekawy"(na pierwszy rzut oka) wykład w pdf. Podaje linka, może się komuś przyda.
    Link
    Opisane są w nim różne metody doboru nastaw.

    Póki co czekam również na sugestie jak rozwiązane jest samostrojenie z projektu z ep.

    Pozdrawiam
  • Poziom 31  
    zas napisał:
    Googlując metodę przekaźnikową natknąłem się na "ciekawy"(na pierwszy rzut oka) wykład w pdf.


    No właśnie choćby ten artykuł miałem na myśli mówiąc "używać z głową"!
    Zauważcie, że autor uzyskuje ujemne poziomy cieczy w zbiorniku :|
    Poza tym pompa też może pracować w "stronę ujemną" -> co oznacza, że zasysa ciecz ze zbiornika.
    Poza tym wzorki OK. Działa skutecznej niż metoda Zieglera-Nicholsa (chociaż opracowana na bazie tej metody) i nie "demoluje" :D połowy zakładu jak może to mieć miejsce przy metodzie Panów Z-N w przypadku osiągnięcia nietłumionych drgań o "troszkę" za dużej amplitudzie.
    Wada: niestety nie działa dla obiektu inercyjnego pierwszego rzędu (np. pojedynczy zbiornik z wypływem grawitacyjnym) Niby nie potrzebne a jednak...
  • Poziom 12  
    najpierw szukam punktu przegiecia (największy przyrost)
    Code:
                   
    
    for (int i=0;i<Strojenie->index2-1;i++)
    {
    if (ABS(Strojenie->Skok[i+1]-Strojenie->Skok[i])>max)
    {
          max = Strojenie->Skok[i+1]-Strojenie->Skok[i];
         PunktPrzegiecia = i;
    }
    }

    Jak mam punkt przegiecia max liczę stała czasową jako odleglosc miedzy punktami przecięcia z y0 (wartosc ustalona przed skokiem) i y1 (wartosc ustalona po skoku) przez styczną w punkcie przegiecia
    Code:

    Strojenie->T = ABS((Strojenie->Skok[Strojenie->index2-1] - Strojenie->Skok[0])/max);

    Wzmocnienie biorę z całek ale można wziąść dokładniej z charakterystyki.
    daje mi to model bez opoznienia g(s) = k/(Ts + 1)
    Jeśli chodzi o dobranie na tej podstawie nastaw to zależy konkretnie od transmitancji regulatora PID. Ja liczę transmitancję zamkniętego układu z parametrami ki kp kd i przyrównuje mianownik tej transmitancji do mianownik transmitancji porządanej transmitancji układu zamkniętego.
  • Specjalista - oświetlenie sceniczne
    Czytam o tych nastawach i w sumie nie kapuje jak go ustawić :)

    Mam reg PI, grzeje mocna grzałką małą ilość wody. P wyregulowałem tak aby bez udziału I temperatura ustabilizowała się kilka % poniżej zadanej wartość.

    Natomiast włączenie członu I powoduje oscylacje. Co prawda jakoś trafiłem z ustawienim I, ale chciał bym to jakoś przewidywalnie zrobić.
    Powiedzmy że mam odchyłke o jakimś okresie i amplitudzie, do tego mam jakiś tam czas całkowania. Poradzcie jak z tego wyciągnąć prawidłowy wniosek
  • Specjalista - Mikrokontrolery
  • Poziom 19  
    Freddie Chopin napisał:
    prawidlowy wniosek to IMHO zastosowanie regulatora PD a nie PI.

    Przy regulacji obiektów cieplnych - (wielo)inercyjne z opóźnieniem - raczej nie stosuje się regulatorów bez całki. Proszę odwołać się zresztą do wykładu, do którego link został wcześniej podany.

    Wykorzystując tylko tor P, dostajemy jakiś tam przebieg regulacji, dla którego czas regulacji i uchyb ustalony maleją ze wzrostem kp. Jednak ze względu na opóźnienie w obiekcie, zbyt duże kp doprowadzi do oscylacji, trzeba zadowolić się zatem jakimś błędem ustalonym. Dodanie toru D spowoduje osłabienie (likwidację) oscylacji z jednoczesnym spowolnieniem regulacji i zachowaniem niezmienionego uchybu ustalonego. Użyciu struktur P lub PD będzie więc towarzyszyć "krótka kołdra", mniej lub bardziej kłopotliwa, zależnie od szczegółowych parametrów obiektu. Oczywiście wszystko zależy od wymagań, jeśli nie są one wielkie co do szybkości i dokładności, to w konkretnych sytuacjach spisałby się zapewne także regulator P.

    Typowo używa się struktur PI lub PID.
    Jeżeli chodzi o dylemat bolka , co do dokładnego wyznaczenia nastaw PI, można zrobić to łatwo, jeśli obiekt ma charakterystykę zbliżoną do jednoinercyjnej z opóźnieniem. W takim wypadku można go modelować transmitancją: G(s) = k*e(-Ds)/(Ts+1). Należy zidentyfikować parametry modelu, określając wzmocnienie statyczne (k), stałą czasową (T) i opóźnienie (D). Transmitancję regulatora PI można zawsze sprowadzić do postaci: Gr(s) = kr*(z*s+1)/s. Należy dobrać: z = T, co oznacza redukcję bieguna obiektu przez zero regulatora. Można powiedzieć, że jest to pewien "optymalny" wybór intensywności całkowania, przy którym układ powinien zachowywać się grzecznie. Wybór kr jest mniej krytyczny. Jego zwiększenie przyspiesza układ, ale nie można przesadzić, gdyż dojdzie do oscylacji lub znacznych ograniczeń sygnału sterowania.

    Dla sensownego użycia regulatora z całkowaniem trzeba by jeszcze dodać anti-windup. Zwłaszcza jeśli układ nie pracuje ciągle, tylko załączany jest dorywczo. Przy starcie, sterowanie zazwyczaj na pewien czas zatrzymuje się na ograniczeniu i jeśli nie ma anti-windup potrzeba trochę czasu, aby całka "wróciła do siebie".
  • Poziom 23  
    Witam.
    Gdzie można znaleźć źródła do tego projektu z EP ( "Mikroprocesorowy regulator PID z interfejsem MODBUS" )?
  • Poziom 13  
    Zalezy co sie rozumie przez samostrojenia PID ? Nie ma takiej matody ktora jednoznacznie wyznacza najlepsze sterowanie a to z prostego powodu - obiekt sterowania nie jest znany !
  • Poziom 16  
    Cytat:
    Gdzie można znaleźć źródła do tego projektu z EP ( "Mikroprocesorowy regulator PID z interfejsem MODBUS" )?


    ze strony ep Link

    Cytat:
    Zalezy co sie rozumie przez samostrojenia PID ?


    Chodzi aby program sam dobrał parametry PID na podstawie odpowiedzi obiektu na jakieś wymuszenie.
  • Poziom 27  
    Także dołączę swoje 3 grosze do tej miłej regulacji temperatury.
    - gdy już zrobisz regulator to pomyśl na zabezpieczeniem się przed sytuacją kiedy cała ta regulacja padnie i się wysypie załączając na stałe grzałkę. Taki rodzaj bezpiecznika niezależnego od regulatora.

    Domyślam się że grzejesz wodę ale juz nie doczytałem ilości wody i czy jest w zamkniętym zbiorniku. Piszę o tym ponieważ na własnej skórze odczułem skutki przegrzania cieczy i jej gwałtownego wrzenia :)

    Koledzy polecają Tobie tutaj słuszne metody używając mądrych określeń. A chodzi o to że załączając grzanie albo je wyłączając należy uwzględnić inercję układu oraz to że temperatura może jeszcze rosnąć mimo że grzanie wyłączono (np. mieszanie się cieczy nie zostało uwzględnione) albo spadać pomimo że je załączono (np. czas niezbędny na "dotarcie" ciepła z grzałki do cieczy) :).

    Dla małych pojemności nie ma sensu zawracać sobie głowy ale kiedy ilość cieczy rośnie i trzeba to uwzględniać. Dlatego proponuję założyć sobie np. dwustopniową regulację mianowicie taką:

    - do jakiejś mniejszej (ile - musisz sam sobie to założyć np. o 5 stopni) od zadanej temperatury regulator dochodzi na zasadzie włącz/wyłącz.
    - powyżej tego zakresu regulator działa sterując grzaniem impulsowo wg algorytmu w którym proporcja miedzy czasem grzania a nie grzania zmienia się w trakcie "dochodzenia" do zadanej temperatury, aż do całkowitego jego wyłączenia po osiągnięciu zadanej wartości.
    Czyli zmienny w trakcie regulacji czas grzania, potem przerwa na osiągnięcie jej stabilnej wartości, kolejny pomiar i ew. korekta poprez kolejne dogrzanie ale już z innym czasem.
    Myślę że to to najprostszy sposób na regulację takiego układu. Jakby co służę radą na przyszłość. PZDR