From 6d031e311cddaf0e04600f1ee8478e24203ae896 Mon Sep 17 00:00:00 2001 From: Scott Date: Sat, 10 Feb 2024 06:41:40 -0500 Subject: [PATCH 1/3] Update DBC creation script for can.signal Conversion Modifies calls to can.Signal constructors to use NamedSignalConversion class. --- tools/create_can_dbc.py | 68 +++++++++++++++++++++-------------------- 1 file changed, 35 insertions(+), 33 deletions(-) diff --git a/tools/create_can_dbc.py b/tools/create_can_dbc.py index 0336e305d..ab25f2470 100644 --- a/tools/create_can_dbc.py +++ b/tools/create_can_dbc.py @@ -1,10 +1,12 @@ from cantools.database import * from odrive.enums import * +from cantools.database.conversion import NamedSignalConversion msgList = [] nodes = [can.Node('Master')] buses = [can.Bus('ODrive', None, 100000)] + for axisID in range(0, 8): newNode = can.Node(f"ODrive_Axis{axisID}") nodes.append(newNode) @@ -12,8 +14,8 @@ # 0x00 - NMT Message (Reserved) # 0x001 - Heartbeat - axisError = can.Signal("Axis_Error", 0, 32, receivers=['Master'], choices={error.value: error.name for error in AxisError}) - axisState = can.Signal("Axis_State", 32, 8, receivers=['Master'], choices={state.value: state.name for state in AxisState}) + axisError = can.Signal("Axis_Error", 0, 32, receivers=['Master'], conversion=NamedSignalConversion(scale=1,offset=0, is_float=False, choices={error.value: error.name for error in AxisError})) + axisState = can.Signal("Axis_State", 32, 8, receivers=['Master'], conversion=NamedSignalConversion(scale=1,offset=0,is_float=False,choices={state.value: state.name for state in AxisState})) motorErrorFlag = can.Signal("Motor_Error_Flag", 40, 1, receivers=['Master']) encoderErrorFlag = can.Signal("Encoder_Error_Flag", 48, 1, receivers=['Master']) controllerErrorFlag = can.Signal("Controller_Error_Flag", 56, 1, receivers=['Master']) @@ -35,17 +37,17 @@ estopMsg = can.Message(0x002, "Estop", 0, [], senders=['Master']) # 0x003 - Motor Error - motorError = can.Signal("Motor_Error", 0, 32, receivers=['Master'], choices={error.value: error.name for error in MotorError}) + motorError = can.Signal("Motor_Error", 0, 32, receivers=['Master'], conversion=NamedSignalConversion(scale=1,offset=0,is_float=False,choices={error.value: error.name for error in MotorError})) motorErrorMsg = can.Message(0x003, "Get_Motor_Error", 8, [motorError], senders=[newNode.name]) # 0x004 - Encoder Error - encoderError = can.Signal("Encoder_Error", 0, 32, receivers=['Master'], choices={error.value: error.name for error in EncoderError}) + encoderError = can.Signal("Encoder_Error", 0, 32, receivers=['Master'], conversion=NamedSignalConversion(scale=1,offset=0,is_float=False,choices={error.value: error.name for error in EncoderError})) encoderErrorMsg = can.Message( 0x004, "Get_Encoder_Error", 8, [encoderError], senders=[newNode.name] ) # 0x005 - Sensorless Error - sensorlessError = can.Signal("Sensorless_Error", 0, 32, receivers=['Master'], choices={error.value: error.name for error in SensorlessEstimatorError}) + sensorlessError = can.Signal("Sensorless_Error", 0, 32, receivers=['Master'], conversion=NamedSignalConversion(scale=1,offset=0,is_float=False,choices={error.value: error.name for error in SensorlessEstimatorError})) sensorlessErrorMsg = can.Message( 0x005, "Get_Sensorless_Error", 8, [sensorlessError], senders=[newNode.name] ) @@ -55,7 +57,7 @@ axisNodeMsg = can.Message(0x006, "Set_Axis_Node_ID", 8, [axisNodeID], senders=['Master']) # 0x007 - Requested State - axisRequestedState = can.Signal("Axis_Requested_State", 0, 32, receivers=[newNode.name], choices={state.value: state.name for state in AxisState}) + axisRequestedState = can.Signal("Axis_Requested_State", 0, 32, receivers=[newNode.name], conversion=NamedSignalConversion(scale=1,offset=0,is_float=False,choices={state.value: state.name for state in AxisState})) setAxisState = can.Message( 0x007, "Set_Axis_State", 8, [axisRequestedState], senders=['Master'] ) @@ -63,8 +65,8 @@ # 0x008 - Startup Config (Reserved) # 0x009 - Encoder Estimates - encoderPosEstimate = can.Signal("Pos_Estimate", 0, 32, is_float=True, receivers=['Master'], unit='rev') - encoderVelEstimate = can.Signal("Vel_Estimate", 32, 32, is_float=True, receivers=['Master'], unit='rev/s') + encoderPosEstimate = can.Signal("Pos_Estimate", 0, 32, conversion=NamedSignalConversion(scale=1,offset=0,is_float=True,choices={}), receivers=['Master'], unit='rev') + encoderVelEstimate = can.Signal("Vel_Estimate", 32, 32, conversion=NamedSignalConversion(scale=1,offset=0,is_float=True,choices={}), receivers=['Master'], unit='rev/s') encoderEstimates = can.Message( 0x009, "Get_Encoder_Estimates", 8, [encoderPosEstimate, encoderVelEstimate], senders=[newNode.name], send_type='cyclic', cycle_time=10 ) @@ -77,36 +79,36 @@ ) # 0x00B - Set Controller Modes - controlMode = can.Signal("Control_Mode", 0, 32, receivers=[newNode.name], choices={state.value: state.name for state in ControlMode}) - inputMode = can.Signal("Input_Mode", 32, 32, receivers=[newNode.name], choices={state.value: state.name for state in InputMode}) + controlMode = can.Signal("Control_Mode", 0, 32, receivers=[newNode.name], conversion=NamedSignalConversion(scale=1,offset=0,is_float=False,choices={state.value: state.name for state in ControlMode})) + inputMode = can.Signal("Input_Mode", 32, 32, receivers=[newNode.name], conversion=NamedSignalConversion(scale=1,offset=0,is_float=False,choices={state.value: state.name for state in InputMode})) setControllerModeMsg = can.Message( 0x00B, "Set_Controller_Mode", 8, [controlMode, inputMode], senders=['Master'] ) # 0x00C - Set Input Pos - inputPos = can.Signal("Input_Pos", 0, 32, is_float=True, receivers=[newNode.name], unit='rev') - velFF = can.Signal("Vel_FF", 32, 16, is_signed=True, scale=0.001, receivers=[newNode.name], unit='rev/s') - torqueFF = can.Signal("Torque_FF", 48, 16, is_signed=True, scale=0.001, receivers=[newNode.name], unit='Nm') + inputPos = can.Signal("Input_Pos", 0, 32, conversion=NamedSignalConversion(scale=1,offset=0,is_float=True,choices={}), receivers=[newNode.name], unit='rev') + velFF = can.Signal("Vel_FF", 32, 16, is_signed=True, conversion=NamedSignalConversion(scale=0.001,offset=0,is_float=False,choices={}), receivers=[newNode.name], unit='rev/s') + torqueFF = can.Signal("Torque_FF", 48, 16, is_signed=True, conversion=NamedSignalConversion(scale=.001,offset=0,is_float=False,choices={}), receivers=[newNode.name], unit='Nm') setInputPosMsg = can.Message( 0x00C, "Set_Input_Pos", 8, [inputPos, velFF, torqueFF], senders=['Master'] ) # 0x00D - Set Input Vel - inputVel = can.Signal("Input_Vel", 0, 32, is_float=True, receivers=[newNode.name], unit='rev') - inputTorqueFF = can.Signal("Input_Torque_FF", 32, 32, is_float=True, receivers=[newNode.name], unit='rev/s') + inputVel = can.Signal("Input_Vel", 0, 32, conversion=NamedSignalConversion(scale=1,offset=0,is_float=True,choices={}), receivers=[newNode.name], unit='rev') + inputTorqueFF = can.Signal("Input_Torque_FF", 32, 32, conversion=NamedSignalConversion(scale=1,offset=0,is_float=True,choices={}), receivers=[newNode.name], unit='rev/s') setInputVelMsg = can.Message( 0x00D, "Set_Input_Vel", 8, [inputVel, inputTorqueFF], senders=['Master'] ) # 0x00E - Set Input Torque - inputTorque = can.Signal("Input_Torque", 0, 32, is_float=True, receivers=[newNode.name], unit='Nm') + inputTorque = can.Signal("Input_Torque", 0, 32, conversion=NamedSignalConversion(scale=1,offset=0,is_float=True,choices={}), receivers=[newNode.name], unit='Nm') setInputTqMsg = can.Message( 0x00E, "Set_Input_Torque", 8, [inputTorque], senders=['Master'] ) # 0x00F - Set Velocity Limit - velLimit = can.Signal("Velocity_Limit", 0, 32, is_float=True, receivers=[newNode.name], unit='rev/s') - currentLimit = can.Signal("Current_Limit", 32, 32, is_float=True, receivers=[newNode.name], unit='A') + velLimit = can.Signal("Velocity_Limit", 0, 32, conversion=NamedSignalConversion(scale=1,offset=0,is_float=True,choices={}), receivers=[newNode.name], unit='rev/s') + currentLimit = can.Signal("Current_Limit", 32, 32, conversion=NamedSignalConversion(scale=1,offset=0,is_float=True,choices={}), receivers=[newNode.name], unit='A') setVelLimMsg = can.Message( 0x00F, "Set_Limits", 8, [velLimit, currentLimit], senders=['Master'] ) @@ -115,40 +117,40 @@ startAnticoggingMsg = can.Message(0x010, "Start_Anticogging", 0, [], senders=['Master']) # 0x011 - Set Traj Vel Limit - trajVelLim = can.Signal("Traj_Vel_Limit", 0, 32, is_float=True, receivers=[newNode.name], unit='rev/s') + trajVelLim = can.Signal("Traj_Vel_Limit", 0, 32, conversion=NamedSignalConversion(scale=1,offset=0,is_float=True,choices={}), receivers=[newNode.name], unit='rev/s') setTrajVelMsg = can.Message( 0x011, "Set_Traj_Vel_Limit", 8, [trajVelLim], senders=['Master'] ) # 0x012 - Set Traj Accel Limits - trajAccelLim = can.Signal("Traj_Accel_Limit", 0, 32, is_float=True, receivers=[newNode.name], unit='rev/s^2') - trajDecelLim = can.Signal("Traj_Decel_Limit", 32, 32, is_float=True, receivers=[newNode.name], unit='rev/s^2') + trajAccelLim = can.Signal("Traj_Accel_Limit", 0, 32, conversion=NamedSignalConversion(scale=1,offset=0,is_float=True,choices={}), receivers=[newNode.name], unit='rev/s^2') + trajDecelLim = can.Signal("Traj_Decel_Limit", 32, 32, conversion=NamedSignalConversion(scale=1,offset=0,is_float=True,choices={}), receivers=[newNode.name], unit='rev/s^2') setTrajAccelMsg = can.Message( 0x012, "Set_Traj_Accel_Limits", 8, [trajAccelLim, trajDecelLim], senders=['Master'] ) # 0x013 - Set Traj Inertia - trajInertia = can.Signal("Traj_Inertia", 0, 32, is_float=True, receivers=[newNode.name], unit='Nm / (rev/s^2)') + trajInertia = can.Signal("Traj_Inertia", 0, 32, conversion=NamedSignalConversion(scale=1,offset=0,is_float=True,choices={}), receivers=[newNode.name], unit='Nm / (rev/s^2)') trajInertiaMsg = can.Message( 0x013, "Set_Traj_Inertia", 8, [trajInertia], senders=['Master'] ) # 0x014 - Get Iq - iqSetpoint = can.Signal("Iq_Setpoint", 0, 32, is_float=True, receivers=['Master'], unit='A') - iqMeasured = can.Signal("Iq_Measured", 32, 32, is_float=True, receivers=['Master'], unit='A') + iqSetpoint = can.Signal("Iq_Setpoint", 0, 32, conversion=NamedSignalConversion(scale=1,offset=0,is_float=True,choices={}), receivers=['Master'], unit='A') + iqMeasured = can.Signal("Iq_Measured", 32, 32, conversion=NamedSignalConversion(scale=1,offset=0,is_float=True,choices={}), receivers=['Master'], unit='A') getIqMsg = can.Message(0x014, "Get_Iq", 8, [iqSetpoint, iqMeasured], senders=[newNode.name]) # 0x015 - Get Sensorless Estimates - sensorlessPosEstimate = can.Signal("Sensorless_Pos_Estimate", 0, 32, is_float=True, receivers=['Master'], unit='rev') - sensorlessVelEstimate = can.Signal("Sensorless_Vel_Estimate", 32, 32, is_float=True, receivers=['Master'], unit='rev/s') + sensorlessPosEstimate = can.Signal("Sensorless_Pos_Estimate", 0, 32, conversion=NamedSignalConversion(scale=1,offset=0,is_float=True,choices={}), receivers=['Master'], unit='rev') + sensorlessVelEstimate = can.Signal("Sensorless_Vel_Estimate", 32, 32, conversion=NamedSignalConversion(scale=1,offset=0,is_float=True,choices={}), receivers=['Master'], unit='rev/s') getSensorlessEstMsg = can.Message(0x015, "Get_Sensorless_Estimates", 8, [sensorlessPosEstimate, sensorlessVelEstimate], senders=[newNode.name]) # 0x016 - Reboot ODrive rebootMsg = can.Message(0x016, "Reboot", 0, [], senders=['Master']) # 0x017 - Get vbus Voltage and Current - busVoltage = can.Signal("Bus_Voltage", 0, 32, is_float=True, receivers=['Master'], unit='V') - busCurrent = can.Signal("Bus_Current", 32, 32, is_float=True, receivers=['Master'], unit='A') + busVoltage = can.Signal("Bus_Voltage", 0, 32, conversion=NamedSignalConversion(scale=1,offset=0,is_float=True,choices={}), receivers=['Master'], unit='V') + busCurrent = can.Signal("Bus_Current", 32, 32, conversion=NamedSignalConversion(scale=1,offset=0,is_float=True,choices={}), receivers=['Master'], unit='A') getVbusVCMsg = can.Message(0x017, "Get_Bus_Voltage_Current", 8, [busVoltage, busCurrent], senders=[newNode.name]) # 0x018 - Clear Errors @@ -159,20 +161,20 @@ setLinearCountMsg = can.Message(0x019, "Set_Linear_Count", 8, [position], senders=['Master']) # 0x01A - Set Pos gain - posGain = can.Signal("Pos_Gain", 0, 32, is_float=True, receivers=[newNode.name], unit='(rev/s) / rev') + posGain = can.Signal("Pos_Gain", 0, 32, conversion=NamedSignalConversion(scale=1,offset=0,is_float=True,choices={}), receivers=[newNode.name], unit='(rev/s) / rev') setPosGainMsg = can.Message(0x01A, "Set_Pos_Gain", 8, [posGain], senders=['Master']) # 0x01B - Set Vel Gains - velGain = can.Signal("Vel_Gain", 0, 32, is_float=True, receivers=[newNode.name], unit='Nm / (rev/s)') - velIntGain = can.Signal("Vel_Integrator_Gain", 32, 32, is_float=True, receivers=[newNode.name], unit='(Nm / (rev/s)) / s') + velGain = can.Signal("Vel_Gain", 0, 32, conversion=NamedSignalConversion(scale=1,offset=0,is_float=True,choices={}), receivers=[newNode.name], unit='Nm / (rev/s)') + velIntGain = can.Signal("Vel_Integrator_Gain", 32, 32, conversion=NamedSignalConversion(scale=1,offset=0,is_float=True,choices={}), receivers=[newNode.name], unit='(Nm / (rev/s)) / s') setVelGainsMsg = can.Message(0x01B, "Set_Vel_Gains", 8, [velGain, velIntGain], senders=['Master']) # 0x01C - Get ADC Voltage - adcVoltage = can.Signal("ADC_Voltage", 0, 32, is_float=True, receivers=['Master'], unit='V') + adcVoltage = can.Signal("ADC_Voltage", 0, 32, conversion=NamedSignalConversion(scale=1,offset=0,is_float=True,choices={}), receivers=['Master'], unit='V') getADCVoltageMsg = can.Message(0x01C, "Get_ADC_Voltage", 8, [adcVoltage], senders=[newNode.name]) # 0x01D - Controller Error - controllerError = can.Signal("Controller_Error", 0, 32, receivers=['Master'], choices={error.value: error.name for error in ControllerError}) + controllerError = can.Signal("Controller_Error", 0, 32, receivers=['Master'], conversion=NamedSignalConversion(scale=1,offset=0,is_float=False,choices={error.value: error.name for error in ControllerError})) controllerErrorMsg = can.Message( 0x01D, "Get_Controller_Error", 8, [controllerError], senders=[newNode.name] ) From 55384d0aebd320209294452825b933d6909717d0 Mon Sep 17 00:00:00 2001 From: Scott Date: Sat, 10 Feb 2024 06:44:31 -0500 Subject: [PATCH 2/3] New generated DBC file from DBC script update --- tools/odrive-cansimple.dbc | 192 +++++++++++++++++++++++++++++++++++++ 1 file changed, 192 insertions(+) diff --git a/tools/odrive-cansimple.dbc b/tools/odrive-cansimple.dbc index 43142b208..c709258eb 100644 --- a/tools/odrive-cansimple.dbc +++ b/tools/odrive-cansimple.dbc @@ -824,8 +824,32 @@ VAL_ 3 Motor_Error 0 "NONE" 1 "PHASE_RESISTANCE_OUT_OF_RANGE" 2 "PHASE_INDUCTANC VAL_ 4 Encoder_Error 0 "NONE" 1 "UNSTABLE_GAIN" 2 "CPR_POLEPAIRS_MISMATCH" 4 "NO_RESPONSE" 8 "UNSUPPORTED_ENCODER_MODE" 16 "ILLEGAL_HALL_STATE" 32 "INDEX_NOT_FOUND_YET" 64 "ABS_SPI_TIMEOUT" 128 "ABS_SPI_COM_FAIL" 256 "ABS_SPI_NOT_READY" 512 "HALL_NOT_CALIBRATED_YET" ; VAL_ 5 Sensorless_Error 0 "NONE" 1 "UNSTABLE_GAIN" 2 "UNKNOWN_CURRENT_MEASUREMENT" ; VAL_ 7 Axis_Requested_State 0 "UNDEFINED" 1 "IDLE" 2 "STARTUP_SEQUENCE" 3 "FULL_CALIBRATION_SEQUENCE" 4 "MOTOR_CALIBRATION" 6 "ENCODER_INDEX_SEARCH" 7 "ENCODER_OFFSET_CALIBRATION" 8 "CLOSED_LOOP_CONTROL" 9 "LOCKIN_SPIN" 10 "ENCODER_DIR_FIND" 11 "HOMING" 12 "ENCODER_HALL_POLARITY_CALIBRATION" 13 "ENCODER_HALL_PHASE_CALIBRATION" ; +VAL_ 9 Vel_Estimate ; +VAL_ 9 Pos_Estimate ; VAL_ 11 Input_Mode 0 "INACTIVE" 1 "PASSTHROUGH" 2 "VEL_RAMP" 3 "POS_FILTER" 4 "MIX_CHANNELS" 5 "TRAP_TRAJ" 6 "TORQUE_RAMP" 7 "MIRROR" 8 "TUNING" ; VAL_ 11 Control_Mode 0 "VOLTAGE_CONTROL" 1 "TORQUE_CONTROL" 2 "VELOCITY_CONTROL" 3 "POSITION_CONTROL" ; +VAL_ 12 Torque_FF ; +VAL_ 12 Vel_FF ; +VAL_ 12 Input_Pos ; +VAL_ 13 Input_Torque_FF ; +VAL_ 13 Input_Vel ; +VAL_ 14 Input_Torque ; +VAL_ 15 Current_Limit ; +VAL_ 15 Velocity_Limit ; +VAL_ 17 Traj_Vel_Limit ; +VAL_ 18 Traj_Decel_Limit ; +VAL_ 18 Traj_Accel_Limit ; +VAL_ 19 Traj_Inertia ; +VAL_ 20 Iq_Measured ; +VAL_ 20 Iq_Setpoint ; +VAL_ 21 Sensorless_Vel_Estimate ; +VAL_ 21 Sensorless_Pos_Estimate ; +VAL_ 23 Bus_Current ; +VAL_ 23 Bus_Voltage ; +VAL_ 26 Pos_Gain ; +VAL_ 27 Vel_Integrator_Gain ; +VAL_ 27 Vel_Gain ; +VAL_ 28 ADC_Voltage ; VAL_ 29 Controller_Error 0 "NONE" 1 "OVERSPEED" 2 "INVALID_INPUT_MODE" 4 "UNSTABLE_GAIN" 8 "INVALID_MIRROR_AXIS" 16 "INVALID_LOAD_ENCODER" 32 "INVALID_ESTIMATE" 64 "INVALID_CIRCULAR_RANGE" 128 "SPINOUT_DETECTED" ; VAL_ 33 Axis_State 0 "UNDEFINED" 1 "IDLE" 2 "STARTUP_SEQUENCE" 3 "FULL_CALIBRATION_SEQUENCE" 4 "MOTOR_CALIBRATION" 6 "ENCODER_INDEX_SEARCH" 7 "ENCODER_OFFSET_CALIBRATION" 8 "CLOSED_LOOP_CONTROL" 9 "LOCKIN_SPIN" 10 "ENCODER_DIR_FIND" 11 "HOMING" 12 "ENCODER_HALL_POLARITY_CALIBRATION" 13 "ENCODER_HALL_PHASE_CALIBRATION" ; VAL_ 33 Axis_Error 0 "NONE" 1 "INVALID_STATE" 64 "MOTOR_FAILED" 128 "SENSORLESS_ESTIMATOR_FAILED" 256 "ENCODER_FAILED" 512 "CONTROLLER_FAILED" 2048 "WATCHDOG_TIMER_EXPIRED" 4096 "MIN_ENDSTOP_PRESSED" 8192 "MAX_ENDSTOP_PRESSED" 16384 "ESTOP_REQUESTED" 131072 "HOMING_WITHOUT_ENDSTOP" 262144 "OVER_TEMP" 524288 "UNKNOWN_POSITION" ; @@ -833,8 +857,32 @@ VAL_ 35 Motor_Error 0 "NONE" 1 "PHASE_RESISTANCE_OUT_OF_RANGE" 2 "PHASE_INDUCTAN VAL_ 36 Encoder_Error 0 "NONE" 1 "UNSTABLE_GAIN" 2 "CPR_POLEPAIRS_MISMATCH" 4 "NO_RESPONSE" 8 "UNSUPPORTED_ENCODER_MODE" 16 "ILLEGAL_HALL_STATE" 32 "INDEX_NOT_FOUND_YET" 64 "ABS_SPI_TIMEOUT" 128 "ABS_SPI_COM_FAIL" 256 "ABS_SPI_NOT_READY" 512 "HALL_NOT_CALIBRATED_YET" ; VAL_ 37 Sensorless_Error 0 "NONE" 1 "UNSTABLE_GAIN" 2 "UNKNOWN_CURRENT_MEASUREMENT" ; VAL_ 39 Axis_Requested_State 0 "UNDEFINED" 1 "IDLE" 2 "STARTUP_SEQUENCE" 3 "FULL_CALIBRATION_SEQUENCE" 4 "MOTOR_CALIBRATION" 6 "ENCODER_INDEX_SEARCH" 7 "ENCODER_OFFSET_CALIBRATION" 8 "CLOSED_LOOP_CONTROL" 9 "LOCKIN_SPIN" 10 "ENCODER_DIR_FIND" 11 "HOMING" 12 "ENCODER_HALL_POLARITY_CALIBRATION" 13 "ENCODER_HALL_PHASE_CALIBRATION" ; +VAL_ 41 Vel_Estimate ; +VAL_ 41 Pos_Estimate ; VAL_ 43 Input_Mode 0 "INACTIVE" 1 "PASSTHROUGH" 2 "VEL_RAMP" 3 "POS_FILTER" 4 "MIX_CHANNELS" 5 "TRAP_TRAJ" 6 "TORQUE_RAMP" 7 "MIRROR" 8 "TUNING" ; VAL_ 43 Control_Mode 0 "VOLTAGE_CONTROL" 1 "TORQUE_CONTROL" 2 "VELOCITY_CONTROL" 3 "POSITION_CONTROL" ; +VAL_ 44 Torque_FF ; +VAL_ 44 Vel_FF ; +VAL_ 44 Input_Pos ; +VAL_ 45 Input_Torque_FF ; +VAL_ 45 Input_Vel ; +VAL_ 46 Input_Torque ; +VAL_ 47 Current_Limit ; +VAL_ 47 Velocity_Limit ; +VAL_ 49 Traj_Vel_Limit ; +VAL_ 50 Traj_Decel_Limit ; +VAL_ 50 Traj_Accel_Limit ; +VAL_ 51 Traj_Inertia ; +VAL_ 52 Iq_Measured ; +VAL_ 52 Iq_Setpoint ; +VAL_ 53 Sensorless_Vel_Estimate ; +VAL_ 53 Sensorless_Pos_Estimate ; +VAL_ 55 Bus_Current ; +VAL_ 55 Bus_Voltage ; +VAL_ 58 Pos_Gain ; +VAL_ 59 Vel_Integrator_Gain ; +VAL_ 59 Vel_Gain ; +VAL_ 60 ADC_Voltage ; VAL_ 61 Controller_Error 0 "NONE" 1 "OVERSPEED" 2 "INVALID_INPUT_MODE" 4 "UNSTABLE_GAIN" 8 "INVALID_MIRROR_AXIS" 16 "INVALID_LOAD_ENCODER" 32 "INVALID_ESTIMATE" 64 "INVALID_CIRCULAR_RANGE" 128 "SPINOUT_DETECTED" ; VAL_ 65 Axis_State 0 "UNDEFINED" 1 "IDLE" 2 "STARTUP_SEQUENCE" 3 "FULL_CALIBRATION_SEQUENCE" 4 "MOTOR_CALIBRATION" 6 "ENCODER_INDEX_SEARCH" 7 "ENCODER_OFFSET_CALIBRATION" 8 "CLOSED_LOOP_CONTROL" 9 "LOCKIN_SPIN" 10 "ENCODER_DIR_FIND" 11 "HOMING" 12 "ENCODER_HALL_POLARITY_CALIBRATION" 13 "ENCODER_HALL_PHASE_CALIBRATION" ; VAL_ 65 Axis_Error 0 "NONE" 1 "INVALID_STATE" 64 "MOTOR_FAILED" 128 "SENSORLESS_ESTIMATOR_FAILED" 256 "ENCODER_FAILED" 512 "CONTROLLER_FAILED" 2048 "WATCHDOG_TIMER_EXPIRED" 4096 "MIN_ENDSTOP_PRESSED" 8192 "MAX_ENDSTOP_PRESSED" 16384 "ESTOP_REQUESTED" 131072 "HOMING_WITHOUT_ENDSTOP" 262144 "OVER_TEMP" 524288 "UNKNOWN_POSITION" ; @@ -842,8 +890,32 @@ VAL_ 67 Motor_Error 0 "NONE" 1 "PHASE_RESISTANCE_OUT_OF_RANGE" 2 "PHASE_INDUCTAN VAL_ 68 Encoder_Error 0 "NONE" 1 "UNSTABLE_GAIN" 2 "CPR_POLEPAIRS_MISMATCH" 4 "NO_RESPONSE" 8 "UNSUPPORTED_ENCODER_MODE" 16 "ILLEGAL_HALL_STATE" 32 "INDEX_NOT_FOUND_YET" 64 "ABS_SPI_TIMEOUT" 128 "ABS_SPI_COM_FAIL" 256 "ABS_SPI_NOT_READY" 512 "HALL_NOT_CALIBRATED_YET" ; VAL_ 69 Sensorless_Error 0 "NONE" 1 "UNSTABLE_GAIN" 2 "UNKNOWN_CURRENT_MEASUREMENT" ; VAL_ 71 Axis_Requested_State 0 "UNDEFINED" 1 "IDLE" 2 "STARTUP_SEQUENCE" 3 "FULL_CALIBRATION_SEQUENCE" 4 "MOTOR_CALIBRATION" 6 "ENCODER_INDEX_SEARCH" 7 "ENCODER_OFFSET_CALIBRATION" 8 "CLOSED_LOOP_CONTROL" 9 "LOCKIN_SPIN" 10 "ENCODER_DIR_FIND" 11 "HOMING" 12 "ENCODER_HALL_POLARITY_CALIBRATION" 13 "ENCODER_HALL_PHASE_CALIBRATION" ; +VAL_ 73 Vel_Estimate ; +VAL_ 73 Pos_Estimate ; VAL_ 75 Input_Mode 0 "INACTIVE" 1 "PASSTHROUGH" 2 "VEL_RAMP" 3 "POS_FILTER" 4 "MIX_CHANNELS" 5 "TRAP_TRAJ" 6 "TORQUE_RAMP" 7 "MIRROR" 8 "TUNING" ; VAL_ 75 Control_Mode 0 "VOLTAGE_CONTROL" 1 "TORQUE_CONTROL" 2 "VELOCITY_CONTROL" 3 "POSITION_CONTROL" ; +VAL_ 76 Torque_FF ; +VAL_ 76 Vel_FF ; +VAL_ 76 Input_Pos ; +VAL_ 77 Input_Torque_FF ; +VAL_ 77 Input_Vel ; +VAL_ 78 Input_Torque ; +VAL_ 79 Current_Limit ; +VAL_ 79 Velocity_Limit ; +VAL_ 81 Traj_Vel_Limit ; +VAL_ 82 Traj_Decel_Limit ; +VAL_ 82 Traj_Accel_Limit ; +VAL_ 83 Traj_Inertia ; +VAL_ 84 Iq_Measured ; +VAL_ 84 Iq_Setpoint ; +VAL_ 85 Sensorless_Vel_Estimate ; +VAL_ 85 Sensorless_Pos_Estimate ; +VAL_ 87 Bus_Current ; +VAL_ 87 Bus_Voltage ; +VAL_ 90 Pos_Gain ; +VAL_ 91 Vel_Integrator_Gain ; +VAL_ 91 Vel_Gain ; +VAL_ 92 ADC_Voltage ; VAL_ 93 Controller_Error 0 "NONE" 1 "OVERSPEED" 2 "INVALID_INPUT_MODE" 4 "UNSTABLE_GAIN" 8 "INVALID_MIRROR_AXIS" 16 "INVALID_LOAD_ENCODER" 32 "INVALID_ESTIMATE" 64 "INVALID_CIRCULAR_RANGE" 128 "SPINOUT_DETECTED" ; VAL_ 97 Axis_State 0 "UNDEFINED" 1 "IDLE" 2 "STARTUP_SEQUENCE" 3 "FULL_CALIBRATION_SEQUENCE" 4 "MOTOR_CALIBRATION" 6 "ENCODER_INDEX_SEARCH" 7 "ENCODER_OFFSET_CALIBRATION" 8 "CLOSED_LOOP_CONTROL" 9 "LOCKIN_SPIN" 10 "ENCODER_DIR_FIND" 11 "HOMING" 12 "ENCODER_HALL_POLARITY_CALIBRATION" 13 "ENCODER_HALL_PHASE_CALIBRATION" ; VAL_ 97 Axis_Error 0 "NONE" 1 "INVALID_STATE" 64 "MOTOR_FAILED" 128 "SENSORLESS_ESTIMATOR_FAILED" 256 "ENCODER_FAILED" 512 "CONTROLLER_FAILED" 2048 "WATCHDOG_TIMER_EXPIRED" 4096 "MIN_ENDSTOP_PRESSED" 8192 "MAX_ENDSTOP_PRESSED" 16384 "ESTOP_REQUESTED" 131072 "HOMING_WITHOUT_ENDSTOP" 262144 "OVER_TEMP" 524288 "UNKNOWN_POSITION" ; @@ -851,8 +923,32 @@ VAL_ 99 Motor_Error 0 "NONE" 1 "PHASE_RESISTANCE_OUT_OF_RANGE" 2 "PHASE_INDUCTAN VAL_ 100 Encoder_Error 0 "NONE" 1 "UNSTABLE_GAIN" 2 "CPR_POLEPAIRS_MISMATCH" 4 "NO_RESPONSE" 8 "UNSUPPORTED_ENCODER_MODE" 16 "ILLEGAL_HALL_STATE" 32 "INDEX_NOT_FOUND_YET" 64 "ABS_SPI_TIMEOUT" 128 "ABS_SPI_COM_FAIL" 256 "ABS_SPI_NOT_READY" 512 "HALL_NOT_CALIBRATED_YET" ; VAL_ 101 Sensorless_Error 0 "NONE" 1 "UNSTABLE_GAIN" 2 "UNKNOWN_CURRENT_MEASUREMENT" ; VAL_ 103 Axis_Requested_State 0 "UNDEFINED" 1 "IDLE" 2 "STARTUP_SEQUENCE" 3 "FULL_CALIBRATION_SEQUENCE" 4 "MOTOR_CALIBRATION" 6 "ENCODER_INDEX_SEARCH" 7 "ENCODER_OFFSET_CALIBRATION" 8 "CLOSED_LOOP_CONTROL" 9 "LOCKIN_SPIN" 10 "ENCODER_DIR_FIND" 11 "HOMING" 12 "ENCODER_HALL_POLARITY_CALIBRATION" 13 "ENCODER_HALL_PHASE_CALIBRATION" ; +VAL_ 105 Vel_Estimate ; +VAL_ 105 Pos_Estimate ; VAL_ 107 Input_Mode 0 "INACTIVE" 1 "PASSTHROUGH" 2 "VEL_RAMP" 3 "POS_FILTER" 4 "MIX_CHANNELS" 5 "TRAP_TRAJ" 6 "TORQUE_RAMP" 7 "MIRROR" 8 "TUNING" ; VAL_ 107 Control_Mode 0 "VOLTAGE_CONTROL" 1 "TORQUE_CONTROL" 2 "VELOCITY_CONTROL" 3 "POSITION_CONTROL" ; +VAL_ 108 Torque_FF ; +VAL_ 108 Vel_FF ; +VAL_ 108 Input_Pos ; +VAL_ 109 Input_Torque_FF ; +VAL_ 109 Input_Vel ; +VAL_ 110 Input_Torque ; +VAL_ 111 Current_Limit ; +VAL_ 111 Velocity_Limit ; +VAL_ 113 Traj_Vel_Limit ; +VAL_ 114 Traj_Decel_Limit ; +VAL_ 114 Traj_Accel_Limit ; +VAL_ 115 Traj_Inertia ; +VAL_ 116 Iq_Measured ; +VAL_ 116 Iq_Setpoint ; +VAL_ 117 Sensorless_Vel_Estimate ; +VAL_ 117 Sensorless_Pos_Estimate ; +VAL_ 119 Bus_Current ; +VAL_ 119 Bus_Voltage ; +VAL_ 122 Pos_Gain ; +VAL_ 123 Vel_Integrator_Gain ; +VAL_ 123 Vel_Gain ; +VAL_ 124 ADC_Voltage ; VAL_ 125 Controller_Error 0 "NONE" 1 "OVERSPEED" 2 "INVALID_INPUT_MODE" 4 "UNSTABLE_GAIN" 8 "INVALID_MIRROR_AXIS" 16 "INVALID_LOAD_ENCODER" 32 "INVALID_ESTIMATE" 64 "INVALID_CIRCULAR_RANGE" 128 "SPINOUT_DETECTED" ; VAL_ 129 Axis_State 0 "UNDEFINED" 1 "IDLE" 2 "STARTUP_SEQUENCE" 3 "FULL_CALIBRATION_SEQUENCE" 4 "MOTOR_CALIBRATION" 6 "ENCODER_INDEX_SEARCH" 7 "ENCODER_OFFSET_CALIBRATION" 8 "CLOSED_LOOP_CONTROL" 9 "LOCKIN_SPIN" 10 "ENCODER_DIR_FIND" 11 "HOMING" 12 "ENCODER_HALL_POLARITY_CALIBRATION" 13 "ENCODER_HALL_PHASE_CALIBRATION" ; VAL_ 129 Axis_Error 0 "NONE" 1 "INVALID_STATE" 64 "MOTOR_FAILED" 128 "SENSORLESS_ESTIMATOR_FAILED" 256 "ENCODER_FAILED" 512 "CONTROLLER_FAILED" 2048 "WATCHDOG_TIMER_EXPIRED" 4096 "MIN_ENDSTOP_PRESSED" 8192 "MAX_ENDSTOP_PRESSED" 16384 "ESTOP_REQUESTED" 131072 "HOMING_WITHOUT_ENDSTOP" 262144 "OVER_TEMP" 524288 "UNKNOWN_POSITION" ; @@ -860,8 +956,32 @@ VAL_ 131 Motor_Error 0 "NONE" 1 "PHASE_RESISTANCE_OUT_OF_RANGE" 2 "PHASE_INDUCTA VAL_ 132 Encoder_Error 0 "NONE" 1 "UNSTABLE_GAIN" 2 "CPR_POLEPAIRS_MISMATCH" 4 "NO_RESPONSE" 8 "UNSUPPORTED_ENCODER_MODE" 16 "ILLEGAL_HALL_STATE" 32 "INDEX_NOT_FOUND_YET" 64 "ABS_SPI_TIMEOUT" 128 "ABS_SPI_COM_FAIL" 256 "ABS_SPI_NOT_READY" 512 "HALL_NOT_CALIBRATED_YET" ; VAL_ 133 Sensorless_Error 0 "NONE" 1 "UNSTABLE_GAIN" 2 "UNKNOWN_CURRENT_MEASUREMENT" ; VAL_ 135 Axis_Requested_State 0 "UNDEFINED" 1 "IDLE" 2 "STARTUP_SEQUENCE" 3 "FULL_CALIBRATION_SEQUENCE" 4 "MOTOR_CALIBRATION" 6 "ENCODER_INDEX_SEARCH" 7 "ENCODER_OFFSET_CALIBRATION" 8 "CLOSED_LOOP_CONTROL" 9 "LOCKIN_SPIN" 10 "ENCODER_DIR_FIND" 11 "HOMING" 12 "ENCODER_HALL_POLARITY_CALIBRATION" 13 "ENCODER_HALL_PHASE_CALIBRATION" ; +VAL_ 137 Vel_Estimate ; +VAL_ 137 Pos_Estimate ; VAL_ 139 Input_Mode 0 "INACTIVE" 1 "PASSTHROUGH" 2 "VEL_RAMP" 3 "POS_FILTER" 4 "MIX_CHANNELS" 5 "TRAP_TRAJ" 6 "TORQUE_RAMP" 7 "MIRROR" 8 "TUNING" ; VAL_ 139 Control_Mode 0 "VOLTAGE_CONTROL" 1 "TORQUE_CONTROL" 2 "VELOCITY_CONTROL" 3 "POSITION_CONTROL" ; +VAL_ 140 Torque_FF ; +VAL_ 140 Vel_FF ; +VAL_ 140 Input_Pos ; +VAL_ 141 Input_Torque_FF ; +VAL_ 141 Input_Vel ; +VAL_ 142 Input_Torque ; +VAL_ 143 Current_Limit ; +VAL_ 143 Velocity_Limit ; +VAL_ 145 Traj_Vel_Limit ; +VAL_ 146 Traj_Decel_Limit ; +VAL_ 146 Traj_Accel_Limit ; +VAL_ 147 Traj_Inertia ; +VAL_ 148 Iq_Measured ; +VAL_ 148 Iq_Setpoint ; +VAL_ 149 Sensorless_Vel_Estimate ; +VAL_ 149 Sensorless_Pos_Estimate ; +VAL_ 151 Bus_Current ; +VAL_ 151 Bus_Voltage ; +VAL_ 154 Pos_Gain ; +VAL_ 155 Vel_Integrator_Gain ; +VAL_ 155 Vel_Gain ; +VAL_ 156 ADC_Voltage ; VAL_ 157 Controller_Error 0 "NONE" 1 "OVERSPEED" 2 "INVALID_INPUT_MODE" 4 "UNSTABLE_GAIN" 8 "INVALID_MIRROR_AXIS" 16 "INVALID_LOAD_ENCODER" 32 "INVALID_ESTIMATE" 64 "INVALID_CIRCULAR_RANGE" 128 "SPINOUT_DETECTED" ; VAL_ 161 Axis_State 0 "UNDEFINED" 1 "IDLE" 2 "STARTUP_SEQUENCE" 3 "FULL_CALIBRATION_SEQUENCE" 4 "MOTOR_CALIBRATION" 6 "ENCODER_INDEX_SEARCH" 7 "ENCODER_OFFSET_CALIBRATION" 8 "CLOSED_LOOP_CONTROL" 9 "LOCKIN_SPIN" 10 "ENCODER_DIR_FIND" 11 "HOMING" 12 "ENCODER_HALL_POLARITY_CALIBRATION" 13 "ENCODER_HALL_PHASE_CALIBRATION" ; VAL_ 161 Axis_Error 0 "NONE" 1 "INVALID_STATE" 64 "MOTOR_FAILED" 128 "SENSORLESS_ESTIMATOR_FAILED" 256 "ENCODER_FAILED" 512 "CONTROLLER_FAILED" 2048 "WATCHDOG_TIMER_EXPIRED" 4096 "MIN_ENDSTOP_PRESSED" 8192 "MAX_ENDSTOP_PRESSED" 16384 "ESTOP_REQUESTED" 131072 "HOMING_WITHOUT_ENDSTOP" 262144 "OVER_TEMP" 524288 "UNKNOWN_POSITION" ; @@ -869,8 +989,32 @@ VAL_ 163 Motor_Error 0 "NONE" 1 "PHASE_RESISTANCE_OUT_OF_RANGE" 2 "PHASE_INDUCTA VAL_ 164 Encoder_Error 0 "NONE" 1 "UNSTABLE_GAIN" 2 "CPR_POLEPAIRS_MISMATCH" 4 "NO_RESPONSE" 8 "UNSUPPORTED_ENCODER_MODE" 16 "ILLEGAL_HALL_STATE" 32 "INDEX_NOT_FOUND_YET" 64 "ABS_SPI_TIMEOUT" 128 "ABS_SPI_COM_FAIL" 256 "ABS_SPI_NOT_READY" 512 "HALL_NOT_CALIBRATED_YET" ; VAL_ 165 Sensorless_Error 0 "NONE" 1 "UNSTABLE_GAIN" 2 "UNKNOWN_CURRENT_MEASUREMENT" ; VAL_ 167 Axis_Requested_State 0 "UNDEFINED" 1 "IDLE" 2 "STARTUP_SEQUENCE" 3 "FULL_CALIBRATION_SEQUENCE" 4 "MOTOR_CALIBRATION" 6 "ENCODER_INDEX_SEARCH" 7 "ENCODER_OFFSET_CALIBRATION" 8 "CLOSED_LOOP_CONTROL" 9 "LOCKIN_SPIN" 10 "ENCODER_DIR_FIND" 11 "HOMING" 12 "ENCODER_HALL_POLARITY_CALIBRATION" 13 "ENCODER_HALL_PHASE_CALIBRATION" ; +VAL_ 169 Vel_Estimate ; +VAL_ 169 Pos_Estimate ; VAL_ 171 Input_Mode 0 "INACTIVE" 1 "PASSTHROUGH" 2 "VEL_RAMP" 3 "POS_FILTER" 4 "MIX_CHANNELS" 5 "TRAP_TRAJ" 6 "TORQUE_RAMP" 7 "MIRROR" 8 "TUNING" ; VAL_ 171 Control_Mode 0 "VOLTAGE_CONTROL" 1 "TORQUE_CONTROL" 2 "VELOCITY_CONTROL" 3 "POSITION_CONTROL" ; +VAL_ 172 Torque_FF ; +VAL_ 172 Vel_FF ; +VAL_ 172 Input_Pos ; +VAL_ 173 Input_Torque_FF ; +VAL_ 173 Input_Vel ; +VAL_ 174 Input_Torque ; +VAL_ 175 Current_Limit ; +VAL_ 175 Velocity_Limit ; +VAL_ 177 Traj_Vel_Limit ; +VAL_ 178 Traj_Decel_Limit ; +VAL_ 178 Traj_Accel_Limit ; +VAL_ 179 Traj_Inertia ; +VAL_ 180 Iq_Measured ; +VAL_ 180 Iq_Setpoint ; +VAL_ 181 Sensorless_Vel_Estimate ; +VAL_ 181 Sensorless_Pos_Estimate ; +VAL_ 183 Bus_Current ; +VAL_ 183 Bus_Voltage ; +VAL_ 186 Pos_Gain ; +VAL_ 187 Vel_Integrator_Gain ; +VAL_ 187 Vel_Gain ; +VAL_ 188 ADC_Voltage ; VAL_ 189 Controller_Error 0 "NONE" 1 "OVERSPEED" 2 "INVALID_INPUT_MODE" 4 "UNSTABLE_GAIN" 8 "INVALID_MIRROR_AXIS" 16 "INVALID_LOAD_ENCODER" 32 "INVALID_ESTIMATE" 64 "INVALID_CIRCULAR_RANGE" 128 "SPINOUT_DETECTED" ; VAL_ 193 Axis_State 0 "UNDEFINED" 1 "IDLE" 2 "STARTUP_SEQUENCE" 3 "FULL_CALIBRATION_SEQUENCE" 4 "MOTOR_CALIBRATION" 6 "ENCODER_INDEX_SEARCH" 7 "ENCODER_OFFSET_CALIBRATION" 8 "CLOSED_LOOP_CONTROL" 9 "LOCKIN_SPIN" 10 "ENCODER_DIR_FIND" 11 "HOMING" 12 "ENCODER_HALL_POLARITY_CALIBRATION" 13 "ENCODER_HALL_PHASE_CALIBRATION" ; VAL_ 193 Axis_Error 0 "NONE" 1 "INVALID_STATE" 64 "MOTOR_FAILED" 128 "SENSORLESS_ESTIMATOR_FAILED" 256 "ENCODER_FAILED" 512 "CONTROLLER_FAILED" 2048 "WATCHDOG_TIMER_EXPIRED" 4096 "MIN_ENDSTOP_PRESSED" 8192 "MAX_ENDSTOP_PRESSED" 16384 "ESTOP_REQUESTED" 131072 "HOMING_WITHOUT_ENDSTOP" 262144 "OVER_TEMP" 524288 "UNKNOWN_POSITION" ; @@ -878,8 +1022,32 @@ VAL_ 195 Motor_Error 0 "NONE" 1 "PHASE_RESISTANCE_OUT_OF_RANGE" 2 "PHASE_INDUCTA VAL_ 196 Encoder_Error 0 "NONE" 1 "UNSTABLE_GAIN" 2 "CPR_POLEPAIRS_MISMATCH" 4 "NO_RESPONSE" 8 "UNSUPPORTED_ENCODER_MODE" 16 "ILLEGAL_HALL_STATE" 32 "INDEX_NOT_FOUND_YET" 64 "ABS_SPI_TIMEOUT" 128 "ABS_SPI_COM_FAIL" 256 "ABS_SPI_NOT_READY" 512 "HALL_NOT_CALIBRATED_YET" ; VAL_ 197 Sensorless_Error 0 "NONE" 1 "UNSTABLE_GAIN" 2 "UNKNOWN_CURRENT_MEASUREMENT" ; VAL_ 199 Axis_Requested_State 0 "UNDEFINED" 1 "IDLE" 2 "STARTUP_SEQUENCE" 3 "FULL_CALIBRATION_SEQUENCE" 4 "MOTOR_CALIBRATION" 6 "ENCODER_INDEX_SEARCH" 7 "ENCODER_OFFSET_CALIBRATION" 8 "CLOSED_LOOP_CONTROL" 9 "LOCKIN_SPIN" 10 "ENCODER_DIR_FIND" 11 "HOMING" 12 "ENCODER_HALL_POLARITY_CALIBRATION" 13 "ENCODER_HALL_PHASE_CALIBRATION" ; +VAL_ 201 Vel_Estimate ; +VAL_ 201 Pos_Estimate ; VAL_ 203 Input_Mode 0 "INACTIVE" 1 "PASSTHROUGH" 2 "VEL_RAMP" 3 "POS_FILTER" 4 "MIX_CHANNELS" 5 "TRAP_TRAJ" 6 "TORQUE_RAMP" 7 "MIRROR" 8 "TUNING" ; VAL_ 203 Control_Mode 0 "VOLTAGE_CONTROL" 1 "TORQUE_CONTROL" 2 "VELOCITY_CONTROL" 3 "POSITION_CONTROL" ; +VAL_ 204 Torque_FF ; +VAL_ 204 Vel_FF ; +VAL_ 204 Input_Pos ; +VAL_ 205 Input_Torque_FF ; +VAL_ 205 Input_Vel ; +VAL_ 206 Input_Torque ; +VAL_ 207 Current_Limit ; +VAL_ 207 Velocity_Limit ; +VAL_ 209 Traj_Vel_Limit ; +VAL_ 210 Traj_Decel_Limit ; +VAL_ 210 Traj_Accel_Limit ; +VAL_ 211 Traj_Inertia ; +VAL_ 212 Iq_Measured ; +VAL_ 212 Iq_Setpoint ; +VAL_ 213 Sensorless_Vel_Estimate ; +VAL_ 213 Sensorless_Pos_Estimate ; +VAL_ 215 Bus_Current ; +VAL_ 215 Bus_Voltage ; +VAL_ 218 Pos_Gain ; +VAL_ 219 Vel_Integrator_Gain ; +VAL_ 219 Vel_Gain ; +VAL_ 220 ADC_Voltage ; VAL_ 221 Controller_Error 0 "NONE" 1 "OVERSPEED" 2 "INVALID_INPUT_MODE" 4 "UNSTABLE_GAIN" 8 "INVALID_MIRROR_AXIS" 16 "INVALID_LOAD_ENCODER" 32 "INVALID_ESTIMATE" 64 "INVALID_CIRCULAR_RANGE" 128 "SPINOUT_DETECTED" ; VAL_ 225 Axis_State 0 "UNDEFINED" 1 "IDLE" 2 "STARTUP_SEQUENCE" 3 "FULL_CALIBRATION_SEQUENCE" 4 "MOTOR_CALIBRATION" 6 "ENCODER_INDEX_SEARCH" 7 "ENCODER_OFFSET_CALIBRATION" 8 "CLOSED_LOOP_CONTROL" 9 "LOCKIN_SPIN" 10 "ENCODER_DIR_FIND" 11 "HOMING" 12 "ENCODER_HALL_POLARITY_CALIBRATION" 13 "ENCODER_HALL_PHASE_CALIBRATION" ; VAL_ 225 Axis_Error 0 "NONE" 1 "INVALID_STATE" 64 "MOTOR_FAILED" 128 "SENSORLESS_ESTIMATOR_FAILED" 256 "ENCODER_FAILED" 512 "CONTROLLER_FAILED" 2048 "WATCHDOG_TIMER_EXPIRED" 4096 "MIN_ENDSTOP_PRESSED" 8192 "MAX_ENDSTOP_PRESSED" 16384 "ESTOP_REQUESTED" 131072 "HOMING_WITHOUT_ENDSTOP" 262144 "OVER_TEMP" 524288 "UNKNOWN_POSITION" ; @@ -887,8 +1055,32 @@ VAL_ 227 Motor_Error 0 "NONE" 1 "PHASE_RESISTANCE_OUT_OF_RANGE" 2 "PHASE_INDUCTA VAL_ 228 Encoder_Error 0 "NONE" 1 "UNSTABLE_GAIN" 2 "CPR_POLEPAIRS_MISMATCH" 4 "NO_RESPONSE" 8 "UNSUPPORTED_ENCODER_MODE" 16 "ILLEGAL_HALL_STATE" 32 "INDEX_NOT_FOUND_YET" 64 "ABS_SPI_TIMEOUT" 128 "ABS_SPI_COM_FAIL" 256 "ABS_SPI_NOT_READY" 512 "HALL_NOT_CALIBRATED_YET" ; VAL_ 229 Sensorless_Error 0 "NONE" 1 "UNSTABLE_GAIN" 2 "UNKNOWN_CURRENT_MEASUREMENT" ; VAL_ 231 Axis_Requested_State 0 "UNDEFINED" 1 "IDLE" 2 "STARTUP_SEQUENCE" 3 "FULL_CALIBRATION_SEQUENCE" 4 "MOTOR_CALIBRATION" 6 "ENCODER_INDEX_SEARCH" 7 "ENCODER_OFFSET_CALIBRATION" 8 "CLOSED_LOOP_CONTROL" 9 "LOCKIN_SPIN" 10 "ENCODER_DIR_FIND" 11 "HOMING" 12 "ENCODER_HALL_POLARITY_CALIBRATION" 13 "ENCODER_HALL_PHASE_CALIBRATION" ; +VAL_ 233 Vel_Estimate ; +VAL_ 233 Pos_Estimate ; VAL_ 235 Input_Mode 0 "INACTIVE" 1 "PASSTHROUGH" 2 "VEL_RAMP" 3 "POS_FILTER" 4 "MIX_CHANNELS" 5 "TRAP_TRAJ" 6 "TORQUE_RAMP" 7 "MIRROR" 8 "TUNING" ; VAL_ 235 Control_Mode 0 "VOLTAGE_CONTROL" 1 "TORQUE_CONTROL" 2 "VELOCITY_CONTROL" 3 "POSITION_CONTROL" ; +VAL_ 236 Torque_FF ; +VAL_ 236 Vel_FF ; +VAL_ 236 Input_Pos ; +VAL_ 237 Input_Torque_FF ; +VAL_ 237 Input_Vel ; +VAL_ 238 Input_Torque ; +VAL_ 239 Current_Limit ; +VAL_ 239 Velocity_Limit ; +VAL_ 241 Traj_Vel_Limit ; +VAL_ 242 Traj_Decel_Limit ; +VAL_ 242 Traj_Accel_Limit ; +VAL_ 243 Traj_Inertia ; +VAL_ 244 Iq_Measured ; +VAL_ 244 Iq_Setpoint ; +VAL_ 245 Sensorless_Vel_Estimate ; +VAL_ 245 Sensorless_Pos_Estimate ; +VAL_ 247 Bus_Current ; +VAL_ 247 Bus_Voltage ; +VAL_ 250 Pos_Gain ; +VAL_ 251 Vel_Integrator_Gain ; +VAL_ 251 Vel_Gain ; +VAL_ 252 ADC_Voltage ; VAL_ 253 Controller_Error 0 "NONE" 1 "OVERSPEED" 2 "INVALID_INPUT_MODE" 4 "UNSTABLE_GAIN" 8 "INVALID_MIRROR_AXIS" 16 "INVALID_LOAD_ENCODER" 32 "INVALID_ESTIMATE" 64 "INVALID_CIRCULAR_RANGE" 128 "SPINOUT_DETECTED" ; SIG_VALTYPE_ 9 Pos_Estimate : 1; SIG_VALTYPE_ 9 Vel_Estimate : 1; From 2a80ad06f7af4aa110dcb01e608782c4ebeff002 Mon Sep 17 00:00:00 2001 From: Scott Date: Sat, 10 Feb 2024 06:46:49 -0500 Subject: [PATCH 3/3] Update can_dbc_example to work with latest cantools * Corrects bugs in current_state to check against string instead of hex. Retval is no longer hex * Adds rate limiting to velocity printout so the terminal isn't spammed with values * Allows for a graceful shutdown of the closed loop control portion --- tools/can_dbc_example.py | 61 ++++++++++++++++++++++++++++------------ 1 file changed, 43 insertions(+), 18 deletions(-) diff --git a/tools/can_dbc_example.py b/tools/can_dbc_example.py index a4d609f06..01d97c918 100644 --- a/tools/can_dbc_example.py +++ b/tools/can_dbc_example.py @@ -9,12 +9,12 @@ # bus = can.Bus("vcan0", bustype="virtual") bus = can.Bus("can0", bustype="socketcan") axisID = 0x1 - +axis="Axis1" print("\nRequesting AXIS_STATE_FULL_CALIBRATION_SEQUENCE (0x03) on axisID: " + str(axisID)) -msg = db.get_message_by_name('Set_Axis_State') +msg = db.get_message_by_name(f'{axis}_Set_Axis_State') data = msg.encode({'Axis_Requested_State': 0x03}) msg = can.Message(arbitration_id=msg.frame_id | axisID << 5, is_extended_id=False, data=data) -print(db.decode_message('Set_Axis_State', msg.data)) +print(db.decode_message(f'{axis}_Set_Axis_State', msg.data)) print(msg) try: @@ -27,23 +27,24 @@ # Read messages infinitely and wait for the right ID to show up while True: msg = bus.recv() - if msg.arbitration_id == ((axisID << 5) | db.get_message_by_name('Heartbeat').frame_id): - current_state = db.decode_message('Heartbeat', msg.data)['Axis_State'] - if current_state == 0x1: + if msg.arbitration_id == ((axisID << 5) | db.get_message_by_name(f'{axis}_Heartbeat').frame_id): + current_state = db.decode_message(f'{axis}_Heartbeat', msg.data)['Axis_State'] + if current_state == 'IDLE': print("\nAxis has returned to Idle state.") break for msg in bus: - if msg.arbitration_id == ((axisID << 5) | db.get_message_by_name('Heartbeat').frame_id): - errorCode = db.decode_message('Heartbeat', msg.data)['Axis_Error'] - if errorCode == 0x00: + if msg.arbitration_id == ((axisID << 5) | db.get_message_by_name(f'{axis}_Heartbeat').frame_id): + errorCode = db.decode_message(f'{axis}_Heartbeat', msg.data)['Axis_Error'] + print(errorCode) + if errorCode == 'NONE': print("No errors") else: print("Axis error! Error code: "+str(hex(errorCode))) break print("\nPutting axis",axisID,"into AXIS_STATE_CLOSED_LOOP_CONTROL (0x08)...") -data = db.encode_message('Set_Axis_State', {'Axis_Requested_State': 0x08}) +data = db.encode_message(f'{axis}_Set_Axis_State', {'Axis_Requested_State': 0x08}) msg = can.Message(arbitration_id=0x07 | axisID << 5, is_extended_id=False, data=data) print(msg) @@ -56,7 +57,7 @@ for msg in bus: if msg.arbitration_id == 0x01 | axisID << 5: print("\nReceived Axis heartbeat message:") - msg = db.decode_message('Heartbeat', msg.data) + msg = db.decode_message(f'{axis}_Heartbeat', msg.data) print(msg) if msg['Axis_State'] == 0x8: print("Axis has entered closed loop") @@ -66,15 +67,39 @@ target = 0 -data = db.encode_message('Set_Limits', {'Velocity_Limit':10.0, 'Current_Limit':10.0}) +data = db.encode_message(f'{axis}_Set_Limits', {'Velocity_Limit':10.0, 'Current_Limit':10.0}) msg = can.Message(arbitration_id=axisID << 5 | 0x00F, is_extended_id=False, data=data) bus.send(msg) t0 = time.monotonic() +print("\nSweeping velocity between -4 and 4.\nCTRL+C to stop\n") +time.sleep(2) +i = 0 while True: - setpoint = 4.0 * math.sin((time.monotonic() - t0)*2) - print("goto " + str(setpoint)) - data = db.encode_message('Set_Input_Pos', {'Input_Pos':setpoint, 'Vel_FF':0.0, 'Torque_FF':0.0}) - msg = can.Message(arbitration_id=axisID << 5 | 0x00C, data=data, is_extended_id=False) - bus.send(msg) - time.sleep(0.01) \ No newline at end of file + try: + setpoint = 4.0 * math.sin((time.monotonic() - t0)*2) + # Don't spam the terminal + if (i % 25 == 0): + print(f"Velocity: {round(setpoint,2)}") + i = 0 + data = db.encode_message(f'{axis}_Set_Input_Pos', {'Input_Pos':setpoint, 'Vel_FF':setpoint, 'Torque_FF':0.0}) + msg = can.Message(arbitration_id=axisID << 5 | 0x00C, data=data, is_extended_id=False) + bus.send(msg) + i+=1 + time.sleep(0.01) + except KeyboardInterrupt: + break +print("\nDone! Setting to AXIS_STATE_IDLE") +data = db.encode_message(f'{axis}_Set_Axis_State', {'Axis_Requested_State': 0x01}) +msg = can.Message(arbitration_id=axisID << 5 | 0x07, is_extended_id=False, data=data) +time.sleep(0.5) +bus.send(msg) +while True: + for msg in bus: + if msg.arbitration_id == 0x01 | axisID << 5: + current_state = db.decode_message(f'{axis}_Heartbeat', msg.data)['Axis_State'] + print(current_state) + if current_state == 'IDLE': + print("\nAxis has returned to Idle state.") + break + break \ No newline at end of file