Sterownik wentylacji


witam mam problem z histerezą w sterowniku wzorując się na programach będących na tej stronie powstał kod. Jednak nie mogę sobie poradzić z histerezą. chciał bym że by wentylatory włączały się po przekroczeniu zadanej temperatury natomiast wyłączał się przy temperaturze zadanej minus ustawianą histereza. poniżej kod. W tej chwili załącza się powyżej zadanego progu ale wyłącza się losowo o parę dziesiątych stopnia poniżej i nie ważne ile jest ustawiona histereza.

                      $regfile = "m8def.dat"
$crystal = 10000000
 
 
Config Portb = &B11111000 : Portb = &B11111111
Config Portc = &B11111111 : Portc = &B11111111
Config Portd = &B00011111 : Portd = &B11111111
 
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5       'mirley UPT M16
Config Lcd = 16 * 2
Deflcdchar 1 , 3 , 2 , 2 , 2 , 2 , 2 , 2 , 3                'nawias[
Deflcdchar 2 , 24 , 8 , 8 , 8 , 8 , 8 , 8 , 24              'nawias]
 
Cls
Cursor Off Noblink
 
Config 1wire = Pind.2
 
Sw_port Alias Pinb                                          'nazwa portu
Went Alias Portd.3
Buzz Alias Portd.1
Light Alias Portd.0
 
 
 
Ds1r Alias Pind.7
 
 
Led_a Alias Portb.5
Led_w Alias Portb.3
Led_s Alias Portb.4
 
 
 
Config Timer0 = Timer , Prescale = 256
Enable Timer0 : On Timer0 Prztimer0
 
 
Enable Interrupts
'********** Konfiguracja uC Koniec  ************
 
'******************  Zmienne *******************
'***********************************************
Dim Stan_sw As Byte , Sw As Byte , Licznik_sw As Byte       'sw
Dim Wyswietlanie As Byte , Poz_wysw As Byte , Wyswietlono As Bit       'Lcd
Dim Mig As Bit , Poz_ust As Byte
Dim Autosave As Byte , Autopowrot As Byte , Autolight As Byte
 
 
 
Dim Ds1(8) As Byte , Ds(8) As Byte , Ds_adr As Byte , Ds_ok As Bit       'DS18B20
Dim Ktory_ds As Byte , Lsb As Byte , Msb As Byte , Minusy As Byte
Dim T(4) As Word
 
 
Dim T_min As Word
Dim T_h As Byte
Dim T_alarm As Word
Dim Dmuch As Byte , Przerwa As Word
 
 
Dim Dzielnik(2) As Byte                                     'dzielniki timera
Dim Flaga_4ms As Bit , Flaga_500ms As Bit , Flaga_1s As Bit 'flagi przerwa?
Dim Hbyte(2) As Byte , Hword(3) As Word , N As Byte , Hbit As Bit , M As Byte
 
Dim Buzz_en As Bit
Dim Tt(2) As Word
Dim Licznik_went As Word , Tryb_pracy As Bit , Praca_przerwa As Bit
Dim Wygasz_licz As Byte , Off_licz As Byte , Oldt1 As Word
 
'*************  Zmienne Koniec  ****************
 
'************ Warunki Poczatkowe ***************
'***********************************************
Light = 0
Autolight = 20
 
 
Lcd " Sterownik Went."
Lowerline
Lcd " By Szymon w.1.1"
 
Wait 1
 
If Ds1r = 0 Then
  Ds_adr = 30
  Gosub Ds_reg
  Cls
  Lcd "prog. czuj."
End If
 
 
 
 
 
 
For N = 1 To 8
  Hbyte(1) = 30 + N
  Readeeprom Ds1(n) , Hbyte(1)
 
 
Next N
 
Readeeprom T_min , 2
Readeeprom T_alarm , 4
Readeeprom Hbyte(1) , 6
Readeeprom T_h , 7
Readeeprom Dmuch , 8
Readeeprom Przerwa , 9
 
 
 
