Slightly altered version of Arduino OneStep
This library is specific to the ST L6474 stepper driver.
Diff: OneStep.h
- Revision:
- 0:92e1b5622620
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OneStep.h Wed Sep 02 15:43:40 2015 +0000 @@ -0,0 +1,801 @@ +/** + * @file OneStep.h + * + * @author Jon Buckman + * + * @section LICENSE + * + * Copyright (c) 2014 Jon Buckman + * + * Copyright (C) 2009-2013 Mike McCauley + * $Id: AccelStepper.cpp,v 1.19 2014/10/31 06:05:27 mikem Exp mikem $ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * @section DESCRIPTION + * + * OneStep stepper motor accelerate and manipulate. + * + * Datasheet: + * + * + * + * Example: + * @code + * #include "mbed.h" + * #include "OneStep.h" + * + * Serial pc(USBTX, USBRX); // tx, rx + * + * OneStep stepper(D11, D12, D13, D10, D9, D7, D8, D2); // mosi, miso, sck, nCS_(cs), step, direction, reset, flag + * + * int main() { + * while(1) + * { + * if (stepper.distanceToGo() == 0) + * { + * // Random change to speed, position and acceleration + * // Make sure we dont get 0 speed or accelerations + * wait_us(1000); + * stepper.moveTo(rand() % 200); + * stepper.setMaxSpeed((rand() % 200) + 1); + * stepper.setAcceleration((rand() % 200) + 1); + * if(stepper.getAlarm() == 0) { + * pc.printf("alarm\r\n"); + * } + * } + * stepper.run(); + * } + * } + * @endcode + */ + +#ifndef ONESTEP_H +#define ONESTEP_H + +/** + * Includes + */ +#include <mbed.h> + +/** + * Defines + */ +#define min(a,b) ((a)<(b)?(a):(b)) +#define max(a,b) ((a)>(b)?(a):(b)) +#define abs(x) ((x)>0?(x):-(x)) +#define constrain(amt,low,high) ((amt)<(low)?(low):((amt)>(high)?(high):(amt))) +#define round(x) ((x)>=0?(long)((x)+0.5):(long)((x)-0.5)) +#define radians(deg) ((deg)*DEG_TO_RAD) +#define degrees(rad) ((rad)*RAD_TO_DEG) +#define sq(x) ((x)*(x)) + +/** + * @brief easySPIN Init structure definition + */ +typedef struct { + uint32_t ABS_POS; + uint16_t EL_POS; + uint32_t MARK; + uint8_t TVAL; + uint8_t T_FAST; + uint8_t TON_MIN; + uint8_t TOFF_MIN; + uint8_t ADC_OUT; + uint8_t OCD_TH; + uint8_t STEP_MODE; + uint8_t ALARM_EN; + uint16_t CONFIG; +} RegsStruct_TypeDef; + +/* easySPIN TVAL register options */ +typedef enum { + TVAL_31_25mA = ((uint8_t) 0x00), + TVAL_62_5mA = ((uint8_t) 0x01), + TVAL_93_75mA = ((uint8_t) 0x02), + TVAL_125mA = ((uint8_t) 0x03), + TVAL_156_25mA = ((uint8_t) 0x04), + TVAL_187_5mA = ((uint8_t) 0x05), + TVAL_218_75mA = ((uint8_t) 0x06), + TVAL_250mA = ((uint8_t) 0x07), + TVAL_281_25mA = ((uint8_t) 0x08), + TVAL_312_5mA = ((uint8_t) 0x09), + TVAL_343_75mA = ((uint8_t) 0x0A), + TVAL_375mA = ((uint8_t) 0x0B), + TVAL_406_25mA = ((uint8_t) 0x0C), + TVAL_437_5mA = ((uint8_t) 0x0D), + TVAL_468_75mA = ((uint8_t) 0x0E), + TVAL_500mA = ((uint8_t) 0x0F), + TVAL_531_25mA = ((uint8_t) 0x10), + TVAL_562_5mA = ((uint8_t) 0x11), + TVAL_593_75mA = ((uint8_t) 0x12), + TVAL_625mA = ((uint8_t) 0x13), + TVAL_656_25mA = ((uint8_t) 0x14), + TVAL_687_5mA = ((uint8_t) 0x15), + TVAL_718_75mA = ((uint8_t) 0x16), + TVAL_750mA = ((uint8_t) 0x17), + TVAL_781_25mA = ((uint8_t) 0x18), + TVAL_812_5mA = ((uint8_t) 0x19), + TVAL_843_75mA = ((uint8_t) 0x1A), + TVAL_875mA = ((uint8_t) 0x1B), + TVAL_906_25mA = ((uint8_t) 0x1C), + TVAL_937_5mA = ((uint8_t) 0x1D), + TVAL_968_75mA = ((uint8_t) 0x1E), + TVAL_1000mA = ((uint8_t) 0x1F), + TVAL_1031_25mA = ((uint8_t) 0x20), + TVAL_1062_5mA = ((uint8_t) 0x21), + TVAL_1093_75mA = ((uint8_t) 0x22), + TVAL_1125mA = ((uint8_t) 0x23), + TVAL_1156_25mA = ((uint8_t) 0x24), + TVAL_1187_5mA = ((uint8_t) 0x25), + TVAL_1218_75mA = ((uint8_t) 0x26), + TVAL_1250mA = ((uint8_t) 0x27), + TVAL_1281_25mA = ((uint8_t) 0x28), + TVAL_1312_5mA = ((uint8_t) 0x29), + TVAL_1343_75mA = ((uint8_t) 0x2A), + TVAL_1375mA = ((uint8_t) 0x2B), + TVAL_1406_25mA = ((uint8_t) 0x2C), + TVAL_1437_5mA = ((uint8_t) 0x2D), + TVAL_1468_75mA = ((uint8_t) 0x2E), + TVAL_1500mA = ((uint8_t) 0x2F), + TVAL_1531_25mA = ((uint8_t) 0x30), + TVAL_1562_5mA = ((uint8_t) 0x31), + TVAL_1593_75mA = ((uint8_t) 0x32), + TVAL_1625mA = ((uint8_t) 0x33), + TVAL_1656_25mA = ((uint8_t) 0x34), + TVAL_1687_5mA = ((uint8_t) 0x35), + TVAL_1718_75mA = ((uint8_t) 0x36), + TVAL_1750mA = ((uint8_t) 0x37), + TVAL_1781_25mA = ((uint8_t) 0x38), + TVAL_1812_5mA = ((uint8_t) 0x39), + TVAL_1843_75mA = ((uint8_t) 0x3A), + TVAL_1875mA = ((uint8_t) 0x3B), + TVAL_1906_25mA = ((uint8_t) 0x3C), + TVAL_1937_5mA = ((uint8_t) 0x3D), + TVAL_1968_75mA = ((uint8_t) 0x3E), + TVAL_2000mA = ((uint8_t) 0x3F), + TVAL_2031_25mA = ((uint8_t) 0x40), + TVAL_2062_5mA = ((uint8_t) 0x41), + TVAL_2093_75mA = ((uint8_t) 0x42), + TVAL_2125mA = ((uint8_t) 0x43), + TVAL_2156_25mA = ((uint8_t) 0x44), + TVAL_2187_5mA = ((uint8_t) 0x45), + TVAL_2218_75mA = ((uint8_t) 0x46), + TVAL_2250mA = ((uint8_t) 0x47), + TVAL_2281_25mA = ((uint8_t) 0x48), + TVAL_2312_5mA = ((uint8_t) 0x49), + TVAL_2343_75mA = ((uint8_t) 0x4A), + TVAL_2375mA = ((uint8_t) 0x4B), + TVAL_2406_25mA = ((uint8_t) 0x4C), + TVAL_2437_5mA = ((uint8_t) 0x4D), + TVAL_2468_75mA = ((uint8_t) 0x4E), + TVAL_2500mA = ((uint8_t) 0x4F), + TVAL_2531_25mA = ((uint8_t) 0x50), + TVAL_2562_5mA = ((uint8_t) 0x51), + TVAL_2593_75mA = ((uint8_t) 0x52), + TVAL_2625mA = ((uint8_t) 0x53), + TVAL_2656_25mA = ((uint8_t) 0x54), + TVAL_2687_5mA = ((uint8_t) 0x55), + TVAL_2718_75mA = ((uint8_t) 0x56), + TVAL_2750mA = ((uint8_t) 0x57), + TVAL_2781_25mA = ((uint8_t) 0x58), + TVAL_2812_5mA = ((uint8_t) 0x59), + TVAL_2843_75mA = ((uint8_t) 0x5A), + TVAL_2875mA = ((uint8_t) 0x5B), + TVAL_2906_25mA = ((uint8_t) 0x5C), + TVAL_2937_5mA = ((uint8_t) 0x5D), + TVAL_2968_75mA = ((uint8_t) 0x5E), + TVAL_3000mA = ((uint8_t) 0x5F), + TVAL_3031_25mA = ((uint8_t) 0x60), + TVAL_3062_5mA = ((uint8_t) 0x61), + TVAL_3093_75mA = ((uint8_t) 0x62), + TVAL_3125mA = ((uint8_t) 0x63), + TVAL_3156_25mA = ((uint8_t) 0x64), + TVAL_3187_5mA = ((uint8_t) 0x65), + TVAL_3218_75mA = ((uint8_t) 0x66), + TVAL_3250mA = ((uint8_t) 0x67), + TVAL_3281_25mA = ((uint8_t) 0x68), + TVAL_3312_5mA = ((uint8_t) 0x69), + TVAL_3343_75mA = ((uint8_t) 0x6A), + TVAL_3375mA = ((uint8_t) 0x6B), + TVAL_3406_25mA = ((uint8_t) 0x6C), + TVAL_3437_5mA = ((uint8_t) 0x6D), + TVAL_3468_75mA = ((uint8_t) 0x6E), + TVAL_3500mA = ((uint8_t) 0x6F), + TVAL_3531_25mA = ((uint8_t) 0x70), + TVAL_3562_5mA = ((uint8_t) 0x71), + TVAL_3593_75mA = ((uint8_t) 0x72), + TVAL_3625mA = ((uint8_t) 0x73), + TVAL_3656_25mA = ((uint8_t) 0x74), + TVAL_3687_5mA = ((uint8_t) 0x75), + TVAL_3718_75mA = ((uint8_t) 0x76), + TVAL_3750mA = ((uint8_t) 0x77), + TVAL_3781_25mA = ((uint8_t) 0x78), + TVAL_3812_5mA = ((uint8_t) 0x79), + TVAL_3843_75mA = ((uint8_t) 0x7A), + TVAL_3875mA = ((uint8_t) 0x7B), + TVAL_3906_25mA = ((uint8_t) 0x7C), + TVAL_3937_5mA = ((uint8_t) 0x7D), + TVAL_3968_75mA = ((uint8_t) 0x7E), + TVAL_4000mA = ((uint8_t) 0x7F) +} TVAL_TypeDef; + +/* easySPIN T_FAST register options */ +typedef enum { + TOFF_FAST_0_5_us = ((uint8_t) 0x00 << 4), + TOFF_FAST_1_0_us = ((uint8_t) 0x01 << 4), + TOFF_FAST_1_5_us = ((uint8_t) 0x02 << 4), + TOFF_FAST_2_0_us = ((uint8_t) 0x03 << 4), + TOFF_FAST_2_5_us = ((uint8_t) 0x04 << 4), + TOFF_FAST_3_0_us = ((uint8_t) 0x05 << 4), + TOFF_FAST_3_5_us = ((uint8_t) 0x06 << 4), + TOFF_FAST_4_0_us = ((uint8_t) 0x07 << 4), + TOFF_FAST_4_5_us = ((uint8_t) 0x08 << 4), + TOFF_FAST_5_0_us = ((uint8_t) 0x09 << 4), + TOFF_FAST_5_5_us = ((uint8_t) 0x0A << 4), + TOFF_FAST_6_0_us = ((uint8_t) 0x0B << 4), + TOFF_FAST_6_5_us = ((uint8_t) 0x0C << 4), + TOFF_FAST_7_0_us = ((uint8_t) 0x0D << 4), + TOFF_FAST_7_5_us = ((uint8_t) 0x0E << 4), + TOFF_FAST_8_0_us = ((uint8_t) 0x0F << 4) +} TOFF_FAST_TypeDef; + +typedef enum { + FAST_STEP_0_5_us = ((uint8_t) 0x00), + FAST_STEP_1_0_us = ((uint8_t) 0x01), + FAST_STEP_1_5_us = ((uint8_t) 0x02), + FAST_STEP_2_0_us = ((uint8_t) 0x03), + FAST_STEP_2_5_us = ((uint8_t) 0x04), + FAST_STEP_3_0_us = ((uint8_t) 0x05), + FAST_STEP_3_5_us = ((uint8_t) 0x06), + FAST_STEP_4_0_us = ((uint8_t) 0x07), + FAST_STEP_4_5_us = ((uint8_t) 0x08), + FAST_STEP_5_0_us = ((uint8_t) 0x09), + FAST_STEP_5_5_us = ((uint8_t) 0x0A), + FAST_STEP_6_0_us = ((uint8_t) 0x0B), + FAST_STEP_6_5_us = ((uint8_t) 0x0C), + FAST_STEP_7_0_us = ((uint8_t) 0x0D), + FAST_STEP_7_5_us = ((uint8_t) 0x0E), + FAST_STEP_8_0_us = ((uint8_t) 0x0F) +} FAST_STEP_TypeDef; + +/* easySPIN overcurrent threshold options */ +typedef enum { + OCD_TH_375mA = ((uint8_t) 0x00), + OCD_TH_750mA = ((uint8_t) 0x01), + OCD_TH_1125mA = ((uint8_t) 0x02), + OCD_TH_1500mA = ((uint8_t) 0x03), + OCD_TH_1875mA = ((uint8_t) 0x04), + OCD_TH_2250mA = ((uint8_t) 0x05), + OCD_TH_2625mA = ((uint8_t) 0x06), + OCD_TH_3000mA = ((uint8_t) 0x07), + OCD_TH_3375mA = ((uint8_t) 0x08), + OCD_TH_3750mA = ((uint8_t) 0x09), + OCD_TH_4125mA = ((uint8_t) 0x0A), + OCD_TH_4500mA = ((uint8_t) 0x0B), + OCD_TH_4875mA = ((uint8_t) 0x0C), + OCD_TH_5250mA = ((uint8_t) 0x0D), + OCD_TH_5625mA = ((uint8_t) 0x0E), + OCD_TH_6000mA = ((uint8_t) 0x0F) +} OCD_TH_TypeDef; + +/* easySPIN STEP_MODE register masks */ +typedef enum { + STEP_MODE_STEP_SEL = ((uint8_t) 0x07), + STEP_MODE_SYNC_SEL = ((uint8_t) 0x70) +} STEP_MODE_Masks_TypeDef; + +/* easySPIN STEP_MODE register options */ +/* easySPIN STEP_SEL options */ +typedef enum { + STEP_SEL_1 = ((uint8_t) 0x08), + STEP_SEL_1_2 = ((uint8_t) 0x09), + STEP_SEL_1_4 = ((uint8_t) 0x0A), + STEP_SEL_1_8 = ((uint8_t) 0x0B), + STEP_SEL_1_16 = ((uint8_t) 0x0C) +} STEP_SEL_TypeDef; + +/* easySPIN SYNC_SEL options */ +typedef enum { + SYNC_SEL_1_2 = ((uint8_t) 0x80), + SYNC_SEL_1 = ((uint8_t) 0x90), + SYNC_SEL_2 = ((uint8_t) 0xA0), + SYNC_SEL_4 = ((uint8_t) 0xB0), + SYNC_SEL_8 = ((uint8_t) 0xC0), + SYNC_SEL_UNUSED = ((uint8_t) 0xD0) +} SYNC_SEL_TypeDef; + +/* easySPIN ALARM_EN register options */ +typedef enum { + ALARM_EN_OVERCURRENT = ((uint8_t) 0x01), + ALARM_EN_THERMAL_SHUTDOWN = ((uint8_t) 0x02), + ALARM_EN_THERMAL_WARNING = ((uint8_t) 0x04), + ALARM_EN_UNDERVOLTAGE = ((uint8_t) 0x08), + ALARM_EN_SW_TURN_ON = ((uint8_t) 0x40), + ALARM_EN_WRONG_NPERF_CMD = ((uint8_t) 0x80) +} ALARM_EN_TypeDef; + +/* easySPIN Config register masks */ +typedef enum { + CONFIG_OSC_SEL = ((uint16_t) 0x0007), + CONFIG_EXT_CLK = ((uint16_t) 0x0008), + CONFIG_EN_TQREG = ((uint16_t) 0x0020), + CONFIG_OC_SD = ((uint16_t) 0x0080), + CONFIG_POW_SR = ((uint16_t) 0x0300), + CONFIG_TSW = ((uint16_t) 0x7C00) +} CONFIG_Masks_TypeDef; + +/* easySPIN Config register options */ +typedef enum { + CONFIG_INT_16MHZ = ((uint16_t) 0x0000), + CONFIG_INT_16MHZ_OSCOUT_2MHZ = ((uint16_t) 0x0008), + CONFIG_INT_16MHZ_OSCOUT_4MHZ = ((uint16_t) 0x0009), + CONFIG_INT_16MHZ_OSCOUT_8MHZ = ((uint16_t) 0x000A), + CONFIG_INT_16MHZ_OSCOUT_16MHZ = ((uint16_t) 0x000B), + CONFIG_EXT_8MHZ_XTAL_DRIVE = ((uint16_t) 0x0004), + CONFIG_EXT_16MHZ_XTAL_DRIVE = ((uint16_t) 0x0005), + CONFIG_EXT_24MHZ_XTAL_DRIVE = ((uint16_t) 0x0006), + CONFIG_EXT_32MHZ_XTAL_DRIVE = ((uint16_t) 0x0007), + CONFIG_EXT_8MHZ_OSCOUT_INVERT = ((uint16_t) 0x000C), + CONFIG_EXT_16MHZ_OSCOUT_INVERT = ((uint16_t) 0x000D), + CONFIG_EXT_24MHZ_OSCOUT_INVERT = ((uint16_t) 0x000E), + CONFIG_EXT_32MHZ_OSCOUT_INVERT = ((uint16_t) 0x000F) +} CONFIG_OSC_MGMT_TypeDef; + +typedef enum { + CONFIG_EN_TQREG_INT_REG = ((uint16_t) 0x0000), + CONFIG_EN_TQREG_ADC_IN = ((uint16_t) 0x0020) +} CONFIG_EN_TQREG_TypeDef; + +typedef enum { + CONFIG_OC_SD_DISABLE = ((uint16_t) 0x0000), + CONFIG_OC_SD_ENABLE = ((uint16_t) 0x0080) +} CONFIG_OC_SD_TypeDef; + +typedef enum { + CONFIG_SR_180V_us = ((uint16_t) 0x0000), + CONFIG_SR_290V_us = ((uint16_t) 0x0200), + CONFIG_SR_530V_us = ((uint16_t) 0x0300) +} CONFIG_POW_SR_TypeDef; + +typedef enum { + CONFIG_TSW_4_us = (((uint16_t) 0x01) << 10), + CONFIG_TSW_8_us = (((uint16_t) 0x02) << 10), + CONFIG_TSW_12_us = (((uint16_t) 0x03) << 10), + CONFIG_TSW_16_us = (((uint16_t) 0x04) << 10), + CONFIG_TSW_20_us = (((uint16_t) 0x05) << 10), + CONFIG_TSW_24_us = (((uint16_t) 0x06) << 10), + CONFIG_TSW_28_us = (((uint16_t) 0x07) << 10), + CONFIG_TSW_32_us = (((uint16_t) 0x08) << 10), + CONFIG_TSW_36_us = (((uint16_t) 0x09) << 10), + CONFIG_TSW_40_us = (((uint16_t) 0x0A) << 10), + CONFIG_TSW_44_us = (((uint16_t) 0x0B) << 10), + CONFIG_TSW_48_us = (((uint16_t) 0x0C) << 10), + CONFIG_TSW_52_us = (((uint16_t) 0x0D) << 10), + CONFIG_TSW_56_us = (((uint16_t) 0x0E) << 10), + CONFIG_TSW_60_us = (((uint16_t) 0x0F) << 10), + CONFIG_TSW_64_us = (((uint16_t) 0x10) << 10), + CONFIG_TSW_68_us = (((uint16_t) 0x11) << 10), + CONFIG_TSW_72_us = (((uint16_t) 0x12) << 10), + CONFIG_TSW_76_us = (((uint16_t) 0x13) << 10), + CONFIG_TSW_80_us = (((uint16_t) 0x14) << 10), + CONFIG_TSW_84_us = (((uint16_t) 0x15) << 10), + CONFIG_TSW_88_us = (((uint16_t) 0x16) << 10), + CONFIG_TSW_92_us = (((uint16_t) 0x17) << 10), + CONFIG_TSW_96_us = (((uint16_t) 0x18) << 10), + CONFIG_TSW_100_us = (((uint16_t) 0x19) << 10), + CONFIG_TSW_104_us = (((uint16_t) 0x1A) << 10), + CONFIG_TSW_108_us = (((uint16_t) 0x1B) << 10), + CONFIG_TSW_112_us = (((uint16_t) 0x1C) << 10), + CONFIG_TSW_116_us = (((uint16_t) 0x1D) << 10), + CONFIG_TSW_120_us = (((uint16_t) 0x1E) << 10), + CONFIG_TSW_124_us = (((uint16_t) 0x1F) << 10) +} CONFIG_TSW_TypeDef; + +/* Status Register bit masks */ +typedef enum { + STATUS_HIZ = (((uint16_t) 0x0001)), + STATUS_DIR = (((uint16_t) 0x0010)), + STATUS_NOTPERF_CMD = (((uint16_t) 0x0080)), + STATUS_WRONG_CMD = (((uint16_t) 0x0100)), + STATUS_UVLO = (((uint16_t) 0x0200)), + STATUS_TH_WRN = (((uint16_t) 0x0400)), + STATUS_TH_SD = (((uint16_t) 0x0800)), + STATUS_OCD = (((uint16_t) 0x1000)) +} STATUS_Masks_TypeDef; + +/* Status Register options */ +typedef enum { + STATUS_DIR_FORWARD = (((uint16_t) 0x0001) << 4), + STATUS_DIR_REVERSE = (((uint16_t) 0x0000) << 4) +} STATUS_DIR_TypeDef; + +/* easySPIN internal register addresses */ +typedef enum { + ABS_POS = ((uint8_t) 0x01), + EL_POS = ((uint8_t) 0x02), + MARK = ((uint8_t) 0x03), + RESERVED_REG01 = ((uint8_t) 0x04), + RESERVED_REG02 = ((uint8_t) 0x05), + RESERVED_REG03 = ((uint8_t) 0x06), + RESERVED_REG04 = ((uint8_t) 0x07), + RESERVED_REG05 = ((uint8_t) 0x08), + RESERVED_REG06 = ((uint8_t) 0x15), + TVAL = ((uint8_t) 0x09), + RESERVED_REG07 = ((uint8_t) 0x0A), + RESERVED_REG08 = ((uint8_t) 0x0B), + RESERVED_REG09 = ((uint8_t) 0x0C), + RESERVED_REG10 = ((uint8_t) 0x0D), + T_FAST = ((uint8_t) 0x0E), + TON_MIN = ((uint8_t) 0x0F), + TOFF_MIN = ((uint8_t) 0x10), + RESERVED_REG11 = ((uint8_t) 0x11), + ADC_OUT = ((uint8_t) 0x12), + OCD_TH = ((uint8_t) 0x13), + RESERVED_REG12 = ((uint8_t) 0x14), + STEP_MODE = ((uint8_t) 0x16), + ALARM_EN = ((uint8_t) 0x17), + CONFIG = ((uint8_t) 0x18), + STATUS = ((uint8_t) 0x19), + RESERVED_REG13 = ((uint8_t) 0x1A), + RESERVED_REG14 = ((uint8_t) 0x1B) +} Registers_TypeDef; + +/* easySPIN command set */ +typedef enum { + NOP = ((uint8_t) 0x00), + SET_PARAM = ((uint8_t) 0x00), + GET_PARAM = ((uint8_t) 0x20), + ENBL = ((uint8_t) 0xB8), + DSBL = ((uint8_t) 0xA8), + GET_STATUS = ((uint8_t) 0xD0), + RESERVED_CMD1 = ((uint8_t) 0xEB), + RESERVED_CMD2 = ((uint8_t) 0xF8) +} Commands_TypeDef; + +/* easySPIN movement direction options */ +typedef enum { + DIR_Forward = ((uint8_t) 0x01), DIR_Reverse = ((uint8_t) 0x00) +} Direction_TypeDef; + +/* easySPIN action options */ +typedef enum { + ACTION_RESET = ((uint8_t) 0x00), ACTION_COPY = ((uint8_t) 0x01) +} Action_TypeDef; + +/** + * OneStep stepper motor accelerate and manipulate. + */ +class OneStep { + +public: + + /** + * Constructor. + * + * @param step mbed pin to use for stepper motor interface. + * @param direction mbed pin to use for stepper motor interface. + * @param enable mbed pin to use for stepper motor interface. + */ + OneStep(PinName mosi, + PinName miso, + PinName sck, + PinName csn, + PinName step, + PinName dir, + PinName reset, + PinName flag); + + /** + * No operation. + * + */ + void nop(void); + + /** + * Enable driver + * + */ + void enable(void); + + /** + * Disable driver + * + */ + void disable(void); + + /** + * Move to a position. + * + * @param parameter Parameter. + * @param length The length of the parameter. + * @param value The value of the parameter. + */ + void set_param(char parameter, int length, int value); + + /** + * Get parameter value. + * + * @param parameter Parameter. + * @param length The length of the parameter. + * @return Returns parameter. + */ + int get_param(char parameter, int length); + + /** + * Get status. + * + * @return Returns status word. + */ + int get_status(void); + + /** + * Move to a position. + * + * @param absolute Absolute step count. + */ + void moveTo(long absolute); + + /** + * Move to a position relative to the current position. + * + * @param relative Relative step count. + */ + void move(long relative); + + /** + * Implements steps according to the current step interval. + * + * @return Returns true if a step occurred. + */ + bool runSpeed(); + + /** + * Get distance yet to go. + * + * @return The distance count. + */ + long distanceToGo(); + + /** + * Get target position. + * + * @return The target position count. + */ + long targetPosition(); + + /** + * Get current position. + * + * @return The current position count. + */ + long currentPosition(); + + /** + * Set current position to a count. Set speed to 0. + * + * @param position The count at the current position. + */ + void setCurrentPosition(long position); + + /** + * Calculate the new speed. + * + */ + void computeNewSpeed(); + + /** + * Run the motor to implement speed and acceleration in order to proceed to the target position. + * + * @return Returns true if the motor is still running to the target position. + */ + bool run(); + + /** + * Step once. + * + */ + void step(); + + /** + * Set the max speed. + * + * @param speed Speed maximum. + */ + void setMaxSpeed(float speed); + + /** + * Set the acceleration. + * + * @param acceleration Acceleration. + */ + void setAcceleration(float acceleration); + + /** + * Set the speed. + * + * @param speed Speed. + */ + void setSpeed(float speed); + + /** + * Get current speed. + * + * @return The speed. + */ + float speed(); + + /** + * Set the minimum pulse width. + * + * @param minWidth MinWidth pulse width. + */ + void setMinPulseWidth(unsigned int minWidth); + + /** + * System reset enable. + * + */ + void enableReset(); + + /** + * System reset disable. + * + */ + void disableReset(); + + /** + * Blocks until the target position is reached and stopped. + * + */ + void runToPosition(); + + /** + * Run at speed to a position. + * + * @return The run speed. + */ + bool runSpeedToPosition(); + + /** + * Blocks until the new target position is reached. + * + * @param position Position. + */ + void runToNewPosition(long position); + + /** + * Stop run to position. + * + */ + void stop(); + + /** + * Get the alarm flag state. + * + * @return The alarm flag state. + */ + int getAlarm(); + +protected: + + /** + * Symbolic names for the direction the motor is turning. + * + */ + typedef enum + { + DIRECTION_CCW = 0, ///< Clockwise + DIRECTION_CW = 1 ///< Counter-Clockwise + } Direction; + +private: + + /** + * The current absolution position in steps. + * + */ + long _currentPos; // Steps + + /** + * The current interval between steps in microseconds. + * 0 means the motor is currently stopped with _speed == 0 + * + */ + unsigned long _stepInterval; + + /** + * The last step time in microseconds. + * + */ + unsigned long _lastStepTime; + + /** + * The minimum allowed pulse width in microseconds. + * + */ + unsigned int _minPulseWidth; + + /** + * The target position in steps. The AccelStepper library will move the + * motor from the _currentPos to the _targetPos, taking into account the + * max speed, acceleration and deceleration. + * + */ + long _targetPos; // Steps + + /** + * The current motos speed in steps per second. + * Positive is clockwise. + * + */ + float _speed; // Steps per second + + /** + * The acceleration to use to accelerate or decelerate the motor in steps + * per second per second. Must be > 0. + * + */ + float _acceleration; + float _sqrt_twoa; // Precomputed sqrt(2*_acceleration) + + /** + * The maximum permitted speed in steps per second. Must be > 0. + * + */ + float _maxSpeed; + + /** + * Min step size in microseconds based on maxSpeed. + * + */ + float _cmin; // at max speed + + /** + * Initial step size in microseconds. + * + */ + float _c0; + + /** + * Last step size in microseconds. + * + */ + float _cn; + + /** + * The step counter for speed calculations. + * + */ + long _n; + + /** + * Current direction motor is spinning in. + * + */ + bool _direction; // 1 == CW + + SPI spi_; + Timer t_; + DigitalOut nCS_; + DigitalOut step_; + DigitalOut dir_; + DigitalOut reset_; + DigitalIn flag_; +}; + +#endif \ No newline at end of file