Tabla de contenido:

Decodificador rotatorio simple: 4 pasos
Decodificador rotatorio simple: 4 pasos

Video: Decodificador rotatorio simple: 4 pasos

Video: Decodificador rotatorio simple: 4 pasos
Video: Codificador Alta Precisión - 2500 Puntos Por Rotación 2024, Noviembre
Anonim
Image
Image
Decodificador rotatorio simple
Decodificador rotatorio simple

Este instructivo describe un método simple para decodificar un codificador rotatorio secuencial usando un Arduino Uno R3.

Las rutinas de software compacto se utilizan para contar el número de transiciones, eliminar el rebote de los contactos y determinar la dirección de rotación. No se requieren componentes ni tablas de búsqueda adicionales.

Se proporcionan versiones del código de interrupción y no interrupción.

La versión de interrupción del código solo requiere un pin de interrupción.

Imágenes:

  • La foto de apertura muestra el codificador ensamblado.
  • La captura de pantalla muestra el código para la versión de interrupción y el recuento cuando el eje del codificador se gira en sentido horario y antihorario.
  • El video muestra el recuento durante la rotación rápida.

Paso 1: diagrama de circuito

Diagrama de circuito
Diagrama de circuito

El diagrama de cableado del codificador se muestra en la figura 1.

Los cables de puente se sueldan directamente a los pines del codificador.

Intercambie los dos cables azules si se invierte la dirección de conteo.

Paso 2: Lista de piezas

Las siguientes piezas se obtuvieron de

  • 1 solo Arduino UNO R3 con cable USB.
  • 1 solo codificador rotatorio secuencial (EC11 o equivalente) con interruptor.
  • 1 solo botón para adaptarse al eje.
  • 3 solo cables de puente Arduino macho a macho.

Paso 3: teoría

Teoría
Teoría

Los codificadores rotatorios secuenciales generan dos ondas cuadradas, cada una de las cuales se desplaza 90 grados como se muestra en la Figura 1.

Los patrones lógicos en el Contacto A y el Contacto B son diferentes cuando el eje se gira en el sentido de las agujas del reloj (CW) y en el sentido contrario a las agujas del reloj (CCW) a través de las posiciones 1 a 6.

Los métodos comunes para determinar la dirección de rotación incluyen:

  • hardware
  • interrupciones gemelas
  • tablas de búsqueda de patrones

Este proyecto utiliza un método de software que no requiere tablas de búsqueda. [1]

Dirección

En lugar de mirar los patrones de salida del Contacto A y el Contacto B, centrémonos en el Contacto A.

Si tomamos una muestra del Contacto B después de cada transición del Contacto A, notamos que:

  • El contacto A y el contacto B tienen estados lógicos opuestos cuando el codificador se gira CW
  • El contacto A y el contacto B tienen el mismo estado lógico cuando el codificador se gira en sentido antihorario

Código real:

// ----- Contar transiciones

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

Este método ofrece las siguientes ventajas:

  • no se requieren tablas de búsqueda
  • solo se requiere una sola línea de interrupción

Rebote

Todos los codificadores mecánicos sufren de "rebote de contacto".

Si un contacto del interruptor no se cierra o se rompe limpiamente, su estado lógico oscilará rápidamente de ALTO a BAJO hasta que el contacto del interruptor se estabilice. Esto da como resultado recuentos falsos.

Un método para suprimir el rebote de los contactos es agregar un pequeño capacitor a través de cada contacto del interruptor. El condensador y el resistor pull-up asociado forman un integrador que efectivamente pone en cortocircuito las altas frecuencias y permite que el voltaje del interruptor suba / baje con gracia.

La desventaja de este enfoque es que se pueden perder las transiciones si el eje del codificador se gira rápidamente.

Eliminación de rebotes de software

Este método utiliza dos contadores (Abierto, Cerrado) que se han puesto a cero. [2]

Una vez que se detecta una transición en el contacto A:

  • Sondear continuamente al Contacto A.
  • Incremente el contador de Apertura y restablezca el contador de Cerrado, siempre que el Contacto A sea ALTO.
  • Incremente el contador Cerrado y reinicie el contador Abierto, siempre que el Contacto A esté BAJO.
  • Salga del bucle cuando uno de los contadores alcance un recuento predeterminado. Estamos buscando efectivamente el período de estado estable después de cualquier rebote de contacto.

Código real:

// ----- Contacto de rebote A

while (1) {if (digitalRead (ContactA)) {// ----- ContactA está Abierto Cerrado = 0; // Integrador opuesto vacío Open ++; // Integrar if (Open> MaxCount) return HIGH; } else {// ----- ContactA is Closed Open = 0; // Integrador opuesto vacío Cerrado ++; // Integrar if (Closed> MaxCount) return LOW; }}

No es necesario eliminar el rebote del contacto B, ya que las transiciones del contacto A y el contacto B no coinciden.

Contando

Un "retén" mecánico duplica efectivamente su recuento, ya que se registran dos recuentos entre los clics (consulte la figura 1).

El número de "retenciones" se puede determinar usando aritmética de módulo 2 como se muestra a continuación.

Código real:

// ----- Contar "retenciones"

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

Referencias

Puede encontrar más información en:

[1]

howtomechatronics.com/tutorials/arduino/ro…

[2]

newbiehack.com/ButtonorSwitchDebounceinSof…

Paso 4: software

Este proyecto requiere una versión reciente de Ardino Uno R3 IDE (entorno de desarrollo integrado) que está disponible en

Descargue cada uno de los siguientes dos bocetos de Arduino (adjuntos)

  • rotary_encoder_1.ino (versión de sondeo)
  • rotary_encoder_2.no (versión de interrupción)

Haga doble clic en su versión preferida y siga las instrucciones en pantalla.

Disfrutar …

Haga clic aquí para ver mis otros instructivos.

Recomendado: