Arduino y motor step

Saludos cordiales a toda la comunidad Arduino.

Les comento que soy nuevo en Arduino, pero si tengo conocimientos generales de electrónica.
Hace unos meses atrás empecé con “jugar” con la tarjeta Arduino Uno del tipo genérica probando varios circuitos de ejemplos que están en internet.
Lo último que realice es hacer funcionar un motor step con una driver TB6560 + Arduino uno, y me resulto.
Pero ahora al circuito le he agregado una mayor dificultada, mi idea es poder controlar la velocidad (RPM) por medio de un potenciómetro y además poder medir a través del puerto serie las RPM a través de un sensor de efecto hall, esto me resulto pero no como yo lo quería, detecte una anomalía.
La anomalía es que cuando activo la captura de los RPM por puerto serie (estando configurado a 115200 Baudios), detecto un pequeño corte o micropulso en el motor step, es como una pequeña “frenada” haciendo que los RPM no sean uniforme.
Al parecer que Arduino no es lo suficientemente rápido para procesar data a velocidades altas, no lo sé.
Por otro lado mi idea principal es poder hacer coincidir a través de un potenciómetro los RPM marcado en el potenciómetro y que sean corroborados por la captura a través del sensor de efecto hall y el puerto serie
El código que ocupe no es de mío, son dos códigos que tome de internet y los junte, tengo conocimiento básicos de programación, pero no estoy muy familiarizado con Arduino.

Si alguien me puede ayudar a mejorar el código o dar otras sugerencias, serán bienvenidas.

Gracias a todos

RPM_y_control_tb6550.ino (1.24 KB)

el loop de arduino, no tarda siempre lo mismo en ejecutarse, por tanto a parte del tiempo que pones de retraso leido del potenciometro estas agregando otro retraso variable, en el qeu hacer las lecturas, y divisiones de tu código, piensa que el arduino optimiza al maximo y no tarda lo mismo en dividir 50/2 que 1324564/365 por tanto cada loop en tu codigo es diferente

te recomiendo que leeas esto sobre los timers y sus interrupciones en arduino, y una vez entendido, la secuencia seria leer potenciometro, ajustar periodo de interrupción, calcular velocidad actúa, actualizar pantalla y volver a empezar, al funcionar los pulsos STEP por interrupciones, siempre serán a la frecuencia especificada, independientemente de lo que tarde el loop en completarse

Muchas gracias Go_zalo

Voy a leer sobre el tema y los tendré informados como me va.

Saludos

Encontré el siguiente código que genera distintos intervalos de tiempo representados en Led sin ocupar Delay.

Pero lo quise modificar sin muchos resultados, mi idea es poder hacer variar el o los tiempos que están asignados.

Simple Timer

This sketch is a simple way to execute functions at different time intervals.

class Timer
{
private:
unsigned long lastTime; // the latest time had doing Func( )
void (*Func) (void);
void (*backupFunc) (void); // backup Func for start( )
unsigned long T_int; // interval in ms, can be set as in us (optional)

public:
Timer(void (*userFunc)(), unsigned long T, int isTinUs=0)
{
Func = backupFunc = userFunc; // save the function pointer
T_int = T * 1000;
if(isTinUs !=0) T_int = T; // T is in micro second as per unit
lastTime = 0; // initialization should be in constructor
lastTime = -T_int; // compatible with Original version
}

void check()
{
if( Func == 0 ) return; // no function pointer
unsigned long _micros = micros( ); // Local variable could be in Register
// Note that ( _micros = micros() < Time) means ( _micros = ( micros() < Time ) )
// BTW, check roll over is actually NOT NECESSARY; by tsaiwn@cs.nctu.edu.tw
if (_micros - lastTime >= T_int)
{
lastTime = _micros; // latest time doing Func( )
Func();
}
}// check(
void start( ) { // first run of doing Func( )
if(Func == 0) Func = backupFunc; // restore after .stop( )
lastTime = micros( ); // latest time doing Func( )
Func(); // First run
} // start(
void stop( ) { // stop the scheduled Func (userFunc)
Func = 0; // set as NULL
} // stop(
};

Timer T1(Blink1, 88000, 38); // 88000us (NOT ms) since 38 is NOT 0
Timer T2(Blink2, 1000); // 1000ms
Timer T3(Blink3, 2000); // 2000ms

void setup()
{
// put your setup code here, to run once:
pinMode(13, OUTPUT);
pinMode(11, OUTPUT);
pinMode(9, OUTPUT);
T1.start( ) ; // optional to use the .start( ) function
delay(2568); // On Purpose for you to compare T1 vs. T2, T3
}

void loop()
{
// put your main code here, to run repeatedly:
T1.check();
T2.check();
T3.check();
}

void Blink1()
{
digitalWrite(13, !digitalRead(13));
}

void Blink2()
{
digitalWrite(9, !digitalRead(9));
}

void Blink3()
{
digitalWrite(11, !digitalRead(11));
}


Por ejemplo cree una llamada de función (disculpen la ignorancia, pero no sé si se llama así)
desde el "void loop" de esta forma:

void loop()
{
// put your main code here, to run repeatedly:

sensorValue =analogRead(sensorPin);
sensorValue= map(sensorValue,0,1023,3600,1);

T2.change_time(sensorValue, 0);

//Timer T2(Blink2, sensorValue);

T1.check();
T2.check();
T3.check();

}

y la función la puse antes de terminar el "class Timer"

void change_time(unsigned long T, int isTinUs=0)
{
//Func = backupFunc = userFunc; // save the function pointer
T_int = T * 1000;
if(isTinUs !=0) T_int = T; // T is in micro second as per unit
lastTime = 0; // initialization should be in constructor
lastTime = -T_int; // compatible with Original version
Serial.println(T);
}

Bueno en resumen no funciono, el led queda pegado mientras los otros led trabajan de acuerdo a los tiempos asignados, también quise llamar la clase Timer desde el Void loop y tampoco tuve resultados positivos.

Favor, me podrían indicar en que estoy equivocado?

De antemano, gracias

:confused: