Generar la señal del codificador rotatorio

0

Necesito generar señales en la salida de un Mega Arduino para simular las señales de un codificador rotatorio. Sé cómo generar Señales de frecuencia a través de la función de abajo. ¿Cómo podría generar las señales como en la imagen de abajo, con un lapso de tiempo entre ellas? Debo tener en cuenta que la frecuencia debe ser la misma.

void Encoder() {
    tone(51,60);//Generates a 60Hz signal at output 51
    tone(52,60);//Generates a 60Hz signal at output 52
}

actualizacion :

Pude generar la señal deseada haciendo lo siguiente:

void Encoder() {

        int i;

        for (i == 0; i <= 10000; i++) {
            digitalWrite(50, HIGH);
            delay(10);
            digitalWrite(48, HIGH);
            delay(10);
            digitalWrite(50, LOW);
            delay(10);
            digitalWrite(48, LOW);
            delay(10);
            digitalWrite(50, HIGH);
            delay(10);
            digitalWrite(48, HIGH);
            delay(10);
            digitalWrite(50, LOW);
            delay(10);
            digitalWrite(48, LOW);
            delay(10);
        }
    }
    
pregunta Eduardo Cardoso

2 respuestas

3

Si no te importa demasiado la frecuencia y el tiempo exactos, puedes usar el siguiente método: los retrasos son 1/4 de 1/60 de segundo o 4167us idealmente, pero las escrituras y el bucle usan algo de tiempo, por lo que la frecuencia Será un poco inferior a 60Hz.

Si necesita una sincronización muy precisa o necesita que el micro esté disponible para otras tareas, puede acceder directamente a los temporizadores en chip, pero eso es un poco más de esfuerzo.

// play with the below number a bit to change the timing
#define DLY 4167

void setup() {
pinMode(13, OUTPUT);
pinMode(12, OUTPUT);
digitalWrite(13, LOW);
digitalWrite(12, LOW);
}

void loop() {
  delayMicroseconds(DLY); 
  digitalWrite(12, HIGH);
  delayMicroseconds(DLY); 
  digitalWrite(13, HIGH);
  delayMicroseconds(DLY); 
  digitalWrite(12, LOW);
  delayMicroseconds(DLY); 
  digitalWrite(13, LOW);
  }

(ignora la pantalla de voltaje, ambos son 0 / 5V)

    
respondido por el Spehro Pefhany
3

Como señaló Eugene Sh, la solución más simple, si no tiene nada más que hacer en el bucle, es girar repetidamente los pines hacia arriba / abajo y ajustar el retraso entre esos eventos.

Si no puede permitirse dedicar un tablero completo a esta tarea (tener un poco de Nano extra es barato y útil), entonces debe ejecutar interrupciones de temporizadores para hacer el cambio en un momento preciso, y dejar el resto de el tiempo claro para tus otras cosas

El documento oficial que explica esta idea está aquí: enlace

Podrías encontrar los ejemplos de esta otra página más ilustrativos: enlace

    
respondido por el Francois Vigneron

Lea otras preguntas en las etiquetas