Hiroshi M / UniStepperMotor
Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers UniStepperMotor.cpp Source File

UniStepperMotor.cpp

00001 /**
00002  *****************************************************************************
00003  * File Name    : UniStepperMotor.cpp
00004  *
00005  * Title        : Unipolar Stepper Motor Class Source File
00006  * Revision     : 0.1
00007  * Notes        :
00008  * Target Board : mbed NXP LPC1768
00009  * Tool Chain   : ????
00010  *
00011  * Revision History:
00012  * When         Who         Description of change
00013  * -----------  ----------- -----------------------
00014  * 2012/07/8    Hiroshi M   init
00015  *****************************************************************************
00016  *
00017  * Copyright (C) 2012 Hiroshi M, MIT License
00018  *
00019  * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
00020  * and associated documentation files (the "Software"), to deal in the Software without restriction,
00021  * including without limitation the rights to use, copy, modify, merge, publish, distribute,
00022  * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
00023  * furnished to do so, subject to the following conditions:
00024  *
00025  * The above copyright notice and this permission notice shall be included in all copies or
00026  * substantial portions of the Software.
00027  *
00028  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
00029  * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
00030  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
00031  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
00032  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
00033  *
00034  **/
00035 
00036 /* Includes ----------------------------------------------------------------- */
00037 #include "UniStepperMotor.h"
00038 #include "mbed.h"
00039 
00040 /* Private typedef ---------------------------------------------------------- */
00041 /* Private define ----------------------------------------------------------- */
00042 /* Private macro ------------------------------------------------------------ */
00043 /* Private variables -------------------------------------------------------- */
00044 
00045 static uint8_t ptn_ClockWise_1x1[]     = {0x01, 0x02, 0x04, 0x08};
00046 static uint8_t ptn_AntiClockWise_1x1[] = {0x08, 0x04, 0x02, 0x01};
00047 
00048 static uint8_t ptn_ClockWise_2x2[]     = {0x03, 0x06, 0x0C, 0x09};
00049 static uint8_t ptn_AntiClockWise_2x2[] = {0x09, 0x0C, 0x06, 0x03};
00050 
00051 static uint8_t ptn_ClockWise_1x2[]     = {0x03, 0x02, 0x06, 0x04, 0x0C, 0x08, 0x09, 0x01};
00052 static uint8_t ptn_AntiClockWise_1x2[] = {0x01, 0x09, 0x08, 0x0C, 0x04, 0x06, 0x02, 0x03};
00053 
00054 #if MAXSPEED == 10
00055 static speed_data_t speed_data [] =
00056 {
00057     {  1,  0,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},   // 0
00058     {500,  4,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},   // 1 500*2 => 1000
00059     {250,  4,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},   // 2 250*2 => 500
00060     {166,  4,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},   // 3 166*2 => 332
00061     {125,  6,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},   // 4 125*2 => 250
00062     {100,  6,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},   // 5 100*2 => 200
00063     {167,  8,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},   // 6
00064     {143,  8,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},   // 7
00065     {125,  9,ptn_ClockWise_1x1,ptn_AntiClockWise_2x2,4},   // 8
00066     {111, 10,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},   // 9
00067     {100, 10,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4}    // 10
00068 };
00069 
00070 #elif MAXSPEED == 63
00071 static speed_data_t speed_data [] =
00072 {
00073     {1,0,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00074     {3150,2,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00075     {1575,3,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00076     {1050,3,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00077     {788,3,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00078     {630,3,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00079     {525,3,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00080     {450,3,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00081     {394,4,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00082     {350,4,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00083     {315,5,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00084     {286,5,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00085     {263,5,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00086     {242,5,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00087     {225,5,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00088     {210,5,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00089     {197,5,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00090     {185,6,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00091     {175,6,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00092     {166,6,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00093     {158,6,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00094     {150,6,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00095     {143,6,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00096     {137,6,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00097     {131,6,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00098     {126,6,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00099     {121,6,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00100     {233,7,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00101     {225,7,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00102     {217,7,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00103     {210,7,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00104     {203,7,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00105     {197,7,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00106     {191,7,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00107     {185,7,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00108     {180,7,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00109     {175,7,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00110     {170,8,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00111     {166,8,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00112     {162,8,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00113     {158,8,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00114     {154,8,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00115     {150,8,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00116     {147,8,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00117     {143,8,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00118     {140,8,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00119     {137,8,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00120     {134,9,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00121     {131,9,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00122     {129,9,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00123     {126,9,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00124     {124,9,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00125     {121,9,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00126     {119,9,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00127     {117,9,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00128     {115,10,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00129     {113,10,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00130     {111,10,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00131     {109,10,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00132     {107,10,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00133     {105,10,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00134     {103,10,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00135     {102,10,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00136     {100,10,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4}
00137 };
00138 
00139 #else
00140 static speed_data_t speed_data [] =
00141 {
00142     {1,0,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00143     {6400,3,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00144     {4267,3,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00145     {3200,3,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00146     {2560,3,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00147     {2134,3,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00148     {1829,3,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00149     {1600,3,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00150     {1422,3,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00151     {1280,3,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00152     {1164,3,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00153     {1067,3,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00154     {985,3,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00155     {915,3,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00156     {854,3,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00157     {800,3,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00158     {753,3,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00159     {711,3,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00160     {674,3,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00161     {640,3,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00162     {610,3,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00163     {582,3,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00164     {557,3,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00165     {534,3,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00166     {512,3,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00167     {493,3,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00168     {474,3,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00169     {457,3,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00170     {442,3,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00171     {427,3,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00172     {413,3,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00173     {400,3,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00174     {388,3,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00175     {377,3,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00176     {366,3,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00177     {356,3,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00178     {346,3,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00179     {337,3,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00180     {328,3,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00181     {320,3,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00182     {312,3,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00183     {305,3,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00184     {298,3,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00185     {291,4,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00186     {285,4,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00187     {279,4,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00188     {273,4,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00189     {267,4,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00190     {261,4,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00191     {256,4,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00192     {251,4,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00193     {246,4,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00194     {242,4,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00195     {237,4,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00196     {233,4,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00197     {229,4,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00198     {225,4,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00199     {221,4,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00200     {217,4,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00201     {214,4,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00202     {210,4,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00203     {207,4,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00204     {203,4,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00205     {200,4,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00206     {197,4,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00207     {194,4,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00208     {191,4,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00209     {188,4,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00210     {186,4,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00211     {183,4,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00212     {181,4,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00213     {178,4,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00214     {176,4,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00215     {173,4,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00216     {171,4,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00217     {169,4,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00218     {166,4,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00219     {164,4,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00220     {162,4,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00221     {160,4,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00222     {158,4,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00223     {156,4,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00224     {154,4,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00225     {153,5,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00226     {151,5,ptn_ClockWise_1x2,ptn_AntiClockWise_1x2,8},
00227     {298,5,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00228     {294,5,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00229     {291,5,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00230     {288,5,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00231     {284,5,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00232     {281,5,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00233     {278,5,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00234     {275,5,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00235     {272,5,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00236     {269,5,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00237     {267,5,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00238     {264,5,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00239     {261,5,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00240     {259,5,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00241     {256,5,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00242     {253,5,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00243     {251,5,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00244     {249,5,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00245     {246,5,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00246     {244,5,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00247     {242,5,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00248     {239,5,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00249     {237,5,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00250     {235,5,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00251     {233,5,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00252     {231,5,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00253     {229,5,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00254     {227,5,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00255     {225,5,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00256     {223,5,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00257     {221,5,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00258     {219,5,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00259     {217,5,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00260     {215,5,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00261     {213,5,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00262     {212,5,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00263     {210,5,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00264     {208,5,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00265     {206,5,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00266     {205,5,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00267     {203,5,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00268     {202,5,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00269     {200,6,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00270     {198,6,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00271     {197,6,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00272     {195,6,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00273     {194,6,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00274     {192,6,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00275     {191,6,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00276     {190,6,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00277     {188,6,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00278     {187,6,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00279     {186,6,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00280     {184,6,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00281     {183,6,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00282     {182,6,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00283     {180,6,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00284     {179,6,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00285     {178,6,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00286     {177,6,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00287     {175,6,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00288     {174,6,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00289     {173,6,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00290     {172,6,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00291     {171,6,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00292     {170,6,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00293     {168,6,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00294     {167,6,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00295     {166,6,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00296     {165,6,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00297     {164,6,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00298     {163,6,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00299     {162,6,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00300     {161,6,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00301     {160,6,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00302     {159,6,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00303     {158,6,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00304     {157,6,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00305     {156,6,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00306     {155,6,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00307     {154,6,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00308     {153,6,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00309     {152,7,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00310     {151,7,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00311     {151,7,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00312     {150,7,ptn_ClockWise_1x1,ptn_AntiClockWise_1x1,4},
00313     {149,7,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00314     {148,7,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00315     {147,7,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00316     {146,7,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00317     {145,7,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00318     {145,7,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00319     {144,7,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00320     {143,7,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00321     {142,7,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00322     {141,7,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00323     {141,7,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00324     {140,7,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00325     {139,7,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00326     {138,7,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00327     {138,7,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00328     {137,7,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00329     {136,7,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00330     {135,7,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00331     {135,7,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00332     {134,7,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00333     {133,7,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00334     {133,7,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00335     {132,7,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00336     {131,7,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00337     {131,7,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00338     {130,7,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00339     {129,7,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00340     {129,7,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00341     {128,7,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00342     {127,7,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00343     {127,7,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00344     {126,7,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00345     {125,7,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00346     {125,7,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00347     {124,7,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00348     {124,7,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00349     {123,7,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00350     {122,7,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00351     {122,8,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00352     {121,8,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00353     {121,8,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00354     {120,8,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00355     {120,8,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00356     {119,8,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00357     {119,8,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00358     {118,8,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00359     {117,8,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00360     {117,8,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00361     {116,8,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00362     {116,8,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00363     {115,8,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00364     {115,8,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00365     {114,8,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00366     {114,8,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00367     {113,8,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00368     {113,8,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00369     {112,8,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00370     {112,8,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00371     {111,8,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00372     {111,8,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00373     {110,8,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00374     {110,8,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00375     {109,8,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00376     {109,8,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00377     {108,8,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00378     {108,8,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00379     {108,8,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00380     {107,8,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00381     {107,8,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00382     {106,8,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00383     {106,8,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00384     {105,8,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00385     {105,8,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00386     {104,8,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00387     {104,8,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00388     {104,8,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00389     {103,8,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00390     {103,8,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00391     {102,8,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00392     {102,8,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00393     {102,8,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00394     {101,8,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00395     {101,8,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00396     {100,8,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4},
00397     {100,8,ptn_ClockWise_2x2,ptn_AntiClockWise_2x2,4}
00398 };
00399 #endif
00400 
00401 /* member fanctions --------------------------------------------------------- */
00402 
00403 // Constractor
00404 StepperMotor::StepperMotor(PinName x_pin_no, PinName y_pin_no, PinName nx_pin_no, PinName ny_pin_no, motor_dir set_direction)
00405     : _x(x_pin_no), _y(y_pin_no), _nx(nx_pin_no), _ny(ny_pin_no)
00406 {
00407     direction = forward_direction;
00408     forward_direction = set_direction;
00409     backward_direction = (forward_direction == CLOCK_WISE) ? ANTI_CLOCK_WISE : CLOCK_WISE;
00410 }
00411 
00412 //  Destrutctor
00413 StepperMotor::~StepperMotor()
00414 {
00415 }
00416 
00417 //
00418 void StepperMotor::PulseEnable(void)
00419 {
00420     Pulse.attach_us(this,&StepperMotor::SetPulse14us,PULSE_INTERVAL);
00421 }
00422 
00423 //
00424 void StepperMotor::PulseDisable(void)
00425 {
00426     Pulse.detach();
00427 }
00428 
00429 void StepperMotor::SetSpeed(int speed)
00430 {
00431     direction = (speed >= 0) ? forward_direction : backward_direction;
00432 
00433     speed = abs(speed);
00434     if (speed > MAXSPEED) speed = MAXSPEED;
00435 
00436     pwm_ratio = speed_data[speed].pwm_ratio;
00437     max_pulse_count = speed_data[speed].max_pulse_count;
00438 
00439     if (direction == CLOCK_WISE)
00440     {
00441         ptn = speed_data[speed].clockwise_ptn;
00442     }
00443     else
00444     {
00445         ptn = speed_data[speed].anticlockwise_ptn;
00446     }
00447     ptn_count = speed_data[speed].ptn_count;
00448 
00449     pulse_count = 0;
00450     ptn_index = 0;
00451 
00452     pwm_on_count = pwm_ratio;
00453     pwm_off_count = 10 - pwm_ratio;
00454 
00455     state = PWM_ON;
00456 }
00457 
00458 
00459 /* private functions */
00460 
00461 void StepperMotor::SetPulse14us(void)
00462 {
00463 
00464     if (++pulse_count == max_pulse_count)
00465     {
00466         pulse_count = 0;
00467 
00468         if (++ptn_index == ptn_count)
00469         {
00470             ptn_index = 0;
00471         }
00472         ptn_data = ptn[ptn_index];
00473     }
00474 
00475     if (pwm_ratio == 10)
00476     {
00477         PulseOut();
00478     }
00479     else if (pwm_ratio == 0)
00480     {
00481         PulseStop();
00482     }
00483     else
00484     {
00485         switch (state)
00486         {
00487         case PWM_ON:
00488             if (--pwm_on_count !=0)
00489             {
00490                 PulseOut();
00491             }
00492             else
00493             {
00494                 pwm_on_count = pwm_ratio;
00495                 state = PWM_OFF;
00496             }
00497             break;
00498         case PWM_OFF:
00499             if (--pwm_off_count != 0)
00500             {
00501                 PulseStop();
00502             }
00503             else
00504             {
00505                 pwm_off_count = 10 - pwm_ratio;
00506                 state = PWM_ON;
00507             }
00508             break;
00509         }
00510     }
00511 }
00512 
00513 void StepperMotor::PulseOut(void)
00514 {
00515     //X
00516     if ((ptn_data & 0x01) == 0x01)
00517     {
00518         _x = 1;
00519     }
00520     else
00521     {
00522         _x = 0;
00523     }
00524     //Y
00525     if ((ptn_data & 0x02) == 0x02)
00526     {
00527         _y = 1;
00528     }
00529     else
00530     {
00531         _y = 0;
00532     }
00533     //Negative X
00534     if ((ptn_data & 0x04) == 0x04)
00535     {
00536         _nx = 1;
00537     }
00538     else
00539     {
00540         _nx = 0;
00541     }
00542     //Negative Y
00543     if ((ptn_data & 0x08) == 0x08)
00544     {
00545         _ny = 1;
00546     }
00547     else
00548     {
00549         _ny = 0;
00550     }
00551 }
00552 
00553 void StepperMotor::PulseStop(void)
00554 {
00555     _x = 0;
00556     _y = 0;
00557     _nx = 0;
00558     _ny = 0;
00559 }