Strona 1 z 1

Ustawianie zadanej enkoderem

: 08 gru 2017, 23:22
autor: Jacek
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.
  1.   '******************** Mikrokontroler *******************************************
  2. '$sim
  3. $regfile = "m16adef.dat"                                                        'typ mikrokontrolera
  4. $crystal = 16000000                                                             'częstotliwość taktowania
  5. $hwstack = 32                                                                   'stos sprzętowy
  6. $swstack = 10                                                                   'stos programowy
  7. $framesize = 40                                                                 'wielkość ramki
  8.  
  9. Config Submode = Old
  10.  
  11. '********************************* LCD **************************************
  12. '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
  13. 'Config Lcd = 16 * 4                                                             'typ wyświetlacza LCD
  14. Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5       'mirley UPT M16
  15. Config Lcd = 16 * 4
  16. '********************************** Timer'y ***********************************
  17. 'Config Timer0 = Pwm , Prescale = 1 , Compare  Pwm = Clear Down 'częstotliwość PWM  31.25 kHz
  18. Config Timer0 = Pwm , Prescale = 8 , Compare Pwm = Clear Down                   'częstotliwość PWM 3900 Hz
  19. 'Config Timer0 = Pwm , Prescale = 64 , Compare  Pwm = Clear Down 'częstotliwość PWM 480 Hz
  20. 'Config Timer0 = Pwm , Prescale = 256 , Compare Pwm = Clear Down 'częstotliwość PWM 125 Hz
  21. 'Config Timer0 = Pwm , Prescale = 1024 , Compare Pwm = Clear Down 'częstotliwość PWM 30.5 Hz
  22. Enable Timer0
  23. 'Config Timer1 = Timer , Prescale = 256
  24. 'Enable Timer1 : On Timer1 Przer_timer1                                          '256
  25. Config Timer1 = Timer , Prescale = 256
  26. Enable Timer1 : On Timer1 Prztimer1
  27.  
  28.  
  29.  
  30. Enable Interrupts
  31. Stop Timer0
  32. Deflcdchar 1 , 4 , 10 , 4 , 32 , 32 , 32 , 32 , 32                              'znak stopnia
  33. Deflcdchar 2 , 4 , 4 , 10 , 10 , 10 , 17 , 17 , 31                              ' replace [x] with number (0-7)
  34. '************************************ Przetworniki *****************************
  35. Config Adc = Single , Prescaler = Auto , Reference = Avcc                       'konfiguracja ADC
  36. Stop Adc
  37.  
  38. '******************************** Porty ***************************************
  39. Config Pind.0 = Input                                                           'ustawienie portu jako wejście
  40. Config Pind.1 = Input                                                           'ustawienie portu jako wejście
  41. Set Pind.0 = 1                                                                  'ustawienie portu w stan wysoki
  42. Set Pind.1 = 1                                                                  'ustawienie portu w stan wysoki
  43. Config Pinb.3 = Output                                                          'ustawienie portu jako wyjście
  44. Config Pind.5 = Output                                                          'ustawienie portu jako wyjście
  45. Config Pind.2 = Input                                                           'ustawienie portu jako wejście
  46. Config Pind.3 = Input                                                           'ustawienie portu jako wejście
  47. Set Portd.2                                                                     'ustawienie portu w stan wysoki
  48. Set Portd.3                                                                     'ustawienie portu w stan wysoki
  49. Config Pinb.0 = Input
  50. Config Pinb.7 = Output
  51. Set Portb.7
  52. Portd = 255
  53. '*********************** Aliasy ***********************************************
  54. Start_ Alias Pind.0
  55. Stop_ Alias Pind.1
  56.  '********************* Deklaracje *********************************************
  57. Declare Sub Start_timer1
  58. Declare Sub Stop_timer1
  59. Declare Sub Pomiar
  60. Declare Sub Wyswietl
  61. 'Declare Sub Impulsator
  62. '********************* Zmienne ***********************************************
  63. Dim Tryb As Byte , Rezultat As Integer
  64. Dim Zmienna As Word
  65. Dim Zmienna1 As Byte
  66. Dim Enc As Byte
  67. Dim W As Word
  68. Dim Z As Word
  69. Dim A As Long
  70. Dim Perc As Long
  71. Dim Zal As Bit
  72. Dim B1 As Byte
  73. Dim B2 As Byte
  74. Dim R As Byte
  75. Dim Znak1 As String * 1
  76. Dim T1 As Single
  77. Dim T2 As Single
  78. Dim Tmp1 As String * 6
  79. Dim Temp_zad As Byte                                                            'Long                                                                   'zmienna odczytu z enkodera lewy wskaźnik
  80. Dim F As Long                                                                   'zmienna odczytu z enkodera prawy wskaźnik
  81. Dim Dzielnik(2) As Byte                                                         'dzielniki timera
  82. Dim Flaga_4ms As Bit , Flaga_500ms As Bit , Flaga_1s As Bit                     'flagi przerwa?
  83. '********************** Początek **********************************************
  84. Cls
  85. Cursor Off
  86. Locate 1 , 1
  87. Lcd "TEST STEROWANIA"
  88. Locate 2 , 3
  89. Lcd "PWM GRZALEK"
  90. Locate 3 , 3
  91. Lcd "SQ2EER 2017"
  92. Wait 2
  93. Cls
  94. Locate 1 , 1                                                                    'Locate 4 , 1
  95. Lcd "TIMER0 OFF      "
  96. Locate 2 , 1                                                                    'Locate 2 , 1                                         'lokalizacja wyświetlania zmiennej PWM
  97. Lcd "PWM  :" ; Perc ; "%  "
  98. Locate 3 , 1
  99. Lcd "TEMP:" ; Znak1 ; Tmp1 ; Chr(1) ; "C  "
  100. Locate 4 , 1
  101. Lcd "ZAD:" ; Zmienna ; Chr(1) ; "C "
  102. Set Portb.3
  103. Z = 0
  104. Temp_zad = 0
  105. F = 0
  106. Zal = 0
  107. Zmienna = 0
  108. Wait 2
  109. Call Wyswietl
  110. Do
  111.   '***********************************************   co 4ms
  112.    If Flaga_4ms = 1 Then
  113.       Flaga_4ms = 0
  114.       Call Wyswietl
  115.       Gosub Impulsator
  116.    End If
  117. '***********************************************
  118.  
  119. '***********************************************   co 500ms
  120.    If Flaga_500ms = 1 Then
  121.       Flaga_500ms = 0
  122.    End If
  123. '***********************************************
  124.  
  125. '***********************************************   co 1s
  126.    If Flaga_1s = 1 Then
  127.       Flaga_1s = 0
  128.       'Call Impulsator
  129.  
  130.  
  131.    End If
  132. '***********************************************
  133.    Gosub Impulsator
  134.  
  135.    If Rezultat <> 0 Then
  136.       Zmienna = Zmienna + Rezultat
  137.       Locate 4 , 1
  138.       Lcd "ZAD:" ; Zmienna ; Chr(1) ; "C "
  139.       'Zmienna1 = Zmienna / 10
  140.       'Locate 2 , 11 : Lcd Zmienna ; "     "
  141.       Rezultat = 0
  142.    End If
  143.  
  144.    Call Pomiar
  145.    If Start_ = 0 Then                                                           'skok do podprogramu załączaenia Timer0 , załaczenie ADC
  146.       Gosub Start_timer1
  147.    End If
  148.  
  149.    If Stop_ = 0 Then                                                            'skok do podprogramu wyłączenia Timer0 , wyłączenie ADC
  150.       Call Stop_timer1
  151.    End If
  152.  
  153.  
  154.    If Zal = 1 Then                                                              'sprawdzenie czy zmienna Zal ma wartość 1 aby pobrać wartość ADC
  155.       Z = Getadc(0)                                                             'pobieraie wartości ADC
  156.       A = Z * 100
  157.       Shift Z , Right , 2
  158.       If W <> Z Then
  159.          W = Z                                                                  'zamiana z 10 bitowej na 8 bitową wartość
  160.          Pwm0 = W                                                               'wpisanie warotści zmiennej W do Pwm1a
  161.          Perc = A / 1023                                                        'dzielenie uzyskanej wartości ADC pomnożonej przez 100 w celu uzyskania wyniku od 0 do 100
  162.          Locate 2 , 1                                                           'Locate 2 , 1                                         'lokalizacja wyświetlania zmiennej PWM
  163.          Lcd "PWM  :" ; Perc ; "%  "                                            'pokazuje na LCD PWM w % od 0 do 100
  164.          Pwm0 = W
  165.  
  166.          Call Wyswietl
  167.       End If
  168.    End If
  169.  
  170.  
  171.  
  172.  
  173.  
  174.  
  175. Loop
  176. End
  177.  
  178. Sub Start_timer1                                                                'podprogram załączenia Timer0 , ADC
  179.    Portd.2 = 0
  180.    Zal = 1
  181.    Start Timer0
  182.    Start Adc
  183.  
  184.    Locate 1 , 1                                                                 'Locate 4 , 1
  185.    Lcd "TIMER0 ON        "
  186. End Sub
  187.  
  188. Sub Stop_timer1                                                                 'podprogram wyłączenia Timer0 , ADC , zerowanie zmienych dla LCD
  189.    Zal = 0
  190.    Disable Adc
  191.    Stop Timer1
  192.    Pwm1b = 0
  193.    Z = 0
  194.    A = 0
  195.    Perc = 0
  196.    Locate 1 , 1
  197.    Lcd "TIMER0 OFF      "
  198.    Set Portd.2
  199.    Set Portb.3
  200.  
  201.    If W <> Z Then
  202.       W = Z                                                                     'zamiana z 10 bitowej na 8 bitową wartość
  203.       Pwm1a = W                                                                 'wpisanie warotści zmiennej W do Pwm1a
  204.  
  205.       Perc = A / 1023                                                           'dzielenie uzyskanej wartości ADC pomnożonej przez 100 w celu uzyskania wyniku od 0 do 100
  206.       Call Wyswietl
  207.    End If
  208. End Sub
  209.  
  210.  
  211. Sub Pomiar
  212. '------------------------------------------------------------------------
  213. '-----------------czujnik DS18B20----------------------------------------
  214.    Config 1wire = Pinb.0                                                        'konfiguracja maistrali 1wire
  215.    1wreset
  216.                                                         'podprogram 1wr
  217.    1wwrite &HCC                                                                 'komenda skip ROM
  218.    1wwrite &H44                                                                 'komenda convert T
  219.  
  220.    1wreset                                                                      'podprogram 1wr
  221.    1wwrite &HCC                                                                 'komenda skip ROM
  222.    1wwrite &HBE                                                                 'komenda read
  223.  
  224.    B1 = 1wread()                                                                'odczyt z czujnika 1
  225.    B2 = 1wread()
  226.  
  227.                                                       'podprogram 1wr
  228.  
  229.    If B1 >= 248 Then                                                            'jesli temperatura ujemna
  230.       B1 = R - B1                                                               'od 255 odejmujemy B1a
  231.       B2 = R - B2                                                               'od 255 odejmujemy B2a
  232.       Znak1 = "-"
  233.    Else
  234.       Znak1 = "+"
  235.    End If
  236.    T1 = B1 / 16                                                                 'przesunięcie w prawo o 4 bajty
  237.    T2 = B2 * 16                                                                 'przesunięcie w lewo o 4 bajty
  238.    T1 = T1 + T2
  239.  
  240.    Tmp1 = Fusing(t1 , "###.&")
  241.    Locate 3 , 1
  242.    Lcd "TEMP:" ; Znak1 ; Tmp1 ; Chr(1) ; "C  "
  243. End Sub
  244. Sub Wyswietl
  245.  
  246.    Locate 2 , 1
  247.    Lcd "PWM  :" ; Perc ; "%  "                                                  'pokazuje na LCD PWM w % od 0 do 100
  248.    Locate 3 , 1
  249.    Lcd "TEMP:" ; Znak1 ; Tmp1 ; Chr(1) ; "C  "
  250.    Pwm0 = W
  251.  
  252.  
  253.  
  254. End Sub
  255.  
  256. Prztimer1:
  257.    Timer1 = 3036
  258.    Set Flaga_4ms
  259.    Incr Dzielnik(1)
  260.    If Dzielnik(1) = 125 Then                                                    '125
  261.       Dzielnik(1) = 0
  262.       Set Flaga_500ms
  263.       Incr Dzielnik(2)
  264.       If Dzielnik(2) = 2 Then
  265.          Dzielnik(2) = 0
  266.          Set Flaga_1s
  267.       End If
  268.    End If
  269. Return
  270.  
  271.  
  272.  
  273.  
  274. Impulsator:
  275.  
  276.    Enc.0 = Pind.2
  277.    Enc.1 = Pind.3
  278.    Rezultat = 0
  279.    Select Case Tryb
  280.       Case 0:
  281.          If Enc = 3 Then Incr Tryb                                              'jeżeli dwa rozwarte
  282.       Case 1:
  283.          If Enc = 2 Then Tryb = 2
  284.          If Enc = 1 Then Tryb = 3
  285.       Case 2:
  286.          If Enc = 1 Then
  287.             Rezultat = 1
  288.             Tryb = 0
  289.          End If
  290.       Case 3:
  291.          If Enc = 2 Then
  292.             Rezultat = -1
  293.             Tryb = 0
  294.          End If
  295.    End Select
  296.  
  297. Return

