Modified phase table in stepper.cpp to enable stepping a bipolar motor using a twin H-bridge driver.
Fork of stepper by
Corrected single-stepping, now walking up or down just one phase table. Compile-time options for driving bipolar motor in any of single-phase, two-phase, or half-stepping. Coils remain engaged at end of specifed movement command - de-energize coils by issuing a motor.move(0) while already stopped.
Diff: stepper.h
- Revision:
- 0:7b0c724fa658
- Child:
- 1:94f55ebfe2db
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/stepper.h Sat Aug 23 06:34:07 2014 +0000 @@ -0,0 +1,127 @@ +/* + * mbed library program + * Stepping Motor + * + * Copyright (c) 2014 Kenji Arai / JH1PJL + * http://www.page.sannet.ne.jp/kenjia/index.html + * http://mbed.org/users/kenjiArai/ + * Created: August 20th, 2014 + * Revised: August 23rd, 2014 + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE + * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef MBED_STEPPER +#define MBED_STEPPER + +#include "mbed.h" + +#define MT_SLOP_STEP 10 +#define MT_MIN_STEP (MT_SLOP_STEP+MT_SLOP_STEP) +#define MT_PLS_WIDTH_MIN 2 // 2mS + +/** Bipolar Type Stepping Motor Driver using 4 Outputs(DigitalOut) with timer interrupt(Ticker) + * + * Driver circuit: Low side driver (4ch for one Stepper) e.g. TD62003AP + * CAUTION: This is only for Unipolar Type Stepping Motor! + * Cannot use for Bipolar Type + * Plese refer http://en.wikipedia.org/wiki/Stepper_motor + * + * @code + * #include "mbed.h" + * #include "stepper.h" + * + * #define TIMEBASE 15000 // 15mS + * + * STEPPER sm(D5, D4, D3, D2); + * + * uint8_t pls_width[10] = {5, 4, 3, 2, 1, 1, 1, 1, 1, 1 }; + * + * int main() { + * sm_r.set_max_speed(TIMEBASE); + * sm.move(+100); + * while (sm.status){ ;} + * sm.move(-1000); + * wait(10); + * sm.move(0); + * while(true){;} + * } + * @endcode + */ + +class STEPPER { +public: + // Please copy following part in to your main.cpp + /** pulse width definition -> Use for start and stop phase + * = data * TIMEBASE -> e.g following data = 5 then 5*15000/1000 = 75mS + */ + //uint8_t pls_width[MT_SLOP_STEP] = {5, 4, 3, 2, 1, 1, 1, 1, 1, 1 }; + + /** Motor Status */ + enum MOTOR_STATE { M_STOP = 0, M_UP, M_CONTINUE, M_DOWN, M_CHANGE, M_UNKOWN = 0xff}; + + /** Configure data pin + * @param data SDA and SCL pins + */ + STEPPER (PinName xp, PinName xn, PinName yp, PinName yn); + + /** Move steps + * @param number of steps + * @return none + */ + void move (int32_t steps); + + /** Set time period (max speed of stepper) + * @param time: e.g. 10mS(=10000) -> 100 PPS(Puls per Sec) + * @return none + */ + void set_max_speed (uint32_t time_base_us); + + /** Check status + * @param none + * @return running(= 1), stopped(= 0) + */ + uint8_t status (void); + +protected: + // Rotation Direction + enum { D_CCW = -1, D_UNKOWN = 0, D_CW = 1}; + + typedef struct{ + int8_t direction; + uint32_t total_step; + } Motor_Inf; + + typedef struct{ + uint8_t state; + int8_t direction; + uint8_t up_cnt; + uint8_t up_cnt_keep; + uint8_t down_cnt; + uint8_t change_cnt; + uint8_t pls_width; + uint8_t ongoing; + uint32_t continue_cnt; + uint32_t motor_step; + } Motor_Control; + + DigitalOut _xp, _xn, _yp, _yn; + Ticker _smdrv; + + void init(); + void set4ports (uint32_t step, int8_t dir); + void setup_mtr_drv_dt(Motor_Inf *mi, Motor_Control *mt); + void millisec_inteval(); + +private: + uint8_t busy_sm_drv; + Motor_Inf inf; + Motor_Control cntl; + +}; + +#endif // MBED_STEPPER