реклама на сайте
подробности

 
 
> Энкодер и как с ним работать.
TamTam
сообщение Jun 8 2006, 03:59
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 293
Регистрация: 14-03-06
Пользователь №: 15 254



Поделитесь грамотным кодом для обработки энкодера.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 8)
_Sam_
сообщение Jun 8 2006, 06:03
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 278
Регистрация: 18-01-05
Из: Санкт-Петербург
Пользователь №: 2 031



описание
исходники

Исходники правда на VHDL, но думаю идея будет ясна, тем более что алгоритмы работы описаны.

Обратите внимание на цифровой фильтр, который используется в указанных примерах! Частота его работы должна быть выше максимальной частоты импульсов энкодера минимум в два раза! Энкодер может выдать максимальную частоту например, если его вал неподвижен, стоит на границе дискреты, и начинает движение! Если рабочая частота вашего цифрового фильтра будет меньше заявленной максимальной частоты импульсов энкодера, то вы будете либо пропускать импульсы, либо насчитывать лишние.
Go to the top of the page
 
+Quote Post
kanzler
сообщение Jun 8 2006, 07:48
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 340
Регистрация: 27-02-06
Из: Екатеринбург
Пользователь №: 14 728



Цитата(TamTam @ Jun 8 2006, 09:59) *
Поделитесь грамотным кодом для обработки энкодера.


Всё зависит от модели энкодера. Есть энкодеры у которы два вывода синхроимпульсов, если нужно определять направление движения то обрабатывать нужно два выхода. Если не нужно определять направление движения то достаточно одного вывода который подключён на счётный вход любого таймера микроконтроллера. Есть модели у которых один вывод синхроимпульсов и вывод направления движения. Тут нужно только следить за состоянием вывода направления движения, а вывод синхроимпульсов подать так жена счётный вывод таймера микроконтроллера.
Go to the top of the page
 
+Quote Post
TamTam
сообщение Jun 8 2006, 08:25
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 293
Регистрация: 14-03-06
Пользователь №: 15 254



Цитата(kanzler @ Jun 8 2006, 11:48) *
Цитата(TamTam @ Jun 8 2006, 09:59) *

Поделитесь грамотным кодом для обработки энкодера.


Всё зависит от модели энкодера. Есть энкодеры у которы два вывода синхроимпульсов, если нужно определять направление движения то обрабатывать нужно два выхода. Если не нужно определять направление движения то достаточно одного вывода который подключён на счётный вход любого таймера микроконтроллера. Есть модели у которых один вывод синхроимпульсов и вывод направления движения. Тут нужно только следить за состоянием вывода направления движения, а вывод синхроимпульсов подать так жена счётный вывод таймера микроконтроллера.


Энкодер с 2 выводами синхроимпульсов

Код
// решение дернуто из аврлиб
// тока дернул, пока не проверял но думаю работать должен
if( (((PIND.2) & (1<<PIND.2)) == 0) ^
   (((PIND.3) & (1<<PIND.3)) == 0) )
      {
          PORTB=0xff;
      }
      else
      {
         PORTB=0x00;
      }



вот тока вопрос с дребезгом и залипанием как решить ?
Go to the top of the page
 
+Quote Post
TamTam
сообщение Jun 8 2006, 09:52
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 293
Регистрация: 14-03-06
Пользователь №: 15 254



Да вроде в протеусе работает без глюков, в верхнем коде есть ошибка.
[code]
// процедуру вызываем из прерывания.
void SIGNAL(void);
void SIGNAL(void)
{
if( (((PIND.2) & (1<<PIND.3)) == 0) ^
(((PIND.3) & (1<<PIND.3)) == 0) )
{

PORTB = (PORTB >> 1) | ( (PORTB == 0) <<7);
}
else
{
PORTB = (PORTB << 1) | ( (PORTB == 0));
}
}
[code]
Go to the top of the page
 
+Quote Post
psw
сообщение Jun 8 2006, 11:20
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 8-06-06
Пользователь №: 17 866



у меня вот так все работает PD0,PD1 входа тодтянутые к плюсу через 4к7
возвращает +1 при повороте по часовой и -1 против


#define PIN_Coder PIND// PD0,PD1
#define Port_Coder PORTD
#define Ddr_Coder DDRD
char status,encoder = 0;
signed char EN = 0;
...
...
//-----------------------------------------------------------------------------------
signed char ReadEncoder(void)
{
register signed char temp = 0;
encoder = (~PIN_Coder & 0x03);//проверяем PD0,PD1
if(status != encoder)
{
switch(encoder)
{
case 0:
if(status == 1) temp = 1;
else if(status == 2) temp = -1;
break;
case 1:
if(status == 3) temp = 1;
else if(status == 0) temp = -1;
break;
case 2:
if(status == 0) temp = 1;
else if(status == 3) temp = -1;
break;
case 3:
if(status == 2)temp = 1;
else if(status == 1) temp = -1;
break;
}
status = encoder;
}
return temp;
}
//-----------------------------------------------------------------------------------
Go to the top of the page
 
+Quote Post
OlegIvanov
сообщение Jun 8 2006, 12:08
Сообщение #7


Участник
*

Группа: Новичок
Сообщений: 38
Регистрация: 12-09-05
Пользователь №: 8 464



делаю приблизительно так (подразумевается сигнал чистый, два канала)
Прикрепленные файлы
Прикрепленный файл  intcount.txt ( 2.47 килобайт ) Кол-во скачиваний: 127
 
Go to the top of the page
 
+Quote Post
_Sam_
сообщение Jun 8 2006, 12:12
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 278
Регистрация: 18-01-05
Из: Санкт-Петербург
Пользователь №: 2 031



Цитата
если нужно определять направление движения то обрабатывать нужно два выхода. Если не нужно определять направление движения то достаточно одного вывода


Выкидывая второй сигнал вы уменьшете разрешающую способность энкодера в 2 раза!


Код
prev_pind2 = pind2;
prev_pind3 = pind3;

pind2 = ( ((PIND.2) & (1<<PIND.2)) == 0 );
pind3 = ( ((PIND.3) & (1<<PIND.3)) == 0 );

any_edge_d3 = ( prev_pind3 ^ pind3 )

any_edge_d3 выделяет все фронты одного из сигналов.

Код

if(!pind2 & any_edge_d3)
              count = (pind3) ? count + 1 : count - 1;

Это мы получили половину разрядности

Теперь остальное
Код
full_code = count << 1 | ( (pind2 ^ pind3) == 0);


В принципе у psw таже задача решена табличным способом.

Ещё хотелось бы знать какова разрешающая способность вашего датчика.
Go to the top of the page
 
+Quote Post
_Diman_
сообщение Jun 8 2006, 21:59
Сообщение #9


Частый гость
**

Группа: Свой
Сообщений: 92
Регистрация: 8-03-05
Пользователь №: 3 160



Вот там тоже про это
http://stas633.narod.ru/ProVse/Valcoder/Valcod.html
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 16:05
Рейтинг@Mail.ru


Страница сгенерированна за 0.01405 секунд с 7
ELECTRONIX ©2004-2016