
//-------------------------------------------------------------------------------
// 最多实现软件控制6路电机异步运动
//-------------------------------------------------------------------------------

#ifndef __STM32MOTOS_H__
#define	__STM32MOTOS_H__

#include "config.h"

//-------------------------------------------------------------------------------
// 最多实现软件控制6路电机异步运动
// 可以实现电机自动的 加速-匀速-降速 运动

#ifndef STM32_MOTOS_NUM
#define	STM32_MOTOS_NUM			0			// 电机数量
#endif

//---------------------------------------------------------------
// 软件PWM信号输出
#ifndef STM32_SOFT_PWM
#define	STM32_SOFT_PWM			0
#endif

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

// 脉冲模式
#define	MODE_CWCCW				0
#define	MODE_STEPDIR			1

//---------------------------------------------------------------
// 运动状态定义
#define	STM32MOTO_ERR			-1		// 异常
#define	STM32MOTO_STOP			0		// 停止
#define	STM32MOTO_ADD			1		// 加速
#define	STM32MOTO_RUN			2		// 匀速
#define	STM32MOTO_DEC			3		// 降速(计数降速)
#define	STM32MOTO_NSTOP			4		// 停车(条件停车)
#define	STM32MOTO_EMC			5		// 刹车(条件刹车)

//---------------------------------------------------------------
// 电机运动控制接口
typedef struct
{
	// 输入
	s32 movement;				// 位移量

	u32 startPPS;				// 启动速度
	u32 runPPS;					// 运动速度
	u32 addPPSG;				// 启停加速度
	u32 brkPPSG;				// 刹车加速度

	u32 funTestTime;			// 运行过程中外部函数检测间隔时间 0:不检测外部函数 (单位:0.1ms)
	int syncList[6];			// 同步移动选择

	// 函数指针
	int (*GetNormalStop)(u32,u32);		// 一般停止条件函数，当为空时，不检测停止条件; 不为空时，条件满足，降速到停止（按启停加速度降速）
	int (*GetQuickStop)(u32,u32);		// 快速停止条件函数，当为空时，不检测停止条件; 不为空时，条件满足，降速到停止（按刹车加速度降速）
	u32 condPara1, condPara2;			// 条件函数参数

	int blockRunflag;					// 阻塞运行标志, =1阻塞运行,同步运动	=0,非阻塞,异步运动
	void (*ExecWhenRun)(void);			// 电机运行过程中执行的函数
	void (*ExecWhenStart)(void);		// 电机启动时执行的函数
	void (*ExecWhenStop)(void);			// 电机停止时执行的函数

}MotoCtrl;

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

typedef void (*OutFunc)(void);


#define	MOTO_FUNC_DEF(x)	\
\
void InitStm32Moto##x##OutFunc(OutFunc stepOn, OutFunc StepOff, OutFunc dirOn, OutFunc dirOff);				/* 功能：设置电机控制输出函数	*/ \
int  STM32Moto##x##Start(MotoCtrl * pCtrl);		/* 功能：启动电机	*/ \
void STM32Moto##x##Stop (void);					/* 功能：停止电机（非阻塞时用到）	*/ \
int  STM32Moto##x##Run(MotoCtrl * pCtrl);		/* 功能：电机运行（非阻塞时用到）	*/ \
int  GetSTM32Moto##x##State(void);				/* 功能：得到电机运行状态（非阻塞时用到）	*/ \
void SetSTM32Moto##x##Mode(int mode);			/* 功能：设置脉冲方式	*/ \
void SetSTM32Moto##x##RunSpd(u32 spd);			/* 功能：设置电机运转速度(非阻塞时用到)  */ \
s32  GetSTM32Moto##x##RealPos(void);			/* 功能：得到电机当前坐标（非阻塞时用到）	*/ \
void SetSTM32Moto##x##RealPos(s32 pos);			/* 功能：设置电机当前坐标（非阻塞时用到）	*/ \
void STM32Moto##x##IntProc(void);				/* 功能：中断处理函数	*/ \
//-------------------------------


//---------------------------------------------------------------
// 初始化电机
void InitSTM32Motos(void);
void InitSTM32SoftPwm(OutFunc pwmProc);


//-------------------------------
#if (STM32_MOTOS_NUM > 0 || STM32_SOFT_PWM > 0)
void STM32MotoSpeedIntProc(void);				/* 功能：中断处理函数	*/
#endif

// MOTO1
#if (STM32_MOTOS_NUM >= 1)
MOTO_FUNC_DEF(1);
#endif

// MOTO2
#if (STM32_MOTOS_NUM >= 2)
MOTO_FUNC_DEF(2);
#endif

// MOTO3
#if (STM32_MOTOS_NUM >= 3)
MOTO_FUNC_DEF(3);
#endif

// MOTO4
#if (STM32_MOTOS_NUM >= 4)
MOTO_FUNC_DEF(4);
#endif

// MOTO5
#if (STM32_MOTOS_NUM >= 5)
MOTO_FUNC_DEF(5);
#endif

// MOTO6
#if (STM32_MOTOS_NUM >= 6)
MOTO_FUNC_DEF(6);
#endif

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



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

#endif





