Ustawianie zadanej enkoderem
: 08 gru 2017, 23:22
Witam - buduje testowy regulator PWM do sterowania grzałką, chciałbym ustawiać zadaną temperaturę enkoderem po wciśnięciu przycisku i przytrzymaniu powiedzmy 5 sekund - nie mogę sobie poradzić z tym tematem wstawiłem do swojego programu na próbę obsługę enkodera który na swojej stronie umieścił Bartek.
Niestety zmiana enkoderem zmiennej nie idzie płynnie lecz skokowo nie wiem jak to zrobić - proszę o pomoc.
Kod dotychczasowy wygląda tak:
Załączanie wyłączanie Timera odpowiedzialnego za PWM działa dobrze, regulacja potencjometrem PWM również, odczyt temperatury działa dobrze.
pozdrawiam Jacek.
Niestety zmiana enkoderem zmiennej nie idzie płynnie lecz skokowo nie wiem jak to zrobić - proszę o pomoc.
Kod dotychczasowy wygląda tak:
Załączanie wyłączanie Timera odpowiedzialnego za PWM działa dobrze, regulacja potencjometrem PWM również, odczyt temperatury działa dobrze.
pozdrawiam Jacek.
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- '******************** Mikrokontroler *******************************************
- '$sim
- $regfile = "m16adef.dat" 'typ mikrokontrolera
- $crystal = 16000000 'częstotliwość taktowania
- $hwstack = 32 'stos sprzętowy
- $swstack = 10 'stos programowy
- $framesize = 40 'wielkość ramki
- Config Submode = Old
- '********************************* LCD **************************************
- 'Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.3 , Rs = Portc.2 'konfiguracja wyświetlacza LCD
- 'Config Lcd = 16 * 4 'typ wyświetlacza LCD
- 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 * 4
- '********************************** Timer'y ***********************************
- 'Config Timer0 = Pwm , Prescale = 1 , Compare Pwm = Clear Down 'częstotliwość PWM 31.25 kHz
- Config Timer0 = Pwm , Prescale = 8 , Compare Pwm = Clear Down 'częstotliwość PWM 3900 Hz
- 'Config Timer0 = Pwm , Prescale = 64 , Compare Pwm = Clear Down 'częstotliwość PWM 480 Hz
- 'Config Timer0 = Pwm , Prescale = 256 , Compare Pwm = Clear Down 'częstotliwość PWM 125 Hz
- 'Config Timer0 = Pwm , Prescale = 1024 , Compare Pwm = Clear Down 'częstotliwość PWM 30.5 Hz
- Enable Timer0
- 'Config Timer1 = Timer , Prescale = 256
- 'Enable Timer1 : On Timer1 Przer_timer1 '256
- Config Timer1 = Timer , Prescale = 256
- Enable Timer1 : On Timer1 Prztimer1
- Enable Interrupts
- Stop Timer0
- Deflcdchar 1 , 4 , 10 , 4 , 32 , 32 , 32 , 32 , 32 'znak stopnia
- Deflcdchar 2 , 4 , 4 , 10 , 10 , 10 , 17 , 17 , 31 ' replace [x] with number (0-7)
- '************************************ Przetworniki *****************************
- Config Adc = Single , Prescaler = Auto , Reference = Avcc 'konfiguracja ADC
- Stop Adc
- '******************************** Porty ***************************************
- Config Pind.0 = Input 'ustawienie portu jako wejście
- Config Pind.1 = Input 'ustawienie portu jako wejście
- Set Pind.0 = 1 'ustawienie portu w stan wysoki
- Set Pind.1 = 1 'ustawienie portu w stan wysoki
- Config Pinb.3 = Output 'ustawienie portu jako wyjście
- Config Pind.5 = Output 'ustawienie portu jako wyjście
- Config Pind.2 = Input 'ustawienie portu jako wejście
- Config Pind.3 = Input 'ustawienie portu jako wejście
- Set Portd.2 'ustawienie portu w stan wysoki
- Set Portd.3 'ustawienie portu w stan wysoki
- Config Pinb.0 = Input
- Config Pinb.7 = Output
- Set Portb.7
- Portd = 255
- '*********************** Aliasy ***********************************************
- Start_ Alias Pind.0
- Stop_ Alias Pind.1
- '********************* Deklaracje *********************************************
- Declare Sub Start_timer1
- Declare Sub Stop_timer1
- Declare Sub Pomiar
- Declare Sub Wyswietl
- 'Declare Sub Impulsator
- '********************* Zmienne ***********************************************
- Dim Tryb As Byte , Rezultat As Integer
- Dim Zmienna As Word
- Dim Zmienna1 As Byte
- Dim Enc As Byte
- Dim W As Word
- Dim Z As Word
- Dim A As Long
- Dim Perc As Long
- Dim Zal As Bit
- Dim B1 As Byte
- Dim B2 As Byte
- Dim R As Byte
- Dim Znak1 As String * 1
- Dim T1 As Single
- Dim T2 As Single
- Dim Tmp1 As String * 6
- Dim Temp_zad As Byte 'Long 'zmienna odczytu z enkodera lewy wskaźnik
- Dim F As Long 'zmienna odczytu z enkodera prawy wskaźnik
- Dim Dzielnik(2) As Byte 'dzielniki timera
- Dim Flaga_4ms As Bit , Flaga_500ms As Bit , Flaga_1s As Bit 'flagi przerwa?
- '********************** Początek **********************************************
- Cls
- Cursor Off
- Locate 1 , 1
- Lcd "TEST STEROWANIA"
- Locate 2 , 3
- Lcd "PWM GRZALEK"
- Locate 3 , 3
- Lcd "SQ2EER 2017"
- Wait 2
- Cls
- Locate 1 , 1 'Locate 4 , 1
- Lcd "TIMER0 OFF "
- Locate 2 , 1 'Locate 2 , 1 'lokalizacja wyświetlania zmiennej PWM
- Lcd "PWM :" ; Perc ; "% "
- Locate 3 , 1
- Lcd "TEMP:" ; Znak1 ; Tmp1 ; Chr(1) ; "C "
- Locate 4 , 1
- Lcd "ZAD:" ; Zmienna ; Chr(1) ; "C "
- Set Portb.3
- Z = 0
- Temp_zad = 0
- F = 0
- Zal = 0
- Zmienna = 0
- Wait 2
- Call Wyswietl
- Do
- '*********************************************** co 4ms
- If Flaga_4ms = 1 Then
- Flaga_4ms = 0
- Call Wyswietl
- Gosub Impulsator
- End If
- '***********************************************
- '*********************************************** co 500ms
- If Flaga_500ms = 1 Then
- Flaga_500ms = 0
- End If
- '***********************************************
- '*********************************************** co 1s
- If Flaga_1s = 1 Then
- Flaga_1s = 0
- 'Call Impulsator
- End If
- '***********************************************
- Gosub Impulsator
- If Rezultat <> 0 Then
- Zmienna = Zmienna + Rezultat
- Locate 4 , 1
- Lcd "ZAD:" ; Zmienna ; Chr(1) ; "C "
- 'Zmienna1 = Zmienna / 10
- 'Locate 2 , 11 : Lcd Zmienna ; " "
- Rezultat = 0
- End If
- Call Pomiar
- If Start_ = 0 Then 'skok do podprogramu załączaenia Timer0 , załaczenie ADC
- Gosub Start_timer1
- End If
- If Stop_ = 0 Then 'skok do podprogramu wyłączenia Timer0 , wyłączenie ADC
- Call Stop_timer1
- End If
- If Zal = 1 Then 'sprawdzenie czy zmienna Zal ma wartość 1 aby pobrać wartość ADC
- Z = Getadc(0) 'pobieraie wartości ADC
- A = Z * 100
- Shift Z , Right , 2
- If W <> Z Then
- W = Z 'zamiana z 10 bitowej na 8 bitową wartość
- Pwm0 = W 'wpisanie warotści zmiennej W do Pwm1a
- Perc = A / 1023 'dzielenie uzyskanej wartości ADC pomnożonej przez 100 w celu uzyskania wyniku od 0 do 100
- Locate 2 , 1 'Locate 2 , 1 'lokalizacja wyświetlania zmiennej PWM
- Lcd "PWM :" ; Perc ; "% " 'pokazuje na LCD PWM w % od 0 do 100
- Pwm0 = W
- Call Wyswietl
- End If
- End If
- Loop
- End
- Sub Start_timer1 'podprogram załączenia Timer0 , ADC
- Portd.2 = 0
- Zal = 1
- Start Timer0
- Start Adc
- Locate 1 , 1 'Locate 4 , 1
- Lcd "TIMER0 ON "
- End Sub
- Sub Stop_timer1 'podprogram wyłączenia Timer0 , ADC , zerowanie zmienych dla LCD
- Zal = 0
- Disable Adc
- Stop Timer1
- Pwm1b = 0
- Z = 0
- A = 0
- Perc = 0
- Locate 1 , 1
- Lcd "TIMER0 OFF "
- Set Portd.2
- Set Portb.3
- If W <> Z Then
- W = Z 'zamiana z 10 bitowej na 8 bitową wartość
- Pwm1a = W 'wpisanie warotści zmiennej W do Pwm1a
- Perc = A / 1023 'dzielenie uzyskanej wartości ADC pomnożonej przez 100 w celu uzyskania wyniku od 0 do 100
- Call Wyswietl
- End If
- End Sub
- Sub Pomiar
- '------------------------------------------------------------------------
- '-----------------czujnik DS18B20----------------------------------------
- Config 1wire = Pinb.0 'konfiguracja maistrali 1wire
- 1wreset
- 'podprogram 1wr
- 1wwrite &HCC 'komenda skip ROM
- 1wwrite &H44 'komenda convert T
- 1wreset 'podprogram 1wr
- 1wwrite &HCC 'komenda skip ROM
- 1wwrite &HBE 'komenda read
- B1 = 1wread() 'odczyt z czujnika 1
- B2 = 1wread()
- 'podprogram 1wr
- If B1 >= 248 Then 'jesli temperatura ujemna
- B1 = R - B1 'od 255 odejmujemy B1a
- B2 = R - B2 'od 255 odejmujemy B2a
- Znak1 = "-"
- Else
- Znak1 = "+"
- End If
- T1 = B1 / 16 'przesunięcie w prawo o 4 bajty
- T2 = B2 * 16 'przesunięcie w lewo o 4 bajty
- T1 = T1 + T2
- Tmp1 = Fusing(t1 , "###.&")
- Locate 3 , 1
- Lcd "TEMP:" ; Znak1 ; Tmp1 ; Chr(1) ; "C "
- End Sub
- Sub Wyswietl
- Locate 2 , 1
- Lcd "PWM :" ; Perc ; "% " 'pokazuje na LCD PWM w % od 0 do 100
- Locate 3 , 1
- Lcd "TEMP:" ; Znak1 ; Tmp1 ; Chr(1) ; "C "
- Pwm0 = W
- End Sub
- Prztimer1:
- Timer1 = 3036
- Set Flaga_4ms
- Incr Dzielnik(1)
- If Dzielnik(1) = 125 Then '125
- 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
- Impulsator:
- Enc.0 = Pind.2
- Enc.1 = Pind.3
- Rezultat = 0
- Select Case Tryb
- Case 0:
- If Enc = 3 Then Incr Tryb 'jeżeli dwa rozwarte
- Case 1:
- If Enc = 2 Then Tryb = 2
- If Enc = 1 Then Tryb = 3
- Case 2:
- If Enc = 1 Then
- Rezultat = 1
- Tryb = 0
- End If
- Case 3:
- If Enc = 2 Then
- Rezultat = -1
- Tryb = 0
- End If
- End Select
- Return