#include "health.h" #include "Can.h" #include "DengFOC.h" #include "adc.h" extern sampler sampler; extern CAN_transmiter CAN0_transmiter; extern FOC_Controlroller FOC; ThermalController thermalController; // 热量控制器初始化 #define SQUARE(x) ((x) * (x)) #define max(a, b, c) \ ((a) > (b) ? ((a) > (c) ? (a) : (c)) : ((b) > (c) ? (b) : (c))) constexpr u16 PROTECT_TIME = 3000; // 过热保护时间,单位*10ms /** ** @brief 热能计算 ** @param None ** @retval 热量值 */ u32 ThermalController::update() { thermal_value = thermal_value * thermalRate; thermal_value += SQUARE(sampler.get_drv_temp()) + SQUARE(sampler.get_mcu_temp()); if (remainingTime10Ms) { // 当前已经过热停机,正在停机自然散热 if (thermal_value < thermal_capacity * recoveryRate) { remainingTime10Ms = 1; // 可以恢复工作 } if (remainingTime10Ms == 1) { // 过热恢复 FOC.resume(); CAN0_transmiter.ThermalStatus = 0; return --remainingTime10Ms; } return --remainingTime10Ms; } else { // 当前没有过热停机 current_max = 1000 * max(sampler.get_current('U'), sampler.get_current('V'), sampler.get_current('W')); // 获取电流最大值 thermal_value += SQUARE(current_max) * gapTimeMs / 100000; // 计算当前电流热积累值 } if (thermal_value > thermal_capacity) { FOC.shut_down(); remainingTime10Ms = PROTECT_TIME; // 过热停机 CAN0_transmiter.ThermalStatus = 1; return remainingTime10Ms; } return thermal_value; } /** ** @brief 温度检测 ** @param None */ void angsens_MG_check(void) { bool MGH = gpio_input_bit_get(GPIOB, GPIO_PIN_10); bool MGL = gpio_input_bit_get(GPIOB, GPIO_PIN_11); CAN0_transmiter.MagStatus = MGH or MGL; }