sábado, 15 de novembro de 2008

Potenciometro sem fim ou Rotary Encoder

Macro para Potenciômetro Digital, ou Potenciômetro Encoder, ou Rotary Encoder ou Potenciômetro sem fim etc...

Procurei pelo nome correto deste potenciômetro, foi difícil, e no Brasil ainda não é bem conhecido, É um potenciômetro sem fim , cuja função é enviar dados de incremento e decremento de valores, ideal para microcontroladores, e muito utilizado em sons modernos para procurar estação de rádio ou controle de volume, sua versatilidade consiste em “colocar” mais rapidamente um determinado valor digital. Pois no modo convencional por botões, é preciso segurar o botão, ou ficar apertando até chegar ao determinado valor, na pratica quando se projeta e constrói algum determinado equipamento, dependendo de alguma escala de valor torna-se inviável, e chato a forma como muda os valores, pensando desta forma que grandes empresas de equipamentos de eletro-eletrônicos, colocou este tipo de mecanismo em seus equipamentos, além do mais torna o equipamento mais moderno, visualmente e na prática também.

Quando se refere a Rotary-Encoder, se refere a um outro tipo de componente também, que consiste em motores a qual também envia dados, a qual serviria pra um ótimo controle de velocidades, giros, RPM etc.

Mas quero referir é a respeito do potenciômetro apenas, existem dois tipos de potenciômetros, suas funcionalidades são idênticas, apenas que um é ótico, e outro com contatos mecânicos, o ótico possui 5 terminais ou 4 terminais (VCC,GND,A,B,NC) e contatos mecânicos (GND,A,B) A funcionalidade destes potenciômetros é idênticas ao mouse de computador, onde o movimento do mouse determina sua posição, pra tal efeito os terminais A, B (encoder), um microcontrolador tem que ler estes terminais e conseguir tornar legíveis as posições (esquerdo, direito)

Veja um potenciômetro destes:


POT. MECÂNICO-SEM FIM

Os terminais, A,B e terra, não estão exatamente nesta ordem, é preciso os terminais certos, pois se estiverem errados, não funcionam adequadamente



POT. ÓTICO-SEM FIM




Estes terminais A,B apresentam em sua saída 2 formas de onda conforme figura:



Note que a fase do pulso se inverte quando o giro do potenciômetro, é invertido. Em A, o primeiro pulso, vem depois de ¼ aparece o primeiro pulso do terminal B

Quando inverte o botão o processo se inverte, o que um microcontrolador tem que fazer é conseguir interpretar estes sinais, para poder incrementar e decrementar. Visualmente nota-se um pouco de dificuldade para a correta interpretação de um código para um microcontrolador, então vamos a forma binária

Lado direito: 1100110011001100110011001100

Lado esquerdo: 0110011001100110011001100110

Assim torna fácil implemetação de um código para um microcontrolador . Vou listar uma macro que funciona 100% .

Este sistema “descodifica” em tempo real o encoder, então alguns cuidados devem ser tomados

1-a velocidade de giro do potenciômetro, não pode ser muito rápida, pois o microcontrolador converte estes sinais em tempo real, usei um clock interno do pic 16F628 de 4 Mhz a qual já ficou perfeito. Com um giro suave os valores já mudam abruptamente, e quando o giro é suave os valores mudam suavemente, com um ressoador de 20Mhz aumenta mais ainda a velocidade do giro,

2- A velocidade do giro depende de como a macro é tratada, se ela for executada e logo entregar o valor a conjunto de display de 7 segmentos, então seu giro pode ser o mais rápido possível, já que o microcontrolador entrega o valor ao display e volta a executar a macro. Num LCD, pelo fato de algumas rotinas de LCDs serem grandes, o que torna lenta e pesada então o valor é entregue ao LCD e logo em seguida retorna a macro, a velocidade de giro já não pode ser extremamente rápida, pois aconteceria mais ou menos assim, enquanto você gira o knob, o valor esta ainda sendo apresentado no LCD,

Estes problemas na verdade, não é problema já que um microcontrolador é muito rápido, e ninguém vai ficar colocando o dial de um lado para outro com extrema velocidade.

3- Quando gira o knob, sente pequenos “estalos” no potenciômetro, como se estivem enviando pulsos, mas não é bem assim, cada “ estalos” varia de potenciômetros para potenciômetros, o que tenho por exemplo, cada estalinho são 4 incrementos ou decrementos, para posicionar no valor correto, basta ir bem devagar.

4- O knob a ser utilizado quanto maior melhor, entendi porque equipamentos com este tipo de controle possuem knobs grandes, pois a faixa de controle é melhor, mais suave, e mais preciso.


A macro:

;os valores que são carregados para os pinos de entrada do PORTA, se for escolher

;outros pinos devem ser alterados na macro

;copie e salve como : POTDIGITAL.INC

;por Mauro R. Sousa códigos para uso livre


