Michael Marzano / Mbed 2 deprecated Linear_Stepper_Motor_Nema17

Dependencies:   mbed

Committer:
mikermarza
Date:
Sun Apr 19 22:16:24 2020 +0000
Revision:
0:54c5be5f26f4
Child:
1:757a52db1604
Motor works for basic test program using BusOut.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mikermarza 0:54c5be5f26f4 1 /** Linear Stepper Motor control library
mikermarza 0:54c5be5f26f4 2 *
mikermarza 0:54c5be5f26f4 3 * @class LinStepMtr
mikermarza 0:54c5be5f26f4 4 * @author Mike Marzano
mikermarza 0:54c5be5f26f4 5 * @version 0.0 ()
mikermarza 0:54c5be5f26f4 6 *
mikermarza 0:54c5be5f26f4 7 * This is the driver for A Nema 17 linear stepper motor
mikermarza 0:54c5be5f26f4 8 *
mikermarza 0:54c5be5f26f4 9 * ----------------------IMPORTANT--------------------
mikermarza 0:54c5be5f26f4 10 *
mikermarza 0:54c5be5f26f4 11 * ---------------------------------------------------
mikermarza 0:54c5be5f26f4 12 */
mikermarza 0:54c5be5f26f4 13
mikermarza 0:54c5be5f26f4 14 #ifndef MBED_LIN_STEP_MTR
mikermarza 0:54c5be5f26f4 15 #define MBED_LIN_STEP_MTR
mikermarza 0:54c5be5f26f4 16
mikermarza 0:54c5be5f26f4 17 #include "mbed.h"
mikermarza 0:54c5be5f26f4 18 #include "rtos.h"
mikermarza 0:54c5be5f26f4 19
mikermarza 0:54c5be5f26f4 20
mikermarza 0:54c5be5f26f4 21
mikermarza 0:54c5be5f26f4 22 /**********
mikermarza 0:54c5be5f26f4 23 * Defines *
mikermarza 0:54c5be5f26f4 24 **********/
mikermarza 0:54c5be5f26f4 25 #define DEFAULT_SPEED 300 // RPM (1rpm = 3.333 steps/sec)
mikermarza 0:54c5be5f26f4 26 #define MAX_SPEED 400 // RPM
mikermarza 0:54c5be5f26f4 27 #define MIN_SPEED 150 // in RPM
mikermarza 0:54c5be5f26f4 28
mikermarza 0:54c5be5f26f4 29 /** Linear Stepper Motor control class
mikermarza 0:54c5be5f26f4 30 *
mikermarza 0:54c5be5f26f4 31 * Example:
mikermarza 0:54c5be5f26f4 32 * @code
mikermarza 0:54c5be5f26f4 33 * #include "mbed.h"
mikermarza 0:54c5be5f26f4 34 * #include "LinStepMtr.h"
mikermarza 0:54c5be5f26f4 35 *
mikermarza 0:54c5be5f26f4 36 *
mikermarza 0:54c5be5f26f4 37 * @endcode
mikermarza 0:54c5be5f26f4 38 */
mikermarza 0:54c5be5f26f4 39
mikermarza 0:54c5be5f26f4 40 class Step {
mikermarza 0:54c5be5f26f4 41 public:
mikermarza 0:54c5be5f26f4 42
mikermarza 0:54c5be5f26f4 43 private:
mikermarza 0:54c5be5f26f4 44
mikermarza 0:54c5be5f26f4 45 };
mikermarza 0:54c5be5f26f4 46
mikermarza 0:54c5be5f26f4 47 class LinStepMtr {
mikermarza 0:54c5be5f26f4 48
mikermarza 0:54c5be5f26f4 49 public:
mikermarza 0:54c5be5f26f4 50
mikermarza 0:54c5be5f26f4 51 /** Constants for motor rotate control */
mikermarza 0:54c5be5f26f4 52 typedef enum {
mikermarza 0:54c5be5f26f4 53 COIL_A_FOR = 0, // Forward Polarity in H-Bright Port A
mikermarza 0:54c5be5f26f4 54 COIL_B_FOR = 1, // Forward Polarity in H-Bright Port B
mikermarza 0:54c5be5f26f4 55 COIL_A_REV = 2, // Reverse Polarity in H-Bright Port A
mikermarza 0:54c5be5f26f4 56 COIL_B_REV = 3, // Reverse Polarity in H-Bright Port B
mikermarza 0:54c5be5f26f4 57 STOP_MOTOR = 4 // Turn Off Both Coils
mikermarza 0:54c5be5f26f4 58 } Polarity;
mikermarza 0:54c5be5f26f4 59
mikermarza 0:54c5be5f26f4 60 /** Direction Control **/
mikermarza 0:54c5be5f26f4 61 typedef enum {
mikermarza 0:54c5be5f26f4 62 CW = 0, // Motor is spinning in CLOCKWISE direction
mikermarza 0:54c5be5f26f4 63 CCW = 1, // Motor is spinning in COUNTER-CLOCKWISE direction
mikermarza 0:54c5be5f26f4 64 } Direction;
mikermarza 0:54c5be5f26f4 65
mikermarza 0:54c5be5f26f4 66 /** Steps of motor for movement *
mikermarza 0:54c5be5f26f4 67 * In form A B A' B' */
mikermarza 0:54c5be5f26f4 68 typedef enum {
mikermarza 0:54c5be5f26f4 69 STOP = 0b0000,
mikermarza 0:54c5be5f26f4 70 ONE = 0b1100,
mikermarza 0:54c5be5f26f4 71 TWO = 0b0110,
mikermarza 0:54c5be5f26f4 72 THREE = 0b0011,
mikermarza 0:54c5be5f26f4 73 FOUR = 0b1001
mikermarza 0:54c5be5f26f4 74 } Step_Num;
mikermarza 0:54c5be5f26f4 75
mikermarza 0:54c5be5f26f4 76 /** Create a linear stepper motor object connected to specified DigitalOut pins
mikermarza 0:54c5be5f26f4 77 *
mikermarza 0:54c5be5f26f4 78 * @param A_f DigitalOut pin for Forward Control of H-Brigde Port A (AIN1)
mikermarza 0:54c5be5f26f4 79 * @param A_r DigitalOut pin for Reverse Control of H-Brigde Port A (AIN2)
mikermarza 0:54c5be5f26f4 80 * @param B_f DigitalOut pin for Forward Control of H-Brigde Port B (BIN1)
mikermarza 0:54c5be5f26f4 81 * @param B_r DigitalOut pin for Reverse Control of H-Brigde Port B (BIN2)
mikermarza 0:54c5be5f26f4 82 */
mikermarza 0:54c5be5f26f4 83 LinStepMtr(PinName A_f, PinName A_r, PinName B_f, PinName B_r);
mikermarza 0:54c5be5f26f4 84
mikermarza 0:54c5be5f26f4 85 /** Create a linear stepper motor object connected to specified DigitalOut pins
mikermarza 0:54c5be5f26f4 86 *
mikermarza 0:54c5be5f26f4 87 * @param A_f DigitalOut pin for Forward Control of H-Brigde Port A (AIN1)
mikermarza 0:54c5be5f26f4 88 * @param A_r DigitalOut pin for Reverse Control of H-Brigde Port A (AIN2)
mikermarza 0:54c5be5f26f4 89 * @param B_f DigitalOut pin for Forward Control of H-Brigde Port B (BIN1)
mikermarza 0:54c5be5f26f4 90 * @param B_r DigitalOut pin for Reverse Control of H-Brigde Port B (BIN2)
mikermarza 0:54c5be5f26f4 91 * @param m_speed Sets the max speed in RPM of the motor
mikermarza 0:54c5be5f26f4 92 */
mikermarza 0:54c5be5f26f4 93 LinStepMtr(PinName A_f, PinName A_r, PinName B_f, PinName B_r, int m_speed);
mikermarza 0:54c5be5f26f4 94
mikermarza 0:54c5be5f26f4 95 /** Destructor
mikermarza 0:54c5be5f26f4 96 */
mikermarza 0:54c5be5f26f4 97 ~LinStepMtr();
mikermarza 0:54c5be5f26f4 98
mikermarza 0:54c5be5f26f4 99 /** Gets the current speed in RPM
mikermarza 0:54c5be5f26f4 100 *
mikermarza 0:54c5be5f26f4 101 */
mikermarza 0:54c5be5f26f4 102 float get_speed();
mikermarza 0:54c5be5f26f4 103
mikermarza 0:54c5be5f26f4 104 /** Sets the value of speed in RPM
mikermarza 0:54c5be5f26f4 105 */
mikermarza 0:54c5be5f26f4 106 //void set_speed(float f);
mikermarza 0:54c5be5f26f4 107
mikermarza 0:54c5be5f26f4 108 /** Gets the number of revolutions since motor was initialized.
mikermarza 0:54c5be5f26f4 109 * Positive means more CW than CCW movement, negative is opposite
mikermarza 0:54c5be5f26f4 110 */
mikermarza 0:54c5be5f26f4 111 double get_rev();
mikermarza 0:54c5be5f26f4 112
mikermarza 0:54c5be5f26f4 113
mikermarza 0:54c5be5f26f4 114 /** Gets the current direction
mikermarza 0:54c5be5f26f4 115 *
mikermarza 0:54c5be5f26f4 116 */
mikermarza 0:54c5be5f26f4 117 Direction get_dir();
mikermarza 0:54c5be5f26f4 118
mikermarza 0:54c5be5f26f4 119 /** Set the direction
mikermarza 0:54c5be5f26f4 120 *
mikermarza 0:54c5be5f26f4 121 */
mikermarza 0:54c5be5f26f4 122 //void set_dir(Direction d);
mikermarza 0:54c5be5f26f4 123
mikermarza 0:54c5be5f26f4 124 /** Initializes the rotate thread and sets parameters before you begin
mikermarza 0:54c5be5f26f4 125 *
mikermarza 0:54c5be5f26f4 126 */
mikermarza 0:54c5be5f26f4 127 void init(double rpm = DEFAULT_SPEED, Direction d=CW);
mikermarza 0:54c5be5f26f4 128
mikermarza 0:54c5be5f26f4 129 /** Ends possibility of motion
mikermarza 0:54c5be5f26f4 130 *
mikermarza 0:54c5be5f26f4 131 */
mikermarza 0:54c5be5f26f4 132 void end();
mikermarza 0:54c5be5f26f4 133
mikermarza 0:54c5be5f26f4 134 /** Rotates the motor for a set number of rotations
mikermarza 0:54c5be5f26f4 135 *
mikermarza 0:54c5be5f26f4 136 */
mikermarza 0:54c5be5f26f4 137 double rotate(float num_rev);
mikermarza 0:54c5be5f26f4 138
mikermarza 0:54c5be5f26f4 139 /** Starts continuous motion in the current direction
mikermarza 0:54c5be5f26f4 140 *
mikermarza 0:54c5be5f26f4 141 */
mikermarza 0:54c5be5f26f4 142 void start();
mikermarza 0:54c5be5f26f4 143
mikermarza 0:54c5be5f26f4 144 /** Stops continuous motion
mikermarza 0:54c5be5f26f4 145 *
mikermarza 0:54c5be5f26f4 146 */
mikermarza 0:54c5be5f26f4 147 void stop();
mikermarza 0:54c5be5f26f4 148
mikermarza 0:54c5be5f26f4 149 /** Changes the direction of motion
mikermarza 0:54c5be5f26f4 150 *
mikermarza 0:54c5be5f26f4 151 */
mikermarza 0:54c5be5f26f4 152 void change_dir(Direction d);
mikermarza 0:54c5be5f26f4 153
mikermarza 0:54c5be5f26f4 154 /** Changes the speed
mikermarza 0:54c5be5f26f4 155 *
mikermarza 0:54c5be5f26f4 156 */
mikermarza 0:54c5be5f26f4 157 void change_speed(float s);
mikermarza 0:54c5be5f26f4 158
mikermarza 0:54c5be5f26f4 159 /** Spins up the motor by stepping up from min speed to current speed
mikermarza 0:54c5be5f26f4 160 *
mikermarza 0:54c5be5f26f4 161 */
mikermarza 0:54c5be5f26f4 162 void spin_up();
mikermarza 0:54c5be5f26f4 163 void spin_up(double rpm);
mikermarza 0:54c5be5f26f4 164
mikermarza 0:54c5be5f26f4 165 /** Spins down the motor by stepping speed down from current speed to 0
mikermarza 0:54c5be5f26f4 166 *
mikermarza 0:54c5be5f26f4 167 */
mikermarza 0:54c5be5f26f4 168 void spin_down();
mikermarza 0:54c5be5f26f4 169 void spin_down(double rpm);
mikermarza 0:54c5be5f26f4 170
mikermarza 0:54c5be5f26f4 171
mikermarza 0:54c5be5f26f4 172
mikermarza 0:54c5be5f26f4 173
mikermarza 0:54c5be5f26f4 174
mikermarza 0:54c5be5f26f4 175 class Step {
mikermarza 0:54c5be5f26f4 176 public:
mikermarza 0:54c5be5f26f4 177 //constructior
mikermarza 0:54c5be5f26f4 178 Step() : cur_step(ONE) {}; // Step();
mikermarza 0:54c5be5f26f4 179
mikermarza 0:54c5be5f26f4 180 //increment step post incr operator
mikermarza 0:54c5be5f26f4 181 Step_Num operator++();
mikermarza 0:54c5be5f26f4 182 //decrement step post incr operator
mikermarza 0:54c5be5f26f4 183 Step_Num operator--();
mikermarza 0:54c5be5f26f4 184 //getter for cur_step
mikermarza 0:54c5be5f26f4 185 Step_Num get_cur_step();
mikermarza 0:54c5be5f26f4 186
mikermarza 0:54c5be5f26f4 187 private:
mikermarza 0:54c5be5f26f4 188 static const int step_one = 0b1100;
mikermarza 0:54c5be5f26f4 189 static const int step_two = 0b0110;
mikermarza 0:54c5be5f26f4 190 static const int step_three = 0b0011;
mikermarza 0:54c5be5f26f4 191 static const int step_four = 0b1001;
mikermarza 0:54c5be5f26f4 192 volatile Step_Num cur_step;
mikermarza 0:54c5be5f26f4 193
mikermarza 0:54c5be5f26f4 194 };
mikermarza 0:54c5be5f26f4 195 //private:
mikermarza 0:54c5be5f26f4 196
mikermarza 0:54c5be5f26f4 197 /** Continuously rotates the motor in the specified direction
mikermarza 0:54c5be5f26f4 198 * lives in it's own thread
mikermarza 0:54c5be5f26f4 199 */
mikermarza 0:54c5be5f26f4 200 void rotate();
mikermarza 0:54c5be5f26f4 201
mikermarza 0:54c5be5f26f4 202 /** Spins up the motor by stepping up from min speed to current speed
mikermarza 0:54c5be5f26f4 203 *
mikermarza 0:54c5be5f26f4 204 */
mikermarza 0:54c5be5f26f4 205 void spin_up(float rpm);
mikermarza 0:54c5be5f26f4 206
mikermarza 0:54c5be5f26f4 207 /** Spins down the motor by stepping speed down from current speed to 0
mikermarza 0:54c5be5f26f4 208 *
mikermarza 0:54c5be5f26f4 209 */
mikermarza 0:54c5be5f26f4 210 void spin_down(float rpm);
mikermarza 0:54c5be5f26f4 211
mikermarza 0:54c5be5f26f4 212 /** Variables **/
mikermarza 0:54c5be5f26f4 213 BusOut mtr_ctrl; // 4-bit Bus Controlling the H-Brigde
mikermarza 0:54c5be5f26f4 214 // form A B A' B'
mikermarza 0:54c5be5f26f4 215 const int max_speed; // Software Limit for max rpm in RPM
mikermarza 0:54c5be5f26f4 216 static const int min_speed = MIN_SPEED; // Software Limit for min rpm in RPM
mikermarza 0:54c5be5f26f4 217 volatile int speed; // Speed of Rotation (in steps per second)
mikermarza 0:54c5be5f26f4 218 volatile double rev_cnt; // Current Revolution of motor
mikermarza 0:54c5be5f26f4 219 Step cur_step; // Current Step, i.e. which one was just written to the motor
mikermarza 0:54c5be5f26f4 220 volatile Direction dir; // The direction for the motor to run
mikermarza 0:54c5be5f26f4 221
mikermarza 0:54c5be5f26f4 222 Thread rotate_th; // Thread to run the rotate function
mikermarza 0:54c5be5f26f4 223 volatile bool stop_mtr; // Flag for if motor should be off;
mikermarza 0:54c5be5f26f4 224 volatile bool terminate; // Flag for if the rotate function should stop executing
mikermarza 0:54c5be5f26f4 225
mikermarza 0:54c5be5f26f4 226 private:
mikermarza 0:54c5be5f26f4 227 volatile Polarity cur_state; // Current State of H-Brige Controls
mikermarza 0:54c5be5f26f4 228 };
mikermarza 0:54c5be5f26f4 229 #endif