Library for STMicroelectronics dSPIN L6470 stepper driver. "daisy-chain" supported.

Dependents:   L6470_daisy_chain l6470

L6470SDC.h

Committer:
Yajirushi
Date:
2015-05-30
Revision:
0:e1964b6e160c
Child:
1:db64ad30b4b3

File content as of revision 0:e1964b6e160c:

#include "mbed.h"

#ifndef L6470SDC_H
#define L6470SDC_H

//デバッグモード(GetParamやSetParamの値をシリアル出力する)
//ONにするとそれなりに動作が遅くなる
//デバッグモードOFF:コメントアウトする
//#define DEBUG_L6470SDC

//L6470のSPI通信のクロック周波数(1MHz以上、5MHz未満であること)
#define L6470_SPI_FREQ 4960000

#define CMD_NOP 0x0
#define CMD_SETPARAM 0x00
#define CMD_GETPARAM 0x20
#define CMD_RUN_PLUS 0x51
#define CMD_RUN_MINUS 0x50
#define CMD_STEP_PLUS 0x59
#define CMD_STEP_MINUS 0x58
#define CMD_ADDSTEP_PLUS 0x41
#define CMD_ADDSTEP_MINUS 0x40
#define CMD_GOTO 0x60
#define CMD_GOTO_DIR_PLUS 0x69
#define CMD_GOTO_DIR_MINUS 0x68
#define CMD_GO_UNTIL_PLUS 0x83
#define CMD_GO_UNTIL_MINUS 0x82
#define CMD_RELEASE_SW_PLUS 0x93
#define CMD_RELEASE_SW_MINUS 0x92
#define CMD_GO_HOME 0x70
#define CMD_GO_MARK 0x78
#define CMD_RESET_POS 0xD8
#define CMD_RESET_DEVICE 0xC0
#define CMD_SOFT_STOP 0xB0
#define CMD_HARD_STOP 0xB8
#define CMD_SOFT_HIZ 0xA0
#define CMD_HARD_HIZ 0xA8
#define CMD_GET_STATUS 0xD0

#define REG_NOTHING 0x0
#define REG_ABS_POS 0x01
#define REG_EL_POS 0x02
#define REG_MARK 0x03
#define REG_SPEED 0x04
#define REG_ACC 0x05
#define REG_DEC 0x06
#define REG_MAX_SPEED 0x07
#define REG_MIN_SPEED 0x08
#define REG_KVAL_HOLD 0x09
#define REG_KVAL_RUN 0x0A
#define REG_KVAL_ACC 0x0B
#define REG_KVAL_DEC 0x0C
#define REG_INT_SPD 0x0D
#define REG_ST_SLP 0x0E
#define REG_FN_SLP_ACC 0x0F
#define REG_FN_SLP_DEC 0x10
#define REG_K_THERM 0x11
#define REG_ADC_OUT 0x12
#define REG_OCD_TH 0x13
#define REG_STALL_TH 0x14
#define REG_FS_SPD 0x15
#define REG_STEP_MODE 0x16
#define REG_ALARM_EN 0x17
#define REG_CONFIG 0x18
#define REG_STATUS 0x19

class L6470SDC{
public:
    //充実のコンストラクタ
    L6470SDC(PinName tx, PinName rx, PinName mosi, PinName miso, PinName sclk, PinName csel);
    L6470SDC(PinName tx, PinName rx, PinName mosi, PinName miso, PinName sclk, DigitalOut *csel);
    L6470SDC(Serial *serial, PinName mosi, PinName miso, PinName sclk, PinName csel);
    L6470SDC(Serial *serial, PinName mosi, PinName miso, PinName sclk, DigitalOut *csel);
    L6470SDC(Serial *serial, SPI *spi, PinName csel);
    L6470SDC(Serial *serial, SPI *spi, DigitalOut *csel);
    L6470SDC(PinName mosi, PinName miso, PinName sclk, PinName csel);
    L6470SDC(PinName mosi, PinName miso, PinName sclk, DigitalOut *csel);
    L6470SDC(SPI *spi, PinName csel);
    L6470SDC(SPI *spi, DigitalOut *csel);

private:
    Serial *pc;
    SPI *spi;
    DigitalOut *cs;

    bool hasSerial;
    int motor_count;                                                                                //モーターの総数

    void setCmd(int motorNumber, unsigned char cmdAddress, unsigned long value, int bitLen);        //コマンド実行
    void setParam(int motorNumber, unsigned char regAddress, unsigned long value, int bitLen);      //パラメーター設定
    unsigned long getParam(int motorNumber, unsigned char regAddress, int bitLen);                  //パラメーター取得
    void sendCMD(unsigned char cmd);                                                                //コマンド送信

public:
    void init();                                                                                    //初期化
    int getMotorCount();                                                                            //モーター個数

    // cmd method ------------------------------------------------------------------------------
    bool isBusy(int motorNumber);
    void run(int motorNumber, unsigned long hex_speed, bool isClockwise);
    void step(int motorNumber, unsigned int count, bool isClockwise);
    void move(int motorNumber, unsigned long stepsCount, bool isClockwise);
    void goto1(int motorNumber, unsigned long ABSPos);
    void goto2(int motorNumber, unsigned long ABSPos, bool isClockwise);
    void goUntil(int motorNumber, unsigned long hex_speed, bool isClockwise, bool setMark);
    void releaseSwitch(int motorNumber, bool isClockwise, bool setMark);
    void home(int motorNumber);
    void zero(int motorNumber);
    void gotoMark(int motorNumber);
    void resetHome(int motorNumber);
    void resetZero(int motorNumber);
    void motorReset(int motorNumber);
    void stop(int motorNumber);
    void stopImmidiate(int motorNumber);
    void stop_HighImpedance(int motorNumber);
    void stopImmidiate_HighImpedance(int motorNumber);

