[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Модератор форума: RD3AVJ 
Форум » форумы » Обсуждение материалов сайта » Энкодер и Bascom-AVR. Счетчик импульсов (Энкодер и Bascom-AVR. Счетчик импульсов)
Энкодер и Bascom-AVR. Счетчик импульсов
DumonДата: Суббота, 17.12.2016, 14:29 | Сообщение # 1
Группа: Проверенные
Сообщений: 2

Статус: Offline
В статье "Энкодер и Bascom-AVR. Счетчик импульсов" для обнаружения вращения энкодера применяется этот код: 

Код
Encod:  ' тут узнаем в каком направлении вращают ручку энкодера
  Waitms 2' ждем пока утихнет дребезг контактов
  If Pind.5 = 1 Then  ' если на ноге единица (импульс не пришел) тогда
  Incr W  ' инкременируем переменную (увеличиваем на 1)
  Else ' в обратном случае
  Decr W  ' декрементируем переменную (уменьшаем на 1)
  End If

  Gifr = 64 ' сбрасываем регистр хранения прерывания INT0


Я использую  вот этот и хочу спросить кто что думает ?

Код
'=========================================================
'                    АнтиДребезг!!!
Enc_0 = 0
Do
Incr Enc_0 : Reset Watchdog
If Pind.2 = 0 And Pind.0 = 1 Then : Incr Enc_1 : Exit Do : End If
If Pind.2 = 0 And Pind.0 = 0 Then : Incr Enc_2 : Exit Do : End If
Loop Until Enc_0 > 20000
Enc_0 = 0
Do
Incr Enc_0 : Reset Watchdog
If Pind.2 = 1 And Pind.0 = 0 Then : Incr Enc_1 : Exit Do : End If
If Pind.2 = 1 And Pind.0 = 1 Then : Incr Enc_2 : Exit Do : End If
Loop Until Enc_0 > 20000
'=========================================================
If Enc_1 > Enc_2 Then                    ' вращение в право
Elseif Enc_1 < Enc_2 Then                    ' вращение в лево Код
End If      
Gifr = 64
Return
'=====================================================


 
exersizzeДата: Вторник, 20.12.2016, 18:18 | Сообщение # 2
Группа: Администраторы
Сообщений: 720

Статус: Offline
оно работает?

 
DumonДата: Вторник, 20.12.2016, 20:59 | Сообщение # 3
Группа: Проверенные
Сообщений: 2

Статус: Offline
Да работает!

Изначально использовал код со статьи но во время вращения энкодера происходит как бы проскакивание что ли , тоесть
например вращаю в право переменная увеличивается и в какойто момент наоборот уменьшается , я связываю это с разной скоростью вращения и дребезгом , в коде ниже такой эффект менее заметен НО количество щелчков не соответствует приросту переменной , в том месте где мне кажется происходит дребезг получается пропуск щелчка , как то так ! 

И еще вопрос может есть как нить алгоритм для энкодера , чтобы можно было более точно считать щелчки ?




Сообщение отредактировал Dumon - Вторник, 20.12.2016, 21:00
 
bulatДата: Вторник, 24.10.2017, 09:55 | Сообщение # 4
Группа: Проверенные
Сообщений: 70

Статус: Offline
я делаю через таймер без прерываний-работает замечательно
enc_a alias pind.1 : config portd.1 = input : portd.1 = 1
enc_b alias pind.2 : config portd.2 = input : portd.2 = 1
Config Timer0 = Timer , Prescale = 64 : On Timer0 Pulse : Enable Timer0       '4000000/64/256=244 гц>>> 4 msec
DIM new_pos AS BYTE
DIM old_pos AS BYTE
DIM minut AS BYTE

do
........
loop

Pulse:
new_pos=0
new_pos.0 = enc_a
new_pos.1 = enc_B
IF old_pos = 3 THEN
IF new_pos = 1 THEN GOSUB L
IF new_pos = 2 THEN GOSUB P
old_pos = new_pos
END IF

return

'крутим вправо
L:
IF minut <99  THEN minut = minut + 1
Return

'крутим влево
P:

IF minut >1  THEN minut = minut - 1

end if




Сообщение отредактировал bulat - Вторник, 24.10.2017, 09:57
 
Форум » форумы » Обсуждение материалов сайта » Энкодер и Bascom-AVR. Счетчик импульсов (Энкодер и Bascom-AVR. Счетчик импульсов)
Страница 1 из 11
Поиск: