diff --git a/Firmware/MotorControl/axis.cpp b/Firmware/MotorControl/axis.cpp index b2c10ff4..123b4e4c 100644 --- a/Firmware/MotorControl/axis.cpp +++ b/Firmware/MotorControl/axis.cpp @@ -150,6 +150,20 @@ bool Axis::do_checks() { if (!(vbus_voltage <= board_config.dc_bus_overvoltage_trip_level)) error_ |= ERROR_DC_BUS_OVER_VOLTAGE; + // This is the same math that's used in update_brake_current(). Should we calculate IBus globally? + float Ibus_sum = 0.0f; + for (size_t i = 0; i < AXIS_COUNT; ++i) { + if (axes[i]->motor_.armed_state_ == Motor::ARMED_STATE_ARMED) { + Ibus_sum += axes[i]->motor_.current_control_.Ibus; + } + } + + if(board_config.power_supply_wattage > 0.0f && + (Ibus_sum * vbus_voltage) > board_config.power_supply_wattage) + { + error_ |= ERROR_DC_BUS_OVER_POWER; + } + // Sub-components should use set_error which will propegate to this error_ motor_.do_checks(); encoder_.do_checks(); diff --git a/Firmware/MotorControl/axis.hpp b/Firmware/MotorControl/axis.hpp index 402da78a..60524a46 100644 --- a/Firmware/MotorControl/axis.hpp +++ b/Firmware/MotorControl/axis.hpp @@ -31,6 +31,7 @@ public: ERROR_MIN_ENDSTOP_PRESSED = 0x1000, ERROR_MAX_ENDSTOP_PRESSED = 0x2000, ERROR_ESTOP_REQUESTED = 0x4000, + ERROR_DC_BUS_OVER_POWER = 0x8000, }; enum State_t { diff --git a/Firmware/MotorControl/odrive_main.h b/Firmware/MotorControl/odrive_main.h index 9b9658c9..2e86ded0 100644 --- a/Firmware/MotorControl/odrive_main.h +++ b/Firmware/MotorControl/odrive_main.h @@ -82,6 +82,7 @@ struct BoardConfig_t { //= 3 make_protocol_object("gpio1_pwm_mapping", make_protocol_definitions(board_config.pwm_mappings[0])), make_protocol_object("gpio2_pwm_mapping", make_protocol_definitions(board_config.pwm_mappings[1])),