Easyelectronics.ru

Электроника для всех
Текущее время: 22 сен 2019, 17:32

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



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

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

Зарегистрирован: 24 июн 2011, 14:05
Сообщения: 294
Откуда: Новочеркасск
Имеется трёх импульсный энкодер (если это правильное название), т.е. датчик который имеет три линии сигнала и импульсы у него на линиях сдвинуты на 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
Сообщения: 294
Откуда: Новочеркасск
Это всё хорошо, но так я и сам могу сделать, да вообще-то и сделал, мне нужно другое.


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

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

Код:
//{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
Сообщения: 294
Откуда: Новочеркасск
_pv, блин точно как то сразу и не подумал что можно массив состояний сделать, спасибо, только элементы [4][5] и [4][6] местами поменять надо.


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

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


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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

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