From d1302e79fdd1b08861bec7307f0b47a7de8562b2 Mon Sep 17 00:00:00 2001 From: mattmcw Date: Sat, 13 Jan 2024 23:29:25 -0500 Subject: [PATCH] Sketch has been updated to do monitoring of multiple rotations, active monitoring of number of estimated frames. Currently not registering the first ~910 pulses (why??) --- ino/motor_encoder_poc/motor_encoder_poc.ino | 73 ++++++++++++++++----- 1 file changed, 55 insertions(+), 18 deletions(-) diff --git a/ino/motor_encoder_poc/motor_encoder_poc.ino b/ino/motor_encoder_poc/motor_encoder_poc.ino index 26c6455..9bcc2ab 100644 --- a/ino/motor_encoder_poc/motor_encoder_poc.ino +++ b/ino/motor_encoder_poc/motor_encoder_poc.ino @@ -25,17 +25,31 @@ #define MOTORA 10 #define MOTORB 11 -volatile int posi = 0; // specify posi as volatile -const long maxTime = 10000; +volatile int64_t posi = 0; // specify posi as volatile +const long maxTime = 100000; +const int maxRotations = 10; const int ppr = 11; -const float ratio = 62.0; +const float ratio = 62.0 / 1.0; const int maxPulses = (int) round((float) ppr * ratio); -const int speed = 40; +const int speed = 230; +const int framesPerRotation = 18; +const int pulsesPerFrame = (int) round((float) maxPulses / (float) framesPerRotation); volatile long start = 0; volatile bool done = false; volatile bool stop = false; volatile int incoming; volatile float rpm; +volatile int rotations = 0; +volatile int lastRotationPosition = 0; +volatile int lastFramePosition = 0; +volatile int frames = 0; + +float calculateFPS () { + +} +float calculateRPM (long rotationLength) { + return 60000.0 / (float) (rotationLength); +} void setup() { Serial.begin(57600); @@ -54,18 +68,14 @@ void setup() { Serial.println(ratio); Serial.print("Pulses: "); Serial.println(maxPulses); - + Serial.print("Frames per Rotation: "); + Serial.println(framesPerRotation); + Serial.print("Pulses per Frame: "); + Serial.println(pulsesPerFrame); } void loop() { - int pos; - if (Serial.available() > 0) { - incoming = Serial.read(); - start = -1; - posi = 0; - done = false; - stop = false; - } + int64_t pos; // Read the position in an atomic block to avoid a potential // misread if the interrupt coincides with this code running // see: https://www.arduino.cc/reference/en/language/variables/variable-scope-qualifiers/volatile/ @@ -74,7 +84,22 @@ void loop() { pos = posi; } - if (abs(pos) == maxPulses) { + if (pos != lastRotationPosition && abs(pos) % maxPulses == 0) { + lastRotationPosition = pos; + rotations++; + frames = rotations * framesPerRotation; + + } + if (pos != lastFramePosition && abs(pos) % pulsesPerFrame == 0) { + lastFramePosition = pos; + frames++; + Serial.print("Frames: "); + Serial.print(frames); + Serial.print("@"); + Serial.println(String(pos)); + } + + if (abs(pos) >= maxPulses * maxRotations) { stop = true; } if (start == -1) { @@ -82,18 +107,30 @@ void loop() { analogWrite(MOTORA, speed); digitalWrite(MOTORB, LOW); start = millis(); + rotations = 0; } else if ((stop || millis() - start >= maxTime) && !done) { digitalWrite(MOTORA, LOW); digitalWrite(MOTORB, LOW); - Serial.print("Final: "); + Serial.print("Final: "); Serial.println(pos); - Serial.print("Time: "); + Serial.print("Time: "); Serial.println(millis() - start); - rpm = (float) 60000 / (float) (millis() - start); - Serial.print("RPM: "); + rpm = calculateRPM(millis() - start) * (float) (rotations + 1); + Serial.print("RPM: "); Serial.println(rpm); + Serial.print("Rotations: "); + Serial.println(rotations + 1); + Serial.print("Frames: "); + Serial.println(frames); done = true; } + if (Serial.available() > 0) { + incoming = Serial.read(); + start = -1; + posi = 0; + done = false; + stop = false; + } } void readEncoder(){