Decodificador rotativo simples: 4 etapas
Decodificador rotativo simples: 4 etapas

Vídeo: Decodificador rotativo simples: 4 etapas

Vídeo: Decodificador rotativo simples: 4 etapas
Vídeo: Códigos - Aula 4: Exercícios (decodificadores) 2025, Janeiro
Anonim
Image
Image
Decodificador Rotativo Simples
Decodificador Rotativo Simples

Este instrutível descreve um método simples de decodificar um codificador rotativo sequencial usando um Arduino Uno R3.

As rotinas de software compactas são usadas para contar o número de transições, eliminar o salto do contato e determinar a direção da rotação. Componentes adicionais e tabelas de pesquisa não são necessários.

Versões de interrupção e não interrupção do código são fornecidas.

A versão de interrupção do código requer apenas um único pino de interrupção.

Imagens:

  • A foto de abertura mostra o codificador montado.
  • A captura de tela mostra o código para a versão de interrupção e a contagem quando o eixo do codificador é girado no sentido horário e anti-horário.
  • O vídeo mostra a contagem durante a rotação rápida.

Etapa 1: Diagrama de Circuito

Diagrama de circuito
Diagrama de circuito

O diagrama de fiação do codificador é mostrado na fig.1.

Os fios do jumper são soldados diretamente aos pinos do codificador.

Troque os dois fios azuis se a direção da contagem for invertida.

Etapa 2: Lista de peças

As seguintes partes foram obtidas em

  • 1 apenas Arduino UNO R3 com cabo USB.
  • 1 apenas codificador rotativo sequencial (EC11 ou equivalente) com interruptor.
  • 1 botão apenas para se adequar ao eixo.
  • 3 fios de jumper macho para macho Arduino apenas.

Etapa 3: Teoria

Teoria
Teoria

Os codificadores rotativos sequenciais geram duas ondas quadradas, cada uma delas deslocada em 90 graus, conforme mostrado na Fig.1.

Os padrões lógicos no contato A e no contato B são diferentes quando o eixo é girado no sentido horário (CW) e anti-horário (CCW) nas posições 1 a 6.

Métodos comuns para determinar a direção de rotação incluem:

  • hardware
  • interrupções gêmeas
  • tabelas de pesquisa de padrões

Este projeto usa um método de software que não requer tabelas de pesquisa. [1]

Direção

Em vez de olhar para os padrões de saída do contato A e do contato B, vamos nos concentrar no contato A.

Se amostrarmos o Contato B após cada transição do Contato A, notaremos que:

  • O contato A e o contato B têm estados lógicos opostos quando o encoder é girado no sentido horário
  • O contato A e o contato B têm o mesmo estado lógico quando o encoder é girado no sentido anti-horário

Código real:

// ----- Transições de contagem

CurrentStateA = stateContactA (); if (CurrentStateA! = LastStateA) {CurrentStateB = digitalRead (ContactB); if (CurrentStateA == CurrentStateB) Contagem ++; if (CurrentStateA! = CurrentStateB) Count--; LastStateA = CurrentStateA; }

Este método oferece as seguintes vantagens:

  • tabelas de pesquisa não são necessárias
  • apenas uma única linha de interrupção é necessária

Debounce

Todos os codificadores mecânicos sofrem de “ressalto de contato”.

Se um contato da chave não abrir / quebrar corretamente, seu estado lógico oscilará rapidamente de ALTO para BAIXO até que o contato da chave se estabilize. Isso resulta em contagens falsas.

Um método para suprimir o salto do contato é adicionar um pequeno capacitor em cada contato da chave. O capacitor e o resistor pull-up associado formam um integrador que efetivamente causa um curto-circuito nas altas frequências e permite que a tensão da chave aumente / diminua graciosamente.

A desvantagem dessa abordagem é que as transições podem ser perdidas se o eixo do codificador for girado rapidamente.

Debouncing de software

Este método usa dois contadores (aberto, fechado) que foram definidos como zero. [2]

Assim que uma transição for detectada no contato A:

  • Pesquisar continuamente o contato A.
  • Incremente o contador Aberto e zere o contador Fechado sempre que o Contato A estiver ALTO.
  • Incremente o contador Fechado e zere o contador Aberto sempre que o Contato A estiver BAIXO.
  • Saia do loop quando um dos contadores atingir uma contagem predeterminada. Estamos efetivamente procurando o período de estado estacionário após qualquer salto de contato.

Código real:

// ----- Debounce Contact A

while (1) {if (digitalRead (ContactA)) {// ----- ContactA está aberto Fechado = 0; // Integrador oposto vazio Open ++; // Integrar if (Abrir> MaxCount) return HIGH; } else {// ----- ContactA está fechado Open = 0; // Integrador oposto vazio Closed ++; // Integrar if (Fechado> MaxCount) return LOW; }}

Não há necessidade de eliminar o contato B, pois as transições do contato A e do contato B não coincidem.

Contando

Um “detentor” mecânico efetivamente duplica sua contagem, já que duas contagens são registradas entre os cliques (consulte a fig. 1).

O número de "detenções" pode ser determinado usando aritmética do módulo 2, conforme mostrado abaixo.

Código real:

// ----- Contar "detenções"

if (Contagem% 2 == 0) {Serial.print ("Contagem:"); Serial.println (contagem / 2); }

Referências

Mais informações podem ser encontradas em:

[1]

howtomechatronics.com/tutorials/arduino/ro…

[2]

newbiehack.com/ButtonorSwitchDebounceinSof…

Etapa 4: Software

Este projeto requer uma versão recente do IDE Ardino Uno R3 (ambiente de desenvolvimento integrado) que está disponível em

Baixe cada um dos dois esboços do Arduino a seguir (em anexo)

  • rotary_encoder_1.ino (versão de votação)
  • rotary_encoder_2.no (versão de interrupção)

Clique duas vezes em sua versão preferida e siga as instruções na tela.

Aproveitar …

Clique aqui para ver meus outros instructables.