diff --git a/api/apibasic/cmdid.hpp b/api/apibasic/cmdid.hpp index b67a7e3..0841777 100644 --- a/api/apibasic/cmdid.hpp +++ b/api/apibasic/cmdid.hpp @@ -62,9 +62,15 @@ typedef enum { kstep_motor_stop = CMDID(2, 40), // para:{4}, ack:{} kstep_motor_active_cfg = CMDID(2, 41), // para:{4}, ack:{} kstep_motor_read_io_state = CMDID(2, 42), // para:{4}, ack:{} - kstep_motor_read_tmc5130_status = CMDID(2, 43), // kstep_motor_easy_move_to_end_point = CMDID(2, 44), // + kstep_motor_read_tmc5130_status = CMDID(2, 50), // + kstep_motor_read_tmc5130_state = CMDID(2, 51), // 调试使用 + kstep_motor_read_tmc4361a_status = CMDID(2, 52), // 调试使用 + kstep_motor_read_tmc4361a_state = CMDID(2, 53), // 调试使用 + kstep_motor_read_tmc2160_status = CMDID(2, 54), // 调试使用 + kstep_motor_read_tmc2160_state = CMDID(2, 55), // 调试使用 + /*********************************************************************************************************************** * MINI_SERVO * ***********************************************************************************************************************/ diff --git a/api/apibasic/reg_index.cpp b/api/apibasic/reg_index.cpp index da1b6d6..6ae785e 100644 --- a/api/apibasic/reg_index.cpp +++ b/api/apibasic/reg_index.cpp @@ -128,6 +128,7 @@ static reginfo_t table[] = { REG_ITERM(kreg_step_motor_look_zero_edge_dec), REG_ITERM(kreg_step_motor_max_d), REG_ITERM(kreg_step_motor_min_d), + REG_ITERM(kreg_step_motor_in_debug_mode), REG_ITERM(kreg_mini_servo_pos), REG_ITERM(kreg_mini_servo_limit_velocity), REG_ITERM(kreg_mini_servo_limit_torque), diff --git a/api/apibasic/reg_index.hpp b/api/apibasic/reg_index.hpp index 32926fb..a76a51e 100644 --- a/api/apibasic/reg_index.hpp +++ b/api/apibasic/reg_index.hpp @@ -177,6 +177,7 @@ typedef enum { kreg_step_motor_look_zero_edge_dec = REG_INDEX(101, 50, 26), // 找零边缘减速度 kreg_step_motor_max_d = REG_INDEX(101, 50, 28), // 最大限制距离 kreg_step_motor_min_d = REG_INDEX(101, 50, 29), // 最小限制距离 + kreg_step_motor_in_debug_mode = REG_INDEX(101, 50, 30), // 驱动器处于调试模式 /*********************************************************************************************************************** * MINI_STEP_MOTOR * diff --git a/api/zi_motor.hpp b/api/zi_motor.hpp index d86fe04..aa2ef21 100644 --- a/api/zi_motor.hpp +++ b/api/zi_motor.hpp @@ -21,6 +21,106 @@ typedef struct { uint32_t stst : 1; } TMC5130MotorStatus_t; +typedef struct { + uint32_t reset : 1; // fatal error + uint32_t drv_err : 1; // fatal error + uint32_t uv_cp : 1; // fatal error +} TMC5130MotorState_t; // R+C + +typedef struct { + uint32_t sg_result : 10; + uint32_t reserved0 : 1; + uint32_t reserved1 : 1; + uint32_t s2vsa : 1; + uint32_t s2vsb : 1; + uint32_t stealth : 1; + uint32_t fsactive : 1; + uint32_t cs_actual : 5; + uint32_t reserved2 : 3; + uint32_t stallguard : 1; + uint32_t ot : 1; + uint32_t otpw : 1; + uint32_t s2ga : 1; + uint32_t s2gb : 1; + uint32_t ola : 1; + uint32_t olb : 1; + uint32_t stst : 1; +} TMC2160MotorDriverStatus_t; + +typedef struct { + uint32_t TARGET_REACHED_F : 1; // XACTUAL = XTARGET + uint32_t POS_COMP_REACHED_F : 1; // XACTUAL = POS_COMP + uint32_t VEL_REACHED_F : 1; // VACTUAL = |VMAX| + uint32_t VEL_STATE_F : 2; // 0:VACTUAL = 0; 1:VACTUAL > 0; 2:VACTUAL < 0 + uint32_t RAMP_STATE_F : 2; // 0:AACTUAL = 0; 1:AACTUAL 增加(加速); 2:AACTUAL 减小(减速) + uint32_t STOPL_ACTIVE_F : 1; // 左停止开关有效。 + + uint32_t STOPR_ACTIVE_F : 1; // 右停止开关有效。 + uint32_t VSTOPL_ACTIVE_F : 1; // 左虚拟停止开关有效。 + uint32_t VSTOPR_ACTIVE_F : 1; // 右虚拟停止开关有效。 + uint32_t ACTIVE_STALL_F : 1; // 电机堵转检测且 VACTUAL > VSTALL_LIMIT。 + uint32_t HOME_ERROR_F : 1; // 输入信号电平不等于预期的回零电平。 + uint32_t FS_ACTIVE_F : 1; // 全步有效。 + uint32_t ENC_FAIL_F : 1; // XACTUAL 和 ENC_POS 中间的差值超出容差。 + uint32_t N_ACTIVE_F : 1; // 事件有效 + + uint32_t ENC_LATCH_F : 1; // ENC_LATCH 被重置。 + uint32_t MULTI_CYCLE_FAIL_F : 1; // 仅适用于绝对编码器 MULTI_CYCLE_FAIL_F 表示上一个多圈数据出现故障。 + uint32_t ___ : 1; // + uint32_t CL_FIT_F : 1; // 如果 ENC_POS_DEV < CL_COMPLATION,则有效。XACTUAL 和 ENC_POS 之间的差值在容许范围内 + uint32_t SERIAL_ENC_FLAGS : 4; // 仅适用于绝对编码器:从编码器接收的 SERIAL_ENC_FLAGS。新的编码器传输请求是会重置这些标志 + + uint32_t SG : 1; // 仅 TMC26x / TMC21x0 StallGuard2 状态。 + uint32_t OT : 1; // 过温关断。 + uint32_t OTPW : 1; // 过温预警。 + uint32_t S2GA : 1; // 线圈 A 高端 MOSFET 管对地短路检测位。 + uint32_t S2GB : 1; // 线圈 B 高端 MOSFET 管对地短路检测位。 + uint32_t OLA : 1; // 线圈 A 开路。 + uint32_t OLB : 1; // 线圈 B 开路。 + uint32_t STST : 1; // 仅 TMC26x / TMC21x0 静止状态。 +} TMC4361AMotorStatus_t; // R+CW 事件标志位 + +typedef struct { + uint32_t reset : 1; // fatal error + uint32_t drv_err : 1; // fatal error + uint32_t uv_cp : 1; // fatal error +} TMC2160MotorGstate_t; // R+C + +typedef struct { + uint32_t TARGET_REACHED : 1; // + uint32_t POS_COMP_REACHED : 1; // + uint32_t VEL_REACHED : 1; // + uint32_t VEL_STATE_EQ_0 : 1; // + uint32_t VEL_STATE_EQ_1 : 1; // + uint32_t VEL_STATE_EQ_2 : 1; // + uint32_t RAMP_STATE_EQ_0 : 1; // + uint32_t RAMP_STATE_EQ_1 : 1; // + uint32_t RAMP_STATE_EQ_2 : 1; // + uint32_t MAX_PHASE_TRAP : 1; // 梯形斜坡已经达到其极限速度 + uint32_t FROZEN : 1; // 重置 TMC4361A,以便进一步运动。 fatal error + uint32_t STOPL : 1; // + uint32_t STOPR : 1; // + uint32_t VSTOPL_ACTIVE : 1; // + uint32_t VSTOPR_ACTIVE : 1; // + uint32_t HOME_ERROR : 1; // + uint32_t XLATCH_DONE : 1; // + uint32_t FS_ACTIVE : 1; // + uint32_t ENC_FAIL : 1; // + uint32_t N_ACTIVE : 1; // + uint32_t ENC_DONE : 1; // + uint32_t SER_ENC_DATA_FAIL : 1; // + uint32_t ___ : 1; // + uint32_t SER_DATA_DONE : 1; // + uint32_t SERIAL_ENC_Flags : 1; // + uint32_t COVER_DONE : 1; // + uint32_t ENC_VEL0 : 1; // 编码器速度到 0。 + uint32_t CL_MAX : 1; // + uint32_t CL_FIT : 1; // + uint32_t STOP_ON_STALL : 1; // 检测到电机堵转。电机斜坡已经停止。 fatal error + uint32_t MOTOR_EV : 1; // 选定的 TMC 电机驱动器标志之一被触发。 + uint32_t RST_EV : 1; // 复位被触发。 fatal error +} TMC4361AMotorEventState_t; + namespace iflytop { using namespace std; class ZIStepMotor { @@ -42,6 +142,11 @@ class ZIStepMotor { /*********************************************************************************************************************** * DEBUG * ***********************************************************************************************************************/ - virtual int32_t step_motor_read_tmc5130_status(int32_t* errorflag) = 0; + virtual int32_t step_motor_read_tmc5130_status(int32_t* status) = 0; + virtual int32_t step_motor_read_tmc5130_state(int32_t* status) = 0; + virtual int32_t step_motor_read_tmc4361a_status(int32_t* status) = 0; + virtual int32_t step_motor_read_tmc4361a_state(int32_t* gstate) = 0; + virtual int32_t step_motor_read_tmc2160_status(int32_t* status) = 0; + virtual int32_t step_motor_read_tmc2160_state(int32_t* status) = 0; }; } // namespace iflytop \ No newline at end of file