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
|
|||
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
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.
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.
RE: Histereza
na samym początku programu ma być jeszcze
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.
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.
Re: Wentylator
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:
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.
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.
Re: Wentylator
No to wystarczy odwrócić działanie.... zakładam że wentylator włącza Ci się zerem na porcie:
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.
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