If T_min < 180 Or T_min > 600 Then T_min = 200
If T_alarm < 180 Or T_alarm > 600 Then T_alarm = 250
If T_h > 100 Or T_h < 5 Then T_h = 20
If Dmuch < 2 Or Dmuch > 99 Then Dmuch = 10
If Przerwa < 60 Or Przerwa > 5940 Then Przerwa = 600
 
Wait 1
Wyswietlono = 1
Wyswietlanie = 1
Autosave = 5
Autolight = 0
 
'*******  Warunki Poczatkowe Koniec  ***********
 
'**************  Petla glowna ******************
'***********************************************
Do
  '***********************************************   co 4ms
  If Flaga_4ms = 1 Then
    Flaga_4ms = 0
 
    Gosub Przyciski
    If Wyswietlono = 1 Then Gosub Wysw_lcd
 
  End If
  '***********************************************
 
  '***********************************************   co 500ms
  If Flaga_500ms = 1 Then
    Flaga_500ms = 0
 
    Mig = Not Mig
 
    Portd.6 = Buzz_en
 
      If Went = 0 Then Led_w = Mig Else Led_w = 1
      If Went = 1 Then Led_s = Mig Else Led_s = 1
 
    Led_a = Buzz
 
 
    Wyswietlanie = Poz_wysw
 
  End If
 
  '***********************************************   co 1s
  If Flaga_1s = 1 Then
    Flaga_1s = 0
 
         If Light = 0 Then
      Incr Autolight
      If Autolight >= 40 Then Light = 1
    Else
      Autolight = 0
    End If
 
 
    If Poz_wysw <> 1 Then
      Incr Autopowrot
      If Autopowrot = 6 Then
        'Poz_wysw = 1
        Wyswietlanie = 1
        Poz_ust = 0
      End If
    Else
      Autopowrot = 0
    End If
 
 
    If Autosave < 5 Then
      Incr Autosave
      If Autosave = 5 Then
        'tu zapis do eeprom
        Writeeeprom T_min , 2
        Writeeeprom T_alarm , 4
        Writeeeprom T_h , 7
        Writeeeprom Hbyte(1) , 6
         Writeeeprom Dmuch , 8                              'bajt
        Writeeeprom Przerwa , 9                             '2 bajty
 
        Poz_ust = 0
      End If
    End If
 
    Gosub Temperatura
    Gosub Sterowanie
 
  End If
  '***********************************************
 
Loop
End
'************ Petla glowna Koniec **************
 
'************ Przerwanie timer 0 ***************
'***********************************************
Prztimer0:
  Timer0 = 5
  Set Flaga_4ms
  Incr Dzielnik(1)
  If Dzielnik(1) = 77 Then
    Dzielnik(1) = 0
    Set Flaga_500ms
    Incr Dzielnik(2)
    If Dzielnik(2) = 2 Then
      Dzielnik(2) = 0
      Set Flaga_1s
 
 
    End If
  End If
 
Return
'******** Przerwanie timer 0 Koniec ************
 