Re: Ustawianie zadanej enkoderem

: 09 gru 2017, 3:17
autor: niveasoft
Jaki to enkoder? Zauważyłem, że masz to na pinach PD2 i PD3 to nawet możesz to zrobić na przerwaniach.

Re: Ustawianie zadanej enkoderem

: 09 gru 2017, 10:09
autor: Jacek
Witam - do testowania mam trzy rodzaje enkoderów:
enkoder3.jpg
enkoder2.jpg
enkoder1.jpg
za przycisk enkodera na razie robi przycisk na płytce testowej.

pozdrawiam Jacek.
P.S. znalazłem również enkoder Copal RMs20-250.

Re: Ustawianie zadanej enkoderem

: 10 gru 2017, 20:59
autor: Jacek
Przepraszam za post pod postem - Bartku znalazłem Twój kod obsługi enkodera - dopisałem w niej 3 linijki ale zamiast cyfry 5 na lcd wskakuje również 6 jeżeli dalej kręcę enkoderem załączam Twój kod z tym co dopisałem.
  1. $regfile = "m16adef.dat"                                                        '$regfile = "m8def.dat"
  2. $crystal = 16000000                                                             '$crystal = 8000000
  3.  '************************************************
  4. 'KONFIGURACJA LCD
  5. Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5       'mirley UPT M16
  6. Config Lcd = 16 * 4
  7. '************************************************
  8. Cursor Off Noblink
  9. Cls
  10.  
  11. Portd = 255
  12.  
  13. Dim In1 As Bit , In2 As Bit
  14. Dim Tryb As Byte , Rezultat As Integer
  15. Dim Zmienna As Word
  16.  
  17. Enable Interrupts
  18.  
  19. Lcd "Licznik:"
  20.  
  21. Do
  22.  
  23.    Gosub Impulsator
  24.  
  25.    If Rezultat <> 0 Then
  26.       Zmienna = Zmienna + Rezultat
  27.       Locate 1 , 10 : Lcd Zmienna ; "     "
  28.       Rezultat = 0
  29.    '-----------------------      to dopisałem
  30.       If Zmienna => 5 Then
  31.          Zmienna = 5
  32.       End If
  33.    '------------------------   to dopisłem
  34.    End If
  35.  
  36. Loop
  37. End
  38.  
  39. '-------------- sub enkodera 1 -----------
  40. Impulsator:
  41.    In1 = Pind.3
  42.    In2 = Pind.2
  43.    Rezultat = 0
  44.    Select Case Tryb
  45.       Case 0:
  46.          If In1 = 1 And In2 = 1 Then Incr Tryb                    'jezeli dwa rozwarte
  47.       Case 1:
  48.          If In1 = 1 And In2 = 0 Then Tryb = 2
  49.          If In1 = 0 And In2 = 1 Then Tryb = 3
  50.       Case 2:
  51.          If In1 = 0 And In2 = 1 Then
  52.             Rezultat = 1
  53.             Tryb = 0
  54.          End If
  55.       Case 3:
  56.          If In1 = 1 And In2 = 0 Then
  57.             Rezultat = -1
  58.             Tryb = 0
  59.          End If
  60.    End Select
  61.    Waitus 100
  62. Return
