/******************************************************************************
文 件 名：Stepper_Motor.h
功能描述：步进电机驱动库头文件
作    者：张暄
版    本：V1.0
日    期：2017.04.18
******************************************************************************/

#ifndef _STEPPER_MOTOR_H_
#define _STEPPER_MOTOR_H_

#include <hidef.h>
#include "API.h"
#include "Motor_Controller.h"

/******************************************************************************
步进电机选择
******************************************************************************/
//#define   USE_VID29_STEPPER_MOTOR           1   //伟力VID29步进电机
#define   USE_TYD5660_STEPPER_MOTOR         1   //天羽TYD5660步进电机

/******************************************************************************
步进电机参数预处理
******************************************************************************/
#if   defined (USE_VID29_STEPPER_MOTOR)
  #include "VID29.h"
#elif defined (USE_TYD5660_STEPPER_MOTOR)
  #include "TYD5660.h"
#else
  #error  Select stepper motor in Stepper_Motor.h
#endif

/******************************************************************************
全局变量
******************************************************************************/
extern volatile uint16_t   StepperMotor0CurStep;
extern volatile uint16_t   StepperMotor0DstStep;
#define    STEPPER_MOTOR_0_CUR_STEP         StepperMotor0CurStep  //步进电机0当前微步
#define    STEPPER_MOTOR_0_DST_STEP         StepperMotor0DstStep  //步进电机0目标微步

extern volatile uint16_t   StepperMotor1CurStep;
extern volatile uint16_t   StepperMotor1DstStep;
#define    STEPPER_MOTOR_1_CUR_STEP         StepperMotor1CurStep  //步进电机1当前微步
#define    STEPPER_MOTOR_1_DST_STEP         StepperMotor1DstStep  //步进电机1目标微步

extern volatile uint16_t   StepperMotor2CurStep;
extern volatile uint16_t   StepperMotor2DstStep;
#define    STEPPER_MOTOR_2_CUR_STEP         StepperMotor2CurStep  //步进电机2当前微步
#define    STEPPER_MOTOR_2_DST_STEP         StepperMotor2DstStep  //步进电机2目标微步

extern volatile uint16_t   StepperMotor3CurStep;
extern volatile uint16_t   StepperMotor3DstStep;
#define    STEPPER_MOTOR_3_CUR_STEP         StepperMotor3CurStep  //步进电机3当前微步
#define    STEPPER_MOTOR_3_DST_STEP         StepperMotor3DstStep  //步进电机3目标微步

/******************************************************************************
步进电机参数设置
******************************************************************************/
#ifndef   STEPPER_MOTOR_0_ENABLE
  #define STEPPER_MOTOR_0_ENABLE            MOTOR_0_ENABLE
  #define STEPPER_MOTOR_0_REVERSE           0                     //步进电机0反向旋转
  #define STEPPER_MOTOR_0_SPEED_MAX         1080                  //步进电机0最大旋转速度   每秒
  #define STEPPER_MOTOR_0_ACC               40                    //步进电机0旋转加速度
#endif

#ifndef   STEPPER_MOTOR_1_ENABLE
  #define STEPPER_MOTOR_1_ENABLE            MOTOR_1_ENABLE
  #define STEPPER_MOTOR_1_REVERSE           0                     //步进电机1反向旋转
  #define STEPPER_MOTOR_1_SPEED_MAX         1080                  //步进电机1最大旋转速度
  #define STEPPER_MOTOR_1_ACC               40                   //步进电机1旋转加速度
#endif

#ifndef   STEPPER_MOTOR_2_ENABLE
  #define STEPPER_MOTOR_2_ENABLE            MOTOR_2_ENABLE
  #define STEPPER_MOTOR_2_REVERSE           1                     //步进电机2反向旋转
  #define STEPPER_MOTOR_2_SPEED_MAX         1080                  //步进电机2最大旋转速度
  #define STEPPER_MOTOR_2_ACC               40                    //步进电机2旋转加速度
#endif

#ifndef   STEPPER_MOTOR_3_ENABLE
  #define STEPPER_MOTOR_3_ENABLE            MOTOR_3_ENABLE
  #define STEPPER_MOTOR_3_REVERSE           1                     //步进电机3反向旋转
  #define STEPPER_MOTOR_3_SPEED_MAX         1080                  //步进电机3最大旋转速度
  #define STEPPER_MOTOR_3_ACC               40                    //步进电机3旋转加速度
#endif

/******************************************************************************
步进电机参数预处理
******************************************************************************/
#if   (STEPPER_MOTOR_0_SPEED_MAX < STEPPER_MOTOR_SPEED_MIN)
  #error "STEPPER_MOTOR_0_SPEED_MAX is below minimum speed"
#elif (STEPPER_MOTOR_0_SPEED_MAX > STEPPER_MOTOR_SPEED_MAX)
  #error "STEPPER_MOTOR_0_SPEED_MAX exceeds the maximum speed"
#endif

#if   (STEPPER_MOTOR_0_ACC == 0)
  #error STEPPER_MOTOR_0_ACC can not be 0
#elif (STEPPER_MOTOR_0_ACC > STEPPER_MOTOR_ACC_MAX)
  #error STEPPER_MOTOR_0_ACC exceeds the maximum acceleration
#endif

#if   (STEPPER_MOTOR_1_SPEED_MAX < STEPPER_MOTOR_SPEED_MIN)
  #error STEPPER_MOTOR_1_SPEED_MAX is below minimum speed
#elif (STEPPER_MOTOR_1_SPEED_MAX > STEPPER_MOTOR_SPEED_MAX)
  #error STEPPER_MOTOR_1_SPEED_MAX exceeds the maximum speed
#endif

#if   (STEPPER_MOTOR_1_ACC == 0)
  #error STEPPER_MOTOR_1_ACC can not be 0
#elif (STEPPER_MOTOR_1_ACC > STEPPER_MOTOR_ACC_MAX)
  #error STEPPER_MOTOR_1_ACC exceeds the maximum acceleration
#endif

#if   (STEPPER_MOTOR_2_SPEED_MAX < STEPPER_MOTOR_SPEED_MIN)
  #error STEPPER_MOTOR_2_SPEED_MAX is below minimum speed
#elif (STEPPER_MOTOR_2_SPEED_MAX > STEPPER_MOTOR_SPEED_MAX)
  #error STEPPER_MOTOR_2_SPEED_MAX exceeds the maximum speed
#endif

#if   (STEPPER_MOTOR_2_ACC == 0)
  #error STEPPER_MOTOR_2_ACC can not be 0
#elif (STEPPER_MOTOR_2_ACC > STEPPER_MOTOR_ACC_MAX)
  #error STEPPER_MOTOR_2_ACC exceeds the maximum acceleration
#endif

#if   (STEPPER_MOTOR_3_SPEED_MAX < STEPPER_MOTOR_SPEED_MIN)
  #error STEPPER_MOTOR_3_SPEED_MAX is below minimum speed
#elif (STEPPER_MOTOR_3_SPEED_MAX > STEPPER_MOTOR_SPEED_MAX)
  #error STEPPER_MOTOR_3_SPEED_MAX exceeds the maximum speed
#endif

#if   (STEPPER_MOTOR_3_ACC == 0)
  #error STEPPER_MOTOR_3_ACC can not be 0
#elif (STEPPER_MOTOR_3_ACC > STEPPER_MOTOR_ACC_MAX)
  #error STEPPER_MOTOR_3_ACC exceeds the maximum acceleration
#endif

/******************************************************************************
步进电机复位(归零)时,可复位(归零)的最大角度
******************************************************************************/
#define   STEPPER_MOTOR_RST_FINE_DEG        6
#define   STEPPER_MOTOR_RST_FULL_DEG        320

/******************************************************************************
步进电机状态
******************************************************************************/
#define   STEPPER_MOTOR_STOP                0x00
#define   STEPPER_MOTOR_RST                 0x01
#define   STEPPER_MOTOR_READY               0x02
#define   STEPPER_MOTOR_BACK                0x03

/******************************************************************************
步进电机开关请求
******************************************************************************/
#define   STEPPER_MOTOR_NO_REQ              0x00
#define   STEPPER_MOTOR_PWR_UP_REQ          0x01
#define   STEPPER_MOTOR_SHDN_REQ            0x02

/******************************************************************************
步进电机工作模式
******************************************************************************/
#define   STEPPER_MOTOR_MODE_NORMAL         0     //正常行走模式
#define   STEPPER_MOTOR_MODE_BRAKE          1     //制动模式

/******************************************************************************
步进电机旋转控制结构
******************************************************************************/
typedef struct
{
  uint8_t   Accomp;           //上一微步走完标识
  uint8_t   Phase;            //电机旋转相位
  uint8_t   ZeroSw;           //归零开关状态
  uint16_t  Timer;            //定时器,用于记录每一微步间的时间
  uint16_t  Interval;         //每一微步间定时间隔,用于调整电机旋转速度
  uint16_t  DstStep;          //电机目标微步数
  uint16_t  CurStep;          //电机当前微步数
  uint16_t  CurStepBackup;    //电机当前微步数备份值
  uint16_t  Speed;            //电机旋转速度
  uint16_t  SpeedMax;         //电机旋转最大速度
  uint16_t  Acc;              //电机旋转加速度
}MotorCtrlStruct;

/******************************************************************************
步进电机全局控制结构
******************************************************************************/
typedef struct
{
  uint8_t   Status;
  uint8_t   Flag;
  uint8_t   PwrReq;
  uint8_t   CalMode;
  uint8_t   RstMode;
  uint16_t  Delay;
}
MotorGlobalControlStruct;

/******************************************************************************
函数声明
******************************************************************************/
void Stepper_Motor_Start_Up(void);
void Stepper_Motor_Shutdown(void);
uint8_t Stepper_Motor_Get_Status(void);
uint8_t Stepper_Motor_Calibration_Mode(uint8_t En);

static uint16_t Stepper_Motor_Speed_Control(MotorCtrlStruct *pMotor, uint16_t DstStep);
static void Stepper_Motor_Fine_Reset_Init(void);
static void Stepper_Motor_Running_Init(void);
static void Stepper_Motor_Rolling_Back_Init(void);

void Stepper_Motor_Reset(void);

void Stepper_Motor_Speed_Control_Service(void);
void Stepper_Motor_Rotating_ISR(void);

#endif
