|
@ -10,7 +10,7 @@ |
|
|
using namespace iflytop; |
|
|
using namespace iflytop; |
|
|
#define TAG "SMCM"
|
|
|
#define TAG "SMCM"
|
|
|
|
|
|
|
|
|
void StepMotorCtrlModule::initialize(int moduleid, IStepperMotor* stepM, ZGPIO iotable[], int nio, config_t* cfg) { |
|
|
|
|
|
|
|
|
void StepMotorCtrlModule::initialize(int moduleid, TMC51X0* stepM, ZGPIO iotable[], int nio, config_t* cfg) { |
|
|
m_id = moduleid; |
|
|
m_id = moduleid; |
|
|
m_stepM1 = stepM; |
|
|
m_stepM1 = stepM; |
|
|
|
|
|
|
|
@ -51,24 +51,9 @@ void StepMotorCtrlModule::create_default_cfg(config_t& cfg) { |
|
|
cfg.stepmotor_ihold = 1; |
|
|
cfg.stepmotor_ihold = 1; |
|
|
cfg.stepmotor_irun = 3; |
|
|
cfg.stepmotor_irun = 3; |
|
|
cfg.stepmotor_iholddelay = 100; |
|
|
cfg.stepmotor_iholddelay = 100; |
|
|
cfg.motor_default_acc = 300; |
|
|
|
|
|
cfg.motor_default_dec = 300; |
|
|
|
|
|
cfg.motor_default_velocity = 500; |
|
|
cfg.motor_default_velocity = 500; |
|
|
|
|
|
|
|
|
cfg.motor_run_to_zero_speed = 100; |
|
|
|
|
|
cfg.motor_run_to_zero_dec = 600; |
|
|
|
|
|
|
|
|
|
|
|
cfg.motor_look_zero_edge_speed = 100; |
|
|
|
|
|
cfg.motor_look_zero_edge_dec = 600; |
|
|
|
|
|
|
|
|
|
|
|
// cfg.motor_vstart = 2000;
|
|
|
|
|
|
// cfg.motor_a1 = ;
|
|
|
|
|
|
// cfg.motor_amax = 300;
|
|
|
|
|
|
// cfg.motor_v1 = ;
|
|
|
|
|
|
// cfg.motor_dmax = 300;
|
|
|
|
|
|
// cfg.motor_d1 = ;
|
|
|
|
|
|
// cfg.motor_vstop = 2000;
|
|
|
|
|
|
// cfg.motor_tzerowait = ;
|
|
|
|
|
|
|
|
|
cfg.motor_run_to_zero_speed = 100; |
|
|
|
|
|
cfg.motor_look_zero_edge_speed = 100; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
/***********************************************************************************************************************
|
|
|
/***********************************************************************************************************************
|
|
@ -77,24 +62,6 @@ void StepMotorCtrlModule::create_default_cfg(config_t& cfg) { |
|
|
int32_t StepMotorCtrlModule::module_xxx_reg(int32_t param_id, bool read, int32_t& val) { |
|
|
int32_t StepMotorCtrlModule::module_xxx_reg(int32_t param_id, bool read, int32_t& val) { |
|
|
int32_t suc = pri_module_xxx_reg(param_id, read, val); |
|
|
int32_t suc = pri_module_xxx_reg(param_id, read, val); |
|
|
if (suc != 0) return suc; |
|
|
if (suc != 0) return suc; |
|
|
switch (param_id) { |
|
|
|
|
|
case kreg_step_motor_shaft: |
|
|
|
|
|
case kreg_step_motor_one_circle_pulse: |
|
|
|
|
|
case kreg_step_motor_one_circle_pulse_denominator: |
|
|
|
|
|
case kreg_step_motor_default_velocity: |
|
|
|
|
|
case kreg_step_motor_default_acc: |
|
|
|
|
|
case kreg_step_motor_default_dec: |
|
|
|
|
|
case kreg_step_motor_run_to_zero_speed: |
|
|
|
|
|
case kreg_step_motor_run_to_zero_dec: |
|
|
|
|
|
case kreg_step_motor_look_zero_edge_speed: |
|
|
|
|
|
case kreg_step_motor_look_zero_edge_dec: |
|
|
|
|
|
case kreg_step_motor_ihold: |
|
|
|
|
|
case kreg_step_motor_irun: |
|
|
|
|
|
case kreg_step_motor_iholddelay: |
|
|
|
|
|
case kreg_step_motor_max_d: |
|
|
|
|
|
case kreg_step_motor_min_d: |
|
|
|
|
|
return 0; |
|
|
|
|
|
} |
|
|
|
|
|
return suc; |
|
|
return suc; |
|
|
} |
|
|
} |
|
|
int32_t StepMotorCtrlModule::pri_module_xxx_reg(int32_t param_id, bool read, int32_t& val) { |
|
|
int32_t StepMotorCtrlModule::pri_module_xxx_reg(int32_t param_id, bool read, int32_t& val) { |
|
@ -106,12 +73,8 @@ int32_t StepMotorCtrlModule::pri_module_xxx_reg(int32_t param_id, bool read, int |
|
|
PROCESS_REG(kreg_step_motor_one_circle_pulse, REG_GET(m_cfg.motor_one_circle_pulse), REG_SET(m_cfg.motor_one_circle_pulse)); |
|
|
PROCESS_REG(kreg_step_motor_one_circle_pulse, REG_GET(m_cfg.motor_one_circle_pulse), REG_SET(m_cfg.motor_one_circle_pulse)); |
|
|
PROCESS_REG(kreg_step_motor_one_circle_pulse_denominator, REG_GET(m_cfg.motor_one_circle_pulse_denominator), REG_SET(m_cfg.motor_one_circle_pulse_denominator)); |
|
|
PROCESS_REG(kreg_step_motor_one_circle_pulse_denominator, REG_GET(m_cfg.motor_one_circle_pulse_denominator), REG_SET(m_cfg.motor_one_circle_pulse_denominator)); |
|
|
PROCESS_REG(kreg_step_motor_default_velocity, REG_GET(m_cfg.motor_default_velocity), REG_SET(m_cfg.motor_default_velocity)); |
|
|
PROCESS_REG(kreg_step_motor_default_velocity, REG_GET(m_cfg.motor_default_velocity), REG_SET(m_cfg.motor_default_velocity)); |
|
|
PROCESS_REG(kreg_step_motor_default_acc, REG_GET(m_cfg.motor_default_acc), REG_SET(m_cfg.motor_default_acc)); |
|
|
|
|
|
PROCESS_REG(kreg_step_motor_default_dec, REG_GET(m_cfg.motor_default_dec), REG_SET(m_cfg.motor_default_dec)); |
|
|
|
|
|
PROCESS_REG(kreg_step_motor_run_to_zero_speed, REG_GET(m_cfg.motor_run_to_zero_speed), REG_SET(m_cfg.motor_run_to_zero_speed)); |
|
|
PROCESS_REG(kreg_step_motor_run_to_zero_speed, REG_GET(m_cfg.motor_run_to_zero_speed), REG_SET(m_cfg.motor_run_to_zero_speed)); |
|
|
PROCESS_REG(kreg_step_motor_run_to_zero_dec, REG_GET(m_cfg.motor_run_to_zero_dec), REG_SET(m_cfg.motor_run_to_zero_dec)); |
|
|
|
|
|
PROCESS_REG(kreg_step_motor_look_zero_edge_speed, REG_GET(m_cfg.motor_look_zero_edge_speed), REG_SET(m_cfg.motor_look_zero_edge_speed)); |
|
|
PROCESS_REG(kreg_step_motor_look_zero_edge_speed, REG_GET(m_cfg.motor_look_zero_edge_speed), REG_SET(m_cfg.motor_look_zero_edge_speed)); |
|
|
PROCESS_REG(kreg_step_motor_look_zero_edge_dec, REG_GET(m_cfg.motor_look_zero_edge_dec), REG_SET(m_cfg.motor_look_zero_edge_dec)); |
|
|
|
|
|
PROCESS_REG(kreg_step_motor_ihold, REG_GET(m_cfg.stepmotor_ihold), REG_SET(m_cfg.stepmotor_ihold)); |
|
|
PROCESS_REG(kreg_step_motor_ihold, REG_GET(m_cfg.stepmotor_ihold), REG_SET(m_cfg.stepmotor_ihold)); |
|
|
PROCESS_REG(kreg_step_motor_irun, REG_GET(m_cfg.stepmotor_irun), REG_SET(m_cfg.stepmotor_irun)); |
|
|
PROCESS_REG(kreg_step_motor_irun, REG_GET(m_cfg.stepmotor_irun), REG_SET(m_cfg.stepmotor_irun)); |
|
|
PROCESS_REG(kreg_step_motor_iholddelay, REG_GET(m_cfg.stepmotor_iholddelay), REG_SET(m_cfg.stepmotor_iholddelay)); |
|
|
PROCESS_REG(kreg_step_motor_iholddelay, REG_GET(m_cfg.stepmotor_iholddelay), REG_SET(m_cfg.stepmotor_iholddelay)); |
|
@ -120,6 +83,15 @@ int32_t StepMotorCtrlModule::pri_module_xxx_reg(int32_t param_id, bool read, int |
|
|
PROCESS_REG(kreg_step_motor_iglobalscaler, REG_GET(m_cfg.stepmotor_iglobalscaler), REG_SET(m_cfg.stepmotor_iglobalscaler)); |
|
|
PROCESS_REG(kreg_step_motor_iglobalscaler, REG_GET(m_cfg.stepmotor_iglobalscaler), REG_SET(m_cfg.stepmotor_iglobalscaler)); |
|
|
PROCESS_REG(kreg_step_motor_in_debug_mode, REG_GET(m_state.debugmode), REG_SET(m_state.debugmode)); |
|
|
PROCESS_REG(kreg_step_motor_in_debug_mode, REG_GET(m_state.debugmode), REG_SET(m_state.debugmode)); |
|
|
|
|
|
|
|
|
|
|
|
PROCESS_REG(kreg_step_motor_vstart, REG_GET(m_cfg.motor_vstart), REG_SET(m_cfg.motor_vstart)); |
|
|
|
|
|
PROCESS_REG(kreg_step_motor_a1, REG_GET(m_cfg.motor_a1), REG_SET(m_cfg.motor_a1)); |
|
|
|
|
|
PROCESS_REG(kreg_step_motor_amax, REG_GET(m_cfg.motor_amax), REG_SET(m_cfg.motor_amax)); |
|
|
|
|
|
PROCESS_REG(kreg_step_motor_v1, REG_GET(m_cfg.motor_v1), REG_SET(m_cfg.motor_v1)); |
|
|
|
|
|
PROCESS_REG(kreg_step_motor_dmax, REG_GET(m_cfg.motor_dmax), REG_SET(m_cfg.motor_dmax)); |
|
|
|
|
|
PROCESS_REG(kreg_step_motor_d1, REG_GET(m_cfg.motor_d1), REG_SET(m_cfg.motor_d1)); |
|
|
|
|
|
PROCESS_REG(kreg_step_motor_vstop, REG_GET(m_cfg.motor_vstop), REG_SET(m_cfg.motor_vstop)); |
|
|
|
|
|
PROCESS_REG(kreg_step_motor_tzerowait, REG_GET(m_cfg.motor_tzerowait), REG_SET(m_cfg.motor_tzerowait)); |
|
|
|
|
|
|
|
|
default: |
|
|
default: |
|
|
return err::kmodule_not_find_config_index; |
|
|
return err::kmodule_not_find_config_index; |
|
|
break; |
|
|
break; |
|
@ -160,6 +132,16 @@ int32_t StepMotorCtrlModule::step_motor_active_cfg() { |
|
|
m_stepM1->setScaleDenominator(m_cfg.motor_one_circle_pulse_denominator); |
|
|
m_stepM1->setScaleDenominator(m_cfg.motor_one_circle_pulse_denominator); |
|
|
m_stepM1->setMotorShaft(m_cfg.motor_shaft); |
|
|
m_stepM1->setMotorShaft(m_cfg.motor_shaft); |
|
|
m_stepM1->setGlobalScale(m_cfg.stepmotor_iglobalscaler); |
|
|
m_stepM1->setGlobalScale(m_cfg.stepmotor_iglobalscaler); |
|
|
|
|
|
|
|
|
|
|
|
m_stepM1->set_vstart(m_cfg.motor_vstart); |
|
|
|
|
|
m_stepM1->set_a1(m_cfg.motor_a1); |
|
|
|
|
|
m_stepM1->set_amax(m_cfg.motor_amax); |
|
|
|
|
|
m_stepM1->set_v1(m_cfg.motor_v1); |
|
|
|
|
|
m_stepM1->set_dmax(m_cfg.motor_dmax); |
|
|
|
|
|
m_stepM1->set_d1(m_cfg.motor_d1); |
|
|
|
|
|
m_stepM1->set_vstop(m_cfg.motor_vstop); |
|
|
|
|
|
m_stepM1->set_tzerowait(m_cfg.motor_tzerowait); |
|
|
|
|
|
|
|
|
// stepmotor_iglobalscaler
|
|
|
// stepmotor_iglobalscaler
|
|
|
if (m_state.enable) { |
|
|
if (m_state.enable) { |
|
|
m_stepM1->enable(true); |
|
|
m_stepM1->enable(true); |
|
@ -405,10 +387,10 @@ bool StepMotorCtrlModule::check_when_run() { |
|
|
|
|
|
|
|
|
bool StepMotorCtrlModule::exec_move_to_io_task(int32_t ioindex, int32_t direction) { |
|
|
bool StepMotorCtrlModule::exec_move_to_io_task(int32_t ioindex, int32_t direction) { |
|
|
int32_t runToPointSpeed = m_cfg.motor_run_to_zero_speed; |
|
|
int32_t runToPointSpeed = m_cfg.motor_run_to_zero_speed; |
|
|
int32_t runToPointDec = m_cfg.motor_run_to_zero_dec; |
|
|
|
|
|
|
|
|
int32_t runToPointDec = m_cfg.motor_amax; |
|
|
|
|
|
|
|
|
int32_t lookPointVelocity = m_cfg.motor_look_zero_edge_speed; |
|
|
int32_t lookPointVelocity = m_cfg.motor_look_zero_edge_speed; |
|
|
int32_t lookPointDec = m_cfg.motor_look_zero_edge_dec; |
|
|
|
|
|
|
|
|
int32_t lookPointDec = m_cfg.motor_amax; |
|
|
|
|
|
|
|
|
direction = direction >= 0 ? 1 : -1; |
|
|
direction = direction >= 0 ? 1 : -1; |
|
|
|
|
|
|
|
@ -417,7 +399,7 @@ bool StepMotorCtrlModule::exec_move_to_io_task(int32_t ioindex, int32_t directio |
|
|
|
|
|
|
|
|
if (!gpio->getState()) { |
|
|
if (!gpio->getState()) { |
|
|
ZLOGI(TAG, "---------STEP1-------- move to point"); |
|
|
ZLOGI(TAG, "---------STEP1-------- move to point"); |
|
|
_rotate(runToPointSpeed * direction, runToPointDec, runToPointDec); |
|
|
|
|
|
|
|
|
_rotate(runToPointSpeed * direction, runToPointDec); |
|
|
bool xreach_io = false; |
|
|
bool xreach_io = false; |
|
|
|
|
|
|
|
|
while (!m_thread.getExitFlag()) { |
|
|
while (!m_thread.getExitFlag()) { |
|
@ -448,7 +430,7 @@ bool StepMotorCtrlModule::exec_move_to_io_task(int32_t ioindex, int32_t directio |
|
|
// 如果设备已经在零点,则反向移动一定距离远离零点
|
|
|
// 如果设备已经在零点,则反向移动一定距离远离零点
|
|
|
if (gpio->getState()) { |
|
|
if (gpio->getState()) { |
|
|
ZLOGI(TAG, "---------STEP2-------- find edge"); |
|
|
ZLOGI(TAG, "---------STEP2-------- find edge"); |
|
|
_rotate(-direction * lookPointVelocity, lookPointDec, lookPointDec); |
|
|
|
|
|
|
|
|
_rotate(-direction * lookPointVelocity, lookPointDec); |
|
|
bool reach_edge = false; |
|
|
bool reach_edge = false; |
|
|
|
|
|
|
|
|
while (!m_thread.getExitFlag()) { |
|
|
while (!m_thread.getExitFlag()) { |
|
@ -477,7 +459,7 @@ bool StepMotorCtrlModule::exec_move_to_io_task(int32_t ioindex, int32_t directio |
|
|
// 如果设备已经在零点,则反向移动一定距离远离零点
|
|
|
// 如果设备已经在零点,则反向移动一定距离远离零点
|
|
|
if (!gpio->getState()) { |
|
|
if (!gpio->getState()) { |
|
|
ZLOGI(TAG, "---------STEP3-------- bak to gpio trigger edge"); |
|
|
ZLOGI(TAG, "---------STEP3-------- bak to gpio trigger edge"); |
|
|
_rotate(direction * lookPointVelocity, lookPointDec, lookPointDec); |
|
|
|
|
|
|
|
|
_rotate(direction * lookPointVelocity, lookPointDec); |
|
|
bool reach_edge = false; |
|
|
bool reach_edge = false; |
|
|
|
|
|
|
|
|
while (!m_thread.getExitFlag()) { |
|
|
while (!m_thread.getExitFlag()) { |
|
@ -512,11 +494,9 @@ bool StepMotorCtrlModule::exec_move_to_io_task(int32_t ioindex, int32_t directio |
|
|
return true; |
|
|
return true; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void StepMotorCtrlModule::_rotate(int32_t vel, int32_t acc, int32_t dec) { |
|
|
|
|
|
ZLOGI(TAG, "m%d _rotate %d %d %d", m_id, vel, acc, dec); |
|
|
|
|
|
m_stepM1->setAcceleration(acc); |
|
|
|
|
|
m_stepM1->setDeceleration(dec); |
|
|
|
|
|
m_stepM1->rotate(vel); |
|
|
|
|
|
|
|
|
void StepMotorCtrlModule::_rotate(int32_t velocity, int32_t acc) { |
|
|
|
|
|
m_stepM1->set_amax(acc); |
|
|
|
|
|
m_stepM1->rotate(velocity); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
/***********************************************************************************************************************
|
|
|
/***********************************************************************************************************************
|
|
@ -619,9 +599,7 @@ int32_t StepMotorCtrlModule::do_step_motor_easy_rotate(int32_t direction) { |
|
|
[this, direction]() { |
|
|
[this, direction]() { |
|
|
befor_motor_move(); |
|
|
befor_motor_move(); |
|
|
{ |
|
|
{ |
|
|
m_stepM1->setAcceleration(m_cfg.motor_default_acc); |
|
|
|
|
|
m_stepM1->setDeceleration(m_cfg.motor_default_dec); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
m_stepM1->set_amax(m_cfg.motor_amax); |
|
|
int32_t vel = m_cfg.motor_default_velocity; |
|
|
int32_t vel = m_cfg.motor_default_velocity; |
|
|
if (direction <= 0) vel = -vel; |
|
|
if (direction <= 0) vel = -vel; |
|
|
m_stepM1->rotate(vel); |
|
|
m_stepM1->rotate(vel); |
|
@ -647,8 +625,7 @@ int32_t StepMotorCtrlModule::do_step_motor_easy_move_to(int32_t tox) { |
|
|
befor_motor_move(); |
|
|
befor_motor_move(); |
|
|
|
|
|
|
|
|
{ |
|
|
{ |
|
|
m_stepM1->setAcceleration(m_cfg.motor_default_acc); |
|
|
|
|
|
m_stepM1->setDeceleration(m_cfg.motor_default_dec); |
|
|
|
|
|
|
|
|
m_stepM1->setAcceleration(m_cfg.motor_amax); |
|
|
int32_t motor_pos = 0; |
|
|
int32_t motor_pos = 0; |
|
|
inter_forward_kinematics(tox, motor_pos); |
|
|
inter_forward_kinematics(tox, motor_pos); |
|
|
m_stepM1->moveTo(motor_pos, m_cfg.motor_default_velocity); |
|
|
m_stepM1->moveTo(motor_pos, m_cfg.motor_default_velocity); |
|
|