328 lines
11 KiB
C
328 lines
11 KiB
C
|
||
#ifndef __MOTOS_H__
|
||
#define __MOTOS_H__
|
||
|
||
//-------------------------------------------------------------------------------
|
||
|
||
#include "embfpga.h"
|
||
|
||
//-------------------------------------------------------------------------------
|
||
|
||
#define AXIS_NUM 6 // 控制轴的个数
|
||
|
||
//-------------------------------------------------------------------------------
|
||
// 电机配置结构
|
||
typedef struct
|
||
{
|
||
u16 axisConfig; // 实轴输出配置
|
||
u16 poutType; // 脉冲输出模式(CW/CCW,PULSE/DIR)
|
||
u16 spdSource; // 实轴速度控制(虚轴1,虚轴2,虚轴3,编码器)
|
||
u16 datSource; // 实轴数据获取(硬件插补,编码器随动,编码器映射)
|
||
}AxisConfig;
|
||
|
||
|
||
#ifdef _IN_MOTOS_C
|
||
|
||
|
||
|
||
#endif
|
||
//-------------------------------------------------------------------------------
|
||
//---------------------------------------------------------------
|
||
|
||
|
||
typedef struct
|
||
{
|
||
int enFlag;
|
||
s32 motosPos[AXIS_NUM];
|
||
|
||
}MotosPara;
|
||
|
||
#ifdef _IN_MOVECTRL_C
|
||
|
||
MotosPara g_motosPara;
|
||
|
||
#else
|
||
|
||
extern MotosPara g_motosPara;
|
||
|
||
#endif
|
||
|
||
//---------------------------------------------------------------
|
||
// 实轴输出配置
|
||
/*
|
||
---------------------------------------------------------------------------------------------------------------------------------
|
||
| b0 | b1 | b2 | b3 | b4 | b5 | b6 | b7 |
|
||
---------------------------------------------------------------------------------------------------------------------------------
|
||
| 脉冲输出允许 | A输出控制 | B输出控制 | 电机伺服ON | 报警停车允许 | 报警电平选择 | | |
|
||
---------------------------------------------------------------------------------------------------------------------------------
|
||
---------------------------------------------------------------------------------------------------------------------------------
|
||
| b8 | b9 | b10 | b11 | b12 | b13 | b14 | b15 |
|
||
---------------------------------------------------------------------------------------------------------------------------------
|
||
| | | | | | | | 配置允许 |
|
||
---------------------------------------------------------------------------------------------------------------------------------
|
||
|
||
// 其中 某个位为1,是输出相应的信号
|
||
*/
|
||
|
||
#define POUT_EN 0x0001 // 输出允许
|
||
#define POA_EN 0x0002 // A允许输出
|
||
#define POB_EN 0x0004 // B允许输出
|
||
#define SON_EN 0x0008 // 伺服ON允许
|
||
|
||
#define ALM_EN 0x0010 // 报警停车允许
|
||
#define ALM_LEVH 0x0020 // 报警电平为高
|
||
|
||
#define CONFIG_EN 0x8000 // 配置允许
|
||
|
||
#define DEFAULT_CFG (CONFIG_EN|SON_EN|ALM_LEVH) // 默认配置
|
||
|
||
#define IO_CTRL_CFG (CONFIG_EN|ALM_EN|ALM_LEVH) // IO控制电机配置
|
||
|
||
// 无报警
|
||
#define MOTOEN_CFG_NALM (CONFIG_EN|POUT_EN|SON_EN|ALM_LEVH) // 通用电机配置
|
||
#define MOTOENA_CFG_NALM (CONFIG_EN|POUT_EN|POA_EN|SON_EN|ALM_LEVH) // 通用电机配置
|
||
#define MOTOENB_CFG_NALM (CONFIG_EN|POUT_EN|POB_EN|SON_EN|ALM_LEVH) // 通用电机配置
|
||
#define MOTOENAB_CFG_NALM (CONFIG_EN|POUT_EN|POA_EN|POB_EN|SON_EN|ALM_LEVH) // 通用电机配置
|
||
|
||
// 有报警
|
||
#define MOTOEN_CFG (CONFIG_EN|POUT_EN|SON_EN|ALM_EN|ALM_LEVH) // 通用电机配置
|
||
#define MOTOENA_CFG (CONFIG_EN|POUT_EN|POA_EN|SON_EN|ALM_EN|ALM_LEVH) // 通用电机配置
|
||
#define MOTOENB_CFG (CONFIG_EN|POUT_EN|POB_EN|SON_EN|ALM_EN|ALM_LEVH) // 通用电机配置
|
||
#define MOTOENAB_CFG (CONFIG_EN|POUT_EN|POA_EN|POB_EN|SON_EN|ALM_EN|ALM_LEVH) // 通用电机配置
|
||
|
||
// 有报警(低电平报警)
|
||
#define MOTOEN_CFG_LALM (CONFIG_EN|POUT_EN|SON_EN|ALM_EN) // 通用电机配置
|
||
#define MOTOENA_CFG_LALM (CONFIG_EN|POUT_EN|POA_EN|SON_EN|ALM_EN) // 通用电机配置
|
||
#define MOTOENB_CFG_LALM (CONFIG_EN|POUT_EN|POB_EN|SON_EN|ALM_EN) // 通用电机配置
|
||
#define MOTOENAB_CFG_LALM (CONFIG_EN|POUT_EN|POA_EN|POB_EN|SON_EN|ALM_EN) // 通用电机配置
|
||
|
||
// 三输出电机 无报警
|
||
#define MOTO3EN_CFG_NALM (CONFIG_EN|POUT_EN|ALM_LEVH) // 通用电机配置
|
||
#define MOTO3ENA_CFG_NALM (CONFIG_EN|POUT_EN|POB_EN|ALM_LEVH) // 通用电机配置
|
||
#define MOTO3ENB_CFG_NALM (CONFIG_EN|POUT_EN|POA_EN|ALM_LEVH) // 通用电机配置
|
||
#define MOTO3ENC_CFG_NALM (CONFIG_EN|POUT_EN|POA_EN|POB_EN|SON_EN|ALM_LEVH) // 通用电机配置
|
||
#define MOTO3ENABC_CFG_NALM (CONFIG_EN|POUT_EN|SON_EN|ALM_LEVH) // 通用电机配置
|
||
|
||
// 三输出电机 有报警
|
||
#define MOTO3EN_CFG (CONFIG_EN|POUT_EN|ALM_EN|ALM_LEVH) // 通用电机配置
|
||
#define MOTO3ENA_CFG (CONFIG_EN|POUT_EN|POB_EN|ALM_EN|ALM_LEVH) // 通用电机配置
|
||
#define MOTO3ENB_CFG (CONFIG_EN|POUT_EN|POA_EN|ALM_EN|ALM_LEVH) // 通用电机配置
|
||
#define MOTO3ENC_CFG (CONFIG_EN|POUT_EN|POA_EN|POB_EN|SON_EN|ALM_EN|ALM_LEVH) // 通用电机配置
|
||
#define MOTO3ENABC_CFG (CONFIG_EN|POUT_EN|SON_EN|ALM_EN|ALM_LEVH) // 通用电机配置
|
||
|
||
|
||
//---------------------------------------------------------------
|
||
|
||
#define POUTA_EN MOUT_SEL_HIGH // 输出脉冲A允许为高电平
|
||
#define POUTA_DIS MOUT_SEL_LOW // 输出脉冲A禁止为低电平
|
||
#define POUTB_EN MOUT_EN_HIGH // 输出脉冲B允许为高电平
|
||
#define POUTB_DIS MOUT_EN_LOW // 输出脉冲B禁止为低电平
|
||
#define SERVO_OFF MOUT_SON_HIGH // 伺服OFF为高电平
|
||
#define SERVO_ON MOUT_SON_LOW // 伺服ON为低电平
|
||
|
||
//---------------------------------------------------------------
|
||
|
||
// 电机配置结构
|
||
typedef struct
|
||
{
|
||
int newConfig; // 重新配置标志,= 0,不需要重新写配置,使用已有配置; != 0,是新的配置,需要重新写入,同时刷新记录配置
|
||
|
||
// 电机报警配置
|
||
AxisConfig axisConfig[AXIS_NUM];
|
||
|
||
}MotosConfig;
|
||
|
||
// 电机位置结构
|
||
typedef struct
|
||
{
|
||
s32 movement[AXIS_NUM]; // 各个轴的运动量,0,无运动;其他,运动长度,单位p
|
||
u32 extraRepeat; // 多出的重复次数,0,无重复,其他,多出的重复次数(按照movement的运动直线延伸)
|
||
u32 interLong; // 插补长轴位移,必须大于或等于movement分量中的最大值
|
||
u32 pulsePerSegment; // 每段脉冲数
|
||
|
||
}MovementCtrl;
|
||
|
||
|
||
// 电机速度结构
|
||
typedef struct
|
||
{
|
||
u32 startPPS; // 启动速度
|
||
u32 stopPPS; // 停止速度
|
||
u32 runPPS; // 运动速度
|
||
u32 slowPPS; // 慢速速度
|
||
u32 addPPSG; // 升速加速度
|
||
u32 decPPSG; // 降速加速度
|
||
u32 brkPPSG; // 刹车加速度
|
||
}SpeedCtrl;
|
||
|
||
//---------------------------------------------------------------
|
||
// 直线插补运动控制结构
|
||
typedef struct
|
||
{
|
||
u32 vAxisId; // 使用虚轴ID
|
||
|
||
MotosConfig motosConfig; // 参与电机配置
|
||
|
||
MovementCtrl mvmtPara; // 位移控制参数
|
||
|
||
SpeedCtrl spdPara; // 速度控制参数
|
||
|
||
int stopMode; // 停止运动方式
|
||
// 0,降速到停止速度以下停止。
|
||
// 1,降速,到整表切换时停止。
|
||
|
||
int errInfo; // 错误信息
|
||
|
||
// 回调函数及参数
|
||
void (*Delay)(u32); // 延时回调函数
|
||
|
||
void (*RefreshPosition)(u32, s32*); // 坐标刷新回调函数
|
||
u32 refPosPara; // 坐标刷新参数
|
||
|
||
int (*WorkBeforeRun)(u32, u32); // 运行前准备工作回调函数
|
||
int (*WorkAfterRun)(u32, u32); // 运行后准备工作回调函数
|
||
u32 workPara1, workPara2; // 工作参数
|
||
|
||
int (*GetSlowDown)(u32,u32); // 慢速运动条件函数,当为空时,不检测降速条件; 不为空时,条件满足,速度降低,条件消失,速度恢复
|
||
int (*GetNormalStop)(u32,u32); // 一般停止条件函数,当为空时,不检测停止条件; 不为空时,条件满足,降速到停止(按降速加速度)
|
||
int (*GetQuickStop)(u32,u32); // 快速停止条件函数,当为空时,不检测停止条件; 不为空时,条件满足,降速到停止(按刹车加速度)
|
||
int (*GetEmergencyStop)(u32,u32); // 紧急停止条件函数,当为空时,不检测急停条件; 不为空时,条件满足,立刻停止发送脉冲(无需降速)
|
||
u32 condPara1, condPara2; // 条件函数参数
|
||
|
||
}InterMoveCtrl;
|
||
|
||
// 最长支持插补数据
|
||
#define MAX_INTER_SIZE S32_MAX
|
||
|
||
#define STOP_MODE_SPD 0 // 速度低于最低速度则停止
|
||
#define STOP_MODE_TAB 1 // 在表运行完成后停止
|
||
|
||
|
||
|
||
#define TOSLOWMUTI 5
|
||
//------------------------------------------------------------------------------------------------
|
||
|
||
#define SUPPORT_SEGMENT 15 // 支持1段数据, 最多支持16段
|
||
|
||
typedef struct
|
||
{
|
||
u32 interLong; // 插补长轴位移,必须大于或等于movement分量中的最大值
|
||
|
||
u16 sineOut[AXIS_NUM]; // 正弦输出标志. 0, 非正弦输出, 1, 正弦输出
|
||
u16 segmnetNum[AXIS_NUM]; // 有效段数,支持0--100
|
||
u32 startEsc[AXIS_NUM]; // 起始跳过脉冲数
|
||
u32 vppSegment[AXIS_NUM]; // 虚轴对应每段脉冲数
|
||
u16 movement[AXIS_NUM][SUPPORT_SEGMENT+1]; // 各个轴的运动数据
|
||
|
||
}MovementDat;
|
||
|
||
// 数据交换结构
|
||
typedef struct
|
||
{
|
||
// 位移控制参数
|
||
s32 fillCount; // 填充计数器(写入FPGA中的数据计数)
|
||
s32 execCount; // 执行计数器(已经执行完成的数据计数,也可以认为是正在执行的数据idx)
|
||
s32 fillLimit; // 填充限制,在刹车过程中允许填充的数据个数
|
||
int bufsta; // 缓冲区状态
|
||
|
||
u32 lastEndPPS; // 上段结束时的速度,也就是本段(正在执行段)的起始速度(每次表结束时设置)
|
||
u32 lastrunPPS; // 上段的运行速度
|
||
|
||
int runstat; // 运行状态,= 0,正常运行状态。 = 1,进入停止状态。 = 2,进入刹车状态
|
||
int errInfo; // 错误信息
|
||
int waitNoData; // 无数据时等待标志, = 0,不等待。= 1,等待
|
||
int emptyCount;
|
||
int dataBegIndex; // 数据索引起始
|
||
int exeingIdx; // 正在执行数据的索引
|
||
//------------
|
||
u32 mvmtStatus; // 运动数据状态,0,无效,1,有效
|
||
|
||
MovementDat mvmtdat; // 位移数据
|
||
|
||
// 速度控制参数
|
||
u32 lowPPS; // 本段启动速度
|
||
u32 runPPS; // 本段运行目标速度
|
||
u32 calcGap; // 本段加速度
|
||
|
||
}MoveSwapData;
|
||
|
||
#define CRST_NORMAL 0 // 正常运行状态
|
||
#define CRST_NSTOP 1 // 停止状态
|
||
#define CRST_QSTOP 2 // 停止状态
|
||
#define CRST_BREAK 3 // 刹车状态
|
||
|
||
|
||
// 多轴连续直线插补运动控制结构
|
||
typedef struct
|
||
{
|
||
u32 vAxisId; // 使用虚轴ID
|
||
|
||
MotosConfig motosConfig; // 参与电机配置
|
||
MoveSwapData mvData; // 位移和速度刷新结构
|
||
|
||
s32 dataBegIndex;
|
||
|
||
// 停车速度控制参数
|
||
u32 stopPPS; // 停车速度
|
||
u32 nstopPPSG; // 普通停止加速度
|
||
u32 qstopPPSG; // 快速停止加速度
|
||
|
||
// 回调函数及参数
|
||
void (*Delay)(u32); // 延时回调函数
|
||
|
||
// 数据填充函数
|
||
int (*RefreshData)(u32, u32); // 数据刷新函数
|
||
u32 refDatPara;
|
||
|
||
void (*RefreshPosition)(u32, s32*); // 坐标刷新回调函数
|
||
u32 refPosPara; // 坐标刷新参数
|
||
|
||
int (*WorkBeforeRun)(u32, u32); // 运行前准备工作回调函数
|
||
int (*WorkAfterRun)(u32, u32); // 运行前准备工作回调函数
|
||
u32 workPara1, workPara2; // 工作参数
|
||
|
||
int (*GetSlowDown)(u32,u32); // 慢速运动条件函数,当为空时,不检测降速条件; 不为空时,条件满足,速度降低,条件消失,速度恢复
|
||
int (*GetNormalStop)(u32,u32); // 一般停止条件函数,当为空时,不检测停止条件; 不为空时,条件满足,降速到停止(按降速加速度)
|
||
int (*GetQuickStop)(u32,u32); // 快速停止条件函数,当为空时,不检测停止条件; 不为空时,条件满足,降速到停止(按刹车加速度)
|
||
int (*GetEmergencyStop)(u32,u32); // 紧急停止条件函数,当为空时,不检测急停条件; 不为空时,条件满足,立刻停止发送脉冲(无需降速)
|
||
u32 condPara1, condPara2; // 条件函数参数
|
||
|
||
}ContinuousInterMoveCtrl;
|
||
|
||
//------------------------------------------------------------------------------------------------
|
||
|
||
|
||
// 初始化电机
|
||
void InitMotos(void);
|
||
|
||
// 读取电机位置
|
||
int GetMotosCounter(s32 * position);
|
||
|
||
// 设置电机位置
|
||
void SetMotosCounter(s32 * position);
|
||
|
||
// 刷新电机位置
|
||
void RefreshMotosPos(s32 * poslist);
|
||
|
||
// 读取电机计数器
|
||
s32 GetMotoCounter(int axisIdx);
|
||
void SetMotoCounter(int axisIdx, s32 pos);
|
||
|
||
void MotoServoCtrl(int axisIdx, int onoff);
|
||
|
||
void SetMotosConfig(MotosConfig * pConfig); // 设置电机配置
|
||
|
||
|
||
// 多轴插补运动,最多支持6轴同步
|
||
int InterpolationMotion(InterMoveCtrl * pCtrl);
|
||
|
||
// 多轴连续直线插补运动,最多支持6轴同步
|
||
int ContinuousInterpolation(ContinuousInterMoveCtrl * pCtrl);
|
||
|
||
u32 CalcDisplacement(u32 pps1, u32 pps2, u32 calcTime); // 计算加减速需要的位移
|
||
u32 CalcGapTime(u32 disp, u32 pps1, u32 pps2); // 计算某位移下速度变化需要的时间间隔参数
|
||
u32 CalcEndSpd(u32 disp, u32 pps1, s32 addgap);
|
||
|
||
|
||
#endif
|