Jump to content

    
Sign in to follow this  
rushack

Прошу помощи с алгоритмом обработки энкодера EC11

Recommended Posts

Прошу помощи с алгоритмом обработки энкодера EC11.

Мучаюсь второй день, энкодер какой-то нестандартный, в основном все инкриментные энкодеры выдают код Грея и их обработать не составляет труда, а с этим (ABC) я уже голову сломал.

 

Datasheet EC11

 

В datasheet, он находится под номером 11, более точная марка EC11EH.

 

Вот что он отсылает на выводы A, B, C.

ABC_encoder.png

 

Ручка не фиксируется, и может занимать любое положение, либо в 0 либо на любом из 3х выводах.

EC11.pdf

Share this post


Link to post
Share on other sites
Прошу помощи с алгоритмом обработки энкодера EC11.

Чего тут сложного:

Запоминаете фазу (A,B или C), на которой прошлый раз было "ON".

Ну и когда будет снова "ON". Смотрите что было в прошлый раз:

A -> B = - 1

A -> C = + 1

B -> C = - 1

B -> A = + 1

C -> A = - 1

C -> B = + 1

 

Всё.

 

P.S.

A -> A = 0

B -> B = 0

C -> C = 0

Share this post


Link to post
Share on other sites

Petka, огромное Вам спасибо! Всё получилось.

 

Собрал небольшую схемку для проверки.

Энкодер висит на порту B микросхемы ATmega32. PB1,PB2,PB3 - A,B,C энкодера соответственно.

Светодиоды повесил на порт C.

Если крутим оный влево, значит загорается светодиод на выходе PC0, если в право то PC1.

 

Вот исходник, может кому пригодится.

 

#include <stdio.h>
#include <avr/delay.h>
#include <avr/signal.h>

//Подпрограммы
void le(void)
{
	//Зажигаем светодиод на PC0
	PORTC |= _BV(PC0);
	//И гасим светодиод на PC1
	PORTC &= ~_BV(PC1);
}

void ri(void)
{
	//Зажигаем светодиод на PC1
	PORTC |= _BV(PC1);
	//И гасим светодиод на PC0
	PORTC &= ~_BV(PC0);
}

int main(void)
{

// Раздел переменных
int sost_A =0,sost_B=0,sost_C=0,sostn_A=0,sostn_B=0,sostn_C=0;


//Настраиваем порты
DDRB =  0x00;
PORTB = 0xff;

DDRC =  0b00000011;
PORTC = 0x00;

while(1) 
{
	//Запоминаем состояние портов
	if (!(PINB & (1<<PINB1))) 
	{
		sost_A = 1; //A
		sost_B = 0;
		sost_C = 0;
	}

	if (!(PINB & (1<<PINB2))) 
	{
		sost_A = 0; //B
		sost_B = 1;
		sost_C = 0;
	}

	if (!(PINB & (1<<PINB3))) 
	{
		sost_A = 0; //C
		sost_B = 0;
		sost_C = 1;
	}

	//Ждём 50 ms
	_delay_ms(50);

	//Запоминаем состояние портов
	if (!(PINB & (1<<PINB1))) 
	{
		sostn_A = 1; //A
		sostn_B = 0;
		sostn_C = 0;
	}

	if (!(PINB & (1<<PINB2))) 
	{
		sostn_A = 0; //B
		sostn_B = 1;
		sostn_C = 0;
	}

	if (!(PINB & (1<<PINB3))) 
	{
		sostn_A = 0; //C
		sostn_B = 0;
		sostn_C = 1;
	}

	//Сравниваем запомненные состояния
	if ((sost_A & sostn_B)==1) le();
	if ((sost_A & sostn_C)==1) ri();

	if ((sost_B & sostn_C)==1) le();
	if ((sost_B & sostn_A)==1) ri();

	if ((sost_C & sostn_A)==1) le();
	if ((sost_C & sostn_B)==1) ri();

	// Обнуляем флаги
	sostn_A = 0;
	sostn_B = 0;
	sostn_C = 0;
	sost_A  = 0;		
	sost_B  = 0;	
	sost_B  = 0;

	}
}

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this