logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Regulacja PID na AVR: skalowanie wyjścia prądowego 4-20 mA i zarządzanie przekaźnikiem

Mirek_1 10 Kwi 2021 19:52 1758 8
  • #1 19371657
    Mirek_1
    Poziom 4  
    Witam

    Przymierzam się do wykonania regulatora PID na jednym z AVR-ów i mam w związku z tym kilka wątpliwości dotyczące ustawiania wyjść. Założenia wyglądają tak, że co 20 ms dokonuję pomiarów wyliczam uchyb i funkcja regulatora PID ustawia wartość wyjścia regulacji załóżmy że jest to zmienna 16 bit. Jak wiadomo wartość ta może przyjmować -32768...+32768. W mojej konstrukcji chciałbym zastosować jeden z wariantów albo wyjście prądowe 4-20 mA, albo przekaźnik. Rozumiem że w przypadku wyjścia prądowego zakres -32768...+32768 muszę skalować na 4-20 mA.
    Natomiast w wariancie z przekaźnikiem jak należy załączać przekaźnik ? Wiadomo przekaźnik ma ograniczoną liczbę cykli łączeń, co ile należało by zmieniać jego stan, jak aktualizacja nastaw następuje co 20 ms? Jak rozwiązać problem regulatora PID z wyjściem przekaźnikowym. Jak to się odbywa w przypadku regulatora PID z wyjściem przekaźnikowym w rozwiązaniach przemysłowych.

    Pozdrawiam
    MP
  • #2 19372070
    zgierzman
    Poziom 31  
    Mirek_1 napisał:
    Wiadomo przekaźnik ma ograniczoną liczbę cykli łączeń, co ile należało by zmieniać jego stan, jak aktualizacja nastaw następuje co 20 ms?


    Jeżeli chcesz sterować ogromnym piecem hartowniczym, to przekaźnik się sprawdzi, inaczej będzie klęska.
    Przy 20 ms cyklu (włącz/wyłącz) wiele (większość) przekaźników nawet nie zadziała. Dla 1 s przekaźnik będzie klikał, ale pójdzie do śmieci po kilku dniach/tygodniach (zależy jaki to przekaźnik).
    Na wyjściu PID będziesz miał sygnał "quasi analogowy", powiedzmy PWM, a co możesz sterować PWM-em o okresie liczonym w dziesiątkach/setkach sekund?
  • #3 19372257
    Mirek_1
    Poziom 4  
    Czyli, jeżeli bym sterował np. temperaturą to zwiększam czas aktualizacji pomiarów powiedzmy hipotetycznie co 5 min, To już rozsądniejsze. Zastanawia mnie jak wygląda sterowanie obiektem przy pomocy regulatora PID wyposażonego w przekaźnik.
  • #4 19375625
    Janusz_kk
    Poziom 38  
    Moderowany przez tmf:

    Fragmenty niezwiązane z tematem usunąłem. Prosze aby osoby wypowiadające się trzymały się tematu.



    Mirek_1 napisał:
    Jak wiadomo wartość ta może przyjmować -32768...+32768.

    To wtedy dajesz próg dla którego będzie się przekaźnik włączał a dla którego wyłączał, tutaj naturalnym progiem jest '0'.
    Ale przed włączeniem możesz dać dodatkowy liczniki który będzie zliczał impulsy, czyli robił opóźnienie aby przekaźnik za często nie cykał.

    Mirek_1 napisał:
    Czyli, jeżeli bym sterował np. temperaturą to zwiększam czas aktualizacji pomiarów powiedzmy hipotetycznie co 5 min, To już rozsądniejsze.

    Nie, zrób tak jak chciałeś czyli co 20-50ms, pid odf razu nie zmienia wartości (to zależy od wzmocnienia poszczególnych części) ale kumuluje wartości i błędy, dlatego dobrze jest żeby je na bieżąco zliczał dopiero jak przekroczy próg to ma zasterować przekaźnikiem.
    Dlatego na początku daje się tylko człon P = 1 reszta czyli D i I na 0 i obserwuje układ, a tak w ogóle to dostrajanie pid-a nie jest proste.
    Tu masz taki przykładowy pid. On właśnie jest tak ustawiony.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #5 19400887
    Mirek_1
    Poziom 4  
    Właśnie w swoim projekcie też bazuję na tym przykładzie, czyli mam ustawić dwa (chyba najlepiej) progi załączenia i wyłączenia przekaźnika w zależności od wartości zmiennej (int16_t)ret? Jeszcze moje wątpliwości budzi stała dosłowna SCALING_FACTOR 128. Co to jest i jak powinno się ją dobierać? Gdyż jej dobranie rzutuje na rezultat regulacji w dość istotny sposób:
    ret = (p_term + i_term + d_term) / SCALING_FACTOR.
  • #6 19400945
    excray
    Poziom 41  
    Janusz_kk napisał:
    To wtedy dajesz próg dla którego będzie się przekaźnik włączał a dla którego wyłączał, tutaj naturalnym progiem jest '0'.

    To będzie jakaś parodia a nie PID. Zwykły komparator lepiej będzie działać niż tak zrealizowany PID. PID wyznacza nam wartość nastawy dla sygnału sterującego, a nie sygnał do sterowania.
    Aby prawidłowo to wykonać należy przeliczyć wartość wyliczoną przez PID na procentowy czas załączenia przekaźnika w cyklu. W tym celu trzeba sobie założyć jakiś cykl o określonym okresie uwzględniając w tym celu bezwładność sterowanego obiektu (im krótszy okres tym lepiej) oraz z z drugiej strony jak najdłuższy żywot przekaźnika (im dłuższy okres tym lepiej). A następnie wartość wyliczoną przez PID przekształcić na czas jego załączenia. Czyli przykładowo wartość -32768 oznaczać będzie, że przekaźnik w ogóle nie będzie w danym cyklu załączony, a wartość 32767, że będzie przez cały cykl załączony.
  • #7 19400971
    Janusz_kk
    Poziom 38  
    Mirek_1 napisał:
    Właśnie w swoim projekcie też bazuję na tym przykładzie, czyli mam ustawić dwa (chyba najlepiej) progi załączenia i wyłączenia przekaźnika w zależności od wartości zmiennej (int16_t)ret?

    Nie, zmienna to inputValue w procedurze Set_Input(inputValue);
    i w niej porównujesz daną InputValue z progiem, oczywiście możesz dać dwa wtedy zrobisz histerezę, ale zacząłbym od jednego czyli np
    if (inputValue) > 0 to załącz
    else wyłącz;

    Dodano po 4 [minuty]:

    Mirek_1 napisał:
    Jeszcze moje wątpliwości budzi stała dosłowna SCALING_FACTOR 128. Co to jest i jak powinno się ją dobierać? Gdyż jej dobranie rzutuje na rezultat regulacji w dość istotny sposób:
    ret = (p_term + i_term + d_term) / SCALING_FACTOR.

    Skalowanie, specjalnie tak dobrane żeby było potęgą 2, procesor nie robi wtedy dzielenia co długo trwa tylko przesuwa bity w prawo co robi szybko.
    Możesz zmienić na np 64 lub 256 i zobaczyć efekt.
  • Pomocny post
    #8 19401002
    Janusz_kk
    Poziom 38  
    excray napisał:
    A następnie wartość wyliczoną przez PID przekształcić na czas jego załączenia. Czyli przykładowo wartość -32768 oznaczać będzie, że przekaźnik w ogóle nie będzie w danym cyklu załączony, a wartość 32767, że będzie przez cały cykl załączony.

    Nie trzeba, błędy będą narastać aż do przerzutu ale też nie znikają od razu, aż do kolejnego przerzutu, dopiero jak układ się stabilizuje to wtedy można dać w procedurze minimalny czas pomiędzy przerzutami żeby nie cykał przekaźnik zbyt często.
  • #9 19412003
    gmp
    Poziom 19  
    Trochę tutaj komplikujecie,
    Ogólnie dla PID nie ma znaczenia co sterujesz, jest wartość zadana, wartość wejściowa, i wartość wyjściowa
    1szym krokiem powinno być wyznaczenie stałej czasowej, - czyli określenie jak szybko obiekt reaguje na zmianę pobudzenia.
    2. Dostosowanie PID do stałej czasowej (czyli jak szybko odczytujemy i jak szybo zmieniamy sygnał na wyjściu.)
    3. Dostrajamy regulator PID.
    Najprościej to zrozumieć ustalając że PID daje nam sygnał 0-100%.
    Potem co z tym robimy zależy od układu sterowania który mamy,
    np: dla 33% przekaźnik będzie włączony przez 20sekund i wyłączony przez 40sek.
    lub sterując fazowo 50% , tyrystor/triak będzie załączany 5 ms po wykryciu przejścia przez 0

    Z praktyki wynika że większości przypadków sekcja D nie jest potrzebna, szczególnie do liniowych układów np sterowanie temperatury.

    Jeszcze jedna uwaga z praktyki: PID nie może się nasycać- czyli iść w nieskończoność , np gdy osiągnie 100% to już nie zwiększa sekcji 'I'.
REKLAMA