muy bien, analizando la respuesta de KILLERJC
void holdHalfCycle(double speedRPS) {
long holdTime_us = (long)( 1.0 / ( (double) stepsInFullRound / speedRPS / 2.0 ) * 1E6);
int overflowCount = holdTime_us / 65535;
for (int i = 0; i < overflowCount; i++) {
delayMicroseconds(65535);
}
delayMicroseconds((unsigned int) holdTime_us);
}
segun zator
http://www.zator.com/Cpp/E2_2_4.htm1: un double tiene 8 bytes 64 bits y el dominio de operacion es 2.23e-308 <= |X| <= 1.79e308, Precisión científica (15-dígitos),
2: un long tiene 4 bytes 32 bits y el dominio de operacion es -2,147,483,648 <= X <= 2,147,483,647
segun lo anterior el parametro speedRPS los valores logicos irian entre [0 y 1.79e308], no tiene sentido ingresar valores negativos, ademas C++ no permite restringir positivamente un double como UNSIGNED LONG
segun entiendo el motor NEMA17 en giro completo requiere 200 pasos, ya que el paso es de 1.8 grados * 200 = 360 grados es decir 1 vuelta, en el codigo original, la variable stepsInFullRound se define con valor 400 por que el micropaso se definio como HALF
const int stepsInFullRound = 400; // half stepping
digitalWrite(DRIVER8825_MODE0_PIN, HIGH); // 1
digitalWrite(DRIVER8825_MODE1_PIN, LOW); // 0
digitalWrite(DRIVER8825_MODE2_PIN, LOW); // 0
Con los valores anteriores y speedRPS=6, expresando la sentencia long holdTime_us = (long)(1.0 / (double) stepsInFullRound / speedRPS / 2.0 * 1E6); como funcion matematica
f(speedRPS,stepsInFullRound)=integerPart(1E6/(speedRPS*stepsInFullRound))
f(6,400)=integerPart(1E6/(speedRPS*stepsInFullRound)) => 208.333333333 => 208
ahora
int overflowCount = holdTime_us / 65535;
208/(2^16-1) => 0.00317 => 0
el ciclo for no se efectúa
for (int i = 0; i < overflowCount; i++) {
delayMicroseconds(65535);
}
solo la siguiente sentencia
delayMicroseconds((unsigned int) holdTime_us);
delayMicroseconds(208) // 208us = 0.000208s
es correcto este calculo?
ahora si speedRPS = 0.019
f(0.019,400) = 65789.4736842 => 65789
65789/(2^16-1) => 1.00387579156 => 1
el ciclo for se efectua una sola vez y hace un retardo de delayMicroseconds(65535); 65535us
mas
delayMicroseconds(65789) // 65789us
en total 131324us verdad? esto es 0.131324s