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

Sterowanie grzałką, implementacja algorytmu PID

kmkm2 28 Cze 2012 22:06 2896 8
  • #1 28 Cze 2012 22:06
    kmkm2
    Poziom 20  

    Witam
    Chcę zaimplementować algorytm PID do kontroli temperatury PCB, ale niestety bardzo mi wychodzi. Czy ma ktoś jakiś sprawdzony sposób? Obecnie grzałka jest sterowana w taki sposób, że im bliżej temperatury zadanej tym mniejsza mocą grzeje grzałka. Funkcja sterującą grzaniem jest wywoływana co 200ms, mamy do dyspozycji wymienione poniżej funkcje sterujące i zmienne.


    Kod: c
    Zaloguj się, aby zobaczyć kod

    0 8
  • Relpol
  • #3 28 Cze 2012 23:45
    kmkm2
    Poziom 20  

    Właśnie na tym się wzorowałem. Swoje wątpliwości umieściłem w komentarzach, bardzo proszę o wskazówki.

    wyglądało to mniej więcej tak:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • Relpol
  • #4 28 Cze 2012 23:51
    gaskoin
    Poziom 38  

    Musisz zajrzeć do środka tej funkcji, żeby wiedzieć jakie są wartości min i max. Można się zorientować chociażby po zwracanym typie, choć lepiej także zajrzeć w sam kod. Następnie trzeba odpowiednio je przeskalować tak żeby uzyskać 16/8 bitów na PWM (w zależności którego używasz). Kiedyś wrzuciłem jakiegoś mega podstawowego PIDa na forum jak poszukasz to pewnie znajdziesz implementację.

    Pamiętaj, że taki regulator należy nastroić bo inaczej lipa z mięsem :)

    0
  • #5 28 Cze 2012 23:52
    LordBlick
    VIP Zasłużony dla elektroda

    To są rozważania teoretyczne, czy już układ zaprojektowany ?

    0
  • #6 29 Cze 2012 01:07
    kmkm2
    Poziom 20  

    To jest układ zaprojektowany i działający. Chce jednak dodać PID. Funkcja Pid wygląda jak poniżej. Wygląda na to że, max wartość inputValue to 32 768 , a min -32767. Wydaje mi się że, żeby to zeskalować wystarczy podzielić przez 128 uraz trochę zmodyfikować sterującą grzałką


    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #7 06 Lip 2012 10:32
    tplewa
    Poziom 37  

    Taka rada ten PID nie wiele ci da... akurat tez z PID-em sie meczylem (tez nad tym siedze - projekt mojego sterownika tez jest na elvikomie), choc temat na razie nie aktualizowany. Po prostu brakuje mi na to wszystko troche czasu.

    Problem jest tutaj to ze nie masz stalego srodowiska, zmiana plyty pod grzalkami to na nowo dobranie parametrow pracy wszystkich blokow PID, do tego dochodzi sterowanie grzalka gorna itd. Wiec w gre wchodzi dobry algorytm samouczacy itd. Do tego pozytywne efekty odiagalem przechodzac w pewnym momencie grzania z PID na PD. Z tym ze ja uzywam promiennikow kwarcowych, czyli mam duzo mniejsza bezwladnosc calego ukladu co jest po czesci dla mnie ulatwieniem.

    W sumie podsumowujac powiem tak - temat nie jest latwy i na chwile obecna mimo tego ze sterowanie dziala w miare ok, to jestem jeszcze "w lesie" jesli chodzi o algorytm samouczenia...

    0
  • #8 27 Cze 2014 19:00
    mariusz.lubicz
    Poziom 17  

    Może ktoś podpowie, bo temat PiD pewnie jak Lenin, wiecznie żywy :-)

    Mnie ten PiD coś tam wypuszcza. Są to wartości od -32768 +32767. Ciekawą rzecz zaobserwowałem. Jak temperatura wody jest niższa do temperatury zadanej w szklance to ta wartość się zmienia w górę. Jak jest przekroczona zadana to idzie sobie w dół.

    Mówię o wartości zwracanej przez tę funkcję
    int16_t pid_Controller()

    Ale jak się temperatury wyrównają to przestaje się zmieniać i zwracana zmienna z funkcji przestaje się zmieniać i pozostaje tam gdzie się zatrzymała. Czy jest to -20000 czy +10000 czy -1 czy +8. Stoi na jakiejś wartości.

    Jak mam to zamienić na sterowanie włącz wyłącz przekaźnikiem? No bo nie mam jak sterować mocą w inny sposób niż włączenie na chwilę grzałki.

    0
  • #9 28 Cze 2014 03:15
    jupi23
    Poziom 15  

    mariusz.lubicz napisał:
    Mnie ten PiD coś tam wypuszcza. Są to wartości od -32768 +32767. Ciekawą rzecz zaobserwowałem. Jak temperatura wody jest niższa do temperatury zadanej w szklance to ta wartość się zmienia w górę. Jak jest przekroczona zadana to idzie sobie w dół.

    Czyli działa tak jak powinien.

    mariusz.lubicz napisał:
    Ale jak się temperatury wyrównają to przestaje się zmieniać i zwracana zmienna z funkcji przestaje się zmieniać i pozostaje tam gdzie się zatrzymała. Czy jest to -20000 czy +10000 czy -1 czy +8. Stoi na jakiejś wartości.

    Część całkująca widać też działa.

    mariusz.lubicz napisał:
    Jak mam to zamienić na sterowanie włącz wyłącz przekaźnikiem? No bo nie mam jak sterować mocą w inny sposób niż włączenie na chwilę grzałki.

    Możesz zastosować PWM sterującym triakiem przez optotriak(sterowanie grupowe). Sygnał z PIDa będzie modulował czas włączenia optotriaka. Możesz też dodać załączanie optotriaka w zerze.

    Inny sposób to przeskalowanie wartości 0-32768 na wartość 0-255 (może być inna), gdzie 1 będzie odpowiadał jednej połówce okresu czyli 10ms. I jak przeskalowana wartość PID będzie np. 15 to załączasz przekaźnik czy grzałkę na 15 półokresów czyli 150ms. Możesz też na podstawie algorytmu Bresenham'a rozłożyć te półokresy, w których przekaźnik czy optotriak będzie włączony równomiernie wzdłuż tych 255 półokresów. Wartości ujemne z wyjścia PID ignorujesz- optotriak czy przkaźnik jest wyłączony.
    No i pewnie dodanie opcji auto-tuning dla procesu z dużym opóźnieniem i dużą stałą czasową (ale to też zależy bo inaczej jest dla szklanki a inaczej dla wiadra wody) dla równległego algorytmu PID.

    0