Table of Contents

Sistem încălzire

Introducere

Proiectul presupune realizarea unui sistem de încălzire care utilizeaza controlul Proportional–integral–derivative (PID). Cu ajutorul unor butoane, se va putea alege o temperatura target, rolul sistemului fiind acela de a menține temperatura cât mai aproape de valoarea introdusă (ideal ar fi să rămână constantă). Temperatura va fi citita folosind o termocuplă care va fi atașată la un încălzitor, in combinatie cu un senzor. Toate datele vor fi afisate în timp real pe un display LCD.

Acest proiect are mai multe avantaje și aplicații practice, cele mai importante fiind:

Descriere generală

Schema bloc cuprinde cinci componente principale: display-ul LCD, senzorul de temperatură, încălzitorul, butoanele și placa Arduino UNO. Modul în care aceste componente interacționează atât între între ele, cât și cu un utilizator extern, este descris mai jos.

schema_bloc_rv.jpg

Hardware Design

Listă componente

Schemă componente

schema_componente_rv_2.jpg

Mod de funcționare:

  • Se setează o temperatură target și valoarea constantelor P-I-D folosind encoder-ul
  • Microcontroller-ul citește temperatura prin SPI folosind modulul MAX6675
  • În funcție de temperatura citită, este calculată o valoare de output prin următoarea formulă: $$Out = P_K \cdot Err + I_K \cdot \frac{(Err + PrevErr) \cdot delta_t}{2} + D_K \cdot \frac{(Err - PrevErr)}{delta_t}$$ unde $P_K, I_K, D_K$ sunt constantele setate anterior, iar $Err=SetTemp - CurrTemp$
  • Valoarea Out este scalată în intervalul [0, 255], reprezentând valoarea care va fi salvată în registrul OCR al timer-ului
  • Tranzistorul MOSFET este controlat prin semnalul PWM de la timer pentru a alimenta încălzitorul
  • Atât temperatura curentă, cât și cea de target sunt afișate în timp real pe display-ul LCD

La final, am asamblat componentele într-o carcasă pe care am proiectat-o cu ajutorul unui software CAD și mai apoi am printat-o 3D.

Software Design

Mediul de dezvoltare folosit a fost PlatformIO. Ca și structură, design-ul software cuprinde atât utilizarea unei librării 3rd-party pentru controlul LCD-ului (LiquidCrystal_I2C.h), cât și programare low-level prin configurarea unor regiștri pentru realizarea anumitor funcționalități. De asemeea, pentru inițializarea și comunicația prin SPI, am folosit API-ul din Laboratorul 5.

Așa cum am explicat anterior, controlul tranzistorului MOSFET se face cu ajutorul timer-ului 2, pe care l-am configurat în modul Fast PWM.

Sistemul este proiectat să funcționeze în trei stări diferite:

Astfel, am folosit un enum pentru a putea detecta cu ușurință starea în care se află sistemul la un moment de timp. Tranziția între cele trei stări se face în ordine, prin apăsarea encoder-ului care va declanșa o întrerupere în rutina căreia se decide starea următoare, în funcție de stare în care ne aflăm la momentul de timp respectiv.

Rezultate Obţinute

Sistemul de control P-I-D funcționează cum m-am așteptat inițial. De menționat ar fi că precizia acestuia este influențată de mai mulți factori, printre care temperatura mediului ambiant, precizia termocuplei sau delay-ul între momentul citirii temperaturii și aplicarea efective a unei tensiuni pe rezistența de încălzire. Din aceste motive, valorile celor trei constante P-I-D pot fi ajustate de către utilizator înaintea începerii efective a controlului, în funcție de situație.

În poza de mai jos este varianta finală și asamblată complet a proiectului.

final_rv.jpg

Concluzii

Din punctul meu de vedere, a fost un proiect interesant din care am învățat cum funcționează majoritatea sistemelor eficiente de control a temperaturii folosite în diverse aplicații practice. Aceast proiect m-a ajutat să înțeleg nu doar principiile teoretice, ci și implementarea practică și provocările asociate acesteia.

Download

Fișierele obținute în urma realizării proiectului sunt disponibile în arhiva următoare.

sistem_incalzire.zip

Bibliografie/Resurse

Repository GitHub pentru codul sursă: https://github.com/RobertVlp/HeatingSystemPM

Videoclip inspirație: https://www.youtube.com/watch?v=LXhTFBGgskI&t=18s