#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