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

Arduino układ regulacji temperatury PID

Matex999 31 Gru 2017 03:11 1065 11
  • #1 31 Gru 2017 03:11
    Matex999
    Poziom 3  

    Witam,

    proszę o pomoc. Posiadam małą makietę układu regulacji temperatury.

    Chciałbym opracować układ regulacji temperatury powietrza zbudowany z grzałki (od małej suszarki 230V), silniczka MT78 ze śmigiełkiem i termistora NTC 110 5 kOhm 5% jako czujnika temperatury. Temperatura w zadanym punkcji będzie podlegała regulacji poprzez zmianę prędkości obrotowej wentylatora.

    Dołączam schemat. Nie mogę znaleźć przekaźnika, którego używam więc zostawiłem tam trzy przewody (od pinu 12 jako sygnał sterujący, zasilanie i uziemienie). Do przekaźnika dołączona grzałka, również niewidoczna na schemacie ale w rzeczywistości znajdująca się między silniczkiem a termistorem. Przy termistorze znajduje się rezystor 10K.
    Załóżmy, że chciałbym aby utrzymywał temperaturę 40 st. C. Przy termistorze znajduje się rezystor 10k. Do pinu 12 mam podłączony przekaźnik z grzałką, do 7 podłączony silniczek z wiatraczkiem. Natomiast pin 6 PWM służy do regulacji prędkości obrotów silniczka.
    Arduino układ regulacji temperatury PID

    Silniczek ze śmigiełkiem oraz grzałką mają ogrzewać termistor. Jak najbardziej elementy te są włączone do układu regulacji. Grzałką nie chcę sterować za pomocą PWM.

    Code:
    #include <PID_v1.h> 
    
    #define Relay 12
    #define Krec 7
    #define PWM 6


    ////Define Variables we'll be connecting to
    double Setpoint, Input, Output;

    //Define the aggressive and conservative Tuning Parameters
    double aggKp = 4, aggKi = 0.2, aggKd = 1;
    double consKp = 1, consKi = 0.05, consKd = 0.25;

    //Specify the links and initial tuning parameters
    PID myPID(&Input, &Output, &Setpoint, 2, 5, 1, DIRECT);

    int WindowSize = 5000;
    unsigned long windowStartTime;

    void setup() {
      Serial.begin(9600);
      pinMode(Relay, OUTPUT);
      pinMode(Krec, OUTPUT);
      digitalWrite(Krec, HIGH);
      pinMode(8, OUTPUT);
      digitalWrite(8, LOW);
     
     

      windowStartTime = millis();
     
      //initialize the variables we're linked to
     
      Input = analogRead(0);
      Setpoint = 120;

      //tell the PID to range between 0 and the full window size
      myPID.SetOutputLimits(0, WindowSize);

      //turn the PID on
      myPID.SetMode(AUTOMATIC);
    }

    void loop() {
      float resistance;
     
      Input = analogRead(0);
      Serial.println(analogRead(0));
      delay(200);
      resistance = map(analogRead(0), 0, 1023, 0, 100);
     

      double gap = abs(Setpoint - resistance); // distance away from setpoint
      if (gap < 10)
      { // we're close to setpoint, use conservative tuning parameters
        myPID. SetTunings(consKp, consKi, consKd);
      } else {
        //we're far from setpoint, use aggresive tuning parameters
        myPID.SetTunings(aggKp, aggKi, aggKd);
      }

      unsigned long now = millis();
      if (now - windowStartTime > WindowSize)
      { // time to shift the Relay Window
        windowStartTime += WindowSize;
      }
     if (Output > now - windowStartTime)
      {
        digitalWrite(Relay, HIGH);
        }
     else {
        digitalWrite(Relay, LOW); }
       

      myPID.Compute();
      analogWrite(PWM, Output);

     
      }


    Proszę doświadczonych forumowiczów o pomoc, mianowicie co muszę poprawić aby przedstawiony układ regulacji działał poprawnie.

    0 11
  • #2 31 Gru 2017 06:10
    pawel1148
    Poziom 19  

    Warto byłoby napisać z czym masz problem.

    0
  • #3 31 Gru 2017 12:34
    Matex999
    Poziom 3  

    pawel1148 napisał:
    Warto byłoby napisać z czym masz problem.


    Chyba przez przypadek usunąłem za dużo zdań, było już późno...
    Chciałbym aby ktoś doświadczony sprawdził mój kod, gdzie jest błąd, co trzeba poprawić. To jest mój pierwszy projekt z zastosowaniem regulatora PID pisany w Arduino IDE więc potrzebuję pomocy.

    Pozdrawiam

    0
  • Pomocny post
    #4 31 Gru 2017 17:41
    romulus73
    Poziom 18  

    No ale to nie jest Twój kod tylko skopiowany z.. w całości i go poprostu nie rozumiesz.
    resistance = map(analogRead(0), 0, 1023, 0, 100); tutaj bzie regulacja PWM tylko do 45%
    Nie widzę abyś zadeklarował wyjście PWM.
    const int analogInPin = A0; // Wejscie
    const int analogOutPin = 6; // pwm
    Ntc 10K Ci nie zadziała bo ma przeciwną rezystancję do temperatury, jaka jest jego charakterystyka (typ) skalowanie w programie masz PTC "resistance = map(analogRead(0), 0, 1023, 0, 100);"
    Zaczynając od czujników NTC dla przykładu typ 12 od typu 9 ma przesuniecie 5stopni prze 0 stopni to jak chcesz regulować

    0
  • #5 31 Gru 2017 18:40
    Matex999
    Poziom 3  

    romulus73 napisał:
    No ale to nie jest Twój kod tylko skopiowany z.. w całości i go poprostu nie rozumiesz.


    Tak, przepraszam, oczywiście to nie jest mój kod. Mogłem inaczej to napisać, proszę nie myśleć, że chcę coś sobie przypisać albo kłamać.

    0
  • Pomocny post
    #6 01 Sty 2018 23:20
    3080496
    Użytkownik usunął konto  
  • #7 02 Sty 2018 10:42
    Matex999
    Poziom 3  

    Brzecyscykievic napisał:
    Matex999 napisał:
    Temperatura w zadanym punkcji będzie podlegała regulacji poprzez zmianę prędkości obrotowej wentylatora.
    Gdy wentylator zwolni i spadnie natężenie przepływu, to z grzałki poleci gorętsze powietrze, PID w celu kompensacji jeszcze bardziej zwolni wentylator to temperatura jeszcze bardziej wzrośnie i spirala będzie się nakręcać aż termik wyłączy grzałkę albo uleci dym w przypadku braku zabezpieczeń. Chyba nie tędy droga... Źródłem energii jest grzałka i wydajność tego źródła należy kontrolować w pierwszej kolejności... Zamiast PWM można użyć regulacji fazowej z banalnym półprzewodnikowym regulatorem mocy/napięcia typu 'all in one' jak ten poniżej:
    Arduino układ regulacji temperatury PID


    Tak, na pewno będę potrzebował czegoś takiego, bo przy testach często mi termostat wyłącza grzałkę i trochę zaburza to utrzymanie zadanej wartości.
    A czy mogę użyć ten moduł przekaźnika?Arduino układ regulacji temperatury PID

    W miejsce input wpinam piny bezpośrednio z Arduino? Czy do ustawiania napięcia na wyjściu wystarczy pin PWM z Arduino? Nie używałem wcześniej takich elementów, proszę o pomoc.
    Dziękuję za radę, Pozdrawiam :)

    Dodano po 30 [minuty]:

    romulus73 napisał:
    No ale to nie jest Twój kod tylko skopiowany z.. w całości i go poprostu nie rozumiesz.
    resistance = map(analogRead(0), 0, 1023, 0, 100); tutaj bzie regulacja PWM tylko do 45%
    Nie widzę abyś zadeklarował wyjście PWM.
    const int analogInPin = A0; // Wejscie
    const int analogOutPin = 6; // pwm
    Ntc 10K Ci nie zadziała bo ma przeciwną rezystancję do temperatury, jaka jest jego charakterystyka (typ) skalowanie w programie masz PTC "resistance = map(analogRead(0), 0, 1023, 0, 100);"
    Zaczynając od czujników NTC dla przykładu typ 12 od typu 9 ma przesuniecie 5stopni prze 0 stopni to jak chcesz regulować


    Faktycznie, nie zadeklarowałem wyjścia PWM... Właśnie sprawdziłem układ ustawiając Setpoint = 80, zostawiając termistor i uzyskałem taki wynik:





    Code:
    #include <PID_v1.h>
    
    #define Relay 12
    #define Krec 7
    #define PWM 6


    ////Define Variables we'll be connecting to
    double Setpoint, Input, Output;

    //Define the aggressive and conservative Tuning Parameters
    double aggKp = 7, aggKi = 1.2, aggKd = 2;
    double consKp = 3, consKi = 0.4, consKd = 0.65;

    //Specify the links and initial tuning parameters
    PID myPID(&Input, &Output, &Setpoint, 2, 5, 1, DIRECT);

    int WindowSize = 15000;
    unsigned long windowStartTime;

    void setup() {
      Serial.begin(9600);
      pinMode(Relay, OUTPUT);
      pinMode(Krec, OUTPUT);
      pinMode(PWM, OUTPUT);
      digitalWrite(Krec, HIGH);
      pinMode(8, OUTPUT);
      digitalWrite(8, LOW);

     // analogWrite(PWM, 240); // stala predkosc wiatraczka
     
     

      windowStartTime = millis();
     
      //initialize the variables we're linked to
     
      Input = analogRead(0);
      Setpoint = 80;

      //tell the PID to range between 0 and the full window size
      myPID.SetOutputLimits(0, WindowSize);

      //turn the PID on
      myPID.SetMode(AUTOMATIC);
    }

    void loop() {
      float resistance;
     
      Input = analogRead(0);
      Serial.println(analogRead(0));
      delay(200);
      resistance = map(analogRead(0), 0, 60, 0, 120);
     

      double gap = abs(Setpoint - resistance); // distance away from setpoint
      if (gap < 10)
      { // we're close to setpoint, use conservative tuning parameters
        myPID. SetTunings(consKp, consKi, consKd);
      } else {
        //we're far from setpoint, use aggresive tuning parameters
        myPID.SetTunings(aggKp, aggKi, aggKd);
      }

      myPID.Compute();
      unsigned long now = millis();
      if (now - windowStartTime > WindowSize)
      { // time to shift the Relay Window
        windowStartTime += WindowSize;
      }
     if (Output > now - windowStartTime)
      {
        digitalWrite(Relay, HIGH);
        }
     else {
        digitalWrite(Relay, LOW); }
       

      analogWrite(PWM, Output);

     // if (Setpoint == 80) {
     //   digitalWrite(Relay, LOW);
     // }
     // else {
      //  digitalWrite(Relay, HIGH);
      } 


    Arduino układ regulacji temperatury PID
    Arduino układ regulacji temperatury PID

    Arduino układ regulacji temperatury PID
    Zdarza się trochę wykraczać poza Setpoint ale to chyba normalne przy układach regulacji.

    Dobra, sprawdzałem przy mniejszym Setpoint i jednak nie działa...

    Napięcie na termistorze w pokoju o temp. 20 st. C wynosi 0,3 V (wartość 60 zostanie wyświetlona na pinie A0 ). Jeśli dobrze rozumiem to wzrost temperatury spowoduje spadek napięcia na termistorze a co za tym idzie wartość na pinie A0.

    Proszę mi wyjaśnić dlaczego przy dłuższej pracy układu, pin 12 coraz częściej załącza przekaźnik, aż w końcu po jakimś czasie cały czas podaje stan wysoki? Trochę utrudnia to pracę układu regulacji.

    Proszę o Wasze komentarze.

    0
  • Pomocny post
    #8 02 Sty 2018 14:21
    3080496
    Użytkownik usunął konto  
  • #9 05 Sty 2018 01:04
    Matex999
    Poziom 3  

    Brzecyscykievic napisał:
    To tylko przekaźnik 0-1, grzałka zasilana w 100% albo w 0% można wykorzystać do regulacji tzw. grupowej. Ten co proponowałem pomimo że wygląda niemal identycznie to jest regulator fazowy. Podając napięcie z przedziału 0-5V regulujesz napięcie/moc na grzałce od 0-100% w sposób ciągły (płynnie). Poczytaj co to regulacja fazowa, grupowa w poniższym artykule:
    https://elportal.pl/pdf/k07/78_18.pdf


    A czy mogę użyć czegoś tańszego np.
    Arduino układ regulacji temperatury PID

    0
  • #10 05 Sty 2018 01:48
    Rariusz
    Specjalista Automatyk

    Witam,

    Na załączonym rysunku masz regulator z potencjometrem z tego co widać
    więc nie ma mowy o automatycznej regulacji temp. Kolega Brzecyscykievic
    dał Ci dobrą radę.


    Pozdrawiam,

    0
  • #11 05 Sty 2018 11:37
    Matex999
    Poziom 3  

    Rariusz napisał:
    Witam,

    Na załączonym rysunku masz regulator z potencjometrem z tego co widać
    więc nie ma mowy o automatycznej regulacji temp. Kolega Brzecyscykievic
    dał Ci dobrą radę.


    Pozdrawiam,


    Znacie Panowie jakieś strony skąd mogę zamówić regulator, który poradził mi Kolega Brzecyscykievic ? Byłem w hurtowni w swoim mieście i tam mają tylko chiński oryginalny zamiennik za 350 zł... Gdzie mogę dostać coś tańszego?

    0
  • #12 05 Sty 2018 11:47
    Rariusz
    Specjalista Automatyk

    Witam,

    Możesz poszukać w serwisach aukcyjnych. Przykładowo, Ja ostatnio za 60zł kupiłem
    tego typu przekaźnik z wejściem 4-20mA 25A 480VAC.

    Biorąc pod uwagę ze jest to arduino a nie jakieś rozwiązanie przemysłowe
    poszukaj coś pod hasłem "Arduino Shield"

    Pozdrawiam,

    0