From 600c2a6bedc2e1028ce33b9a5ad0c68c4153aca3 Mon Sep 17 00:00:00 2001 From: Edgar Bonet Date: Mon, 3 Feb 2025 15:03:40 +0100 Subject: [PATCH] Simplify Stepper::stepMotor() Instead of separately coding each step, use the fact that all pins follow the same periodic pattern, with phase shifts between them. For the 5-pin steppers, hard-code the pattern in a PROGMEM array, as this is cheaper than reducing a number modulo 10 on chips lacking a hardware divider. --- src/Stepper.cpp | 143 ++++++++---------------------------------------- 1 file changed, 22 insertions(+), 121 deletions(-) diff --git a/src/Stepper.cpp b/src/Stepper.cpp index 148de03..4d2f360 100644 --- a/src/Stepper.cpp +++ b/src/Stepper.cpp @@ -233,128 +233,29 @@ void Stepper::step(int steps_to_move) */ void Stepper::stepMotor(int thisStep) { - if (this->pin_count == 2) { - switch (thisStep) { - case 0: // 01 - digitalWrite(motor_pin_1, LOW); - digitalWrite(motor_pin_2, HIGH); - break; - case 1: // 11 - digitalWrite(motor_pin_1, HIGH); - digitalWrite(motor_pin_2, HIGH); - break; - case 2: // 10 - digitalWrite(motor_pin_1, HIGH); - digitalWrite(motor_pin_2, LOW); - break; - case 3: // 00 - digitalWrite(motor_pin_1, LOW); - digitalWrite(motor_pin_2, LOW); - break; - } - } - if (this->pin_count == 4) { - switch (thisStep) { - case 0: // 1010 - digitalWrite(motor_pin_1, HIGH); - digitalWrite(motor_pin_2, LOW); - digitalWrite(motor_pin_3, HIGH); - digitalWrite(motor_pin_4, LOW); - break; - case 1: // 0110 - digitalWrite(motor_pin_1, LOW); - digitalWrite(motor_pin_2, HIGH); - digitalWrite(motor_pin_3, HIGH); - digitalWrite(motor_pin_4, LOW); - break; - case 2: //0101 - digitalWrite(motor_pin_1, LOW); - digitalWrite(motor_pin_2, HIGH); - digitalWrite(motor_pin_3, LOW); - digitalWrite(motor_pin_4, HIGH); - break; - case 3: //1001 - digitalWrite(motor_pin_1, HIGH); - digitalWrite(motor_pin_2, LOW); - digitalWrite(motor_pin_3, LOW); - digitalWrite(motor_pin_4, HIGH); - break; - } - } + static PROGMEM const uint8_t phases[] = { + LOW, LOW, LOW, LOW, HIGH, HIGH, HIGH, HIGH, HIGH, + LOW, LOW, LOW, LOW, LOW, HIGH, HIGH, HIGH, HIGH + }; - if (this->pin_count == 5) { - switch (thisStep) { - case 0: // 01101 - digitalWrite(motor_pin_1, LOW); - digitalWrite(motor_pin_2, HIGH); - digitalWrite(motor_pin_3, HIGH); - digitalWrite(motor_pin_4, LOW); - digitalWrite(motor_pin_5, HIGH); - break; - case 1: // 01001 - digitalWrite(motor_pin_1, LOW); - digitalWrite(motor_pin_2, HIGH); - digitalWrite(motor_pin_3, LOW); - digitalWrite(motor_pin_4, LOW); - digitalWrite(motor_pin_5, HIGH); - break; - case 2: // 01011 - digitalWrite(motor_pin_1, LOW); - digitalWrite(motor_pin_2, HIGH); - digitalWrite(motor_pin_3, LOW); - digitalWrite(motor_pin_4, HIGH); - digitalWrite(motor_pin_5, HIGH); - break; - case 3: // 01010 - digitalWrite(motor_pin_1, LOW); - digitalWrite(motor_pin_2, HIGH); - digitalWrite(motor_pin_3, LOW); - digitalWrite(motor_pin_4, HIGH); - digitalWrite(motor_pin_5, LOW); - break; - case 4: // 11010 - digitalWrite(motor_pin_1, HIGH); - digitalWrite(motor_pin_2, HIGH); - digitalWrite(motor_pin_3, LOW); - digitalWrite(motor_pin_4, HIGH); - digitalWrite(motor_pin_5, LOW); - break; - case 5: // 10010 - digitalWrite(motor_pin_1, HIGH); - digitalWrite(motor_pin_2, LOW); - digitalWrite(motor_pin_3, LOW); - digitalWrite(motor_pin_4, HIGH); - digitalWrite(motor_pin_5, LOW); - break; - case 6: // 10110 - digitalWrite(motor_pin_1, HIGH); - digitalWrite(motor_pin_2, LOW); - digitalWrite(motor_pin_3, HIGH); - digitalWrite(motor_pin_4, HIGH); - digitalWrite(motor_pin_5, LOW); - break; - case 7: // 10100 - digitalWrite(motor_pin_1, HIGH); - digitalWrite(motor_pin_2, LOW); - digitalWrite(motor_pin_3, HIGH); - digitalWrite(motor_pin_4, LOW); - digitalWrite(motor_pin_5, LOW); - break; - case 8: // 10101 - digitalWrite(motor_pin_1, HIGH); - digitalWrite(motor_pin_2, LOW); - digitalWrite(motor_pin_3, HIGH); - digitalWrite(motor_pin_4, LOW); - digitalWrite(motor_pin_5, HIGH); - break; - case 9: // 00101 - digitalWrite(motor_pin_1, LOW); - digitalWrite(motor_pin_2, LOW); - digitalWrite(motor_pin_3, HIGH); - digitalWrite(motor_pin_4, LOW); - digitalWrite(motor_pin_5, HIGH); - break; - } + switch (pin_count) { + case 2: + digitalWrite(motor_pin_1, (thisStep+1) & 2); + digitalWrite(motor_pin_2, (thisStep+2) & 2); + break; + case 4: + digitalWrite(motor_pin_4, (thisStep+0) & 2); + digitalWrite(motor_pin_2, (thisStep+1) & 2); + digitalWrite(motor_pin_3, (thisStep+2) & 2); + digitalWrite(motor_pin_1, (thisStep+3) & 2); + break; + case 5: + digitalWrite(motor_pin_1, pgm_read_byte(&phases[thisStep+0])); + digitalWrite(motor_pin_4, pgm_read_byte(&phases[thisStep+2])); + digitalWrite(motor_pin_2, pgm_read_byte(&phases[thisStep+4])); + digitalWrite(motor_pin_5, pgm_read_byte(&phases[thisStep+6])); + digitalWrite(motor_pin_3, pgm_read_byte(&phases[thisStep+8])); + break; } }