Hola, estoy usando un codigo para calcular el periodo de una señal cuadrada para luego transformarlo en RPM. Funciona bien solamente que cuando no mando mas pulsos (o sea cuando no hay RPM) me muestra el ultimo valor que tuvo hasta que vuelve a tener, no vuelve a cero. Cual seria la solucion? Gracias
Mas alla del consejo de victorjam, la variable RPMN1 nunca la pones a cero antes de reactivar las interrupciones.
Esa simple práctica podría funcionar.
surbyte:
Mas alla del consejo de victorjam, la variable RPMN1 nunca la pones a cero antes de reactivar las interrupciones.
Esa simple práctica podría funcionar.
Por favor @ElEspanol basta con copiar a otra variable y operas como gustes.
El código esta limitado a presentar. Y yo lo plantee en ese contexto, si fuera parte de un PID consideraría otra alternativa. No descarto que el timeout sea mejor pero esto tambien puede funcionar.
No estoy del todo seguro, pero ten en cuenta que si el periodo es grande, hablando en términos de microsegundos, un long se puede desbordar y te dará valores negativos.
Eso te puede alterar el valor sobre todo a bajas revoluciones, donde el periodo es mayor.
Sigue sin funcionar, ahora cuando le pongo ese if para volver a cero deja de marcar rpm. Alguna otra sugerencia? Marca exacto las RPM pero no puedo hacer que se vuelva a cero cuando no hay pulsos.
Prueba este trozo de código a ver que resultado te da para medir RPM:
unsigned long tactual, tanterior;
unsinged long periodo;
int rpm;
float f;
void isr() {
tactual = micros();
periodo = tactual-tanterior;
tanterior = tactual;
}
void setup() {
Serial.begin(115200);
tactual=0;
tanterior=0;
attachInterrupt(0, isr, FALLING);
}
void loop() {
if ( periodo==0 ) f=0;
if ( micros() - tactual > 1000000 ) f=0;
else f= 1000000.0/periodo;
rpm = f*60;
Serial.println(rpm);
}
Como ves, basicamente mido el periodo en la interrupción y no hago nada en ella. En el loop simplemente lo utilizo.
No habilito/deshabilito las interrupciones, ni utilizo una bandera flag.