diff --git a/Firmware/MotorControl/axis.cpp b/Firmware/MotorControl/axis.cpp index 80987c00..4f845eab 100644 --- a/Firmware/MotorControl/axis.cpp +++ b/Firmware/MotorControl/axis.cpp @@ -140,6 +140,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 9e78fdab..3f240b87 100644 --- a/Firmware/MotorControl/axis.hpp +++ b/Firmware/MotorControl/axis.hpp @@ -21,6 +21,7 @@ public: ERROR_CONTROLLER_FAILED = 0x200, ERROR_POS_CTRL_DURING_SENSORLESS = 0x400, ERROR_WATCHDOG_TIMER_EXPIRED = 0x800, + ERROR_DC_BUS_OVER_POWER = 0x1000, }; enum State_t { diff --git a/Firmware/MotorControl/odrive_main.h b/Firmware/MotorControl/odrive_main.h index 677fb996..7065cd42 100644 --- a/Firmware/MotorControl/odrive_main.h +++ b/Firmware/MotorControl/odrive_main.h @@ -81,6 +81,7 @@ struct BoardConfig_t { //