'***********************************************
'*****************  Przyciski     **************
Przyciski:
Sw = Sw_port And &B00000111                                 'maska na piny nieu?ywane jako sw
If Sw <> &B00000111 And Stan_sw = Sw Then
    Incr Licznik_sw
    If Licznik_sw = 68 Then
      Licznik_sw = 0
      Select Case Stan_sw
        Case &B00000011:                                    'incr
        '***********************************************************
          Select Case Poz_wysw
            Case 2:
              Select Case Poz_ust
                Case 0:
                   Poz_ust = 1
                Case 1:
                   If T_min < 600 Then T_min = T_min + 10
                Case 2:
                   If T_alarm < 600 Then T_alarm = T_alarm + 10
              End Select
              Autosave = 0
            Case 4:
 
                 Select Case Poz_ust
                Case 0:
                  Poz_ust = 1
                Case 1:
                  If Dmuch < 99 Then Dmuch = Dmuch + 1
                Case 2:
                  If Przerwa < 5940 Then Przerwa = Przerwa + 60
              End Select
              Autosave = 0
 
            Case 3:
               Select Case Poz_ust
                Case 0:
                  Poz_ust = 1
                Case 1:
                     If T_h < 100 Then Incr T_h
 
 
          End Select
           Autosave = 0
 
          End Select
 
          If Buzz = 0 Then Buzz_en = 0
          Autopowrot = 0
           Light = 0
          Autolight = 0
 
 
 
        Case &B00000101:                                    'ustaw next
        '***********************************************************
           If Poz_ust = 0 Then
            Wyswietlanie = Poz_wysw + 1
            If Wyswietlanie = 5 Then Wyswietlanie = 1
          Else
 
            Select Case Poz_wysw
              Case 2:
                Incr Poz_ust
                If Poz_ust = 3 Then Poz_ust = 0
              Case 3:
                Incr Poz_ust
                If Poz_ust = 4 Then Poz_ust = 0
              Case 4:
                 Incr Poz_ust
                If Poz_ust = 5 Then Poz_ust = 0
 
            End Select
          End If
          If Buzz = 0 Then Buzz_en = 0
          Autopowrot = 0
           Light = 0
          Autolight = 0
 
        Case &B00000110:                                    'decr
        '***********************************************************
          Select Case Poz_wysw
            Case 2:
              Select Case Poz_ust
                Case 0:
                  Poz_ust = 1
                Case 1:
                  If T_min > 100 Then T_min = T_min - 10
                Case 2:
                  If T_alarm > 100 Then T_alarm = T_alarm - 10
              End Select
              Autosave = 0
            Case 4:
                Select Case Poz_ust
                Case 0:
                  Poz_ust = 1
                Case 1:
                  If Dmuch > 2 Then Dmuch = Dmuch - 1
                Case 2:
                  If Przerwa > 60 Then Przerwa = Przerwa - 60
              End Select
              Autosave = 0
 
            Case 3:
               Select Case Poz_ust
                Case 0:
                  Poz_ust = 1
                Case 1:
                     If T_h > 5 Then Decr T_h
                     Autosave = 0
               End Select
              Autosave = 0
 
 
          End Select
          If Buzz = 0 Then Buzz_en = 0
          Autopowrot = 0
           Light = 0
          Autolight = 0
 
 
      End Select
    End If
  Else
    Stan_sw = Sw
    Licznik_sw = 60
  End If
 
Return
'***********************************************
 
