|
|
@ -16,6 +16,7 @@ void StepMotorCtrlModule::initialize(int moduleid, TMC51X0* stepM, ZGPIO iotable |
|
|
|
m_iotable = iotable; |
|
|
|
m_nio = nio; |
|
|
|
|
|
|
|
|
|
|
|
m_thread.init(TAG, 1024, osPriorityNormal); |
|
|
|
m_cfg = *cfg; |
|
|
|
m_default_cfg = *cfg; |
|
|
@ -137,6 +138,9 @@ int32_t StepMotorCtrlModule::module_set_reg(int32_t regindex, int32_t val) { |
|
|
|
MODULE_REG_CASE__SET_REG_TO(kreg_step_motor_pos_devi_tolerance, (m_cfg.pos_devi_tolerance)); |
|
|
|
MODULE_REG_CASE__SET_REG_TO(kreg_step_motor_io_trigger_append_distance, (m_cfg.io_trigger_append_distance)); |
|
|
|
|
|
|
|
MODULE_REG_CASE__SET_REG_TO(kreg_step_motor_zero_io_mirror, (m_cfg.zero_io_mirror)); |
|
|
|
MODULE_REG_CASE__SET_REG_TO(kreg_step_motor_limit_io_mirror, (m_cfg.limit_io_mirror)); |
|
|
|
|
|
|
|
default: |
|
|
|
return err::kmodule_not_find_reg; |
|
|
|
break; |
|
|
@ -215,6 +219,9 @@ int32_t StepMotorCtrlModule::module_get_reg(int32_t regindex, int32_t* val) { |
|
|
|
MODULE_CFG_CASE__GET_REG_FROM(kreg_step_motor_pos_devi_tolerance, m_cfg.pos_devi_tolerance); |
|
|
|
MODULE_CFG_CASE__GET_REG_FROM(kreg_step_motor_io_trigger_append_distance, m_cfg.io_trigger_append_distance); |
|
|
|
|
|
|
|
MODULE_CFG_CASE__GET_REG_FROM(kreg_step_motor_zero_io_mirror, (m_cfg.zero_io_mirror)); |
|
|
|
MODULE_CFG_CASE__GET_REG_FROM(kreg_step_motor_limit_io_mirror, (m_cfg.limit_io_mirror)); |
|
|
|
|
|
|
|
default: |
|
|
|
return err::kmodule_not_find_reg; |
|
|
|
break; |
|
|
@ -262,16 +269,17 @@ int32_t StepMotorCtrlModule::step_motor_active_cfg() { |
|
|
|
m_stepM1->set_tzerowait(m_cfg.motor_tzerowait); |
|
|
|
m_stepM1->set_enc_resolution(m_cfg.motor_enc_resolution); |
|
|
|
|
|
|
|
TMC51X0::VCfg_t vcfg; |
|
|
|
vcfg.a1 = m_cfg.motor_a1; |
|
|
|
vcfg.amax = m_cfg.motor_amax; |
|
|
|
vcfg.v1 = m_cfg.motor_v1; |
|
|
|
vcfg.dmax = m_cfg.motor_dmax; |
|
|
|
vcfg.d1 = m_cfg.motor_d1; |
|
|
|
vcfg.vstart = m_cfg.motor_vstart; |
|
|
|
vcfg.vstop = m_cfg.motor_vstop; |
|
|
|
vcfg.vmax = m_cfg.motor_default_velocity; |
|
|
|
m_stepM1->set_vcfg(&vcfg); |
|
|
|
// TMC51X0::VCfg_t vcfg;
|
|
|
|
// vcfg.a1 = m_cfg.motor_a1;
|
|
|
|
// vcfg.amax = m_cfg.motor_amax;
|
|
|
|
// vcfg.v1 = m_cfg.motor_v1;
|
|
|
|
// vcfg.dmax = m_cfg.motor_dmax;
|
|
|
|
// vcfg.d1 = m_cfg.motor_d1;
|
|
|
|
// vcfg.vstart = m_cfg.motor_vstart;
|
|
|
|
// vcfg.vstop = m_cfg.motor_vstop;
|
|
|
|
// vcfg.vmax = m_cfg.motor_default_velocity;
|
|
|
|
// m_stepM1->set_vcfg(&vcfg);
|
|
|
|
m_stepM1->stop(); |
|
|
|
|
|
|
|
// stepmotor_iglobalscaler
|
|
|
|
if (m_state.enable) { |
|
|
@ -285,7 +293,7 @@ int32_t StepMotorCtrlModule::step_motor_read_io_state(int32_t ioindex, int32_t* |
|
|
|
if (ioindex < 0 || ioindex >= m_nio) { |
|
|
|
return err::kstep_motor_ioindex_out_of_range; |
|
|
|
} |
|
|
|
*state = m_iotable[ioindex].getState(); |
|
|
|
*state = getIOState(ioindex) ? 1 : 0; |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
@ -411,11 +419,13 @@ bool StepMotorCtrlModule::check_when_run() { |
|
|
|
} else if (state.uv_cp) { |
|
|
|
ZLOGE(TAG, "motor uv_cp when run"); |
|
|
|
dumpTMC5130Status(&devStatus); |
|
|
|
module_detail_errorcode = *((int32_t*)&devStatus); |
|
|
|
setErrorFlag(err::kstep_motor_uv_cp); |
|
|
|
return false; |
|
|
|
} else if (state.drv_err) { |
|
|
|
ZLOGE(TAG, "motor drv_err when run"); |
|
|
|
setErrorFlag(err::kstep_motor_drv_err); |
|
|
|
module_detail_errorcode = *((int32_t*)&devStatus); |
|
|
|
dumpTMC5130Status(&devStatus); |
|
|
|
return false; |
|
|
|
} |
|
|
@ -430,16 +440,15 @@ bool StepMotorCtrlModule::exec_move_to_io_task(int32_t ioindex, int32_t directio |
|
|
|
|
|
|
|
direction = direction >= 0 ? 1 : -1; |
|
|
|
|
|
|
|
ZGPIO* gpio = &m_iotable[ioindex]; |
|
|
|
if (!check_when_run()) return false; |
|
|
|
|
|
|
|
if (!gpio->getState()) { |
|
|
|
if (!getIOState(ioindex)) { |
|
|
|
ZLOGI(TAG, "---------STEP1-------- move to point"); |
|
|
|
rotate(direction, runToPointSpeed); |
|
|
|
bool xreach_io = false; |
|
|
|
|
|
|
|
while (!m_thread.getExitFlag()) { |
|
|
|
if (gpio->getState()) { |
|
|
|
if (getIOState(ioindex)) { |
|
|
|
xreach_io = true; |
|
|
|
m_stepM1->stop(); |
|
|
|
break; |
|
|
@ -465,13 +474,13 @@ bool StepMotorCtrlModule::exec_move_to_io_task(int32_t ioindex, int32_t directio |
|
|
|
|
|
|
|
// 如果设备已经在零点,则反向移动一定距离远离零点
|
|
|
|
|
|
|
|
if (gpio->getState()) { |
|
|
|
if (getIOState(ioindex)) { |
|
|
|
ZLOGI(TAG, "---------STEP2-------- find edge"); |
|
|
|
rotate(-direction, lookPointVelocity); |
|
|
|
bool reach_edge = false; |
|
|
|
|
|
|
|
while (!m_thread.getExitFlag()) { |
|
|
|
if (!gpio->getState()) { |
|
|
|
if (!getIOState(ioindex)) { |
|
|
|
reach_edge = true; |
|
|
|
m_stepM1->stop(); |
|
|
|
break; |
|
|
@ -494,13 +503,13 @@ bool StepMotorCtrlModule::exec_move_to_io_task(int32_t ioindex, int32_t directio |
|
|
|
if (!check_when_run()) return false; |
|
|
|
|
|
|
|
// 如果设备已经在零点,则反向移动一定距离远离零点
|
|
|
|
if (!gpio->getState()) { |
|
|
|
if (!getIOState(ioindex)) { |
|
|
|
ZLOGI(TAG, "---------STEP3-------- bak to gpio trigger edge"); |
|
|
|
rotate(direction, lookPointVelocity); |
|
|
|
bool reach_edge = false; |
|
|
|
|
|
|
|
while (!m_thread.getExitFlag()) { |
|
|
|
if (gpio->getState()) { |
|
|
|
if (getIOState(ioindex)) { |
|
|
|
reach_edge = true; |
|
|
|
m_stepM1->stop(); |
|
|
|
break; |
|
|
@ -623,9 +632,6 @@ int32_t StepMotorCtrlModule::step_motor_easy_move_to_zero() { |
|
|
|
return err::kstep_motor_ioindex_out_of_range; |
|
|
|
} |
|
|
|
|
|
|
|
if (m_iotable[0].isNull()) { |
|
|
|
return err::kstep_motor_ioindex_out_of_range; |
|
|
|
} |
|
|
|
|
|
|
|
return do_step_motor_easy_move_to_zero(); |
|
|
|
} |
|
|
@ -648,9 +654,6 @@ int32_t StepMotorCtrlModule::step_motor_easy_move_to_end_point() { |
|
|
|
if (m_nio <= 1) { |
|
|
|
return err::kstep_motor_ioindex_out_of_range; |
|
|
|
} |
|
|
|
if (m_iotable[1].isNull()) { |
|
|
|
return err::kstep_motor_ioindex_out_of_range; |
|
|
|
} |
|
|
|
return do_step_motor_easy_move_to_end_point(); |
|
|
|
} |
|
|
|
int32_t StepMotorCtrlModule::step_motor_easy_reciprocating_motion(int32_t startpos, int32_t endpos, int32_t times) { |
|
|
@ -793,9 +796,6 @@ int32_t StepMotorCtrlModule::do_step_motor_easy_move_to_io(int32_t ioindex, int3 |
|
|
|
if (ioindex < 0 || ioindex >= m_nio) { |
|
|
|
return err::kstep_motor_ioindex_out_of_range; |
|
|
|
} |
|
|
|
if (m_iotable[ioindex].isNull()) { |
|
|
|
return err::kstep_motor_ioindex_out_of_range; |
|
|
|
} |
|
|
|
|
|
|
|
m_thread.stop(); |
|
|
|
module_status = 1; |
|
|
@ -985,3 +985,15 @@ int32_t StepMotorCtrlModule::getspeed(int32_t speedlevel) { |
|
|
|
} |
|
|
|
return speed; |
|
|
|
} |
|
|
|
bool StepMotorCtrlModule::getIOState(int32_t ioindex) { |
|
|
|
if (ioindex < 0 || ioindex >= m_nio) { |
|
|
|
return false; |
|
|
|
} |
|
|
|
if (ioindex == 0) { |
|
|
|
return m_cfg.zero_io_mirror ? !m_iotable[ioindex].getState() : m_iotable[ioindex].getState(); |
|
|
|
} else if (ioindex == 1) { |
|
|
|
return m_cfg.limit_io_mirror ? !m_iotable[ioindex].getState() : m_iotable[ioindex].getState(); |
|
|
|
} else { |
|
|
|
return m_iotable[ioindex].getState(); |
|
|
|
} |
|
|
|
} |