Enkoder w Xmega
- Jacek
- Posty: 384
- Rejestracja: 25 kwie 2016, 19:14
Enkoder w Xmega
Witam - wiem że wszyscy są zajęci ale jak ustawić system zdarzeń aby xmega odczytywała i zliczała impulsy w lewo i w prawo mogę prosić o wyjaśnienie?
pozdrawiam Jacek.
pozdrawiam Jacek.
-
- Posty: 65
- Rejestracja: 21 sty 2018, 23:08
Re: Xmega sprzętowa obsługa enkodera -to takie proste
Nie bardzo rozumiem.
Dawno się tym bawiłem, ale działa to mniej więcej tak.
Sprzętowo wykrywany jest ruch i w zależności od kierunku obrotu licznik sprzętowy jest zwiększany lub zmniejszany.
W programie porównujesz wartość licznika z wartością zapamiętaną wcześniej i z tej różnicy wychodzi o ile impulsów i w jakim kierunku został wykonany obrót. Jeśli nie chcesz sprawdzać licznika w interwałach, to ustaw przerwanie na jednym lub obu pinach od enkodera.
Dawno się tym bawiłem, ale działa to mniej więcej tak.
Sprzętowo wykrywany jest ruch i w zależności od kierunku obrotu licznik sprzętowy jest zwiększany lub zmniejszany.
W programie porównujesz wartość licznika z wartością zapamiętaną wcześniej i z tej różnicy wychodzi o ile impulsów i w jakim kierunku został wykonany obrót. Jeśli nie chcesz sprawdzać licznika w interwałach, to ustaw przerwanie na jednym lub obu pinach od enkodera.
- Jacek
- Posty: 384
- Rejestracja: 25 kwie 2016, 19:14
Re: Xmega sprzętowa obsługa enkodera -to takie proste
Witam - tak tylko ja nie wiem jak to ustawić w xmedze jeżeli mogę prosić o jakiś przykład byłbym zobowiązany.
pozdrawiam Jacek.
pozdrawiam Jacek.
- niveasoft
- Posty: 1216
- Rejestracja: 17 sie 2015, 12:13
- Kontakt:
Re: Xmega sprzętowa obsługa enkodera -to takie proste
To można, jak zawsze, rozwiązać na wiele sposobów.
Problemem jest to, że ten szesnastobitowy timer, jak kręcisz w lewo to przeskoczy z 0 na 65535.
Nie wiem ile kroków potrzebujesz tam w tokarce. Gdyby wystarczyło 32768 to mógłbyś po starcie Xmegi wpisać do Timera taka wartość. Wtedy timer będzie w lewo zjeżdżał do zera a w prawo liczył w górę do 65535. Potem proste porównanie poprzedniego odczytu i wiesz co się dzieje.
Poniżej masz trochę inne rozwiązanie. Przy przejściu przez zero sprawdza czy następny odczyt to 1->prawo czy 65535->lewo. Tu jednak można zgubić jakiś impuls jak w programie będziesz miał więcej kodu, ale ustawia zmienną Steps od -32767 do +32768. Jeśli więc widzisz np. -5 to silnik powinien zrobić pięć kroków w lewo i za każdym razem dodać jeden krok. Widzisz +5 to robisz pięć kroków w prawo za każdym razem odejmując od zmiennej Steps jeden. Silnik zawsze ma pilnować by Steps=0
Sprawdź bo nie bardzo mam czas to wszystko połączyć. Może trzeba pomyśleć nad innym rozwiązaniem...jeszcze nie wiem.
Problemem jest to, że ten szesnastobitowy timer, jak kręcisz w lewo to przeskoczy z 0 na 65535.
Nie wiem ile kroków potrzebujesz tam w tokarce. Gdyby wystarczyło 32768 to mógłbyś po starcie Xmegi wpisać do Timera taka wartość. Wtedy timer będzie w lewo zjeżdżał do zera a w prawo liczył w górę do 65535. Potem proste porównanie poprzedniego odczytu i wiesz co się dzieje.
Poniżej masz trochę inne rozwiązanie. Przy przejściu przez zero sprawdza czy następny odczyt to 1->prawo czy 65535->lewo. Tu jednak można zgubić jakiś impuls jak w programie będziesz miał więcej kodu, ale ustawia zmienną Steps od -32767 do +32768. Jeśli więc widzisz np. -5 to silnik powinien zrobić pięć kroków w lewo i za każdym razem dodać jeden krok. Widzisz +5 to robisz pięć kroków w prawo za każdym razem odejmując od zmiennej Steps jeden. Silnik zawsze ma pilnować by Steps=0
Sprawdź bo nie bardzo mam czas to wszystko połączyć. Może trzeba pomyśleć nad innym rozwiązaniem...jeszcze nie wiem.
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- '***********************************************************************
- $regfile = "xm128a3udef.dat"
- $crystal = 32000000
- $hwstack = 64
- $swstack = 64
- $framesize = 64
- 'Enable The Osc
- Config Osc = Enabled , 32mhzosc = Enabled
- ' ***************** SYSTEM CLOCK CONFIG ********************************
- ' INTERNAL 32MHz NO PRESCALE
- '
- Config Osc = Disabled , 32mhzosc = Enabled , 32khzosc = Enabled
- Config Sysclock = 32mhz , Prescalea = 1 , Prescalebc = 1_1
- '
- 'ENABLING AUTOMATIC OSCILLATOR CALIBRATION
- Osc_dfllctrl.0 = 1
- Dfllrc32m_ctrl.0 = 1
- '
- '***********************************************************************
- Config Priority = Static , Vector = Application , Lo = Enabled 'Enable Lo Level Interrupts
- '***********************************************************************
- '*******************Xmega 128A3U***********************
- '* UART *********** TX pin * RX pin *
- '* ****************************************************
- '* COM1 - UART_C0 * PORTC.3 * PORTC.2 *
- '******************************************************
- '* COM2 - UART_C1 * PORTC.7 * PORTC.6 *
- '******************************************************
- '* COM3 - UART_D0 * PORTD.3 * PORTD.2 *
- '******************************************************
- '* COM4 - UART_D1 * PORTD.7 * PORTD.6 *
- '******************************************************
- '* COM5 - UART_E0 * PORTE.3 * PORTE.2 *
- '******************************************************
- '* COM6 - UART_E1 * PORTE.7 * PORTE.6 *
- '******************************************************
- '* COM7 - UART_F0 * PORTF.3 * PORTF.2 *
- '******************************************************
- '* COM8 - UART_F1 * PORTF.7 * PORTF.6 *
- '******************************************************
- '***********************************************************************
- Dim Buart_channel As Byte '0 = COM1 ...... 7 = COM8
- Config Com3 = 115200 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8 'COM3 - UART_D0 PORTD.3 PORTD.2
- Config Com1 = 115200 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8 'COM1 - UART_C0 PORTC.3 PORTC.2
- Buart_channel = 2
- 'Print #buart_channel , "This use COM3" 'print current Uart
- 'Print #buart_channel , "MCU Rev. = " ; Mcu_revid 'version of the MCU
- Print #buart_channel , ""
- Print #buart_channel , "Started "
- '***********************************************************************
- Dim Encoder_tmp As Word , Encoder_prev As Word 'zmienna dla enkodera
- Dim Steps As Integer
- Enable Interrupts 'włacz przerwania globalne
- '***********************************************************************
- 'config pinA.2 = input 'index pin of the encoder
- Config Pina.1 = Input 'enkoder B
- Config Pina.0 = Input 'enkoder A
- 'Config Xpin = PinA.2 , Outpull = pullup , Sense = low_level
- Config Xpin = Porta.1 , Outpull = Pullup , Sense = Low_level 'enable Pull up and reaction on low level
- Config Xpin = Porta.0 , Outpull = Pullup , Sense = Low_level
- 'konfigurujemy system zdarzeń
- Config Event_system = Dummy , Mux0 = Porta.0 , Qd0 = Enabled , Digflt0 = 4
- 'konfiguracja systemu zdarzeń multiplexer kanał 0 , portA.0, obsługa enkodera QDO właczona, filtr cyfrowy 8
- 'gdy używamy idndexu musimy dodać QDIO=enabled
- 'config Event_system = Dummy , Mux0 = portA.0 , QD0 = enabled , QDI0 = enabled , Digflt0 = 8
- '***********************************************************************
- Config Tcd0 = Normal , Prescale = E0 , Event_source = E0 , Event_action = Qdec
- 'konfiguracja timera TCD0 normal= bez generowania sygnałów, preskaler =e0, zródło zdarzenia=podajemy zródło czyli event system
- 'kanał 0 , event action =czyli reakcja na zdarzenie QDEC właczenie obsługi enkodera
- '***********************************************************************
- Do
- Encoder_tmp = Tcd0_cnt
- If Encoder_prev <> Encoder_tmp Then 'jesli zawartosc timera TCD0 jest różna od naszej zmiennej to
- Select Case Encoder_prev
- Case 0
- If Encoder_tmp = 1 Then Incr Steps Else Decr Steps
- Case Else
- Select Case Encoder_tmp
- Case Is < Encoder_prev : Decr Steps
- Case Is > Encoder_prev : Incr Steps
- End Select
- End Select
- Encoder_prev = Encoder_tmp
- Print #buart_channel , Steps 'wyśli przez port szeregowy 2 (zmienna buart=2)
- End If
- 'na ekranie termianla zobaczymy liczbe impulsów policzonych przez nasz timer.
- 'na jeden przeskok enkodera przypadaja 4 impulsy
- 'to możesz robić z inną częstotliwością
- If 50ms = 1 Then
- 50ms = 0
- If Motor_step_pin = 1 Then
- Reset Motor_step_pin
- Else
- Select Case Steps
- Case Is < 0
- Incr Steps
- 'Call Ustaw_kierunek_l
- Set Motor_step_pin
- Case Is > 0
- Decr Steps
- 'Call Ustaw_kierunek_r
- Set Motor_step_pin
- End Select
- End If
- End If
- Loop
- End 'end program
- Pikczu
- Posty: 390
- Rejestracja: 17 sie 2015, 13:46
- Lokalizacja: Dublin, Ireland
- Kontakt:
Re: Xmega sprzętowa obsługa enkodera -to takie proste
Od tego jest bit kierunku o nazwie DIR o który Jacek enigmatycznie pytał w innym wątku i dostał odwiedź
viewtopic.php?f=18&t=354#p2883
Zmieniając bit będzie zawsze liczyło w w wybranym kierunku niezależenie od prawdziwego kierunku obrotu.
viewtopic.php?f=18&t=354#p2883
Zmieniając bit będzie zawsze liczyło w w wybranym kierunku niezależenie od prawdziwego kierunku obrotu.
- niveasoft
- Posty: 1216
- Rejestracja: 17 sie 2015, 12:13
- Kontakt:
Re: Xmega sprzętowa obsługa enkodera -to takie proste
Tak, ale co to wniesie do sprawy? Ten bit jest chyba tylko po to żeby nie trzeba było zamieniać miejscami wyjść enkodera A i B.
To ja mam informować Megę tym bitem, że będę kręcił w lewo czy ona ma to wyczaić sama?
Osobiście to bym w przerwaniu ustawiał zmienną Steps a w obsłudze jakiegoś Timera te Steps odejmował i rozpędzał/hamował rampę.
To ja mam informować Megę tym bitem, że będę kręcił w lewo czy ona ma to wyczaić sama?
Osobiście to bym w przerwaniu ustawiał zmienną Steps a w obsłudze jakiegoś Timera te Steps odejmował i rozpędzał/hamował rampę.
- Pikczu
- Posty: 390
- Rejestracja: 17 sie 2015, 13:46
- Lokalizacja: Dublin, Ireland
- Kontakt:
Re: Xmega sprzętowa obsługa enkodera -to takie proste
XMega sama ustawia ten bit ale można go zmienić ręcznie.
Z tego co zrozumiałem Jackowi chodzi o to żeby mu zawsze liczyło w górę nie zależnie czy kreci w lewo czy prawo.
Z tego co zrozumiałem Jackowi chodzi o to żeby mu zawsze liczyło w górę nie zależnie czy kreci w lewo czy prawo.
- Jacek
- Posty: 384
- Rejestracja: 25 kwie 2016, 19:14
Re: Xmega sprzętowa obsługa enkodera -to takie proste
Witam - dziękuje Bartku za procedure działa tak jak powinno - zmieniłem 50ms na 10ms silnik kręci raz w lewo raz w prawo co prawda wolno ale kręci wolniej jak ja kręcę enkoderem ale to już duży postęp. Paweł jak wiesz nie umiem tak jak Ty, Bartek pisać programów i procedur - bez waszej pomocy po prostu cały projekt trafi do kosza i o tym nie raz rozmawialiśmy tak że jestem bardzo wdzięczny za to co do tej pory dla mnie zrobiliście chciałbym aby w trybie ręcznym silnik tak nadążał za enkoderem jak na tym filmie https://www.youtube.com/watch?v=To7S_rLIJwk&t=115s
zobacz od 5:08.
pozdrawiam Jacek.
zobacz od 5:08.
pozdrawiam Jacek.
- niveasoft
- Posty: 1216
- Rejestracja: 17 sie 2015, 12:13
- Kontakt:
Re: Xmega sprzętowa obsługa enkodera -to takie proste
Tak się tym dzisiaj zająłem bo widziałem Twój post na MCS
Może zmień ten Timer z 10ms na 1ms a potem sobie programowo 10ms zrobisz jak potrzebujesz np. do jakichś przycisków.
Timerów tam masz dużo. Możesz ustawić jakiś drugi żeby liczył, na przykład, 1ms
Mam u siebie taki malutki driver A48coś tam i silniki NEMA45 i jakieś inne. Może go jutro podłączę i machniemy rampę
Trzeba też chyba dodać Stop no i może przeniosę niektóre posty do Twojego tematu, żeby tu Pawłowi nie bruździć
Może zmień ten Timer z 10ms na 1ms a potem sobie programowo 10ms zrobisz jak potrzebujesz np. do jakichś przycisków.
Timerów tam masz dużo. Możesz ustawić jakiś drugi żeby liczył, na przykład, 1ms
Mam u siebie taki malutki driver A48coś tam i silniki NEMA45 i jakieś inne. Może go jutro podłączę i machniemy rampę
Trzeba też chyba dodać Stop no i może przeniosę niektóre posty do Twojego tematu, żeby tu Pawłowi nie bruździć
- Jacek
- Posty: 384
- Rejestracja: 25 kwie 2016, 19:14
Re: Xmega sprzętowa obsługa enkodera -to takie proste
Witam - PEŁEN SUKCES silnik kreci jak szalony jak kręcę enkoderem - nagram film jeszcze dzisiaj.
pozdrawiam Jacek.
pozdrawiam Jacek.