1017 lines
37 KiB
C
1017 lines
37 KiB
C
|
||
#ifndef __EMBFPGA_H__
|
||
#define __EMBFPGA_H__
|
||
|
||
#include "config.h"
|
||
|
||
//------------------------------------------------------------------------------------------------
|
||
//------------------------------------------------------------------------------------------------
|
||
|
||
// 板载FPGA
|
||
// 可以控制6路电机信号
|
||
// 每路电机信号包括2路高速差分脉冲信号,3个输出信号和1个报警输入信号
|
||
// FPGA还控制16路普通输入信号,可以配置为下降沿外部中断
|
||
// FPGA还控制8路输出信号,可以配置为PWM输出
|
||
// FPGA还可以输出一路主轴位置信号,位置信号可以在12路实轴脉冲,两路编码器的4个脉冲信号或虚轴脉冲中选择1个输出,也可以直接控制输出
|
||
|
||
|
||
//------------------------------------------------------------------------------------------------
|
||
|
||
#define FPGA_VER_101 0x0101 // FPGA版本v1.0.1
|
||
|
||
#define FPGA_VER_ERR 0xFFFF // FPGA总线错误
|
||
//------------------------------------------------------------------------------------------------
|
||
|
||
#define FPGA_CLK 72000000L
|
||
|
||
//------------------------------------------------------------------------------------------------
|
||
|
||
#define VAXIS (CORE_FPGA_ADDR_BEG+0x0000) // 虚轴
|
||
#define AXIS(i) (CORE_FPGA_ADDR_BEG+((i)<<7)) // 实轴
|
||
|
||
//------------------------------------------------------------------------------------------------
|
||
//------------------------------------------------------------------------------------------------
|
||
|
||
// 带√为复位默认状态
|
||
|
||
// 虚轴
|
||
// 写端口地址
|
||
|
||
//---------------------------------------------------------------
|
||
// 虚轴控制端口
|
||
#define VAXIS_CONTROL (VAXIS+0x00)
|
||
// 向控制端口写入如下命令,实现相应的功能,定义如下:
|
||
#define VCTR_LOCK 0x0000 // 当前频率/计数锁存
|
||
|
||
#define VCTR_INPUT_ALM_INT 0x0001 // 清除Input接口下降沿中断标志
|
||
|
||
#define VCTR_AXIS_ALM_INT 0x0002 // 清除驱动器报警标志
|
||
|
||
#define VCTR_ZP1_INT 0x0003 // 编码器1:清除ZP1上升沿中断标志
|
||
#define VCTR_ZP2_INT 0x0004 // 编码器2:清除ZP2上升沿中断标志
|
||
|
||
#define EXOUT_EN_ON 0x0010 // 外部输出使能:开(扩展IO)
|
||
#define EXOUT_EN_OFF 0x0011 // 外部输出使能:关√
|
||
|
||
#define VCTR_VAXIS1_STOP 0x0100 // 虚轴1:停止√
|
||
#define VCTR_VAXIS1_RUN 0x0101 // 虚轴1:运行
|
||
#define VCTR_VAXIS1_DIS_BUF1 0x0110 // 虚轴1:运动缓冲区1失效√
|
||
#define VCTR_VAXIS1_DIS_BUF2 0x0111 // 虚轴1:运动缓冲区2失效√
|
||
#define VCTR_VAXIS1_DIS_BUF3 0x0112 // 虚轴1:运动缓冲区3失效√
|
||
#define VCTR_VAXIS1_CLEAN_OV1 0x0120 // 虚轴1:清除表1完成标志
|
||
#define VCTR_VAXIS1_CLEAN_OV2 0x0121 // 虚轴1:清除表2完成标志
|
||
|
||
#define VCTR_VAXIS1_DIS_OV1INT 0x0130 // 虚轴1:表完成中断关闭√
|
||
#define VCTR_VAXIS1_EN_OV1INT 0x0131 // 虚轴1:表完成中断打开(暂未使用)
|
||
|
||
#define VCTR_ECD1_CLEAR 0x0200 // 编码器1:计数器清零
|
||
#define VCTR_ZP1_DIS_INT 0x0210 // 编码器1:关闭ZP1中断√
|
||
#define VCTR_ZP1_EN_INT 0x0211 // 编码器1:开启ZP1中断
|
||
#define VCTR_ECD1_LEVEL_RST 0x0220 // 编码器1:ABZP电平信号复位√
|
||
#define VCTR_AP1_LEVEL_NEG 0x0221 // 编码器1:AP电平信号取反
|
||
#define VCTR_AZ1_LEVEL_NEG 0x0222 // 编码器1:APZP电平信号取反
|
||
#define VCTR_ZP1_LEVEL_NEG 0x0223 // 编码器1:ZP电平信号取反
|
||
#define VCTR_ZP1_FM_ECDZP 0x0230 // 编码器1:ZP中断通道选择:ZP1√
|
||
#define VCTR_ZP1_FM_NONE 0x023F // 编码器1:ZP中断通道选择: 无ZP(编码器不清零)
|
||
|
||
#define VCTR_ZP1_FM_INPUT1 0x0240 // 编码器1:ZP中断通道选择:INPUT1
|
||
#define VCTR_ZP1_FM_INPUT2 0x0241 // 编码器1:ZP中断通道选择:INPUT2
|
||
#define VCTR_ZP1_FM_INPUT3 0x0242 // 编码器1:ZP中断通道选择:INPUT3
|
||
#define VCTR_ZP1_FM_INPUT4 0x0243 // 编码器1:ZP中断通道选择:INPUT4
|
||
#define VCTR_ZP1_FM_INPUT5 0x0244 // 编码器1:ZP中断通道选择:INPUT5
|
||
#define VCTR_ZP1_FM_INPUT6 0x0245 // 编码器1:ZP中断通道选择:INPUT6
|
||
#define VCTR_ZP1_FM_INPUT7 0x0246 // 编码器1:ZP中断通道选择:INPUT7
|
||
#define VCTR_ZP1_FM_INPUT8 0x0247 // 编码器1:ZP中断通道选择:INPUT8
|
||
#define VCTR_ZP1_FM_INPUT9 0x0248 // 编码器1:ZP中断通道选择:INPUT9
|
||
#define VCTR_ZP1_FM_INPUT10 0x0249 // 编码器1:ZP中断通道选择:INPUT10
|
||
#define VCTR_ZP1_FM_INPUT11 0x024A // 编码器1:ZP中断通道选择:INPUT11
|
||
#define VCTR_ZP1_FM_INPUT12 0x024B // 编码器1:ZP中断通道选择:INPUT12
|
||
#define VCTR_ZP1_FM_INPUT13 0x024C // 编码器1:ZP中断通道选择:INPUT13
|
||
#define VCTR_ZP1_FM_INPUT14 0x024D // 编码器1:ZP中断通道选择:INPUT14
|
||
#define VCTR_ZP1_FM_INPUT15 0x024E // 编码器1:ZP中断通道选择:INPUT15
|
||
#define VCTR_ZP1_FM_INPUT16 0x024F // 编码器1:ZP中断通道选择:INPUT16
|
||
|
||
#define VCTR_ECD2_CLEAR 0x0300 // 编码器2:计数器清零
|
||
#define VCTR_ZP2_DIS_INT 0x0310 // 编码器2:关闭ZP2中断√
|
||
#define VCTR_ZP2_EN_INT 0x0311 // 编码器2:开启ZP2中断
|
||
#define VCTR_ECD2_LEVEL_RST 0x0320 // 编码器2:ABZP电平信号复位√
|
||
#define VCTR_AP2_LEVEL_NEG 0x0321 // 编码器2:AP电平信号取反
|
||
#define VCTR_AZ2_LEVEL_NEG 0x0322 // 编码器2:APZP电平信号取反
|
||
#define VCTR_ZP2_LEVEL_NEG 0x0323 // 编码器2:ZP电平信号取反
|
||
#define VCTR_ZP2_FM_ECDZP 0x0330 // 编码器2:ZP中断通道选择:ZP2√
|
||
#define VCTR_ZP2_FM_NONE 0x033F // 编码器2:ZP中断通道选择: 无ZP(编码器不清零)
|
||
|
||
#define VCTR_ZP2_FM_INPUT1 0x0340 // 编码器2:ZP中断通道选择:INPUT1
|
||
#define VCTR_ZP2_FM_INPUT2 0x0341 // 编码器2:ZP中断通道选择:INPUT2
|
||
#define VCTR_ZP2_FM_INPUT3 0x0342 // 编码器2:ZP中断通道选择:INPUT3
|
||
#define VCTR_ZP2_FM_INPUT4 0x0343 // 编码器2:ZP中断通道选择:INPUT4
|
||
#define VCTR_ZP2_FM_INPUT5 0x0344 // 编码器2:ZP中断通道选择:INPUT5
|
||
#define VCTR_ZP2_FM_INPUT6 0x0345 // 编码器2:ZP中断通道选择:INPUT6
|
||
#define VCTR_ZP2_FM_INPUT7 0x0346 // 编码器2:ZP中断通道选择:INPUT7
|
||
#define VCTR_ZP2_FM_INPUT8 0x0347 // 编码器2:ZP中断通道选择:INPUT8
|
||
#define VCTR_ZP2_FM_INPUT9 0x0348 // 编码器2:ZP中断通道选择:INPUT9
|
||
#define VCTR_ZP2_FM_INPUT10 0x0349 // 编码器2:ZP中断通道选择:INPUT10
|
||
#define VCTR_ZP2_FM_INPUT11 0x034A // 编码器2:ZP中断通道选择:INPUT11
|
||
#define VCTR_ZP2_FM_INPUT12 0x034B // 编码器2:ZP中断通道选择:INPUT12
|
||
#define VCTR_ZP2_FM_INPUT13 0x034C // 编码器2:ZP中断通道选择:INPUT13
|
||
#define VCTR_ZP2_FM_INPUT14 0x034D // 编码器2:ZP中断通道选择:INPUT14
|
||
#define VCTR_ZP2_FM_INPUT15 0x034E // 编码器2:ZP中断通道选择:INPUT15
|
||
#define VCTR_ZP2_FM_INPUT16 0x034F // 编码器2:ZP中断通道选择:INPUT16
|
||
|
||
#define VCTR_OPOS_NONE 0x0400 // OP输出:关√
|
||
#define VCTR_OPOS_ON 0x0401 // OP输出:开
|
||
|
||
#define VCTR_OPOS_VAXIS1 0x0402 // OP输出:虚轴1
|
||
|
||
#define VCTR_OPOS_AXIS1_P 0x0411 // OP输出:实轴1 pulse信号
|
||
#define VCTR_OPOS_AXIS1_S 0x0412 // OP输出:实轴1 sign信号
|
||
#define VCTR_OPOS_AXIS2_P 0x0421 // OP输出:实轴2 pulse信号
|
||
#define VCTR_OPOS_AXIS2_S 0x0422 // OP输出:实轴2 sign信号
|
||
#define VCTR_OPOS_AXIS3_P 0x0431 // OP输出:实轴3 pulse信号
|
||
#define VCTR_OPOS_AXIS3_S 0x0432 // OP输出:实轴3 sign信号
|
||
#define VCTR_OPOS_AXIS4_P 0x0441 // OP输出:实轴4 pulse信号
|
||
#define VCTR_OPOS_AXIS4_S 0x0442 // OP输出:实轴4 sign信号
|
||
#define VCTR_OPOS_AXIS5_P 0x0451 // OP输出:实轴5 pulse信号
|
||
#define VCTR_OPOS_AXIS5_S 0x0452 // OP输出:实轴5 sign信号
|
||
#define VCTR_OPOS_AXIS6_P 0x0461 // OP输出:实轴6 pulse信号
|
||
#define VCTR_OPOS_AXIS6_S 0x0462 // OP输出:实轴6 sign信号
|
||
#define VCTR_OPOS_AP1 0x0471 // OP输出:AP1
|
||
#define VCTR_OPOS_BP1 0x0472 // OP输出:BP1
|
||
#define VCTR_OPOS_ZP1 0x0473 // OP输出:ZP1
|
||
#define VCTR_OPOS_AP2 0x0481 // OP输出:AP2
|
||
#define VCTR_OPOS_BP2 0x0482 // OP输出:BP2
|
||
#define VCTR_OPOS_ZP2 0x0483 // OP输出:ZP2
|
||
|
||
#define VCTR_ZPOS_NONE 0x0500 // ZP输出:关√
|
||
#define VCTR_ZPOS_ON 0x0501 // ZP输出:开
|
||
#define VCTR_ZPOS_INPUT1 0x0510 // ZP输出:input1
|
||
#define VCTR_ZPOS_INPUT2 0x0511 // ZP输出:input2
|
||
#define VCTR_ZPOS_INPUT3 0x0512 // ZP输出:input3
|
||
#define VCTR_ZPOS_INPUT4 0x0513 // ZP输出:input4
|
||
#define VCTR_ZPOS_INPUT5 0x0514 // ZP输出:input5
|
||
#define VCTR_ZPOS_INPUT6 0x0515 // ZP输出:input6
|
||
#define VCTR_ZPOS_INPUT7 0x0516 // ZP输出:input7
|
||
#define VCTR_ZPOS_INPUT8 0x0517 // ZP输出:input8
|
||
#define VCTR_ZPOS_INPUT9 0x0518 // ZP输出:input9
|
||
#define VCTR_ZPOS_INPUT10 0x0519 // ZP输出:input10
|
||
#define VCTR_ZPOS_INPUT11 0x051A // ZP输出:input11
|
||
#define VCTR_ZPOS_INPUT12 0x051B // ZP输出:input12
|
||
#define VCTR_ZPOS_INPUT13 0x051C // ZP输出:input13
|
||
#define VCTR_ZPOS_INPUT14 0x051D // ZP输出:input14
|
||
#define VCTR_ZPOS_INPUT15 0x051E // ZP输出:input15
|
||
#define VCTR_ZPOS_INPUT16 0x051F // ZP输出:input16
|
||
#define VCTR_ZPOS_ECD1 0x0520 // ZP输出:编码器1
|
||
#define VCTR_ZPOS_ECD2 0x0521 // ZP输出:编码器2
|
||
|
||
#define VCTR_AXIS1_ALM_STOP_DIS 0x0610 // 实轴1报警不停车√
|
||
#define VCTR_AXIS1_ALM_STOP_EN 0x0611 // 实轴1报警停车
|
||
#define VCTR_AXIS1_ALM_LEV_LOW 0x0612 // 实轴1报警电平为低√
|
||
#define VCTR_AXIS1_ALM_LEV_HIGH 0x0613 // 实轴1报警电平为高
|
||
#define VCTR_AXIS2_ALM_STOP_DIS 0x0620 // 实轴2报警不停车√
|
||
#define VCTR_AXIS2_ALM_STOP_EN 0x0621 // 实轴2报警停车
|
||
#define VCTR_AXIS2_ALM_LEV_LOW 0x0622 // 实轴2报警电平为低√
|
||
#define VCTR_AXIS2_ALM_LEV_HIGH 0x0623 // 实轴2报警电平为高
|
||
#define VCTR_AXIS3_ALM_STOP_DIS 0x0630 // 实轴3报警不停车√
|
||
#define VCTR_AXIS3_ALM_STOP_EN 0x0631 // 实轴3报警停车
|
||
#define VCTR_AXIS3_ALM_LEV_LOW 0x0632 // 实轴3报警电平为低√
|
||
#define VCTR_AXIS3_ALM_LEV_HIGH 0x0633 // 实轴3报警电平为高
|
||
#define VCTR_AXIS4_ALM_STOP_DIS 0x0640 // 实轴4报警不停车√
|
||
#define VCTR_AXIS4_ALM_STOP_EN 0x0641 // 实轴4报警停车
|
||
#define VCTR_AXIS4_ALM_LEV_LOW 0x0642 // 实轴4报警电平为低√
|
||
#define VCTR_AXIS4_ALM_LEV_HIGH 0x0643 // 实轴4报警电平为高
|
||
#define VCTR_AXIS5_ALM_STOP_DIS 0x0650 // 实轴5报警不停车√
|
||
#define VCTR_AXIS5_ALM_STOP_EN 0x0651 // 实轴5报警停车
|
||
#define VCTR_AXIS5_ALM_LEV_LOW 0x0652 // 实轴5报警电平为低√
|
||
#define VCTR_AXIS5_ALM_LEV_HIGH 0x0653 // 实轴5报警电平为高
|
||
#define VCTR_AXIS6_ALM_STOP_DIS 0x0660 // 实轴6报警不停车√
|
||
#define VCTR_AXIS6_ALM_STOP_EN 0x0661 // 实轴6报警停车
|
||
#define VCTR_AXIS6_ALM_LEV_LOW 0x0662 // 实轴6报警电平为低√
|
||
#define VCTR_AXIS6_ALM_LEV_HIGH 0x0663 // 实轴6报警电平为高
|
||
|
||
#define ALM_CONFIG_BASE 0x0600
|
||
#define ALM_STOP_DIS 0x0000
|
||
#define ALM_STOP_EN 0x0001
|
||
#define ALM_LEV_LOW 0x0002
|
||
#define ALM_LEV_HIGH 0x0003
|
||
|
||
#define MAKE_VCTR_AXIS_ALM_CMD(id, alm) (ALM_CONFIG_BASE|((id<<4)&0xF0)|((alm)&0x0F))
|
||
|
||
#define IS_VAXIS_CMD(cmd) ( ((cmd) == VCTR_LOCK ) ||\
|
||
((cmd) == VCTR_INPUT_ALM_INT ) ||\
|
||
((cmd) == VCTR_AXIS_ALM_INT ) ||\
|
||
((cmd) == VCTR_ZP1_INT ) ||\
|
||
((cmd) == VCTR_ZP2_INT ) ||\
|
||
((cmd) == EXOUT_EN_ON ) ||\
|
||
((cmd) == EXOUT_EN_OFF ) ||\
|
||
((cmd) == VCTR_VAXIS1_STOP ) ||\
|
||
((cmd) == VCTR_VAXIS1_RUN ) ||\
|
||
((cmd) == VCTR_VAXIS1_DIS_BUF1 ) ||\
|
||
((cmd) == VCTR_VAXIS1_DIS_BUF2 ) ||\
|
||
((cmd) == VCTR_VAXIS1_DIS_BUF3 ) ||\
|
||
((cmd) == VCTR_VAXIS1_CLEAN_OV1 ) ||\
|
||
((cmd) == VCTR_VAXIS1_CLEAN_OV2 ) ||\
|
||
((cmd) == VCTR_ECD1_CLEAR ) ||\
|
||
((cmd) == VCTR_ZP1_DIS_INT ) ||\
|
||
((cmd) == VCTR_ZP1_EN_INT ) ||\
|
||
((cmd) == VCTR_ECD1_LEVEL_RST ) ||\
|
||
((cmd) == VCTR_AP1_LEVEL_NEG ) ||\
|
||
((cmd) == VCTR_AZ1_LEVEL_NEG ) ||\
|
||
((cmd) == VCTR_ZP1_LEVEL_NEG ) ||\
|
||
((cmd) == VCTR_ZP1_FM_ECDZP ) ||\
|
||
((cmd) == VCTR_ZP1_FM_NONE ) ||\
|
||
((cmd) == VCTR_ZP1_FM_INPUT1 ) ||\
|
||
((cmd) == VCTR_ZP1_FM_INPUT2 ) ||\
|
||
((cmd) == VCTR_ZP1_FM_INPUT3 ) ||\
|
||
((cmd) == VCTR_ZP1_FM_INPUT4 ) ||\
|
||
((cmd) == VCTR_ZP1_FM_INPUT5 ) ||\
|
||
((cmd) == VCTR_ZP1_FM_INPUT6 ) ||\
|
||
((cmd) == VCTR_ZP1_FM_INPUT7 ) ||\
|
||
((cmd) == VCTR_ZP1_FM_INPUT8 ) ||\
|
||
((cmd) == VCTR_ZP1_FM_INPUT9 ) ||\
|
||
((cmd) == VCTR_ZP1_FM_INPUT10 ) ||\
|
||
((cmd) == VCTR_ZP1_FM_INPUT11 ) ||\
|
||
((cmd) == VCTR_ZP1_FM_INPUT12 ) ||\
|
||
((cmd) == VCTR_ZP1_FM_INPUT13 ) ||\
|
||
((cmd) == VCTR_ZP1_FM_INPUT14 ) ||\
|
||
((cmd) == VCTR_ZP1_FM_INPUT15 ) ||\
|
||
((cmd) == VCTR_ZP1_FM_INPUT16 ) ||\
|
||
((cmd) == VCTR_ECD2_CLEAR ) ||\
|
||
((cmd) == VCTR_ZP2_DIS_INT ) ||\
|
||
((cmd) == VCTR_ZP2_EN_INT ) ||\
|
||
((cmd) == VCTR_ECD2_LEVEL_RST ) ||\
|
||
((cmd) == VCTR_AP2_LEVEL_NEG ) ||\
|
||
((cmd) == VCTR_AZ2_LEVEL_NEG ) ||\
|
||
((cmd) == VCTR_ZP2_LEVEL_NEG ) ||\
|
||
((cmd) == VCTR_ZP2_FM_ECDZP ) ||\
|
||
((cmd) == VCTR_ZP2_FM_NONE ) ||\
|
||
((cmd) == VCTR_ZP2_FM_INPUT1 ) ||\
|
||
((cmd) == VCTR_ZP2_FM_INPUT2 ) ||\
|
||
((cmd) == VCTR_ZP2_FM_INPUT3 ) ||\
|
||
((cmd) == VCTR_ZP2_FM_INPUT4 ) ||\
|
||
((cmd) == VCTR_ZP2_FM_INPUT5 ) ||\
|
||
((cmd) == VCTR_ZP2_FM_INPUT6 ) ||\
|
||
((cmd) == VCTR_ZP2_FM_INPUT7 ) ||\
|
||
((cmd) == VCTR_ZP2_FM_INPUT8 ) ||\
|
||
((cmd) == VCTR_ZP2_FM_INPUT9 ) ||\
|
||
((cmd) == VCTR_ZP2_FM_INPUT10 ) ||\
|
||
((cmd) == VCTR_ZP2_FM_INPUT11 ) ||\
|
||
((cmd) == VCTR_ZP2_FM_INPUT12 ) ||\
|
||
((cmd) == VCTR_ZP2_FM_INPUT13 ) ||\
|
||
((cmd) == VCTR_ZP2_FM_INPUT14 ) ||\
|
||
((cmd) == VCTR_ZP2_FM_INPUT15 ) ||\
|
||
((cmd) == VCTR_ZP2_FM_INPUT16 ) ||\
|
||
((cmd) == VCTR_OPOS_NONE ) ||\
|
||
((cmd) == VCTR_OPOS_ON ) ||\
|
||
((cmd) == VCTR_OPOS_VAXIS1 ) ||\
|
||
((cmd) == VCTR_OPOS_AXIS1_P ) ||\
|
||
((cmd) == VCTR_OPOS_AXIS1_S ) ||\
|
||
((cmd) == VCTR_OPOS_AXIS2_P ) ||\
|
||
((cmd) == VCTR_OPOS_AXIS2_S ) ||\
|
||
((cmd) == VCTR_OPOS_AXIS3_P ) ||\
|
||
((cmd) == VCTR_OPOS_AXIS3_S ) ||\
|
||
((cmd) == VCTR_OPOS_AXIS4_P ) ||\
|
||
((cmd) == VCTR_OPOS_AXIS4_S ) ||\
|
||
((cmd) == VCTR_OPOS_AXIS5_P ) ||\
|
||
((cmd) == VCTR_OPOS_AXIS5_S ) ||\
|
||
((cmd) == VCTR_OPOS_AXIS6_P ) ||\
|
||
((cmd) == VCTR_OPOS_AXIS6_S ) ||\
|
||
((cmd) == VCTR_OPOS_AP1 ) ||\
|
||
((cmd) == VCTR_OPOS_BP1 ) ||\
|
||
((cmd) == VCTR_OPOS_ZP1 ) ||\
|
||
((cmd) == VCTR_OPOS_AP2 ) ||\
|
||
((cmd) == VCTR_OPOS_BP2 ) ||\
|
||
((cmd) == VCTR_OPOS_ZP2 ) ||\
|
||
((cmd) == VCTR_ZPOS_NONE ) ||\
|
||
((cmd) == VCTR_ZPOS_ON ) ||\
|
||
((cmd) == VCTR_ZPOS_INPUT1 ) ||\
|
||
((cmd) == VCTR_ZPOS_INPUT2 ) ||\
|
||
((cmd) == VCTR_ZPOS_INPUT3 ) ||\
|
||
((cmd) == VCTR_ZPOS_INPUT4 ) ||\
|
||
((cmd) == VCTR_ZPOS_INPUT5 ) ||\
|
||
((cmd) == VCTR_ZPOS_INPUT6 ) ||\
|
||
((cmd) == VCTR_ZPOS_INPUT7 ) ||\
|
||
((cmd) == VCTR_ZPOS_INPUT8 ) ||\
|
||
((cmd) == VCTR_ZPOS_INPUT9 ) ||\
|
||
((cmd) == VCTR_ZPOS_INPUT10 ) ||\
|
||
((cmd) == VCTR_ZPOS_INPUT11 ) ||\
|
||
((cmd) == VCTR_ZPOS_INPUT12 ) ||\
|
||
((cmd) == VCTR_ZPOS_INPUT13 ) ||\
|
||
((cmd) == VCTR_ZPOS_INPUT14 ) ||\
|
||
((cmd) == VCTR_ZPOS_INPUT15 ) ||\
|
||
((cmd) == VCTR_ZPOS_INPUT16 ) ||\
|
||
((cmd) == VCTR_ZPOS_ECD1 ) ||\
|
||
((cmd) == VCTR_ZPOS_ECD2 ) ||\
|
||
((cmd) == VCTR_AXIS1_ALM_STOP_DIS ) ||\
|
||
((cmd) == VCTR_AXIS1_ALM_STOP_EN ) ||\
|
||
((cmd) == VCTR_AXIS1_ALM_LEV_LOW ) ||\
|
||
((cmd) == VCTR_AXIS1_ALM_LEV_HIGH ) ||\
|
||
((cmd) == VCTR_AXIS2_ALM_STOP_DIS ) ||\
|
||
((cmd) == VCTR_AXIS2_ALM_STOP_EN ) ||\
|
||
((cmd) == VCTR_AXIS2_ALM_LEV_LOW ) ||\
|
||
((cmd) == VCTR_AXIS2_ALM_LEV_HIGH ) ||\
|
||
((cmd) == VCTR_AXIS3_ALM_STOP_DIS ) ||\
|
||
((cmd) == VCTR_AXIS3_ALM_STOP_EN ) ||\
|
||
((cmd) == VCTR_AXIS3_ALM_LEV_LOW ) ||\
|
||
((cmd) == VCTR_AXIS3_ALM_LEV_HIGH ) ||\
|
||
((cmd) == VCTR_AXIS4_ALM_STOP_DIS ) ||\
|
||
((cmd) == VCTR_AXIS4_ALM_STOP_EN ) ||\
|
||
((cmd) == VCTR_AXIS4_ALM_LEV_LOW ) ||\
|
||
((cmd) == VCTR_AXIS4_ALM_LEV_HIGH ) ||\
|
||
((cmd) == VCTR_AXIS5_ALM_STOP_DIS ) ||\
|
||
((cmd) == VCTR_AXIS5_ALM_STOP_EN ) ||\
|
||
((cmd) == VCTR_AXIS5_ALM_LEV_LOW ) ||\
|
||
((cmd) == VCTR_AXIS5_ALM_LEV_HIGH ) ||\
|
||
((cmd) == VCTR_AXIS6_ALM_STOP_DIS ) ||\
|
||
((cmd) == VCTR_AXIS6_ALM_STOP_EN ) ||\
|
||
((cmd) == VCTR_AXIS6_ALM_LEV_LOW ) ||\
|
||
((cmd) == VCTR_AXIS6_ALM_LEV_HIGH ) ||\
|
||
0)
|
||
|
||
//---------------------------------------------------------------
|
||
// 虚轴参数
|
||
|
||
#define VAXIS1_BUF1_PARA (VAXIS+0x02) // 虚轴1:命令缓冲区1写参数端口
|
||
#define VAXIS1_BUF2_PARA (VAXIS+0x04) // 虚轴1:命令缓冲区2写参数端口
|
||
#define VAXIS1_BUF3_PARA (VAXIS+0x06) // 虚轴1:命令缓冲区3
|
||
|
||
|
||
// 虚轴命令有两个缓冲区,向一个缓冲区写入运动命令后,再向控制端口写入运行命令,则开始产生脉冲。
|
||
// 缓冲区1执行过程中,可以向缓冲区2写入下一步的运动命令。一个缓冲区执行完成后自动切换到下一个。
|
||
|
||
// 虚轴命令缓冲区结构如下
|
||
typedef struct
|
||
{
|
||
u16 vaxisId; // 虚轴选择 (VAXIS_ID1 ~ VAXIS_ECD)
|
||
u16 bufSel; // buf 选择 (BUF_SEL1 ~ BUF_SEL3)
|
||
|
||
u32 calcGap; // 计算时间间隔 (MIN_GAP ~ MAX_GAP)
|
||
u32 startPPS; // 启动频率 (MIN_PPS ~ MAX_PPS)
|
||
u32 runPPS; // 目标频率 (MIN_PPS ~ MAX_PPS)
|
||
u32 outNum; // 本次输出脉冲个数 (MIN_OUTNUM ~ MAX_OUTNUM)
|
||
u32 jumpNum; // 变速跳过脉冲个数 (0 ~ MAX_OUTNUM)
|
||
// 命令生效
|
||
} VAxisCmdStr;
|
||
|
||
// 注意:
|
||
// 1. 频率范围 1Hz ~ 4Mhz
|
||
// 2. 所有数值均为无符号数
|
||
// 3. 最小频率必须大于加速度频率
|
||
// 4.表3优先级高于表1和表2,表3有效时,虚轴速度以表3为准
|
||
|
||
// 结构用到的宏定义
|
||
|
||
// 虚轴选择
|
||
#define VAXIS_ID1 0x0001
|
||
|
||
#define VAXIS_ECD 0x0004
|
||
#define VAXIS_ID_ALL 0x0005
|
||
|
||
|
||
#define IS_VAXIS_ID(VAXIS) (((VAXIS) == VAXIS_ID1) || \
|
||
((VAXIS) == VAXIS_ECD) || \
|
||
((VAXIS) == VAXIS_ID_ALL))
|
||
|
||
// 表选择
|
||
#define BUF_SEL1 0x0001
|
||
#define BUF_SEL2 0x0002
|
||
#define BUF_SEL3 0x0003
|
||
|
||
#define IS_BUF_SEL(BUFF) (((BUFF) == BUF_SEL1) || \
|
||
((BUFF) == BUF_SEL2) || \
|
||
((BUFF) == BUF_SEL3))
|
||
|
||
|
||
#define MIN_GAP 36
|
||
#define MAX_GAP 72000
|
||
|
||
#define MIN_PPS 1
|
||
#define MAX_PPS 4000000 // 4MHz
|
||
|
||
#define MIN_OUTNUM 1
|
||
#define MAX_OUTNUM 67108863 // 2^26-1
|
||
|
||
#define VOK_FLAG 0x4F4B // OK
|
||
|
||
#define OP_OUT_DIVISION (VAXIS+0x08) // OP输出分频设置端口
|
||
#define OP_OUT_DIRECT 0x0001 // 直接输出√
|
||
// 其他值,支持从 0x0002--0xFFFE 之间的偶数
|
||
|
||
#define OP_COUNTER_SET_L (VAXIS+0x0A) // 设置OP计数值
|
||
#define OP_COUNTER_SET_H (VAXIS+0x0C)
|
||
|
||
#define ZP_COUNTER_SET_L (VAXIS+0x0E) // 设置ZP计数值
|
||
#define ZP_COUNTER_SET_H (VAXIS+0x10)
|
||
|
||
#define ECD1_COUNTER_SET_L (VAXIS+0x12) // 设置编码器1计数值
|
||
#define ECD1_COUNTER_SET_H (VAXIS+0x14)
|
||
|
||
#define ECD2_COUNTER_SET_L (VAXIS+0x16) // 设置编码器2计数值
|
||
#define ECD2_COUNTER_SET_H (VAXIS+0x18)
|
||
|
||
#define INPUT_INT_SET (VAXIS+0x20) // 输入端口下降沿中断配置
|
||
|
||
#define INPUT_ALL_FINT_DIS 0x0000 // 输入中断全部禁用√
|
||
|
||
#define INPUT1_INT_EN 0x0001 // 输入1中断使能
|
||
#define INPUT2_INT_EN 0x0002 // 输入2中断使能
|
||
#define INPUT3_INT_EN 0x0004 // 输入3中断使能
|
||
#define INPUT4_INT_EN 0x0008 // 输入4中断使能
|
||
#define INPUT5_INT_EN 0x0010 // 输入5中断使能
|
||
#define INPUT6_INT_EN 0x0020 // 输入6中断使能
|
||
#define INPUT7_INT_EN 0x0040 // 输入7中断使能
|
||
#define INPUT8_INT_EN 0x0080 // 输入8中断使能
|
||
#define INPUT9_INT_EN 0x0100 // 输入9中断使能
|
||
#define INPUT10_INT_EN 0x0200 // 输入10中断使能
|
||
#define INPUT11_INT_EN 0x0400 // 输入11中断使能
|
||
#define INPUT12_INT_EN 0x0800 // 输入12中断使能
|
||
#define INPUT13_INT_EN 0x1000 // 输入13中断使能
|
||
#define INPUT14_INT_EN 0x2000 // 输入14中断使能
|
||
#define INPUT15_INT_EN 0x4000 // 输入15中断使能
|
||
#define INPUT16_INT_EN 0x8000 // 输入16中断使能
|
||
|
||
// 输出端口控制
|
||
#define OUTPUT_SET (VAXIS+0x22)
|
||
|
||
#define OUTPUT1_BIT 0x0001 // 输出1
|
||
#define OUTPUT2_BIT 0x0002 // 输出2
|
||
#define OUTPUT3_BIT 0x0004 // 输出3
|
||
#define OUTPUT4_BIT 0x0008 // 输出4
|
||
#define OUTPUT5_BIT 0x0010 // 输出5
|
||
#define OUTPUT6_BIT 0x0020 // 输出6
|
||
#define OUTPUT7_BIT 0x0040 // 输出7
|
||
#define OUTPUT8_BIT 0x0080 // 输出8
|
||
|
||
// 外部IO刷新频率
|
||
#define EXIO_REFRE_FREQ (VAXIS+0x24) // 外部IO刷新频率配置
|
||
|
||
#define REF_FREQ_35K 0x0001
|
||
#define REF_FREQ_22K 0x0002
|
||
#define REF_FREQ_16K 0x0003
|
||
#define REF_FREQ_14K 0x0004
|
||
#define REF_FREQ_12K 0x0005
|
||
#define REF_FREQ_10K 0x0006 // √
|
||
#define REF_FREQ_9K 0x0007
|
||
#define REF_FREQ_8K 0x0008
|
||
#define REF_FREQ_7K 0x0009
|
||
#define REF_FREQ_6K 0x000A
|
||
#define REF_FREQ_5K 0x000B
|
||
#define REF_FREQ_4K 0x000C
|
||
#define REF_FREQ_3K 0x000D
|
||
#define REF_FREQ_2K 0x000E
|
||
#define REF_FREQ_1K 0x000F
|
||
#define REF_FREQ_500 0x001F
|
||
|
||
|
||
// 串行IO扩展板卡读写
|
||
#define EXIO_PORT_BASE (VAXIS+0x60) // 串行IO扩展板卡基地址
|
||
#define EXIO_PORT_ADDR(addr) (EXIO_PORT_BASE+((addr)>>4)*2)
|
||
#define EXIO_ADDR_MOD(addr) (0x0001 << ((addr)&0x0F))
|
||
|
||
#define MAX_EXIO_ADDR 256
|
||
#define EXIO_PER_PORT 16
|
||
#define EXIO_PORT_NUM (MAX_EXIO_ADDR/EXIO_PER_PORT)
|
||
|
||
//------------------------------------------------------------------------------------------------
|
||
//------------------------------------------------------------------------------------------------
|
||
|
||
// 实轴偏移地址
|
||
|
||
//------------------------------------------------------
|
||
|
||
// 写端口地址
|
||
// 实轴输出配置端口
|
||
#define AXIS_CONFIG(axisAddr) (axisAddr+0x00)
|
||
|
||
#define POUT_CWCCW 0x0000 // 双脉冲方式输出√
|
||
#define POUT_PLSDIR 0x0001 // 脉冲+方向方式输出
|
||
#define POUT_NORMAL 0x0002 // 脉冲信号正常输出模式√
|
||
#define POUT_XCHANGE 0x0003 // 脉冲信号对调输出模式
|
||
|
||
#define POUT_DISABLE 0x0100 // 脉冲输出禁止√
|
||
#define POUT_ENABLE_VAXIS1 0x0101 // 脉冲输出允许:输入时钟为虚轴1
|
||
|
||
#define POUT_ENABLE_ECD 0x0102 // 脉冲输出允许:输入为编码器接口
|
||
#define POUT_ENABLE_PWM 0x0102 // 脉冲输出允许:输入为PWM模式
|
||
#define POUT_ENABLE_BUSIO 0x0102 // 脉冲输出允许:输入为内部总线直接控制模式
|
||
|
||
#define MAKE_POUT_CMD(vaxis) (POUT_DISABLE|((vaxis)&0x0F))
|
||
|
||
#define DATI_INTERPOLATION 0x0200 // 硬件直线(正弦)插补√
|
||
#define DATI_ECD1_FLOW 0x0201 // 编码器1随动方式输出(CW/CCW或P/S信号)
|
||
#define DATI_ECD2_FLOW 0x0202 // 编码器2随动方式输出(CW/CCW或P/S信号)
|
||
#define DATI_ECD1_MAPPING 0x0203 // 编码器1信号映射输出(信号直连, 正交信号或CW/CCW或P/S信号)
|
||
#define DATI_ECD2_MAPPING 0x0204 // 编码器2信号映射输出(信号直连, 正交信号或CW/CCW或P/S信号)
|
||
#define DATI_PWM 0x0205 // PWM模式
|
||
#define DATI_BUS_IO 0x0206 // 内部总线直接控制模式
|
||
|
||
#define MOUT_EN_LOW 0x0300 // 驱动器EN信号输出低
|
||
#define MOUT_EN_HIGH 0x0301 // 驱动器EN信号输出高√
|
||
#define MOUT_SON_LOW 0x0310 // 驱动器SON信号输出低
|
||
#define MOUT_SON_HIGH 0x0311 // 驱动器SON信号输出高√
|
||
#define MOUT_SEL_LOW 0x0320 // 驱动器SEL信号输出低
|
||
#define MOUT_SEL_HIGH 0x0321 // 驱动器SEL信号输出高√
|
||
|
||
#define COUNTER_DIR_POS 0x0400 // 计数器计数方向为正√
|
||
#define COUNTER_DIR_NEG 0x0401 // 计数器计数方向为反
|
||
|
||
#define DIS_INTER_BUF1 0x0500 // 表1失效,表1清空,数据指针归零√
|
||
#define DIS_INTER_BUF2 0x0501 // 表2失效,表2清空,数据指针归零√
|
||
|
||
#define MOUT_PLUS_OFF 0x0600 // 内部脉冲信号:无√
|
||
#define MOUT_PLUS_ON 0x0601 // 内部脉冲信号:有
|
||
#define MOUT_SIGN_CW 0x0610 // 内部方向信号:正转√
|
||
#define MOUT_SIGN_CCW 0x0611 // 内部方向信号:反转
|
||
|
||
#define IS_AXIS_CMD(cmd) ( ((cmd) == POUT_CWCCW ) ||\
|
||
((cmd) == POUT_PLSDIR ) ||\
|
||
((cmd) == POUT_NORMAL ) ||\
|
||
((cmd) == POUT_XCHANGE ) ||\
|
||
((cmd) == POUT_DISABLE ) ||\
|
||
((cmd) == POUT_ENABLE_VAXIS1 ) ||\
|
||
((cmd) == POUT_ENABLE_ECD ) ||\
|
||
((cmd) == POUT_ENABLE_PWM ) ||\
|
||
((cmd) == POUT_ENABLE_BUSIO ) ||\
|
||
((cmd) == DATI_INTERPOLATION ) ||\
|
||
((cmd) == DATI_ECD1_FLOW ) ||\
|
||
((cmd) == DATI_ECD2_FLOW ) ||\
|
||
((cmd) == DATI_ECD1_MAPPING ) ||\
|
||
((cmd) == DATI_ECD2_MAPPING ) ||\
|
||
((cmd) == DATI_PWM ) ||\
|
||
((cmd) == DATI_BUS_IO ) ||\
|
||
((cmd) == MOUT_EN_LOW ) ||\
|
||
((cmd) == MOUT_EN_HIGH ) ||\
|
||
((cmd) == MOUT_SON_LOW ) ||\
|
||
((cmd) == MOUT_SON_HIGH ) ||\
|
||
((cmd) == MOUT_SEL_LOW ) ||\
|
||
((cmd) == MOUT_SEL_HIGH ) ||\
|
||
((cmd) == COUNTER_DIR_POS ) ||\
|
||
((cmd) == COUNTER_DIR_NEG ) ||\
|
||
((cmd) == DIS_INTER_BUF1 ) ||\
|
||
((cmd) == DIS_INTER_BUF2 ) ||\
|
||
((cmd) == MOUT_PLUS_OFF ) ||\
|
||
((cmd) == MOUT_PLUS_ON ) ||\
|
||
((cmd) == MOUT_SIGN_CW ) ||\
|
||
((cmd) == MOUT_SIGN_CCW ) ||\
|
||
0 )
|
||
// 插补1参数
|
||
#define INTER_BUF1_PARA(axisAddr) (axisAddr+0x02)
|
||
|
||
// 插补2参数
|
||
#define INTER_BUF2_PARA(axisAddr) (axisAddr+0x04)
|
||
|
||
// 插补数据缓冲区1
|
||
#define INTER_BUF1_DATA(axisAddr) (axisAddr+0x06)
|
||
|
||
// 插补数据缓冲区2
|
||
#define INTER_BUF2_DATA(axisAddr) (axisAddr+0x08)
|
||
|
||
#define MAX_SEGMENT_PER_BUF 16 // 每个缓冲区的最大段数
|
||
|
||
#define MAX_PULSE_PER_SEGMENT 32767 // 每段最大脉冲数
|
||
|
||
|
||
// 整个表方向控制
|
||
// 0x00000000(默认值): 一直正转
|
||
// R.31 R.30 00(正向|正向),01(正向|反向),10(反向|正向),11(反向|反向)
|
||
// R.25--R.0: 方向变化点位图地址,按照位来编址
|
||
// 当为0xffffffff 时,按分段内方向标识执行
|
||
#define DIR_POSPOS 0x00000000
|
||
#define DIR_POSNEG 0x40000000
|
||
#define DIR_NEGPOS 0x80000000
|
||
#define DIR_NEGNEG 0xC0000000
|
||
#define AXIS_DIR_CHG_VAL(n) ((n)&0x3FFFFFFF)
|
||
#define AXIS_DIR_USEBUF 0xFFFFFFFF // 使用每段内方向标志
|
||
|
||
// 每段方向&发送脉冲个数控制
|
||
// R.15 0(正向),1(反向)
|
||
// R.14--R.0: 输出脉冲数(0--32767)
|
||
#define DATA_DIR_POS 0x0000
|
||
#define DATA_DIR_NEG 0x8000
|
||
#define DATA_DIR_CHG_VAL(n) ((n)&0x7FFF)
|
||
|
||
typedef struct
|
||
{
|
||
u16 axisId; // 实轴选择 (AXIS_ID1 ~ AXIS_ID6)
|
||
u16 vaxisId; // 虚轴选择 (VAXIS_ID1 ~ VAXIS_ECD)
|
||
u16 bufSel; // 缓冲区选择 (BUF_SEL1 ~ BUF_SEL3)
|
||
u32 startEscNum; // 起始跳过的虚轴脉冲数 (0 ~ MAX_OUTNUM)
|
||
u32 partVxNum; // 每段对应的虚轴脉冲数 (MIN_OUTNUM ~ MAX_OUTNUM)
|
||
u32 dirAttr; // 实轴脉冲输出方向和方向变化
|
||
u16 datBufLen; // 缓冲区有效数据个数 (1 ~ MAX_PULSE_PER_SEGMENT)
|
||
u16 datBuff[MAX_SEGMENT_PER_BUF]; // 缓冲区 (15.段执行方向; .14~0脉冲数)
|
||
u16 sineOut; // 正弦输出标志. 0, 非正弦输出, 1, 正弦输出
|
||
} InterData;
|
||
|
||
#define SINE_MUTI (1.42f) // 正弦输出脉冲变换系数
|
||
|
||
// 实轴选择
|
||
#define AXIS_ID1 0x0001
|
||
#define AXIS_ID2 0x0002
|
||
#define AXIS_ID3 0x0003
|
||
#define AXIS_ID4 0x0004
|
||
#define AXIS_ID5 0x0005
|
||
#define AXIS_ID6 0x0006
|
||
|
||
#define IS_AXIS_ID(AXIS) (((AXIS) == AXIS_ID1) || \
|
||
((AXIS) == AXIS_ID2) || \
|
||
((AXIS) == AXIS_ID3) || \
|
||
((AXIS) == AXIS_ID4) || \
|
||
((AXIS) == AXIS_ID5) || \
|
||
((AXIS) == AXIS_ID6))
|
||
|
||
// 设置计数器(L)
|
||
#define AXIS_COUNTER_L(axisAddr) (axisAddr+0x0A)
|
||
// 设置计数器(H)
|
||
#define AXIS_COUNTER_H(axisAddr) (axisAddr+0x0C)
|
||
|
||
|
||
#define FPGA_PWM_MAX_VAL (0x3FF)
|
||
|
||
|
||
#define IS_AXIS_PWM_ID(AXIS) (((AXIS) == AXIS_ID3) || \
|
||
((AXIS) == AXIS_ID4))
|
||
|
||
#define IS_AXIS_PWM_FREQ(FREQ) (((FREQ) >= 0x01) && \
|
||
((FREQ) <= 0xFF))
|
||
|
||
#define IS_AXIS_PWM_VAL(VAL) (((VAL) >= 0x0000)&& \
|
||
((VAL) <= 0x03FF))
|
||
|
||
#define AXIS_PWM_FREQ(axisAddr) (axisAddr+0x0E) // PWM分频系数(对62.5K分频)(0x01~0xFF)
|
||
#define AXIS_PULSE_PWM(axisAddr) (axisAddr+0x10) // pulse PWM 值 10bit(0~0x3FF)
|
||
#define AXIS_SIGN_PWM(axisAddr) (axisAddr+0x12) // sign PWM 值 10bit(0~0x3FF)
|
||
|
||
|
||
/* 正弦输出模式
|
||
0,数据为0时表示此功能不起作用
|
||
1,如使用该输出模式,需配置直线插补参数
|
||
2,实轴直线插补输出脉冲数需不小于 此值 x 根号2
|
||
*/
|
||
|
||
#define IS_AXIS_SINE_ID(AXIS) (((AXIS) == AXIS_ID1) || \
|
||
((AXIS) == AXIS_ID2) || \
|
||
((AXIS) == AXIS_ID3) || \
|
||
((AXIS) == AXIS_ID4) || \
|
||
((AXIS) == AXIS_ID5) || \
|
||
((AXIS) == AXIS_ID6))
|
||
|
||
#define AXIS_BUF1_SINE_OUT(axisAddr) (axisAddr+0x14) // BUF1输出脉冲数
|
||
#define AXIS_BUF2_SINE_OUT(axisAddr) (axisAddr+0x16) // BUF2输出脉冲数
|
||
|
||
#define AXIS_BUF1_SINE_OUT_H(axisAddr) (axisAddr+0x1A)
|
||
#define AXIS_BUF2_SINE_OUT_H(axisAddr) (axisAddr+0x1C)
|
||
|
||
|
||
// 编码器选择
|
||
#define ECD_SEL1 0x0001
|
||
#define ECD_SEL2 0x0002
|
||
|
||
#define IS_ECD_SEL(ECD) (((ECD) == ECD_SEL1) || \
|
||
((ECD) == ECD_SEL2))
|
||
|
||
|
||
|
||
|
||
|
||
//------------------------------------------------------------------------------------------------
|
||
//------------------------------------------------------------------------------------------------
|
||
|
||
// 读端口地址
|
||
// FPGA硬件版本(分为高8位机器类型,低8位版本)
|
||
#define FPGA_HARD_VERSION (VAXIS+0x00)
|
||
|
||
#define FPGA_PLOTTER_VER 0x01 // 喷墨绘图仪
|
||
#define FPGA_EMB_VER 0x02 // 绣花机/布线机
|
||
|
||
// FPGA软件版本(分为高8位,低8位)
|
||
#define FPGA_SOFT_VERSION (VAXIS+0x02)
|
||
|
||
// 虚轴状态端口
|
||
// 从虚轴状态端口中读取数据,通过下面的位判断相应的状态。状态位 .15 .14 .13 .12 .11 .10 .7 .6 .3 .2 为1时会产生中断,需要软件清除
|
||
// *中断源
|
||
#define VAXIS_STATUS (VAXIS+0x04)
|
||
#define VAXIS1_BUF1_RUNNING 0x0001 // 虚轴1缓冲区1正在执行标志
|
||
#define VAXIS1_BUF2_RUNNING 0x0002 // 虚轴1缓冲区2正在执行标志
|
||
#define VAXIS1_BUF1_FINISH 0x0004 // 虚轴1缓冲区1完成标志*
|
||
#define VAXIS1_BUF2_FINISH 0x0008 // 虚轴1缓冲区2完成标志*
|
||
|
||
#define AXIS_ALARM_FLAG 0x2000 // 实轴驱动器报警停车标志* (AXIS_ALM_STATUS)
|
||
#define ENCODER_ALARM_FLAG 0x4000 // 编码器上升沿中断标志* (ECD_INT_FLAGS)
|
||
#define INPUT_ALARM_FLAG 0x8000 // Input下降沿中断标志* (INPUT_INT_FLAGS)
|
||
|
||
// 虚轴表状态
|
||
#define VAXIS_STATUS1 (VAXIS+0x0006)
|
||
|
||
#define VAXIS1_BUF1_ENABLE 0x0001 // 虚轴1缓冲区1有效标志
|
||
#define VAXIS1_BUF2_ENABLE 0x0002 // 虚轴1缓冲区2有效标志
|
||
#define VAXIS1_BUF3_ENABLE 0x0004 // 虚轴1缓冲区3有效标志
|
||
|
||
// 编码器中断标志
|
||
#define ECD_INT_FLAGS (VAXIS+0x0008)
|
||
#define ECD1ZP_INT_FLAG 0x0001 // 编码器1 ZP上升沿中断
|
||
#define ECD2ZP_INT_FLAG 0x0002 // 编码器2 ZP上升沿中断
|
||
|
||
#define ECD_INT_MASK 0x0003
|
||
|
||
// 输入信号中断标志
|
||
#define INPUT_INT_FLAGS (VAXIS+0x0A)
|
||
#define INPUT01_INT_FLAG 0x0001 // 输入1下降沿中断
|
||
#define INPUT02_INT_FLAG 0x0002 // 输入2下降沿中断
|
||
#define INPUT03_INT_FLAG 0x0004 // 输入3下降沿中断
|
||
#define INPUT04_INT_FLAG 0x0008 // 输入4下降沿中断
|
||
#define INPUT05_INT_FLAG 0x0010 // 输入5下降沿中断
|
||
#define INPUT06_INT_FLAG 0x0020 // 输入6下降沿中断
|
||
#define INPUT07_INT_FLAG 0x0040 // 输入7下降沿中断
|
||
#define INPUT08_INT_FLAG 0x0080 // 输入8下降沿中断
|
||
#define INPUT09_INT_FLAG 0x0100 // 输入9下降沿中断
|
||
#define INPUT10_INT_FLAG 0x0200 // 输入10下降沿中断
|
||
#define INPUT11_INT_FLAG 0x0400 // 输入11下降沿中断
|
||
#define INPUT12_INT_FLAG 0x0800 // 输入12下降沿中断
|
||
#define INPUT13_INT_FLAG 0x1000 // 输入13下降沿中断
|
||
#define INPUT14_INT_FLAG 0x2000 // 输入14下降沿中断
|
||
#define INPUT15_INT_FLAG 0x4000 // 输入15下降沿中断
|
||
#define INPUT16_INT_FLAG 0x8000 // 输入16下降沿中断
|
||
|
||
#define INPUT_INT_MASK 0xFFFF
|
||
|
||
// 虚轴1当前频率,单位PPS,先锁存后读取 (0~4M)
|
||
#define CUR_VAXIS1_PPS_L (VAXIS+0x0C)
|
||
#define CUR_VAXIS1_PPS_H (VAXIS+0x0E)
|
||
|
||
// 上一个表结束时的虚轴频率
|
||
#define VAXIS1_END_FREQUENCY_L (VAXIS+0x10)
|
||
#define VAXIS1_END_FREQUENCY_H (VAXIS+0x12)
|
||
|
||
// 虚轴1当前脉冲计数,单位:个,先锁存后读取 (0 ~ 2^26-1)
|
||
#define CUR_VAXIS1_COUNTER_L (VAXIS+0x14)
|
||
#define CUR_VAXIS1_COUNTER_H (VAXIS+0x16)
|
||
|
||
// 实轴1计数器计数值,有符号数,单位:个,先锁存后读取 (-2^31-1 ~ 2^31-1)
|
||
#define CUR_AXIS1_COUNTER_L (VAXIS+0x20)
|
||
#define CUR_AXIS1_COUNTER_H (VAXIS+0x22)
|
||
|
||
// 实轴2计数器计数值,有符号数,单位:个,先锁存后读取 (-2^31-1 ~ 2^31-1)
|
||
#define CUR_AXIS2_COUNTER_L (VAXIS+0x24)
|
||
#define CUR_AXIS2_COUNTER_H (VAXIS+0x26)
|
||
|
||
// 实轴3计数器计数值,有符号数,单位:个,先锁存后读取 (-2^31-1 ~ 2^31-1)
|
||
#define CUR_AXIS3_COUNTER_L (VAXIS+0x28)
|
||
#define CUR_AXIS3_COUNTER_H (VAXIS+0x2A)
|
||
|
||
// 实轴4计数器计数值,有符号数,单位:个,先锁存后读取 (-2^31-1 ~ 2^31-1)
|
||
#define CUR_AXIS4_COUNTER_L (VAXIS+0x2C)
|
||
#define CUR_AXIS4_COUNTER_H (VAXIS+0x2E)
|
||
|
||
// 实轴5计数器计数值,有符号数,单位:个,先锁存后读取 (-2^31-1 ~ 2^31-1)
|
||
#define CUR_AXIS5_COUNTER_L (VAXIS+0x30)
|
||
#define CUR_AXIS5_COUNTER_H (VAXIS+0x32)
|
||
|
||
// 实轴6计数器计数值,有符号数,单位:个,先锁存后读取 (-2^31-1 ~ 2^31-1)
|
||
#define CUR_AXIS6_COUNTER_L (VAXIS+0x34)
|
||
#define CUR_AXIS6_COUNTER_H (VAXIS+0x36)
|
||
|
||
// 编码器1计数值,有符号数,单位:个,先锁存后读取 (-2^31-1 ~ 2^31-1)
|
||
#define CUR_ECD1_COUNTER_L (VAXIS+0x40)
|
||
#define CUR_ECD1_COUNTER_H (VAXIS+0x42)
|
||
|
||
// 编码器2计数值,有符号数,单位:个,先锁存后读取 (-2^31-1 ~ 2^31-1)
|
||
#define CUR_ECD2_COUNTER_L (VAXIS+0x44)
|
||
#define CUR_ECD2_COUNTER_H (VAXIS+0x46)
|
||
|
||
// OP计数值,单位:个,先锁存后读取 (0 ~ 2^32-1)
|
||
#define CUR_OP_COUNTER_L (VAXIS+0x48)
|
||
#define CUR_OP_COUNTER_H (VAXIS+0x4A)
|
||
|
||
// ZP计数值,单位:个,先锁存后读取 (0 ~ 2^32-1)
|
||
#define CUR_ZP_COUNTER_L (VAXIS+0x4C)
|
||
#define CUR_ZP_COUNTER_H (VAXIS+0x4E)
|
||
|
||
// 实轴报警状态端口
|
||
#define AXIS_ALM_STATUS (VAXIS+0x50)
|
||
#define AXIS1_ALM 0x0001 // 轴1报警
|
||
#define AXIS2_ALM 0x0002 // 轴2报警
|
||
#define AXIS3_ALM 0x0004 // 轴3报警
|
||
#define AXIS4_ALM 0x0008 // 轴4报警
|
||
#define AXIS5_ALM 0x0010 // 轴5报警
|
||
#define AXIS6_ALM 0x0020 // 轴6报警
|
||
|
||
#define AXIS_ALM_MASK 0x003F
|
||
|
||
// 编码器状态端口
|
||
#define ECD_SIGNAL_STATUS (VAXIS+0x52)
|
||
#define BP1_STA 0x0001 // 编码器1BP
|
||
#define AP1_STA 0x0802 // 编码器1AP
|
||
#define ZP1_STA 0x0004 // 编码器1ZP
|
||
#define BP2_STA 0x0008 // 编码器2BP
|
||
#define AP2_STA 0x0010 // 编码器2AP
|
||
#define ZP2_STA 0x0020 // 编码器2ZP
|
||
|
||
#define ECD_STA_MASK 0x003F
|
||
|
||
// 标准输入状态端口
|
||
#define INPUT_STATUS (VAXIS+0x54)
|
||
#define INPUT1_STA 0x0001 // 输入1
|
||
#define INPUT2_STA 0x0002 // 输入2
|
||
#define INPUT3_STA 0x0004 // 输入3
|
||
#define INPUT4_STA 0x0008 // 输入4
|
||
#define INPUT5_STA 0x0010 // 输入5
|
||
#define INPUT6_STA 0x0020 // 输入6
|
||
#define INPUT7_STA 0x0040 // 输入7
|
||
#define INPUT8_STA 0x0080 // 输入8
|
||
#define INPUT9_STA 0x0100 // 输入9
|
||
#define INPUT10_STA 0x0200 // 输入10
|
||
#define INPUT11_STA 0x0400 // 输入11
|
||
#define INPUT12_STA 0x0800 // 输入12
|
||
#define INPUT13_STA 0x1000 // 输入13
|
||
#define INPUT14_STA 0x2000 // 输入14
|
||
#define INPUT15_STA 0x4000 // 输入15
|
||
#define INPUT16_STA 0x8000 // 输入16
|
||
|
||
//--------------------------------------------------------------------------------------------------------------
|
||
|
||
|
||
//--------------------------------------------------------------------------------------------------------------
|
||
|
||
// 初始化FPGA
|
||
void InitEmbFpga(void);
|
||
|
||
//--------------------------------------------------------------------------------------------------------------
|
||
// 读端口
|
||
// 读取版本
|
||
u16 GetFpgaHardVersion(void);
|
||
u16 GetFpgaSoftVersion(void);
|
||
|
||
// 得到虚轴运行状态
|
||
u16 GetRunStatus(void);
|
||
|
||
// 读取虚轴表状态
|
||
u16 GetRunStatus1(void);
|
||
|
||
// 得到输入端口中断信息
|
||
u16 GetInputIntFlags(void);
|
||
|
||
// 得到编码器中断信息
|
||
u16 GetEcdIntFlags(void);
|
||
|
||
// 得到虚轴的运行频率
|
||
u32 GetVAxisPPS(u16 vaxisId);
|
||
|
||
// 读取上一个表结束时虚轴的运行速度
|
||
u32 GetLastVAxisFrequency(u16 vaxisId);
|
||
|
||
// 得到虚轴的计数值
|
||
u32 GetVAxisCounter(u16 vaxisId);
|
||
|
||
// 读取实轴计数器值
|
||
s32 GetAxisCounter(u16 axisId);
|
||
|
||
// 得到编码器的数值
|
||
s32 GetEcdCounter(u16 ecdId);
|
||
|
||
// 读取OP计数器值
|
||
u32 GetOPCounter(void);
|
||
|
||
// 读取ZP计数器值
|
||
u32 GetZPCounter(void);
|
||
|
||
// 得到实轴报警信息
|
||
u16 GetAlarmValue(void);
|
||
|
||
// 得到编码器信号状态
|
||
u16 GetEcdStatus(void);
|
||
|
||
// 得到输入信号状态
|
||
u16 GetInputStatus(void);
|
||
|
||
//--------------------------------------------------------------------------------------------------------------
|
||
// 写端口
|
||
// 设置虚轴配置
|
||
void SetVAxisConfig(u16 cfg);
|
||
|
||
// 清除全部中断标志
|
||
void CleanAllIntFlag(void);
|
||
|
||
// 启动运动
|
||
int StartVAxisRun(VAxisCmdStr * pCmd);
|
||
|
||
// 停止当前运动
|
||
int StopVAxisRun(u16 vaxisId);
|
||
|
||
// 速度解除速度临时控制
|
||
void StopSpdCtrl(u16 vaxisId);
|
||
|
||
// 编码器的数值清零
|
||
void ClearEcdCounter(u16 ecdId);
|
||
|
||
void ReetEcdABZLevel(u16 ecdId); // ABZ电平信号复位
|
||
|
||
void SetEcdAPLevelNegative(u16 ecdId); // 编码器AP取反
|
||
|
||
void SetEcdAZLevelNegative(u16 ecdId); // AP ZP 取反
|
||
|
||
void SetEcdZPLevelNegative(u16 ecdId); // ZP取反
|
||
|
||
void SetOpOutOn(void); // OP输出控制
|
||
void SetOpOutOff(void);
|
||
|
||
void SetZpOutOn(void); // ZP输出控制
|
||
void SetZpOutOff(void);
|
||
|
||
// 设置报警命令
|
||
void SetAxisAlarmConfig(u16 axisId, u16 alm);
|
||
|
||
//--------------------------------------------------------------------------------------------------------------
|
||
|
||
// 设置OP输出的分频系数
|
||
void SetOpDivision(u16 div);
|
||
|
||
// 设置OP计数值
|
||
void SetOpCounter(s32 cnt);
|
||
|
||
// 设置ZP计数值
|
||
void SetZpCounter(s32 cnt);
|
||
|
||
// 设置编码器计数值
|
||
void SetEcdCounter(u16 ecdId, s32 cnt);
|
||
|
||
// 设置输入端口中断配置
|
||
void SetInputInt(u16 cfg);
|
||
|
||
// 输出信号控制
|
||
void Output1On(void);
|
||
void Output1Off(void);
|
||
void Output2On(void);
|
||
void Output2Off(void);
|
||
void Output3On(void);
|
||
void Output3Off(void);
|
||
void Output4On(void);
|
||
void Output4Off(void);
|
||
void Output5On(void);
|
||
void Output5Off(void);
|
||
void Output6On(void);
|
||
void Output6Off(void);
|
||
void Output7On(void);
|
||
void Output7Off(void);
|
||
void Output8On(void);
|
||
void Output8Off(void);
|
||
|
||
u8 GetOutputVal(int num);
|
||
|
||
//--------------------------------------------------------------------------------------------------------------
|
||
// 设置实轴输出配置
|
||
void SetAxisConfig(u16 axisId, u16 cfg);
|
||
|
||
// 写插补数据
|
||
int WriteInterData(InterData * pCmd);
|
||
|
||
// 清空表
|
||
void CleanAxisBuff(u16 axisId, u16 bufSel);
|
||
|
||
// 设置实轴计数器值
|
||
void SetAxisCounter(u16 axisId, s32 cnt);
|
||
|
||
// 设置轴PWM分频系数
|
||
void SetAxisPwmFreq(u16 axisId, u16 freq);
|
||
|
||
// 设置轴PULSE的PWM值
|
||
void SetAxisPulsePwm(u16 axisId, u16 val);
|
||
|
||
// 设置轴SIGN的PWM值
|
||
void SetAxisSignPwm(u16 axisId, u16 val);
|
||
|
||
//--------------------------------------------------------------------------------------------------------------
|
||
|
||
void RegInputIntProc(u16 intcfg, void(*inputProc)(void));
|
||
void RegEcdInputProc(u16 ecdId, void(*ecdProc)(void));
|
||
|
||
// 外部中断响应函数
|
||
void FpgaIntProc(void);
|
||
|
||
//--------------------------------------------------------------------------------------------------------------
|
||
|
||
|
||
//--------------------------------------------------------------------------------------------------------------
|
||
|
||
|
||
//--------------------------------------------------------------------------------------------------------------
|
||
void SetExoutEnOn(void);
|
||
void SetExoutEnOff(void);
|
||
void SetExOutValue(u16 addr, u8 value);
|
||
u8 GetExOutValue(u16 addr);
|
||
void FlushExOutputs(void);
|
||
|
||
// 设置扩展IO输出状态
|
||
// addr: 1--MAX_EXIO_ADDR
|
||
// value: SENSOR_ON(Bit_RESET) 或 SENSOR_OFF(Bit_SET)
|
||
void SetExOutput(u16 addr, u8 value);
|
||
|
||
// 读取IO扩展板输入状态
|
||
// addr: 1--MAX_EXIO_ADDR
|
||
// 返回: SENSOR_ON(Bit_RESET) 或 SENSOR_OFF(Bit_SET)
|
||
u8 GetExInput(u16 addr);
|
||
void GetExInputs(u16 * pBuf);
|
||
//--------------------------------------------------------------------------------------------------------------
|
||
|
||
|
||
#endif
|