Sterownik wentylacji chlewni



Witam. Na bazie programu sterownika co powstał sterownik wentylacji chlewni. Układ pracuje już 4 tygodnie i na razie spełnia zadanie czyli regulację temperatury oraz przewietrzanie co pewien odcinek czasu. Sterownik steruje dwoma wentylatorami. Chodzi mi teraz żeby zrobić sterowanie szybkością obrotów wentylatorów. Chciał bym wprowadzić część w programie żeby sterował w następujący sposób wentylatorami
- Jeżeli różnica miedzy obecną temperatura a zadana jest większa o np 1 stopień wentylatory 100%
- jeżeli ta różnica zmniejszy się do 0,5 stopnia 50% mocy
- jeżeli różnica jest 0,2 to 25%
równa zatrzymanie.
Jeżeli mógł by ktoś podpowiedzieć był bym wdzięczny.
Wcześniej wentylatorami sterował sterownik firmy Jotafan http://jotafan.pl/pl/sterowniki_mikroklimatu/Seria_TERMISTAT/TERMISTAT-6-.../TERMISTAT-6-AL-010
Doczytałem tam że sterowanie trijaka odbywało się za pomocą zmiany napięcia w przedziale od 0 do 10V.
W sterowniku zastosowany jest 89S52








Portret użytkownika matrix

Re: Sterownik wentylacji chlewni

To ja mam pytanie (lub dwa):
- na jakiej zasadzie ten sterownik u Ciebie działa?
steruje wentylatorami i uchyla bądź zamyka klapy wpuszczające świeże powietrze?
- jak duża jest ta chlewnia i ile tuczników tam trzymasz?

Bo jeśli jest duża, powiedzmy na około 500 sztuk (w jakiej ja mam czasem okazję pomagać znajomemu) to nie ma sensu regulować się już o 1st.

Mój znajomy też ma sterownik ale z tego co zauważyłem to wentylatory nie pracują tam w ten sposób że przy różnicy już o 1 stopień zmieniają się tak diametralnie obroty.

Tam jest bodajże rozpiętość 10% na 1st.C

Portret użytkownika Szymon SQ3OPC

sterownik wentylacji chlewni

Sterownik działa tylko załączając wentylatory. Na kominach wyciągowych są klapy jednak jak wentylatory się wyłączą to się zamykają. Są typowo mechaniczne. Nie wiem ile tuczników ponieważ to nie moja chlewnia myślę, że około 200. Tuczniki są trzymane w boksach na rusztach. Pamiętam jak stary sterownik był sprawny to jeżeli temperatura w chlewni była o 1st wyższa niż zadana to obroty były 80% i potem spadały.

Portret użytkownika matrix

Re: Sterownik wentylacji chlewni

Według mnie trzeba to pomyśleć tak żeby na każdy stopień różnicy przypadało na przykład 10% obrotów wentylatora. Tylko że wtedy trzeba wziąć pod uwagę kilka zmiennych takich jak choćby temperatura aktualna, temperatura zadana i na podstawie różnicy między nimi sterować wentylatorami.

Na marginesie, wiąże się to trochę z moim projektem sterownika temperatury do mojego samochodu 1:1.

Portret użytkownika Szymon SQ3OPC

Sterownik wentylacji

To może choć we fragmencie wrzucisz kod. Nie znalazłem na Twojej stronie tego projektu

Portret użytkownika matrix

Re: Sterownik wentylacji chlewni

Nie ma tego na mojej stronie bo jeszcze nie jest dokończone. Mój projekt zakłada obsługę potencjometru cyfrowego po I2C, obsługę expandera I/O też po I2C, obsługę touch panela, współpracę dwóch atmeg32 po RS'ie i wyświetlanie wszystkiego na wyświetlaczu graficznym 192x64px.

Zastosował bym do tego PWM programowy tu ze strony Mirka, bo będziemy mieli rozpiętość od 0 do 100% prędkości wentylatora. Kod niestety nie został jeszcze napisany bo na chwilę obecną powstaje płytka. Myślę że przedział między 15 a 25st. C będzie ok (dla moich zastosowań). Ja obliczanie temperatury dam tak:

dim temp_zadana as byte
dim temp_aktualna as byte
dim roznica as byte
 
