¿Qué tan preciso puedo obtener Arduino usando codificadores rotativos?

15

Los motores paso a paso suelen ser caros para un motor grande. Sin embargo, con un potente motor de CC estándar y un codificador giratorio, puede "simular" un motor paso a paso. ¿Qué tan precisos son los codificadores rotativos con Arduino solo con un bucle básico y no mucho otro código? ¿Va a "perder el pulso" y no registrará la rotación suficiente a menudo? ¿Cómo puedo manejar esto con mucho más código? ¿Hay una mejor manera de hacer esto? ¿Las interrupciones ayudarían? ¿Hay algún tipo de circuito que ayudaría con este problema?

Nota: Probablemente no excederá de 4 rotaciones por segundo ... (Eso puede ser mucho, pero si está haciendo un mecanismo de tipo tornillo de avance, solo sería 24 pulgadas por minuto si hay 10 rotaciones por pulgada de movimiento lineal. )

Pingüino anónimo
fuente
He usado codificadores rotativos que se negaron a funcionar correctamente cuando giraron rápido. Supongo que varía con el precio.
jippie

Respuestas:

10

Las interrupciones son lo que usarías en esta situación.

Las tasas que se han mencionado son lo suficientemente lenta en la que probablemente sería capaz de contar dentro de un bucle, sin embargo esto no es recomendable, como un bucle típico tomará muchos ciclos de reloj para completar, y en función del número de instuctiuons por bucle , puede perder algunos recuentos.

Las interrupciones se realizan para este propósito, ya que pueden activarse en cualquier momento, independientemente del estado del bucle.

Hay una función llamada attachInterrupt()que tomará tres argumentos.

  1. Pin de interrupción
  2. Rutina de servicio de interrupción
  3. Modo

A continuación se muestra un ejemplo para contar una interrupción.

volatile int myCounter = 0;

void setup(){
    attachInterrupt(0, count, RISING);
}

void count(){
    myCounter++;
}

Los modos son los siguientes:

BAJO, CAMBIO, SALIDA, CAÍDA

Puede encontrar más información sobre el uso de interrupciones aquí .

Dependiendo del codificador que use, necesitará adaptar el código a sus necesidades y hacer algunos cálculos más para determinar su posición, pero este debería ser un buen punto de partida.

Editar Aquí hay un código de ejemplo de Arduino Sandbox para usar un codificador rotatorio.

Matt Clark
fuente
1
Un detector de borde accionado por interrupción en un Duemilanove maneja fácilmente 100 bordes por segundo (6500 rpm en un motor).
Wayfaring Stranger
@WayfaringStranger Entonces no hay problema en un Uno, entonces. ¡Gracias!
Anonymous Penguin
1
@AnnonomusPerson - ¿Cuánto trabajo estás dispuesto a poner? Si se queda desnudo ( ISR_NAKED()), puede omitir el guardado automático de contexto C y lograr tasas de interrupción de 100-500 Khz sin problema, pero básicamente está escribiendo ensamblaje en C en ese punto.
Connor Wolf
1
Si desea un documento completo de banannas sobre cómo optimizar la basura absoluta de la respuesta de interrupción, mire aquí . ¡Colocando el código directamente en la tabla de interrupción para reducir aún más la latencia de interrupción!
Connor Wolf
1
Además, tenga en cuenta que si va a realizar interrupciones de baja latencia, la función attachInterrupt de arduino inyecta una sobrecarga adicional de llamadas a funciones en lugar de utilizar la interrupción ISR()directamente.
Connor Wolf
3

Agregar algunas referencias a bibliotecas y ejemplos ya escritos, para permitir la comparación entre diferentes enfoques y experiencias con velocidad versus susceptibilidad a pasos faltantes.

Lectura de codificadores rotativos: http://playground.arduino.cc/Main/RotaryEncoders

Codificador de cuadratura demasiado rápido para Arduino (con solución): http://www.hessmer.org/blog/2011/01/30/quadrature-encoder-too-fast-for-arduino/

Biblioteca Teensy Encoder: https://www.pjrc.com/teensy/td_libs_Encoder.html

Lectura del codificador rotatorio en Arduino: http://www.circuitsathome.com/mcu/reading-rotary-encoder-on-arduino/

gwideman
fuente