'***********************************************
'**************    LCD     ***********
Wysw_lcd:
 If Wyswietlanie <> 0 Then
   Wyswietlono = 0
   Select Case Wyswietlanie
     Case 1:                                                'temp piec bojler
     '**************************************************************
       If Poz_wysw <> 1 Then
         Deflcdchar 0 , 7 , 5 , 7 , 32 , 32 , 32 , 32 , 32  'stopien
         'Deflcdchar 1 , 4 , 32 , 14 , 17 , 17 , 17 , 14 , 32       ' o kreskowane
 
         Cls
         Lcd "Temp  :"
         Lowerline
         Lcd "T Ust.:"
       End If
 
       Tt(1) = T(1)
       Tt(2) = T_min                                        'temperatura zadana
 
 
       For N = 1 To 2
         Hword(1) = Tt(n) / 10
         Hword(2) = 12
         If Hword(1) >= 10 Then Decr Hword(2)
         If Hword(1) >= 100 Then Decr Hword(2)
         If Minusy.n = 1 Then Decr Hword(2)
         Locate N , Hword(2)
         Hword(2) = Tt(n) Mod 10
         If Minusy.n = 1 Then Lcd "-"
         Lcd Hword(1) ; "." ; Hword(2) ; Chr(0) ; "C"
       Next N
 
    ' Case 2:                                                'temb banka,dom
     '**************************************************************
 
     Case 2:
     '**************************************************************
       If Poz_wysw <> 2 Then
         Deflcdchar 0 , 7 , 5 , 7 , 32 , 32 , 32 , 32 , 32  'stopien
         'Deflcdchar 1 , 4 , 32 , 14 , 17 , 17 , 17 , 14 , 32       ' o kreskowane
 
         Cls
         Lcd "T.Min   :"
         Lowerline
         Lcd "T.Alarm:"
       End If
 
       If Poz_ust = 1 And Mig = 1 Then
          Locate 1 , 10
          Lcd "       "
       Else
       't minimalna
         Hword(1) = T_min / 10
         Hword(2) = 12
         If Hword(1) >= 10 Then Decr Hword(2)
         If Hword(1) >= 100 Then Decr Hword(2)
         Locate 1 , Hword(2)
         Hword(2) = T_min Mod 10
         Lcd Hword(1) ; "." ; Hword(2) ; Chr(0) ; "C "
       End If
 
       If Poz_ust = 2 And Mig = 1 Then
          Locate 2 , 10
          Lcd "       "
       Else
       't alarmowa
         Hword(1) = T_alarm / 10
         Hword(2) = 12
         If Hword(1) >= 10 Then Decr Hword(2)
         If Hword(1) >= 100 Then Decr Hword(2)
         Locate 2 , Hword(2)
         Hword(2) = T_alarm Mod 10
         Lcd Hword(1) ; "." ; Hword(2) ; Chr(0) ; "C"
       End If
 
 
      Case 3:
     '**************************************************************
        If Poz_wysw <> 3 Then
         Deflcdchar 0 , 7 , 5 , 7 , 32 , 32 , 32 , 32 , 32  'stopien
         'Deflcdchar 1 , 4 , 32 , 14 , 17 , 17 , 17 , 14 , 32       ' o kreskowane
 
         Cls
         Lcd "T hist :"
 
       End If
 
       If Poz_ust = 1 And Mig = 1 Then
          Locate 1 , 10
          Lcd "       "
       Else
       't minimalna
         Hword(1) = T_h / 10
         Hword(2) = 12
         If Hword(1) >= 10 Then Decr Hword(2)
         If Hword(1) >= 100 Then Decr Hword(2)
         Locate 1 , Hword(2)
         Hword(2) = T_h Mod 10
         Lcd Hword(1) ; "." ; Hword(2) ; Chr(0) ; "C "
       End If
     Case 4:
     '**************************************************************
       If Poz_wysw <> 4 Then
         Cls
         Lcd "Nadmuch:"
         Lowerline
         Lcd "Przerwa:"
       End If
 
       'dmuch
       If Poz_ust = 1 And Mig = 1 Then
          Locate 1 , 10
          Lcd "       "
       Else
        Hword(2) = 11
        If Dmuch >= 10 Then Decr Hword(2)
        Locate 1 , Hword(2)
        Lcd Dmuch ; Chr(1) ; "s" ; Chr(2)
       End If
 
       'Przerwa
       If Poz_ust = 2 And Mig = 1 Then
          Locate 2 , 10
          Lcd "       "
       Else
        Hword(2) = 11
        Hword(1) = Przerwa / 60
        If Hword(1) >= 10 Then Decr Hword(2)
        Locate 2 , Hword(2)
        Lcd Hword(1) ; Chr(1) ; "min" ; Chr(2)
       End If
 
 
 
 
       End Select
   Poz_wysw = Wyswietlanie
   Wyswietlanie = 0
   Wyswietlono = 1
 End If
 
 
   Return
 
'************** LCD Koniec ***********
 
'**********  rejestracja DS *********
Ds_reg:
  Disable Interrupts
  1wreset
  1wwrite &H33
  Ds(1) = 1wread(8):
  Enable Interrupts
  If Ds(1) <> 255 Or Ds(2) <> 255 Or Ds(3) <> 255 Then
    Ds_ok = 1
    For N = 1 To 8
      Hbyte(1) = Ds_adr + N
      Writeeeprom Ds(n) , Hbyte(1)
    Next N
  Else
    Ds_ok = 0
  End If
Return
'******  rejestracja DS Koniec ******
 