'tu pobieranie temperatury z czujnikow
'i przetworzenie na liczbe z zakresu od zera wzwyz
'jako ze to bedzie do mnie do sampchodu to temperatury beda sie
'wahac w granicach miedzy 0 (i ponizej) do 40st. C wiec musze
'napisac tak
 
if temp_zadana > temp_aktualna then
 roznica = temp_zadana - temp_aktualna 'to mi da wynik z przedzialu 0 do 25st. C
else
 roznica = temp_aktualna - temp_zadana
end if
 
roznica = roznica * 5
 
if roznica < 20 then
 wentylator = 25 'wentylator to wyjscie procesora sterujace PWM dla wentylatora
end if
if roznica > 100 then
 wentylator = 100
end if
if roznica >= 20 and roznica < 100 then
 wentylator = roznica
end if

dalej jeszcze sterowanie PWM programowym itd. ale wystarczy to teraz przeanalizować tak:

Jeśli temp_zadana to 20 a temp_aktualna 25 to od aktualnej odejmujemy zadana i mamy różnica = 5. Dalej w programie mamy mnożenie różnicy * 5 wiec mnożymy 5*5 i mamy 25. Dalej różnica jest przypisywana do prędkości wentylatora i mam 25% jego prędkości.

W myśl tego można przeanalizować inną temperaturę.

Jeśli temp_zadana to 15 a temp_aktualna 30 to od aktualnej odejmujemy zadana i mamy różnica = 15. Dalej w programie mamy mnożenie różnicy * 5 wiec mnożymy 15*5 i mamy 75. Dalej różnica jest przypisywana do prędkości wentylatora i mam 75% jego prędkości.

Dzięki takim obliczeniom mamy czym większa różnica między temp_zadana a temp_aktualna tym szybciej kręci się wentylator.

Portret użytkownika gosc

Kolego mtrixie co ma tu pwm

Kolego mtrixie co ma tu pwm do rzeczy, tutaj trzeba wykorzystać sterowanie fazą lub częstotliwością, te 1 będzie wiele prostsze, tylko najlepiej było by je wykonać na osobnym klocku a dane przesyłać do niego po spi albo rs obojętnie.

Obliczanie temperatury to akurat pestka ale najpierw trzeba zrobić sterownik fazy, attiny13 powinien starczyć, jak nie to attiny25.

Do kolegi szymona:

Na elektrodzie jast od pęczka na których jest to opisane, razem z programami, strczyło by dorobić tylko komunikację i gotowe.

Portret użytkownika matrix

Re: Sterownik wentylacji chlewni

To zależy na jakich silnikach chodzą wentylatory. Skoro to sterownik domowej roboty to założyłem że silniki nie są trójfazowe tylko na 230V. Poza tym zaznaczyłem że kod jest do mojego projektu sterownika do auta 1:1 a w aucie jest wentylator na 12V dlatego ja wykorzystam PWM.

Portret użytkownika rafliczek22

Pod sterownikiem c.o. kolega

Pod sterownikiem c.o. kolega szymon napisał że to silniki Jednofazowe asynchroniczne, a ztego powodu że kręcą wentylami zmiana napięcia zasilania da liniową zmianę obrotów.

Portret użytkownika Szymon SQ3OPC

Sterownik

I właśnie o to mi chodzi kolego rafliczek. Tylko nie zabardzo wiem jak to uygryść programowo.

Portret użytkownika Szymon SQ3OPC

kod sterownika

                       $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 Word , 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 , Praca As Bit
Dim Wygasz_licz As Byte , Off_licz As Byte , Oldt1 As Word
 
'*************  Zmienne Koniec  ****************
 
'************ Warunki Poczatkowe ***************
'***********************************************
Light = 0
Autolight = 50
Praca = 0
Praca_przerwa = 0
 
Lcd " Sterownik Went."
Lowerline
Lcd " By Szymon w.2.0"
 
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 < 60 Or Dmuch > 5940 Then Dmuch = 100
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 >= 60 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 < 5940 Then Dmuch = Dmuch + 60
                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 > 60 Then Dmuch = Dmuch - 60
                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 Zad.:"
       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.Zad   :"
         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
        Hword(1) = Dmuch / 60
        If Hword(1) >= 10 Then Decr Hword(2)
        Locate 1 , Hword(2)
        Lcd Dmuch ; Chr(1) ; "min" ; 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
         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 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
     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
 
Return