Página 1 de 2

Uso de encoder

MensagemEnviado: 01 Fev 2007 15:44
por paulo_hod
Olá,

Sou novato no forum, trabalho com projetos eletrônicos e gostaria de receber uma ajuda em um projeto com PIC...

Como implementar um encoder para controle de um contador up-down? Este encoder é parecido com aquele que controla volume em aparelhos eletronicos, possui 3 terminais.

Ao girar no sentido horario, ele envia dois pulsos, sendo que um deles é defasado. Por exemplo, qdo o mesmo gira em sentido horário primeiro se tem um pulso negativo no terminal que é "up" depois outro no "down", invertendo se a situação quando giramos em sentido anti-horário.

O programa funcionou perfeito com chaves no UP e DOWN, mas agora é necessario colocar um encoder rotativo para esta função.

Abraços, agradeço desde já a ajuda 8)

MensagemEnviado: 01 Fev 2007 17:47
por proex
Como vc ja sabe como o encoder trabalha, qual é a duvida afinal?

MensagemEnviado: 01 Fev 2007 19:26
por eletroinf
Bueno... eu fiz essa implementação, só pra teste... na verdade meu maior problema foi conseguir esse bendito encoder.
Eu fiz assim: Liga um pino do encoder num pino que gere interrupção sensível à borda no mcu. Quando acontecer a interrupção, tu lê o outro pino, se tiver nível 0 tá girando pra um lado e se tiver nível 1 pro outro! Ah tem que botar um debounce senão fica doidão... O terceiro pino é o comum. Eu aterrei ele e pullupei os outros dois (os de sinal).

MensagemEnviado: 02 Fev 2007 06:57
por paulo_hod
Bom... entendi a lógica, vou fazer uns ensaios por aqui.

É que o projeto original estava controlado por chavinhas, tive que adaptar o encoder.

Obrigado.

Abraços,

MensagemEnviado: 02 Fev 2007 08:03
por phophollety
Se estiver com dificuldades para obter o encoder no comércios, vão dicas:

Desmonte um mouse com scroll (rodinha) lá tem um...

Use esse link.. bem legal!

http://www.webx.dk/oz2cpu/20m/encoder.htm

MensagemEnviado: 03 Fev 2007 04:25
por guest2003
Eletroinf, esta maneira que vc fez é bem pratica e simples.... porem voce perde resoluçao ( o q na maioria dos casos nao eh problema )

Outro metodo de fazer isso é verificando quando qquer uma das saidas mudar... ai voce olha isso como um conjunto de 2 bits, e verifica q numero era e pra qual foi, com isso sabe se esta girando no horario ou anti-horario...

canal A - 00110011
canal B - 01100110
sequen - 01320132

[]'s

MensagemEnviado: 05 Fev 2007 09:13
por paulo_hod
guest2003 escreveu:Eletroinf, esta maneira que vc fez é bem pratica e simples.... porem voce perde resoluçao ( o q na maioria dos casos nao eh problema )

Outro metodo de fazer isso é verificando quando qquer uma das saidas mudar... ai voce olha isso como um conjunto de 2 bits, e verifica q numero era e pra qual foi, com isso sabe se esta girando no horario ou anti-horario...

canal A - 00110011
canal B - 01100110
sequen - 01320132

[]'s


Hum, tô começando a entender a lógica... montei o código e testei segundo a sugestão do eletroinf, mas estou tendo uns problemas pois em alguns pontos a contagem ocorre antes do "click" do encoder, ou seja, ao mínimo movimento do eixo.

Vou tentar mais, sugestões serão bem vindas.

Grato.

MensagemEnviado: 04 Ago 2007 17:53
por eagle_good
Pessoal .......montei o projeto baseado na tecnica de interrupção para ler 02 encoder (shaft encoder quadratura) qdo ocorre a interrupção cheque
outro pino para saber o sentido,.......mas como e 02 encoder e ocodigo e grande ........ele se perde sim ........nunca retorna exatamente no mesmo lugar......

Ou seja esta maneira nao e indicada ........ estou tentando usar os counter para isto mas nao tenho ideia.....

Alguem pode nos ajudar a ler encoder quadratura (A e B) usando os counter e claro o sentido ?????????
Ou seja como incrementar e decrementar o counter usando os canais a e b sem interromper o bichionho a cada clock do encoder ???

