
#ifndef __STEPMOTOS_H__
#define __STEPMOTOS_H__

#include "config.h"
#include "sintable.h"

//------------------------------------------------------------------------
#ifndef STEP_MOTOS_NUM
#define STEP_MOTOS_NUM		0
#endif

#if (STEP_MOTOS_NUM > 4)
#undef STEP_MOTOS_NUM
#define STEP_MOTOS_NUM		4
#endif

//------------------------------------------------------------------------

#ifndef MOTO1_CCWDIR
#define	MOTO1_CCWDIR		CCWDIR_POSI
#endif

#ifndef MOTO2_CCWDIR
#define	MOTO2_CCWDIR		CCWDIR_POSI
#endif

#ifndef MOTO3_CCWDIR
#define	MOTO3_CCWDIR		CCWDIR_POSI
#endif

#ifndef MOTO4_CCWDIR
#define	MOTO4_CCWDIR		CCWDIR_POSI
#endif

//------------------------------------------------------------------------


// 两相步进电机, 定子两组线圈, 磁场成90度排列,  A+, A-, B+, B-
// 分为50个电周期，每个电周期 7.2度
// 一个电周期角内分作 1024 （4096） 份, 对应一个正弦周期 (定义在sintable中)

#define	MOTO_NOPP			(50)						// 极对数

#define MOTO_PPC			(MOTO_NOPP*SIN_TAB_SIZE)	// 电机每圈可控位置 (50 * 4K = 200K)

#define	MAX_OUT_LEV			240		// 320  最大输出电流 （pwm占空比）

#define FULL_STEP_PPC		200		// 整步/圈

#ifndef MICO_STEP_PPC
#define MICO_STEP_PPC		1000	// 微步/圈
#endif

#define PHASE_MUTI			((1.0f*MOTO_NOPP*SIN_TAB_SIZE)/(MOTO_PPC))

#define MAX_ABPOS_CIRCLE	(1024*10)		// 最大绝对圈数

#define MAX_MOTO_POS		(MAX_ABPOS_CIRCLE*MOTO_PPC)		//

#define MAX_ADVANCE			(MOTO_PPC/FULL_STEP_PPC)	// 1.8度
#define MIN_ADVANCE			(MOTO_PPC/FULL_STEP_PPC/10)	// 0.18度
#define MICO_ADVANCE		(MAX_ADVANCE/5)				// 0.36度

//------------------------------------------------------------------------

#define CCWDIR_POSI		1		// 电机逆时针正向
#define CCWDIR_NEGA		-1		// 电机逆时针反向

//------------------------------------------------------------------------

#define POS_TYPE	float
typedef void(*MotoCoilPwm)(int);
typedef void(*MotoCoilCtrl)(void);

//------------------------------------------------------------------------

void InitStepMotos(void);

void SetMotoCtrlFuncs(int motoIdx,
		MotoCoilPwm coilapwm, MotoCoilCtrl acpon, MotoCoilCtrl acpoff, MotoCoilCtrl acnon, MotoCoilCtrl acnoff,
		MotoCoilPwm coilbpwm, MotoCoilCtrl bcpon, MotoCoilCtrl bcpoff, MotoCoilCtrl bcnon, MotoCoilCtrl bcnoff);

void SetMotoCCWDir(int motoIdx, int dir);

void ResetMotoPos(int motoIdx, int eff);
void SetMotoEnable(int motoIdx, int eff);
void SetMotoPosTo(int motoIdx, POS_TYPE pos, int eff);
POS_TYPE GetMotoPos(int motoIdx);
int MotoOneFullStep(int motoIdx, int dir, int eff);
int MotoOneMicoStep(int motoIdx, int dir, int eff);

//------------------------------------------------------------------------

#endif