'*************  Temperatura   ***********
Temperatura:
  Disable Interrupts
  1wreset
  Select Case Ktory_ds
    Case 0:
      1wwrite &HCC
      1wwrite &H44
    Case 1:
      1wwrite &H55
      1wwrite Ds1(1) , 8
      1wwrite &HBE
      Lsb = 1wread():
      Msb = 1wread():
 
 
  End Select
 
 
 
  Enable Interrupts
 
  If Ktory_ds > 0 Then
    T(ktory_ds) = Msb * 256
    T(ktory_ds) = T(ktory_ds) + Lsb
    Minusy.ktory_ds = Msb.7
 
    If Minusy.ktory_ds = 1 Then
      T(ktory_ds) = Not T(ktory_ds)
      T(ktory_ds) = T(ktory_ds) + 1
    End If
 
    T(ktory_ds) = T(ktory_ds) * 10
    T(ktory_ds) = T(ktory_ds) / 16
   Else
    If Poz_wysw = 1 And Wyswietlono = 1 Then Wyswietlanie = 1
  End If
 
  Incr Ktory_ds
  If Ktory_ds = 2 Then Ktory_ds = 0
 
Return
'**********  Temperatura  Koniec *********
 
 
'************   Sterowanie       ***************
'***********************************************
Sterowanie:
       If T(1) >= T_min Then
       Went = 0
      Praca_przerwa = 1
 
       Else
 
        Hword(1) = T_min - T_h
        If T(1) <= Hword(1) Then
        Went = 1
       Praca_przerwa = 0
       End If
       End If
 
 
  If T(1) >= T_alarm Or T(2) >= T_alarm Then
    If Buzz_en = 1 Then Buzz = Not Buzz Else Buzz = 1
  Else
    Buzz = 1
    Hword(1) = T_alarm - 50
    If T(1) <= Hword(1) And T(2) <= Hword(1) Then Buzz_en = 1
  End If
 
     If Praca_przerwa = 0 Then                              'przerwa
        Went = 1
        Incr Licznik_went
        If Licznik_went >= Przerwa Then
          Licznik_went = 0
          Praca_przerwa = 1
        End If
      Else
        Went = 0
        Incr Licznik_went
        If Licznik_went >= Dmuch Then
          Licznik_went = 0
          Praca_przerwa = 0
        End If
        End If
 
 
 
 
Return




Portret użytkownika mirley

Re: program Histereza

Problem jest raczej w miejscu sterowania... ustawiasz Went = 0 i Praca_przerwa = 1 albo Went = 1 i Praca_przerwa = 0 co nic ci nie zmienia. Zmienna praca_przerwa i tak zmienia się cyklicznie dając prace przerywaną wentylatora. Dodaj jeszcze jedną zmienna Praca i na początku spróbuj wogóle uruchomić samą histerezę, bez pracy przerywanej wentylatora, żeby zobaczyć czy to działa tak jak chcesz

Tak poniżej jest najprościej, potem zamiast went trzeba dać dodatkową zmienna praca i w zależności od niej ustawiać wentylator w tryb przerywany lub wygaszenie

Sterowanie:
       If T(1) >= T_min Then
         Went = 0
       Else
        Hword(1) = T_min - T_h
        If T(1) <= Hword(1) Then
         Went = 1
        End If
       End If 
 
  If T(1) >= T_alarm Or T(2) >= T_alarm Then
    If Buzz_en = 1 Then Buzz = Not Buzz Else Buzz = 1
  Else
    Buzz = 1
    Hword(1) = T_alarm - 50
    If T(1) <= Hword(1) And T(2) <= Hword(1) Then Buzz_en = 1
  End If
 
Return

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika Szymon SQ3OPC

histereza

Histereza działa tak jak chciałem właśnie tak jak twój wzór napisałem wczoraj sterowanie. Nie mogę jednak połączyć przedmuchów z histereza bo wtedy są przedmuchy ale histereza nie działa. kombinowałem z kolejną zmienną ale nie mogę dać rady.

Portret użytkownika mirley

