Easyelectronics.ru

Электроника для всех
Текущее время: 19 фев 2020, 11:54

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 5 ] 
Автор Сообщение
 Заголовок сообщения: Обработка энкодера
СообщениеДобавлено: 20 ноя 2014, 17:07 
Старожил

Зарегистрирован: 24 июн 2011, 14:05
Сообщения: 299
Откуда: Новочеркасск
Имеется трёх импульсный энкодер (если это правильное название), т.е. датчик который имеет три линии сигнала и импульсы у него на линиях сдвинуты на 120 градусов(скважность импульсов 50%). Датчик стоит на валу ротора.
Мне нужно отслеживать текущее положение ротора и сравнивать с предыдущим. Всего получается шесть возможных комбинаций, комбинация 000b или 111b считаются ошибкой датчика.
Загвоздка в том что сочетание импульсов идёт не попорядку, а если перевести в десятичную систему счисления: 2,6,4,5,1,3,2.
Ну или в двоичной:
010
110
100
101
001
011
010
Направление вращения может быть любое, поэтому текущее положение нужно сравнивать с двумя, если не совпадёт то опять же ошибка датчика. Впринципе как сделать это с использованием кучи условий мне понятно, а может как нибудь можно битовыми операциями получать от текущего положения два крайних?
Такая мысль летает, но не могу пока описать в коде, что если в текущем положении одна единица нужно искать единицу в предыдущем положении слева или справа, для одного нуля тоже самое но искать нули.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Обработка энкодера
СообщениеДобавлено: 20 ноя 2014, 17:14 
Заглядывает иногда

Зарегистрирован: 29 май 2010, 18:44
Сообщения: 150
Откуда: Украина, Славянск
http://easyelectronics.ru/avr-uchebnyj- ... koder.html


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Обработка энкодера
СообщениеДобавлено: 20 ноя 2014, 17:26 
Старожил

Зарегистрирован: 24 июн 2011, 14:05
Сообщения: 299
Откуда: Новочеркасск
Это всё хорошо, но так я и сам могу сделать, да вообще-то и сделал, мне нужно другое.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Обработка энкодера
СообщениеДобавлено: 20 ноя 2014, 17:34 
Старожил

Зарегистрирован: 10 июн 2011, 23:01
Сообщения: 3366
просто забить все переходы в таблицу

Код:
//{1,3,2,6,4,5}
#define I 0     //invalid state
#define P +1    //positive
#define S 0     //no change
#define N -1    //negative
#define E 0     //error

const s8 encTable[8][8] = {
  { I, I, I, I, I, I, I, I },
  { I, S, E, P, E, N, E, I },
  { I, E, S, N, E, E, P, I },
  { I, N, P, S, E, E, E, I },
  { I, E, E, E, S, P, N, I },
  { I, P, E, E, N, S, E, I },
  { I, E, N, E, P, E, S, I },
  { I, I, I, I, I, I, I, I }
}

#undef I
#undef P
#undef S
#undef N
#undef E

//
void Encoder(){
  static u8 prevState = ReadPinState() & 0x07;
  u8 currentState = ReadPinState() & 0x07;
  pos += encTable[prevState][currentState];
  prevState = currentState;
}

чтобы ошибки отлавливать, в таблицу можно вместо 0,+1, -1 забить для каждого состояния разные циферки 0,1,2,3,4 и потом из другого массива по полученному из таблицы индекса звать соответсвующую функцию.


Последний раз редактировалось _pv 20 ноя 2014, 18:24, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Обработка энкодера
СообщениеДобавлено: 20 ноя 2014, 17:44 
Старожил

Зарегистрирован: 24 июн 2011, 14:05
Сообщения: 299
Откуда: Новочеркасск
_pv, блин точно как то сразу и не подумал что можно массив состояний сделать, спасибо, только элементы [4][5] и [4][6] местами поменять надо.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: demiurg1978


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB