Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Histereza - jak sensownie wykonać?

robiw 27 Oct 2005 19:23 5754 13
  • #1
    robiw
    Level 26  
    Witam.
    Może ktoś z Szanownych Kolegów pomoże mi w sensownym rozwiązaniu problemu histerezy w programowym termostacie sterującym klimatyzatorem.

    W moim programie występują 2 zmienne, których wartości odpowiadają zmierzonej temperaturze : zmienna Temp_1wire (typu byte w zakresie 0-35) i Pol_stopnia (typu bit - wskazująca, że w pomiarze jest pół stopnia) oraz zmienna odpowiadająca ustawionej temperaturze Temp_ust(typu byte). Chicałem zastosować histerezę ale nie wiem jak to sensownie wykonać - aby zbyt często nie następowało włączanie/wyłączanie klimatyzatora (powiedzmy histereza pozwalająca schłodzić o 1 stopień niżej niż ustawiona temperatura i pozwalająca poczekać z włączeniem klimatyzatora do temperatury 1 stopień wyższej niż ustawiona).
    Zastosowałem następującą konstrukcję (nie wykorzystuję zmiennej Pol_stopnia - jest mi tylko potrzebna przy wyświetlaniu mierzonej temperatury na LCD):

    If Temp_1wire > Temp_ust then
    'Wlączamy klimatyzator bo ustawiona temperatura jest mniejsza niż mierzona
    If P1.6 = 1 then Reset P1.6 ' do tego portu podłączony jest przekaźnik załączający klimatyzator - aktywnym stanem jest "0"
    Else
    Set P1.6
    End If

    Niestety to rozwiązanie nie zapewnia pożadanych rezultatów. Może macie inny pomysł. Z góry dzięki... robiw
  • #2
    powerm
    Level 23  
    Musisz zapamietac w ktorym ze stanow byl termostat.
    if goracy and temp1 > temp ust -10

    if zimny and temp1 < temp ust + 10

    Jesli pamietasz jak wyglada wykres histerezy to bedzie ci latwiej (pamietasz strzalki?)
  • #3
    Smoczy
    Level 19  
    Możesz to rozwiązać tak: (zakładam, że interesuje Cię histereza +-1st.C)
    If Temp_1wire > Temp_ust then
    'Wlączamy klimatyzator bo ustawiona temperatura jest mniejsza niż mierzona
    Reset P1.6 ' do tego portu podłączony jest przekaźnik załączający klimatyzator - aktywnym stanem jest "0"
    Else
    If Temp_1wire < Temp_ust then Set P1.6
    End If

    Przepraszam za błędy składni, nie pisze nic w BASCOM. Sądze, że rozumiesz idee, jeżeli temperatura spadnie o 1 jednostkę wartości lub więcej to klimatyzator się uruchomi i zostanie wyłączony, jeżeli mierzona temperatura jest większa i 1 jednostkę wartości lub więcej od ustawionej temperatury to klimatyzator wyłączy się. W pozostałych przypadkach (jeżeli bedzie równy), nic sie nie stanie, niezałeżnie w którą stronę bedzie zmieniała się temperatura. Jeżeli interesuje Cię większy zakres histerezy, można dodać do wartości odniesienia wartość stałą i to zwiększy zakres histerezy.
    Pozdr
  • #4
    marek_Łódź
    Level 36  
    tak, jak napisał kol Smoczy

    Code:
    if Temp1_Wire>Temp_Ust then reset p1.6 'na czujniku za dużo, włącz 
    
    if Temp1_Wire<Temp_Ust then set p1.6 'na czujniku za mało, wyłącz
    'jeśli Temp1Wire=Temp_Ust nic się nie dzieje


    Dla wygenerowania szerszej histerezy:

    Code:
    if Temp1_Wire>Temp_Ust+Half_H then reset p1.6 'na czujniku za dużo, włącz 
    
    if Temp1_Wire<Temp_Ust-Half_H then set p1.6 'na czujniku za mało, wyłącz
    'jeśli Temp_1Wire>=Temp_Ust-Half_H and  Temp_1Wire<=Temp_Ust+Half_H nic się nie dzieje


    gdzie Half_H jest połową histerezy
  • #5
    Smoczy
    Level 19  
    Half_H+1 jest połową histerezy.
  • #6
    robiw
    Level 26  
    Witam.
    Serdeczne dzięki, to działa i było całkiem proste:
    Code:

    If Temp_1wire > Temp_ust then
    'Wlączamy klimatyzator bo ustawiona temperatura jest mniejsza niż mierzona
    Reset P1.6 ' do tego portu podłączony jest przekaźnik załączający klimatyzator - aktywnym stanem jest "0"
    Else
    If Temp_1wire < Temp_ust then Set P1.6
    End If

    Ja jednak chciałbym wykonać histerezę ±1.5 °C lecz w inny sposób - aby nie używać zmiennych Single (czyli liczb rzeczywistych) bo Bascom generuje wtedy duży kod wynikowy. W moim programie 2 zmienne reprezentują mierzoną temperaturę : Temp_1wire i Pol_stopnia (typu bit) czyli jak np.: temperatura wynosi 21.5°C to Temp_1wire=21 a Pol_stopnia=1 itd... Jak wykonać to w tym przypadku :?: . Z góry serdeczne dzięki za odpowiedzi... robiw
  • #7
    zumek
    Level 39  
    Z jakiego termometru (DS-a ?) korzystasz :?:

    Piotrek
  • #8
    robiw
    Level 26  
    DS1820... robiw
  • #9
    marek_Łódź
    Level 36  
    Code:
    Temp_Ust_Prim= Temp_Ust+Temp_Ust+Delta_Ust_polstopnia
    
    Temp_1wire_Prim=Temp_1wire+Temp_1wire+Pol_Stopnia
    if Temp_1Wire_Prim>Temp_Ust_Prim then Reset P1.6
    if Temp_1Wire_Prim<Temp_Ust_Prim then Set P1.6


    jednostką w tych obliczeniach jest pół stopnia.

    Delta_Ust_polstopnia można pominąć (wtedy nastawa jest ustalana z dokładnością do stopnia).

    oczywiście jak się bardzo uprzesz, możesz zastosować swoje else

    Code:
    Temp_Ust_Prim= Temp_Ust+Temp_Ust+Delta_Ust_polstopnia
    
    Temp_1wire_Prim=Temp_1wire+Temp_1wire+Pol_Stopnia
    if Temp_1Wire_Prim>Temp_Ust_Prim then Reset P1.6
    else
      if Temp_1Wire_Prim<Temp_Ust_Prim then Set P1.6
    endif
  • #10
    robiw
    Level 26  
    Tylko, że ja nie chcę używać zmiennych typu rzeczywistego i dlatego w swoim programie mam 2 zmienne ospowiadającej zmierzonej temperaturze:

    Temp_1wire typu Byte
    Pol_stopnia typu Bit

    i jedną zmienną typu Byte odpowiadającą ustawionej temperaturze - Temp_ust

    i na nich chę zrobić histerezę 1.5 °C :| ... robiw
  • #11
    marek_Łódź
    Level 36  
    Sorry po poprawkach

    Code:

    Dim Temp_Ust as byte
    Dim Temp_1wire as byte
    Dim Temp_Ust_Prim as byte
    Dim Temp_1wire_Prim as byte
    Dim Delta_Ust_polstopnia as bit
    Dim Pol_stopnia as bit
    Dim Hist as byte
    .......
    .......
    '********************************
    '***Przeskalowanie temperatur ***
    '********************************
    Temp_Ust_Prim = Temp_Ust+Temp_Ust
    Temp_Ust_Prim = Temp_Ust_Prim+Delta_Ust_polstopnia
    Temp_1wire_Prim=Temp_1wire+Temp_1wire
    Temp_1wire_Prim=Temp_1wire_Prim+Pol_Stopnia

    Hist=3  'Histereza w stopniach (3 półstopnie w górę i trzy w dół)

    '********************************
    '*** Regulacja ***
    '********************************
    if Temp_1Wire_Prim>=Temp_Ust_Prim+Hist then Reset P1.6
    else
      if Temp_1Wire_Prim<=Temp_Ust_Prim-Hist then Set P1.6
    endif
    ......


    Jednostka w zmiennych primowanych - pół stopnia. Nastawa z dokładnością do pół stopnia.

    W bajtach? W bajtach! Bez rzeczywistych? Bez rzeczywistych :!:
  • #12
    robiw
    Level 26  
    marek_Łódź wrote:
    Sorry po poprawkach

    Jednostka w zmiennych primowanych - pół stopnia. Nastawa z dokładnością do pół stopnia.

    W bajtach? W bajtach! Bez rzeczywistych? Bez rzeczywistych :!:


    Ale zakręciłeś :D ale chyba dobrze... Rozumiem, że jeśli ustawię zmienną Delta_Ust_polstopnia as bit na "1" to histereza będzie wynosić 1.5°C? A co to znaczy "Jednostka w zmiennych primowanych - pół stopnia. Nastawa z dokładnością do pół stopnia. " :?: Serdecznie pozdrawiam i serdecznie dziękuję :D ... robiw
  • Helpful post
    #13
    marek_Łódź
    Level 36  
    Jednostka zmiennych oznaczonych jako prim odpowiada wartości 0,5°C przykładowo przy temperaturze 1wire 23,5°C temp_1wire_prim wyniesie 47, przy 24°C - 48 itd...Czyli inaczej mówiąc zmienne te są przeskalowane i nie liczą w stopniach, tylko "półstopniach".

    Delta_Ust_Polstopnia to korekta wartości zadanej Temp_Ust o 0,5°C (to samo co Pol_Stopnia w zmiennej Temp_1wire)

    Czyli dla nastawy 23 stopni ta zmienna będzie zerem, dla 23,5 będzie jedynką.

    Ponieważ liczymy w "półstopniach", ±1,5°C odpowiada przesunięciu poziomu zmiennych .....prim o ±3, co widać w instrukcjach przełączania.

    Nie używam BASCOMa, więc nie bardzo rozumiem dlaczego nie mogę w jednej instrukcji podstawienia zsumować trzech składników (kompilator wywala błąd).
  • #14
    robiw
    Level 26  
    Dzięki... temat zakończony... robiw
pcbway logo