oprócz tego jeżeli zmniejszam zmienną kręcąc w lewo to po 0 wskakuje 65535.
jak to doprowadzić do prawidłowego liczenia i wyświetlania?

pozdrawiam Jacek.

Re: Ustawianie zadanej enkoderem

: 10 gru 2017, 21:05
autor: niveasoft
To chyba oczywiste. Zastanów się. Trzeba zmienną "ukrócić" przed wyświetleniem.
Nie napisałeś tylko jaki chcesz uzyskać efekt w lewo i w prawo.

Poniżej poprawiłem tylko co nieco
  1. If Rezultat <> 0 Then
  2.       Zmienna = Zmienna + Rezultat
  3.        '-----------------------      zmieniłem kolejnośc
  4.       If Zmienna => 5 Then
  5.          Zmienna = 5
  6.       End If
  7.    '------------------------  
  8.       Locate 1 , 10 : Lcd Zmienna ; "     "
  9.       Rezultat = 0
  10.  
  11.    End If

Re: Ustawianie zadanej enkoderem

: 10 gru 2017, 22:11
autor: Jacek
Ano - właśnie myślałem że te 3 linijki "ukrócą" zmienną - chciałem to wykorzystać do przełączania menu - wartość zmiennej była by pozycją w menu.
pozdrawiam Jacek.