INICIA_POT MACRO POT_INICIAL
MOVF POT_INICIAL,W
MOVWF POT_BALEE
MOVF ENCODER,W
MOVWF POT_ALT
MOVLW B'00000011' ;define os pinos de entrada no caso PORTA,0 – PORTA,1
ANDWF POT_ALT, F
ENDM
POT MACRO VALOR
CALL LEIA_O_ENCODER
MOVF POT_BALEE,W
MOVWF VALOR
ENDM


LEIA_O_ENCODER
MOVF ENCODER,W
MOVWF POT_ISC
MOVLW B'00000011' ; define os pinos de entrada no caso PORTA,0 – PORTA,1
ANDWF POT_ISC , F
MOVF POT_ISC ,W
MOVWF POT_TEMP
MOVF POT_ALT,W
XORWF POT_TEMP, W
BZ UFA_ACABOU
BCF POT_ALT, 1
CLRC
RLF POT_ALT, F
MOVF POT_ISC ,W
XORWF POT_ALT, F
BZ ZBOXBALEE
DECF POT_ALT, F
BZ ZBOXBALEE
BALEEX76
INCF POT_BALEE , F
GOTO BALEE6547
ZBOXBALEE
DECF POT_BALEE , F
BALEE6547
MOVF POT_ISC ,W
MOVWF POT_ALT
UFA_ACABOU
RETURN







A estrutura da macro dentro de um programa

Definir as seguintes variáveis :



POT_DEFINE
POT_II
POT_TEMP
POT_BALEE
POT_ALT
POT_ISC
PDADOS ; recebe o valor do encoder





Definir Hardware : exemplo:

#DEFINE ENCODER PORTA ;define qual das portas será entrada do potenciômetro



Incluir macro:

#INCLUDE"POTDIGITAL.INC



Comandos :


A variável POT_II , recebe um valor a qual o potenciômetro começa a incrementar ou decrementar
INICIA_POT POT_II, comando que deve vir logo a seguir POT_II transfere o valor para a macro.
POT PDADOS, é o comando que retorna o valor exato do potenciômetro





Exemplo prático


-------------------------------------------------------------------------------------------------------------------------------------------------------



; list p=16f628
#INCLUDE
__CONFIG (_PWRTE_OFF & _CP_OFF & _MCLRE_OFF & _WDT_OFF & _LVP_OFF & _INTRC_OSC_NOCLKOUT & _BOREN_OFF )




#DEFINE BANK0 BCF STATUS,RP0
#DEFINE BANK1 BSF STATUS,RP0



;----------------------------------DECLARAÇÃO DE VARIAVEIS-----------------------------

CBLOCK 0x20
POT_DEFINE
POT_II
POT_TEMP
POT_BALEE
POT_ALT
POT_ISC
PDADOS ; recebe o valor do encoder
ENDC



;----------------------------------DEFINE HARDWARE------------------------------------------

#DEFINE ENCODER PORTA

;-------------------------------------------------------------------------------------------------------

ORG 0x00
GOTO INICIO

ORG 0x04
RETFIE



;--------------------------------------INCLUSÃO DA MACRO---------------------

#INCLUDE"POTDIGITAL.INC"

;------------------------------------------------------------------------------------------

INICIO
BANK1
MOVLW B'00000011' ; aqui foi escolhido onde estaria ligado os terminais do pot.
MOVWF TRISA
MOVLW B'00000000'
MOVWF TRISB
MOVLW B'00000000'
MOVWF OPTION_REG
CLRF INTCON
BANK0
MOVLW B'00000111'
MOVWF CMCON





;-----------------------------------------------SOFTWARE---------------------------

MOVLW .0 ;começa o valor com 0
MOVWF POT_II ;
INICIA_POT POT_II ; INICIA_POT recebe o valor de POT_II


AQUI
POT PDADOS ;PDDADOS retorno de valores da macro do potenciometro digital
MOVF PDADOS,W ;coloca o valor em W
MOVWF PORTB ; e joga o valor no PORTB


GOTO AQUI
END


;---------------------------------------------------------------------------------------------






Este programa joga os dados binários na saída de portb, a visualização é feita por leds, girando o potenciômetro de um lado, é incrementado e do outro lado é decrementado









-------------------------------fim---------------------------------------------------

3 comentários:

belladona disse...

gostei muito do projeto pois quase se encaixa com o circuito que eu estou procurando. bom procuro um circuito semelhante porem para controlar um display de 3 digitos com o mesmo potenciometro pois preciso para acoplar a meu movimentador da antena parabolica pois preciso saber a luitura no display tanto da elvação como o azimut da antena quando eu a movimento atraves de dois motores. sera que você não conseguiria esse circuito para min se atendido obrigado meu e-mail rogeriobelladona@hotmail.com

Unknown disse...

qual linguagem de programação é essa que voce usou...???
obrigado..

Almir Bispo disse...

Parabens !! Seu projeto foi bem explanado !!!