BeRTOS
|
00001 00024 #ifndef DRV_STEPPER_H 00025 #define DRV_STEPPER_H 00026 00027 #include <cfg/compiler.h> 00028 00029 #include <algo/ramp.h> 00030 00031 // Forward declaration 00032 struct Stepper; 00033 00035 #define STEPS_INFINITE_POSITIVE ((int16_t)0xFFFF) 00036 #define STEPS_INFINITE_NEGATIVE ((int16_t)0x8FFF) 00037 00039 #define MAX_STEPS 0x7FFF 00040 00042 #define MOTOR_NO_LEVEL_SENSOR 0xFFFF 00043 00045 #define MOTOR_NO_HOME_SENSOR 0xFFFF 00046 00048 #define DEAFSTEPS_DEFAULT MAX_STEPS 00049 00051 //\{ 00052 #define SPEED_STOPPED 0xFFFF ///< motor is stopped 00053 #define SPEED_HOMING 0xFFFE ///< motor is homing 00054 //\} 00055 00056 // default values for steps inside and outside home sensor 00057 #define MOTOR_INSIDE_HOME_STEPS 10 00058 #define MOTOR_OUTSIDE_HOME_STEPS 40 00059 00060 // default value for home sensor tolerance 00061 #define MOTOR_TOLERANCE_HOME_STEPS 2 00062 00063 // default value for consecutive error 00064 #define MOTOR_CONSECUTIVE_ERROR_STEPS 3 00065 00066 // values for the home control enabling 00067 enum MotorHomeSensorCheck 00068 { 00069 MOTOR_HOMESENSOR_NOCHECK = 0, 00070 MOTOR_HOMESENSOR_INCHECK, 00071 MOTOR_HOMESENSOR_OUTCHECK 00072 }; 00073 00074 // default value in ms for home procedure timeout 00075 #define MOTOR_TIMEOUT_HOME 20000 00076 00080 enum MotorDirection 00081 { 00082 DIR_POSITIVE = 1, 00083 DIR_NONE = 0, 00084 DIR_NEGATIVE = -1 00085 }; 00086 00087 #define STEPPER_MAX_STATES 32 00088 00089 00093 enum StepperState 00094 { 00095 MSTS_UNINIT, 00096 MSTS_RUN, 00097 MSTS_IDLE, 00098 MSTS_PREIDLE, 00099 MSTS_PRERUN, 00100 00101 // Home procedure 00102 MSTS_PREINIT, 00103 MSTS_INIT, 00104 MSTS_ENTERING, 00105 MSTS_LEAVING, 00106 MSTS_OUTHOME, 00107 00108 MSTS_ERROR, 00109 00111 MSTS_DUMMY_ALIGN = STEPPER_MAX_STATES - 1 00112 }; 00113 00115 typedef enum StepperState (*fsm_state)(struct Stepper* ); 00116 00118 typedef void (*stepper_isr_t)(struct Stepper* ); 00119 00121 typedef uint16_t stepper_time_t; 00122 00126 struct StepperConfig 00127 { 00128 struct Ramp ramp; 00129 uint16_t pulse; 00130 00131 fsm_state states[STEPPER_MAX_STATES]; 00132 00133 int16_t stepsInHome; 00134 int16_t stepsOutHome; 00135 uint16_t clocksHome; 00136 00137 int16_t stepsTollOutHome; 00138 int16_t stepsTollInHome; 00139 00140 int16_t timeoutHome; 00141 00142 uint8_t powerRun; 00143 uint8_t powerIdle; 00144 00145 uint16_t homeSensorIndex; 00146 uint16_t levelSensorIndex; 00147 00148 struct 00149 { 00150 bool homeInverted : 1; 00151 bool halfStep : 1; 00152 bool axisInverted : 1; 00153 bool levelInverted : 1; 00154 bool controlBit : 1; 00155 bool controlMoveBit : 1; 00156 bool highcurrentBit : 1; 00157 } flags; 00158 }; 00159 00160 00164 struct Stepper 00165 { 00166 const struct StepperConfig *cfg; 00167 fsm_state state; 00168 00169 struct TimerCounter *timer; 00170 uint16_t index; 00171 00172 volatile int16_t step; 00173 volatile int16_t rampStep; 00174 #if RAMP_USE_FLOATING_POINT 00175 float rampValue; 00176 float rampClock; 00177 #else 00178 uint16_t rampValue; 00179 uint32_t rampClock; 00180 #endif 00181 00182 enum MotorDirection dir; 00183 uint8_t power; 00184 00185 uint16_t speed; 00186 int16_t stepToReach; 00187 00188 int16_t skipIrqs; 00189 int16_t changeCurrentIrqs; 00190 00191 int8_t enableCheckHome; 00192 int8_t stepsErrorHome; 00193 int16_t stepsTollMax; 00194 int16_t stepsTollMin; 00195 00196 int16_t stepsDeaf; 00197 int16_t stepsLevel; 00198 00199 int16_t stepCircular; 00200 }; 00201 00202 00203 void stepper_init(void); 00204 void stepper_end(void); 00205 struct Stepper *stepper_setup(int index, struct StepperConfig *cfg); 00206 void stepper_disable(void); 00207 void stepper_reset(struct Stepper *motor); 00208 void stepper_home(struct Stepper *motor); 00209 void stepper_setStep(struct Stepper *motor, int16_t step); 00210 int16_t stepper_getStep(struct Stepper *motor); 00211 int16_t stepper_move(struct Stepper *motor, int16_t step, uint16_t speed, int16_t deafstep); 00212 void stepper_stop(struct Stepper *motor); 00213 void stepper_break(struct Stepper *motor, enum StepperState state); 00214 bool stepper_idle(struct Stepper *motor); 00215 bool stepper_readHome(struct Stepper *motor); 00216 bool stepper_readLevel(struct Stepper *motor); 00217 void stepper_updateHalfStep(struct Stepper *motor); 00218 void stepper_updateControlBit(struct Stepper *motor); 00219 void stepper_updateControlMoveBit(struct Stepper *motor); 00220 bool stepper_error(struct Stepper *motor); 00221 bool stepper_inhome(struct Stepper *motor); 00222 int16_t stepper_getLevelStep(struct Stepper *motor); 00223 void stepper_set_stepCircular(struct Stepper *motor, int16_t steps); 00224 int16_t stepper_get_stepCircular(struct Stepper *motor); 00225 int16_t stepper_scaleSteps(struct Stepper *motor, int16_t dir); 00226 00227 #endif /* DRV_STEPPER_H */