    // calc method -----------------------------------------------------------------------------
    unsigned long calcSpd(float stepPerSecond);                                                     //回転速度(step/s)をParam形式に変換
    unsigned short calcAcc(float stepPerSecond_2);                                                  //加速(step/s^2)をParam形式に変換
    unsigned short calcDec(float stepPerSecond_2);                                                  //減速(step/s^2)をParam形式に変換
    unsigned short calcMaxSpd(float stepPerSecond);                                                 //最大回転速度(step/s)をParam形式に変換
    unsigned short calcMinSpd(float stepPerSecond);                                                 //最低回転速度(step/s)をParam形式に変換
    unsigned short calcIntSpd(float stepPerSecond);                                                 //加減速曲線の切り替わる速度(step/s)をParam形式に変換
    unsigned short calcFullStepSpd(float stepPerSecond);                                            //フルステップに切り替わる速度(step/s)をParam形式に変換

    // set method ------------------------------------------------------------------------------
    void setAbsPosition(int motorNumber, unsigned long value);                                      //絶対座標設定
    void setElecPosition(int motorNumber, unsigned short value);                                    //マイクロステップ位置設定
    void setMarkPosition(int motorNumber, unsigned long value);                                     //ホームポジション設定
    void setAcceleration(int motorNumber, unsigned short value);                                    //加速設定
    void setDeceleration(int motorNumber, unsigned short value);                                    //減速設定
    void setMaximumSpeed(int motorNumber, unsigned short value);                                    //最大回転速度設定
    void setMinimumSpeed(int motorNumber, unsigned short value);                                    //最低回転速度設定(普通はゼロ)
    void setHoldingKVAL(int motorNumber, unsigned char value);                                      //モーター停止中の電圧
    void setRunningKVAL(int motorNumber, unsigned char value);                                      //モーター駆動中の電圧
    void setAccelerationKVAL(int motorNumber, unsigned char value);                                 //モーター加速中の電圧
    void setDecelerationKVAL(int motorNumber, unsigned char value);                                 //モーター減速中の電圧
    void setKVAL(                                                                                   //モーターの電圧(一度に設定)
        int motorNumber,
        unsigned char holdVal, unsigned char runVal,
        unsigned char accVal, unsigned char decVal
    );
    void setInterpolateSpeed(int motorNumber, unsigned short value);                                //加減速補間を開始するスピード
    void setInterpolateSlope(int motorNumber, unsigned char value);                                 //加減速補間の傾き
    void setAccSlopeFinal(int motorNumber, unsigned char value);                                    //加速最終時の補間の傾き
    void setDecSlopeFinal(int motorNumber, unsigned char value);                                    //減速最終時の補間の傾き
    void setThermoCorrect(int motorNumber, unsigned char value);                                    //高温時の補正
    void setOCThreshold(int motorNumber, unsigned char value);                                      //オーバーカレントの電流閾値
    void setStallThreshold(int motorNumber, unsigned char value);                                   //ストールの電流閾値
    void setFSSpeed(int motorNumber, unsigned short value);                                         //フルステップ駆動に切り替えるスピード
    void setStepMode(int motorNumber, unsigned char value);                                         //マイクロステッピングモード指定
    void setAlermEnable(int motorNumber, unsigned char value);                                      //アラームの有効無効
    void setSystemConfig(int motorNumber, unsigned short value);                                    //ドライバシステム設定

    // get method ------------------------------------------------------------------------------
    unsigned long getSpeed(int motorNumber);                                                        //現在の回転スピード
    unsigned short getADC(int motorNumber);                                                         //ADCの取得
    unsigned short getStatus(int motorNumber);                                                      //ステータス読み取り
    unsigned long getAbsPosition(int motorNumber);                                                  //絶対座標
    unsigned short getElecPosition(int motorNumber);                                                //マイクロステップ位置
    unsigned long getMarkPosition(int motorNumber);                                                 //ホームポジション
    unsigned short getAcceleration(int motorNumber);                                                //加速
    unsigned short getDeceleration(int motorNumber);                                                //減速
    unsigned short getMaximumSpeed(int motorNumber);                                                //最大回転速度
    unsigned short getMinimumSpeed(int motorNumber);                                                //最低回転速度(普通はゼロ)
    unsigned char getHoldingKVAL(int motorNumber);                                                  //モーター停止中の電圧
    unsigned char getRunningKVAL(int motorNumber);                                                  //モーター駆動中の電圧
    unsigned char getAccelerationKVAL(int motorNumber);                                             //モーター加速中の電圧
    unsigned char getDecelerationKVAL(int motorNumber);                                             //モーター減速中の電圧
    unsigned short getInterpolateSpeed(int motorNumber);                                            //加減速補間を開始するスピード
    unsigned char getInterpolateSlope(int motorNumber);                                             //加減速補間の傾き
    unsigned char getAccSlopeFinal(int motorNumber);                                                //加速最終時の補間の傾き
    unsigned char getDecSlopeFinal(int motorNumber);                                                //減速最終時の補間の傾き
    unsigned char getThermoCorrect(int motorNumber);                                                //高温時の補正
    unsigned char getOCThreshold(int motorNumber);                                                  //オーバーカレントの電流閾値
    unsigned char getStallThreshold(int motorNumber);                                               //ストールの電流閾値
    unsigned short getFSSpeed(int motorNumber);                                                     //フルステップ駆動に切り替えるスピード
    unsigned char getStepMode(int motorNumber);                                                     //マイクロステッピングモード
    unsigned char getAlermEnable(int motorNumber);                                                  //アラームの有効無効
    unsigned short getSystemConfig(int motorNumber);                                                //ドライバシステム設定
};

#endif