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??)
This commit is contained in:
parent
82fbd4af33
commit
d1302e79fd
|
@ -25,17 +25,31 @@
|
||||||
#define MOTORA 10
|
#define MOTORA 10
|
||||||
#define MOTORB 11
|
#define MOTORB 11
|
||||||
|
|
||||||
volatile int posi = 0; // specify posi as volatile
|
volatile int64_t posi = 0; // specify posi as volatile
|
||||||
const long maxTime = 10000;
|
const long maxTime = 100000;
|
||||||
|
const int maxRotations = 10;
|
||||||
const int ppr = 11;
|
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 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 long start = 0;
|
||||||
volatile bool done = false;
|
volatile bool done = false;
|
||||||
volatile bool stop = false;
|
volatile bool stop = false;
|
||||||
volatile int incoming;
|
volatile int incoming;
|
||||||
volatile float rpm;
|
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() {
|
void setup() {
|
||||||
Serial.begin(57600);
|
Serial.begin(57600);
|
||||||
|
@ -54,18 +68,14 @@ void setup() {
|
||||||
Serial.println(ratio);
|
Serial.println(ratio);
|
||||||
Serial.print("Pulses: ");
|
Serial.print("Pulses: ");
|
||||||
Serial.println(maxPulses);
|
Serial.println(maxPulses);
|
||||||
|
Serial.print("Frames per Rotation: ");
|
||||||
|
Serial.println(framesPerRotation);
|
||||||
|
Serial.print("Pulses per Frame: ");
|
||||||
|
Serial.println(pulsesPerFrame);
|
||||||
}
|
}
|
||||||
|
|
||||||
void loop() {
|
void loop() {
|
||||||
int pos;
|
int64_t pos;
|
||||||
if (Serial.available() > 0) {
|
|
||||||
incoming = Serial.read();
|
|
||||||
start = -1;
|
|
||||||
posi = 0;
|
|
||||||
done = false;
|
|
||||||
stop = false;
|
|
||||||
}
|
|
||||||
// Read the position in an atomic block to avoid a potential
|
// Read the position in an atomic block to avoid a potential
|
||||||
// misread if the interrupt coincides with this code running
|
// misread if the interrupt coincides with this code running
|
||||||
// see: https://www.arduino.cc/reference/en/language/variables/variable-scope-qualifiers/volatile/
|
// see: https://www.arduino.cc/reference/en/language/variables/variable-scope-qualifiers/volatile/
|
||||||
|
@ -74,7 +84,22 @@ void loop() {
|
||||||
pos = posi;
|
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;
|
stop = true;
|
||||||
}
|
}
|
||||||
if (start == -1) {
|
if (start == -1) {
|
||||||
|
@ -82,18 +107,30 @@ void loop() {
|
||||||
analogWrite(MOTORA, speed);
|
analogWrite(MOTORA, speed);
|
||||||
digitalWrite(MOTORB, LOW);
|
digitalWrite(MOTORB, LOW);
|
||||||
start = millis();
|
start = millis();
|
||||||
|
rotations = 0;
|
||||||
} else if ((stop || millis() - start >= maxTime) && !done) {
|
} else if ((stop || millis() - start >= maxTime) && !done) {
|
||||||
digitalWrite(MOTORA, LOW);
|
digitalWrite(MOTORA, LOW);
|
||||||
digitalWrite(MOTORB, LOW);
|
digitalWrite(MOTORB, LOW);
|
||||||
Serial.print("Final: ");
|
Serial.print("Final: ");
|
||||||
Serial.println(pos);
|
Serial.println(pos);
|
||||||
Serial.print("Time: ");
|
Serial.print("Time: ");
|
||||||
Serial.println(millis() - start);
|
Serial.println(millis() - start);
|
||||||
rpm = (float) 60000 / (float) (millis() - start);
|
rpm = calculateRPM(millis() - start) * (float) (rotations + 1);
|
||||||
Serial.print("RPM: ");
|
Serial.print("RPM: ");
|
||||||
Serial.println(rpm);
|
Serial.println(rpm);
|
||||||
|
Serial.print("Rotations: ");
|
||||||
|
Serial.println(rotations + 1);
|
||||||
|
Serial.print("Frames: ");
|
||||||
|
Serial.println(frames);
|
||||||
done = true;
|
done = true;
|
||||||
}
|
}
|
||||||
|
if (Serial.available() > 0) {
|
||||||
|
incoming = Serial.read();
|
||||||
|
start = -1;
|
||||||
|
posi = 0;
|
||||||
|
done = false;
|
||||||
|
stop = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void readEncoder(){
|
void readEncoder(){
|
||||||
|
|
Loading…
Reference in New Issue