entrada de 24 dientes para simular la salida 36

0

¿Puede alguien ayudarme con el código? Tengo una rueda de gatillo de 24 dientes. Cada diente está registrado por el sensor Hall y necesito que Arduino simule 36 salidas de pulsos de la entrada de 24 pulsos correspondiente.

Aquí está mi código con retrasos de microsegundos, pero no puedo usar los retrasos de microsegundos, porque Arduino no entiende un retardo de más de 16k micros.

const int  hall = 2;    // hall sensor
const int ledPin = 13;       // the pin that the LED is attached to

// Variables will change:
int teethCounter = 0;
int hallState = 0;
int lasthallState = 0;
long cycles=0;
boolean cycle = false;
unsigned long microsStart = 0;
unsigned long microsStop = 0;
unsigned long usElapsed = 0;
unsigned long usElapsedUp = 0;
unsigned long usInterval;


void setup() {
// initialize the button pin as a input:
pinMode(hall, INPUT);
// initialize the LED as an output:
pinMode(ledPin, OUTPUT);
// initialize serial communication:
Serial.begin(9600);
}


void loop() {
hallState = digitalRead(hall);
if(cycle==true){
microsStart=micros();
}
if(cycle==true){
usInterval = usElapsedUp/72;
for (int i=0; i <= 36; i++){
digitalWrite(13,HIGH);
delayMicroseconds(usInterval);
digitalWrite(13,LOW);
delayMicroseconds(usInterval);
cycle = false;
}
}

 // compare the hallState to its previous state
 if (hallState != lasthallState) {
 // if the state has changed, increment the counter
 if (hallState == HIGH) {
 teethCounter++;
 if(teethCounter==24){
 cycle = true;
 cycles++;
 teethCounter=0;
 usElapsedUp = usElapsed;

 }

 Serial.print("Tooth count: ");
Serial.print(teethCounter);
Serial.print(" Cycles: ");
Serial.print(cycles);
Serial.print(" Time: ");
Serial.print(usElapsedUp);
Serial.print(" Interval: ");
Serial.println(usInterval);
}
microsStop=micros();
usElapsed=microsStop-microsStart;
}
// save the current state as the last state,
//for next time through the loop

lasthallState = hallState;
}

¿Cómo puedo calcular y desde dónde puedo tomar los puntos de activación?

  If(event happens==true){
  digitalWrite(13,HIGH);
   }
  If(event happens==false){
  digitalWrite(13,LOW);
  }

    
pregunta Ralfs Volis

2 respuestas

1

simular este circuito : esquema creado usando CircuitLab

La duplicación de frecuencia es bastante fácil activando cada cambio de estado de la señal de entrada (a) durante un tiempo fijo que resulta en la forma de onda (b). Debería ser una codificación bastante trivial pasar esto a la salida, pero silenciar cada cuarto pulso para darle tres por cada dos entradas.

simular este circuito

Figura 2. Un reloj trifásico (a), (b) y (c) proporciona 72 pulsos / rev (d) que se pueden dividir en dos para dar 36 pulsos / rev.

Otra opción para obtener una sincronización precisa es utilizar tres sensores compensados por un número entero de dientes + 5 ° y + 10 ° (1/3 diente y 2/3 diente). Esto le dará 72 pulsos por revolución y puede dividir por dos para obtener 36 (e).

Le recomiendo que no use las funciones de retardo incorporadas. Tu código no puede hacer nada más mientras tanto. Cree temporizadores y verifique cada escaneo para ver si han transcurrido.

    
respondido por el Transistor
1

No estoy seguro de que necesites jugar con los pulsos. Como tienes un Arduino que recibe los pulsos, puedes crear cualquier pulso de salida que desees para cualquier revolución del engranaje.

  1. Cuente 24 (o cualquier número que desee) pulsos entrantes en el Arduino.
  2. Calcule el tiempo para una revolución, divídalo entre 36.
  3. Programe un temporizador para la frecuencia de pulso calculada.
  4. Salida de 36 pulsos a la velocidad calculada.

Esto emitiría pulsos a una tasa fija para cualquier rotación dada de la marcha, pero recalcularía la tasa para cada rotación.

Hay un retardo inherente de 24 pulsos antes de que comience a emitir a la nueva velocidad, pero dudo que esto afecte su aplicación.

Prueba el código y reporta.

    
respondido por el Jack Creasey

Lea otras preguntas en las etiquetas