MensagemEnviado: 05 Ago 2007 17:29
por eagle_good
LS7082/3/4 series quadrature converters. These 8 pin chips convert quadrature encoder inputs
to either pulse and direction, or up clock and down clock signals.
They are configurable to X1, X2, or X4 operation, and are very simple to use.
However, they have no internal counter,so the pulses must be processed immediately.
The only solution I have thought of, but not tested is to use a
PIC12C508 or 8051 (I have code for the PIC) to decode the
quadrature into count and direction. The outputs of this device
are up-clock/down-clock.

Pessoal e possivel configurar o microcontroller com:
01 input counter (uma entrada contador)
01 input up/down (e outra entrada como direção de contagem)

sem usar a interrupção e claro.

MensagemEnviado: 05 Ago 2007 18:13
por RobL
Pessoal e possivel configurar o microcontroller com:
01 input counter (uma entrada contador)
01 input up/down (e outra entrada como direção de contagem)


Sem problemas.
Mas neste caso estará usando uma interface externa para o encoder.
Seu problema vai ser contar para baixo com um contador de 8 ou 16 bits que so conta para cima, no caso dos PICs. Com AVR dá para contar para cima e para baixo.
É possível fazer contar para baixo mesmo contando para cima.

MensagemEnviado: 06 Ago 2007 08:01
por ze
coloque esta rotina no seu loop (ou int)

cpp code
//rotina para decodificação - código gray
//identifica direção e retorna 1 para a direita, 2 para a esquerda, 0 se parado
#define pa RA6
#define pb RA5
unsigned char ret,port,port0;
static bit a,b,a0,b0;
unsigned char decode()
{
a=pa;b=pb;
port=PORTA&0b1100000;
if (port^port0) //comparar leitura atual c/anterior
{
if (!a0 & a) { //bit A mudou de 0 para 1
if (!b) ret=1; //bit B = 0:direita
else ret=2; //bit B = 1:esquerda
}
if (a0 & !a) { //bit A: 1 para 0
if (b) ret=1; // B em 1:direita
else ret=2; // B em 0:esquerda
}
if (!b0 & b) { //bit B: 0 para 1
if (!a) ret=2; // A em 0:esquerda
else ret=1; // A em 1:direita
}
if (b0 & !b) { //bit B: 1 para 0
if (a) ret=2; // A em 1:esquerda
else ret=1; // A em 0:direita
}
}
else ret=0;
a0=pa;b0=pb;
port0=PORTA&0b1100000;
return ret;
}


não ensino a pescar, dou o peixe.
abraço...

MensagemEnviado: 06 Ago 2007 08:45
por eagle_good
BLZ ...Pessoal
lellis... realmente a rotina acima funfa..... e eh sem a INT mas.....
fiquei na mesma.......porque.....precisaria ter processamento muito rapido para ler o encoder e executar o restante do codigo(58K ...ja bem otimizado) sem perder nehum pulso.

Mas o RobL coloca para nos que o AVR o qual numca trampei.... executa a
contagem em uma entrada obedecendo uma outra entrada UP/DOWN.

01 input counter (uma entrada contador)
01 input up/down (e outra entrada como direção de contagem)

Poderia nos exemplificar.......... e no pic nao e mesmo possivel:

Abraçosa a todos.....

MensagemEnviado: 06 Ago 2007 08:56
por andre_luis
Se nao quizer fugir muto da tecnologia, vai de DSPIC que tem módulo de encoder. Voce só tem o trabalho de ler a posicao atual e pronto. Já usei pra um encoder de 1800 pulsos rodando à quaze 15Hz. É muito confiável. O mesmo gravador que voce usa pro PIC funciona no DSPIC.

Se for migrar pra alguma coisa decente, vá direto pro ARM7, que é produzido por vários fabricantes diferentes.


+++

MensagemEnviado: 06 Ago 2007 09:18
por eagle_good
Legal......nao conheco a tecnologia ARM7
A Analog device tambem tem um integrado com 01 interface de quadrature encoder e core arm7...enbora eu precise de 02 entradas de encoder.....mas
Iniciar o arm7 vale a pena mesmo...qual o compiler em C pro danadinho ........

MensagemEnviado: 06 Ago 2007 10:10
por andre_luis
Vá pro tópico ARM que tem uma galera casca-grossa nessa área.


+++