Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of stepper by
stepper.h
00001 /* 00002 * mbed library program 00003 * Stepping Motor 00004 * 00005 * Copyright (c) 2014 Kenji Arai / JH1PJL 00006 * http://www.page.sannet.ne.jp/kenjia/index.html 00007 * http://mbed.org/users/kenjiArai/ 00008 * Created: August 20th, 2014 00009 * Revised: August 23rd, 2014 00010 * 00011 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 00012 * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE 00013 * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 00014 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 00015 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 00016 */ 00017 00018 #ifndef MBED_STEPPER 00019 #define MBED_STEPPER 00020 00021 #include "mbed.h" 00022 00023 #define MT_SLOP_STEP 10 00024 #define MT_MIN_STEP (MT_SLOP_STEP+MT_SLOP_STEP) 00025 #define MT_PLS_WIDTH_MIN 2 // 2mS 00026 00027 /** Unipolar Type Stepping Motor Driver using 4 Outputs(DigitalOut) with timer interrupt(Ticker) 00028 * 00029 * Driver circuit: Low side driver (4ch for one Stepper) e.g. TD62003AP 00030 * CAUTION: This is only for Unipolar Type Stepping Motor! 00031 * Cannot use for Bipolar Type 00032 * Plese refer http://en.wikipedia.org/wiki/Stepper_motor 00033 * 00034 * @code 00035 * #include "mbed.h" 00036 * #include "stepper.h" 00037 * 00038 * #define TIMEBASE 15000 // 15mS 00039 * 00040 * STEPPER sm(D5, D4, D3, D2); 00041 * 00042 * uint8_t pls_width[10] = {5, 4, 3, 2, 1, 1, 1, 1, 1, 1 }; 00043 * 00044 * int main() { 00045 * sm_r.set_max_speed(TIMEBASE); 00046 * sm.move(+100); 00047 * while (sm.status){ ;} 00048 * sm.move(-1000); 00049 * wait(10); 00050 * sm.move(0); 00051 * while(true){;} 00052 * } 00053 * @endcode 00054 */ 00055 00056 class STEPPER { 00057 public: 00058 // Please copy following pls_width[] part in to your main.cpp 00059 /** pulse width definition -> Use for start and stop phase 00060 * = data * TIMEBASE -> e.g following data = 5 then 5*15000/1000 = 75mS 00061 */ 00062 //uint8_t pls_width[MT_SLOP_STEP] = {5, 4, 3, 2, 1, 1, 1, 1, 1, 1 }; 00063 00064 /** Motor Status */ 00065 enum MOTOR_STATE { M_STOP = 0, M_UP, M_CONTINUE, M_DOWN, M_CHANGE, M_UNKOWN = 0xff}; 00066 00067 /** Configure data pin 00068 * @param data SDA and SCL pins 00069 */ 00070 STEPPER (PinName xp, PinName xn, PinName yp, PinName yn); 00071 00072 /** Move steps 00073 * @param number of steps 00074 * @return none 00075 */ 00076 void move (int32_t steps); 00077 00078 /** Set time period (max speed of stepper) 00079 * @param time: e.g. 10mS(=10000) -> 100 PPS(Puls per Sec) 00080 * @return none 00081 */ 00082 void set_max_speed (uint32_t time_base_us); 00083 00084 /** Check status 00085 * @param none 00086 * @return running(= 1), stopped(= 0) 00087 */ 00088 //surely other states can be returned too eg UP, CONTINUE, CHANGE, DOWN? 00089 uint8_t status (void); 00090 00091 /** De-energize coils 00092 * @param none 00093 * @return none 00094 */ 00095 void stop(); 00096 00097 00098 protected: 00099 // Rotation Direction 00100 enum { D_CCW = -1, D_UNKOWN = 0, D_CW = 1}; 00101 00102 typedef struct{ 00103 int8_t direction; 00104 uint32_t total_step; 00105 } Motor_Inf; 00106 00107 typedef struct{ 00108 uint8_t state; 00109 int8_t direction; 00110 uint8_t up_cnt; 00111 uint8_t up_cnt_keep; 00112 uint8_t down_cnt; 00113 uint8_t change_cnt; 00114 uint8_t pls_width; 00115 uint8_t ongoing; 00116 uint32_t continue_cnt; 00117 uint8_t motor_step; //keeps track of phase only, no need of uint32_t 00118 } Motor_Control; 00119 00120 DigitalOut _xp, _xn, _yp, _yn; 00121 Ticker _smdrv; 00122 00123 void set4ports (void); 00124 void setup_mtr_drv_dt(Motor_Inf *mi, Motor_Control *mt); 00125 void millisec_inteval(); 00126 00127 private: 00128 uint8_t busy_sm_drv; 00129 Motor_Inf inf; 00130 Motor_Control cntl; 00131 00132 }; 00133 00134 #endif // MBED_STEPPER
Generated on Thu Jul 14 2022 02:17:18 by
1.7.2
