feat(FOC): 添加快速电压检测功能和PWM调试模式
新增基于跌幅检测的快速电压保护机制,在100us周期内响应电压异常, 当电压跌幅超过阈值或低于绝对下限时立即关机保护。同时添加PWM输出 调试模式便于硬件测试。 BREAKING CHANGE: 重构了电压检测逻辑,采用峰值跟踪算法替代固 定阈值检测,提高在动态供电环境下的可靠性
This commit is contained in:
+43
-8
@@ -4,6 +4,7 @@
|
||||
#include "FOC.h"
|
||||
#include "adc.h"
|
||||
#include "flash.h"
|
||||
#include "systick.h"
|
||||
|
||||
|
||||
extern sampler sampler;
|
||||
@@ -15,6 +16,10 @@ ThermalController thermalController; // 热量控制器初始化
|
||||
#define max(a, b, c) \
|
||||
((a) > (b) ? ((a) > (c) ? (a) : (c)) : ((b) > (c) ? (b) : (c)))
|
||||
constexpr u16 PROTECT_TIME = 6000; // 过热保护时间,单位*10ms
|
||||
|
||||
// 电压管理状态机
|
||||
static VoltageState voltage_state = VoltageState::NORMAL;
|
||||
static float last_vbus_slow = 0.0f; // 上次电压值(慢速任务用)
|
||||
/**
|
||||
** @brief 热能计算
|
||||
** @param None
|
||||
@@ -90,18 +95,48 @@ void angsens_MG_check(void) {
|
||||
CAN0_transmiter.MagStatus = MGH or MGL;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 电压管理(低频任务,约10ms调用一次)
|
||||
*
|
||||
* 负责:
|
||||
* 1. 执行Flash保存(阻塞操作,不能在高频循环中执行)
|
||||
* 2. 状态恢复判断(基于基准电压的比例恢复)
|
||||
* 3. 更新FOC的电源电压参数
|
||||
*/
|
||||
void power_manage(void) {
|
||||
float last_vbus = sampler.get_vbus_voltage();
|
||||
sampler.update_vbus_voltage();
|
||||
FOC.update_power(last_vbus);
|
||||
float vbus = sampler.get_vbus_voltage();
|
||||
if ((vbus < 22.0f) and (last_vbus > vbus) and vbus > 8.0f) {
|
||||
FOC.shut_down();
|
||||
|
||||
// 更新FOC的电源电压参数
|
||||
FOC.update_power(last_vbus_slow);
|
||||
last_vbus_slow = vbus;
|
||||
|
||||
// 如果快速检测已触发紧急关机,执行保存
|
||||
if (FOC.emergency_shutdown) {
|
||||
flashEEP.save_system_config(true);
|
||||
} else {
|
||||
// 只有在没有过热关机时才恢复
|
||||
if (!FOC.thermal_shutdown) {
|
||||
FOC.resume();
|
||||
FOC.emergency_shutdown = false; // 清除紧急关机标志
|
||||
voltage_state = VoltageState::SHUTDOWN_SAVE;
|
||||
return;
|
||||
}
|
||||
|
||||
// 状态机处理
|
||||
switch (voltage_state) {
|
||||
case VoltageState::NORMAL:
|
||||
// 正常状态:无需操作
|
||||
break;
|
||||
|
||||
case VoltageState::SHUTDOWN_SAVE:
|
||||
// 关机保存状态:检查是否可以恢复
|
||||
// 恢复条件:电压恢复到基准电压的90%以上
|
||||
if (FOC.vbus_reference > 0 && vbus > FOC.vbus_reference * VBUS_RECOVERY_RATIO) {
|
||||
if (!FOC.thermal_shutdown) {
|
||||
FOC.resume();
|
||||
voltage_state = VoltageState::NORMAL;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user