RE: Histereza

Sterowanie:
       If T(1) >= T_min Then
         Praca = 1
       Else
        Hword(1) = T_min - T_h
        If T(1) <= Hword(1) Then
         Praca = 0
         Praca_przerwa = 1
        End If
       End If 
 
  If T(1) >= T_alarm Or T(2) >= T_alarm Then
    If Buzz_en = 1 Then Buzz = Not Buzz Else Buzz = 1
  Else
    Buzz = 1
    Hword(1) = T_alarm - 50
    If T(1) <= Hword(1) And T(2) <= Hword(1) Then Buzz_en = 1
  End If
 
  if Praca = 1 then
    If Praca_przerwa = 0 Then                              'przerwa
        Went = 1
        Incr Licznik_went
        If Licznik_went >= Przerwa Then
          Licznik_went = 0
          Praca_przerwa = 1
        End If
      Else
        Went = 0
        Incr Licznik_went
        If Licznik_went >= Dmuch Then
          Licznik_went = 0
          Praca_przerwa = 0
        End If
        End If
    else  
     Went = 1
    end if
 
Return

na samym początku programu ma być jeszcze

Praca = 0
Praca_przerwa = 1

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika Szymon SQ3OPC

przedmuchy

Niestety nie chce działać teraz w ogóle wentylator nie włącza się na stałe działa to tak: po przekroczeniu t ustawionej zaczynają działać przedmuchy poniżej t ustawionej nic się nie dzieje czyli wentylator stoi.Kombinowałem zmieniałem co tylko można i nic.

Portret użytkownika mirley

Re: Wentylator

Quote:
po przekroczeniu t ustawionej zaczynają działać przedmuchy poniżej t ustawionej nic się nie dzieje czyli wentylator stoi.

Właśnie dokładnie tak to napisałem... a jak chciałeś żeby Ci to działało?

zmień Went=1 na Went=0 w tym fragmencie i wentylator będzie działał dla temperatury mniejszej od T_min - T_h:

    else  
     Went = 1
    end if

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika Szymon SQ3OPC

wentylator

Zasada działanie ma być taka:
Ustawiam temp np 25 stopni, jeżeli temperatura w pomieszczeniu przekracza załącza się wentylator na stałe. Po obniżeniu się temperatury do nastawionej minus histereza (nastaw histerezy 2 stopni) czyli 23 stopnie wentylator się wyłącza i zaczyna się cykl przedmuchów. Po przekroczeniu temp. zadanej cykl się powtarza.tak działał fabryczny sterownik w chlewni no były jeszcze regulowane obroty wentylatora w zależności od temp. Sterownik ten uległ awarii której nie da się już usunąć uszkodzony mikrokontroler(89s52) A nowy kosztuje 700zł więc postanowiłem pomóc koledze.

Portret użytkownika mirley

Re: Wentylator

No to wystarczy odwrócić działanie.... zakładam że wentylator włącza Ci się zerem na porcie:

  If T(1) >= T_min Then
         Praca = 1
         Praca_przerwa = 0
       Else
        Hword(1) = T_min - T_h
        If T(1) <= Hword(1) Then
         Praca = 0
        End If
       End If 

if Praca = 1 then
     Went = 0
else  
    If Praca_przerwa = 0 Then                              'przerwa
        Went = 1
        Incr Licznik_went
        If Licznik_went >= Przerwa Then
          Licznik_went = 0
          Praca_przerwa = 1
        End If
      Else
        Went = 0
        Incr Licznik_went
        If Licznik_went >= Dmuch Then
          Licznik_went = 0
          Praca_przerwa = 0
        End If
        End If
 
end if

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika Szymon SQ3OPC

Działa super :):):)

Dzięki Mirku za pomoc i cierpliwość niektóre rzeczy w bascomie przychodzą mi łatwiej. Akurat w tym przypadku było odwrotnie. Fakt dopiero zaczołem 2 miesiące temu bawić się mikrokontrolerami. Jeszcze raz dzięki za pomoc