logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[ATTINY2313][BASCOM] Mikroprocesorowy sterownik wentylatora

Mariuszek15 15 Gru 2009 17:26 3808 14
  • #1 7393020
    Mariuszek15
    Poziom 24  
    Witam :) Mam problem, otóż, gdy w programie ustawiam stałą wartości temperatury np. 30*, 60*, 90* warunki dobrze działają. Natomiast z czujnikiem DS18B20 już program nie działa poprawnie, wentylator nie obraca się. A powinien zmieniać płynnie obroty zależnie od temperatury. Jaki jest błąd w programie?

    '****************************** PROCEK I KWARC *********************************
    
    $regfile = "attiny2313.dat"
    $crystal = 8000000
    
    '****************************** TIMER 1 ****************************************
    
    Config Timer1 = Pwm , Pwm = 8 , Prescale = 1 , Compare A Pwm = Clear Down
    
    '********************************** STAŁE **************************************
    
    Const Low_temp = 30                                         'Low temperatura
    Const High_temp = 85                                        'High temperatura
    Const Overheat = 90                                         'Power OFF - Przegrzany !
    
    '********************************* ZMIENNE *************************************
    
    Dim Odczyt(2) As Byte                                       'Temperatura
    Dim T As Byte
    Dim T1 As Byte
    
    '************************* KONFIGURACJA PORTÓW *********************************
    
    Config 1wire = Portb.1                                      ' DS18B20
    
    Config Portb.0 = Output                                     ' LED RED
    
    Config Portb.3 = Output                                     'Wentylator PWM
    
    '******************************** PROGRAM **************************************
    
    Start:
    
    Stop Timer1
    
    Portb.0 = 0                                                 'Sygnalizacja LED
    Waitms 500
    Portb.0 = 1
    Waitms 500
    
    Portb.0 = 0
    Waitms 500
    Portb.0 = 1
    Waitms 500
    
    Portb.0 = 0
    Waitms 500
    Portb.0 = 1
    Waitms 500
    Portb.0 = 0
    
    Start Timer1                                                'Start TIMER1
    
    '*******************************************************************************
    
    Do
    
      1wreset                                                   'reset
      1wwrite &HCC                                              'jedna kostka, więc wykorzystujemy rozkaz SKIP ROM
      1wwrite &H44                                              'dokonaj konwersji
      Waitms 750                                                'Czekaj
      1wreset                                                   'reset
      1wwrite &HCC                                              'rozkaz adresowy SKIP ROM
      1wwrite &HBE                                              'rozkaz funkcyjny - polecenie odczytu DS18B20
      Odczyt(1) = 1wread(2)                                     'odczytaj dwa pierwsze bajty
      T = Odczyt(2)                                             'przepisz starszy bajt do zmiennej typu Integer
      Shift T , Left , 8                                        'przesuń ten bajt w lewo na wyższe pozycje
      T = T + Odczyt(1)                                         'przepisz - dodaj młodszy bajt
      T1 = T * 0.0625
    
    If T1 < Low_temp Then Pwm1a = 0                             'Przelicznik temperatury na wartość PWM
    
    If T1 >= Low_temp And T1 < High_temp Then Pwm1a = T1 + 70
    
    If T1 >= High_temp Then Pwm1a = 255
    
    If T1 >= Overheat Then
    Pwm1a = 255
    Set Portb.0                                                 ' LED RED ON
    End If
    
    Loop
    End
  • #3 7393157
    Mariuszek15
    Poziom 24  
    Zmieniałem to też, na i nic:

    Dim Odczyt(2) As Byte ,T As Integer, T1 As Single 


    Ale masz rację powinny być te zmienne zapisane jak wyżej. :)
  • #4 7406166
    landy13
    Poziom 31  
    If T1 >= Low_temp And T1 < High_temp Then Pwm1a = T1 + 70
    Błąd jest w tej linii. Do Pwm1a nie można wpisać zmiennej typu single, a taką masz T1. Możesz utworzyć dodatkową zmienną typu byte, np. x=T1+70 i wpisywać Pwm1a=x. Lepiej też będzie zamiast dodawać 70, mnożyć T1 przez 2 albo nawet przez 3 dla lepszego wykorzystania zakresu pwma.
  • #5 7407021
    Mariuszek15
    Poziom 24  
    Ok :) Teraz mam tak:

    Do
    
      1wreset                                                   'reset
      1wwrite &HCC                                              'jedna kostka, więc wykorzystujemy rozkaz SKIP ROM
      1wwrite &H44                                              'dokonaj konwersji
      Waitms 750                                                'Czekaj
      1wreset                                                   'reset
      1wwrite &HCC                                              'rozkaz adresowy SKIP ROM
      1wwrite &HBE                                              'rozkaz funkcyjny - polecenie odczytu DS18B20
      Odczyt(1) = 1wread(2)                                     'odczytaj dwa pierwsze bajty
      T = Odczyt(2)                                             'przepisz starszy bajt do zmiennej typu Integer
      Shift T , Left , 8                                        'przesuń ten bajt w lewo na wyższe pozycje
      T = T + Odczyt(1)                                         'przepisz - dodaj młodszy bajt
      T1 = T * 0.0625
    
    If T1 < Low_temp Then Pwm1a = 0                             'Przelicznik temperatury na wartość PWM
    
    If T1 >= Low_temp And T1 < High_temp Then X = T1 + 70
    
    If T1 >= High_temp Then Pwm1a = 255
    
    If T1 >= Overheat Then
    Pwm1a = 255
    Set Portb.0                                                 ' LED RED ON
    End If
    
    X = Pwm1a
    
    Loop
    End


    Teraz wygląda na to, że lepiej to wszystko chodzi. Ale po ogrzaniu DS18B20 do około 30* napięcie na wentylatorze jest tylko 0.5V. Cała procedura obsługi DS18B20 jest dobra...
  • #7 7408605
    Mariuszek15
    Poziom 24  
    Nic to nie pomogło. Napięcie na wentylatorze 0.05V.
  • #8 7408636
    gothye
    Poziom 33  
    Ja bym to wykonał tak :




    '-----------------------------------------konfiguracja DS1820 ---------------------------------------------
    Config 1wire = Portd.2                                      'deklaracja portu na którym będą podpięte DS18b20
    Dim I1 As Integer
    Dim Dsid1(8) As Byte
    
    
    'program głowny
    do
       If Timer1 > 5000 Then                                    '[8000000/1024] * 0.65s = ~14000
          Gosub Temp
       End If
    
       If Timer1 = 0 Then
          Gosub Temp_write
       End If
    
       'temperatury i regulacja obrotów
       Select Case I1
          Case 0 To 300 : pwm1a = 0
          Case 300 To 350 : Pwm1a = 120 'itd.....
       End Select
    
    loop
    
    
        '-------------------------------------------------TEMP_WRITE----------------------------------------
    Sub Temp_write
       1wreset
       1wwrite &H55                                             'zapisz ID czujnika DS1820
       1wverify Dsid1(1)                                        'sprawdź , czy układ o podanym ID
    
       1wwrite &HBE
       I1 = 1wread(2)
       1wreset
       1wwrite &HCC
       1wwrite &H44
    Timer1 = 1
    End Sub Temp_write
    '----------------------------------------------------TEMP--------------------------------------------
    Sub Temp
       I1 = I1 * 10                                             '10.5
       I1 = I1 / 16
    
    Timer1 = 0
    End Sub Temp



    obsługa za pomocą timerów czujnika ds ;)

    jesli masz mozliwosc zmien obsługe pwm z timer1 na timer0 ,wentylator nie potrzebuje rozdzielczosci 10bitów
  • #9 7409034
    Mariuszek15
    Poziom 24  
    gothye Warunki u mnie są wszystkie OK. Tylko w tym problem jest, że coś jest z programem który przelicza temperaturę na obroty wentylatora lub sama obsługa DS18B20 jest źle napisana. Ale w innych układach i z taką samą obsługą jak wyżej napisaną działa znakomicie. Tylko w tym programie coś jest nie tak. Właśnie mi zależy, aby układu nie zmieniać.
  • #10 7409089
    gothye
    Poziom 33  
    popatrz jak to wygląda u mnie :

    odczyt :

    I1 = 1wread(2)
    'przeliczanie na C
       I1 = I1 * 10                                        
       I1 = I1 / 16
    
    


    więc wynikiem jest np 200 dla 20.0C

    jako regulacje zastosuj select ponieważ nie musisz robic wielu warunków :

       'temperatury i regulacja obrotów 
       Select Case I1 
          Case 0 To 300 : pwm1a = 0  'dla 30.0C
          Case 300 To 350 : Pwm1a = 120 ' dla 30.0 ... 35.0 C ..itd..... 
       End Select
  • #11 7409117
    Logan
    Poziom 30  
    Jeśli wiesz, że temperatura zawsze będzie dodatnia (np. sterownik ma pracować w komputerze) to odczytaj tylko pierwszy bajt, przesuń w prawo i gotowe.
  • #12 7409191
    Mariuszek15
    Poziom 24  
    Zrobiłem tak:

    Do
    
    Gosub Pomiar
    
    Select Case T1                                              'temperatury i regulacja obrotów
    Case 0 To 200 : Pwm1a = 120                                 'Dla 30.0C
    Case 300 To 350 : Pwm1a = 255                               'Dla 30.0C ... 35.0C
    End Select
    
    Loop
    
    Pomiar:
    
    1wreset                                                   'reset
    1wwrite &HCC                                                'jedna kostka, więc wykorzystujemy rozkaz SKIP ROM
    1wwrite &H44                                                'dokonaj konwersji
    Waitms 750                                                  'Czekaj
    1wreset                                                     'reset
    1wwrite &HCC                                                'rozkaz adresowy SKIP ROM
    1wwrite &HBE                                                'rozkaz funkcyjny - polecenie odczytu DS18B20
    T = 1wread(2)
    T = T * 10
    T1 = T / 16
    
    End


    Dim Odczyt(2) As Byte                                       'Temperatura
    Dim T As Byte
    Dim T1 As Integer
    Dim X As Byte


    Ale nadal nie działa jak powinno :(
  • #13 7409218
    gothye
    Poziom 33  
    sprawdź w samej pętli do ... loop PWM czy działa prawidłow ,ustaw rejestr PWM na 1024 lub 0 w zależności od sposobu sterowania wentylatorem i czy prawidłowo dokonuje sie regulacja
  • #14 7409238
    Logan
    Poziom 30  
    gothye napisał:
    sprawdź w samej pętli do ... loop PWM czy działa prawidłow ,ustaw rejestr PWM na 1024 lub 0 w zależności od sposobu sterowania wentylatorem i czy prawidłowo dokonuje sie regulacja


    Przecież autor postu wyraźnie napisał, że po "recznym" wpisaniu wartości temperatury sterowanie działa.

    :arrow: Mariuszek15 skąd pewność, że komunikacja jest poprawna ?
  • #15 7409256
    Mariuszek15
    Poziom 24  
    Logan Ale warunki działają tylko w tej 1 wersji programu. Teraz z Select Case nie działają warunki.

    Już nawet sam nie wiem czy komunikacja jest poprawna. Program do DS18B20 był setki razy stosowany przeze mnie i temperaturę pokazywał dokładnie np. 25,5*.


    Ok działa :) błąd był w tych liniach:

    Pomiar:

    1wreset                                                     'reset
    1wwrite &HCC                                                'jedna kostka, więc wykorzystujemy rozkaz SKIP ROM
    1wwrite &H44                                                'dokonaj konwersji
    Waitms 750                                                  'Czekaj
    1wreset                                                     'reset
    1wwrite &HCC                                                'rozkaz adresowy SKIP ROM
    1wwrite &HBE                                                'rozkaz funkcyjny - polecenie odczytu DS18B20
    T1 = 1wread(2)
    T1 = T1 * 10
    T1 = T1 / 16
    
    Return
    End


    Praktyka jednak pokazała,że ma być wszędzie T1.

    Logan I gothye Dziękuje ! :)
REKLAMA