optical/EMBOS/Users/EmbBase/embfpga.h
2025-09-04 09:45:08 +08:00

1017 lines
37 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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先锁存后读取 (04M)
#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_ONBit_RESET 或 SENSOR_OFFBit_SET
void SetExOutput(u16 addr, u8 value);
// 读取IO扩展板输入状态
// addr: 1--MAX_EXIO_ADDR
// 返回: SENSOR_ONBit_RESET 或 SENSOR_OFFBit_SET
u8 GetExInput(u16 addr);
void GetExInputs(u16 * pBuf);
//--------------------------------------------------------------------------------------------------------------
#endif