@@ -62,6 +62,7 @@ void IMotionCube::mapMisoPDOs(SdoSlaveInterface& sdo)
6262 map_miso.addObject (IMCObjectName::MotionErrorRegister);
6363 map_miso.addObject (IMCObjectName::DetailedErrorRegister);
6464 map_miso.addObject (IMCObjectName::DCLinkVoltage);
65+ map_miso.addObject (IMCObjectName::MotorVoltage);
6566 map_miso.addObject (IMCObjectName::MotorPosition);
6667 map_miso.addObject (IMCObjectName::MotorVelocity);
6768 map_miso.addObject (IMCObjectName::ActualVelocity);
@@ -128,7 +129,12 @@ bool IMotionCube::writeInitialSettings(SdoSlaveInterface& sdo, int cycle_time)
128129 int rate_ec_x = sdo.write <uint8_t >(0x60C2 , 1 , cycle_time);
129130 int rate_ec_y = sdo.write <int8_t >(0x60C2 , 2 , -3 );
130131
131- if (!(mode_of_op && max_pos_lim && min_pos_lim && stop_opt && stop_decl && abort_con && rate_ec_x && rate_ec_y))
132+ // use filter object to read motor voltage
133+ int volt_address = sdo.write <int16_t >(0x2108 , 1 , 0x0232 );
134+ int volt_filter = sdo.write <int16_t >(0x2108 , 2 , 32767 );
135+
136+ if (!(mode_of_op && max_pos_lim && min_pos_lim && stop_opt && stop_decl && abort_con && rate_ec_x && rate_ec_y &&
137+ volt_address && volt_filter))
132138 {
133139 throw error::HardwareException (error::ErrorType::WRITING_INITIAL_SETTINGS_FAILED,
134140 " Failed writing initial settings to IMC of slave %d" , this ->getSlaveIndex ());
@@ -296,6 +302,11 @@ float IMotionCube::getIMCVoltage()
296302 static_cast <float >(imc_voltage_iu); // Conversion to Volt, see Technosoft CoE programming manual
297303}
298304
305+ float IMotionCube::getMotorVoltage ()
306+ {
307+ return this ->read16 (this ->miso_byte_offsets_ .at (IMCObjectName::MotorVoltage)).ui ;
308+ }
309+
299310void IMotionCube::setControlWord (uint16_t control_word)
300311{
301312 bit16 control_word_ui = { .ui = control_word };
0 commit comments