feat(FOC): 添加快速电压检测功能和PWM调试模式
新增基于跌幅检测的快速电压保护机制,在100us周期内响应电压异常, 当电压跌幅超过阈值或低于绝对下限时立即关机保护。同时添加PWM输出 调试模式便于硬件测试。 BREAKING CHANGE: 重构了电压检测逻辑,采用峰值跟踪算法替代固 定阈值检测,提高在动态供电环境下的可靠性
This commit is contained in:
@@ -18,6 +18,7 @@ extern angle_sensor KTH7823;
|
||||
extern CAN_transmiter CAN0_transmiter;
|
||||
extern EncoderVelocityKalman Vel_kalman; // 速度滤波
|
||||
extern CurrentKalman Current_kalman;
|
||||
extern u16 adc_value[6]; // ADC DMA缓冲区,用于快速电压检测
|
||||
|
||||
// 初始变量及函数定义
|
||||
#define _constrain(amt, low, high) \
|
||||
@@ -293,6 +294,18 @@ float FOC_Controller::drv_hold() {
|
||||
Set_3Pwm(hold_pwm_duty, 0, 0);
|
||||
return hold_pwm_duty;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief PWM模式(调试)
|
||||
*/
|
||||
float FOC_Controller::PWM_out() {
|
||||
float hold_pwm_duty = target_velocity/100;
|
||||
Set_3Pwm(hold_pwm_duty, hold_pwm_duty, hold_pwm_duty);
|
||||
return hold_pwm_duty;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief 电机恢复
|
||||
*
|
||||
@@ -318,6 +331,67 @@ void FOC_Controller::update_power(float voltage) {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 快速电压检测(在电机控制循环中每100us调用一次)
|
||||
*
|
||||
* 直接从DMA缓冲区读取最新ADC值,检测电压跌幅
|
||||
* 响应时间 < 200us
|
||||
*
|
||||
* 算法:
|
||||
* 1. 使用峰值检测算法跟踪当前额定电压(vbus_reference)
|
||||
* - 电压上升时,基准电压跟随
|
||||
* - 电压下跌时,基准电压保持(不跟随下跌)
|
||||
* 2. 计算电压跌幅 = 基准电压 - 当前电压
|
||||
* 3. 关机条件(满足任一即可):
|
||||
* - 电压跌幅超过 VBUS_DROP_THRESHOLD
|
||||
* - 电压低于绝对下限 VBUS_ABSOLUTE_MIN
|
||||
*
|
||||
* 参数定义在 config.h 中:
|
||||
* - VBUS_DROP_THRESHOLD: 电压跌幅阈值 (默认5V)
|
||||
* - VBUS_ABSOLUTE_MIN: 绝对最低电压 (默认8V)
|
||||
* - VBUS_DEBOUNCE_COUNT: 防抖计数 (默认5次)
|
||||
*/
|
||||
void FOC_Controller::fast_voltage_check(void) {
|
||||
// 直接从DMA缓冲区读取最新ADC值(通道5是Vbus)
|
||||
float current_vbus = adc_value[5] * (3.3f / 4096.0f) * 11.0f;
|
||||
|
||||
// 更新基准电压(峰值检测)
|
||||
// 电压上升时,基准电压跟随;电压下跌时,基准电压保持
|
||||
if (current_vbus > vbus_reference) {
|
||||
vbus_reference = current_vbus;
|
||||
}
|
||||
// 电压下跌时不更新基准电压,保持之前的峰值
|
||||
|
||||
// 更新上次电压值
|
||||
last_vbus_fast = current_vbus;
|
||||
|
||||
// 计算电压跌幅(相对于基准电压)
|
||||
float voltage_drop = vbus_reference - current_vbus;
|
||||
|
||||
// 关机条件(满足任一即可):
|
||||
// 1. 电压跌幅超过阈值
|
||||
// 2. 电压低于绝对下限
|
||||
bool drop_exceeded = (voltage_drop > VBUS_DROP_THRESHOLD);
|
||||
bool below_absolute = (current_vbus < VBUS_ABSOLUTE_MIN);
|
||||
|
||||
if ((drop_exceeded || below_absolute) && (!is_shut_down)) {
|
||||
// 电压跌落计数(防抖)
|
||||
vbus_drop_count++;
|
||||
|
||||
if (vbus_drop_count >= VBUS_DEBOUNCE_COUNT) {
|
||||
// 确认需要关机,立即停机
|
||||
drv_stop();
|
||||
motor_sleep();
|
||||
is_shut_down = true;
|
||||
emergency_shutdown = true; // 标记紧急关机,低频任务会执行保存
|
||||
vbus_drop_count = 0; // 重置计数器
|
||||
}
|
||||
} else {
|
||||
// 电压正常,重置计数器
|
||||
vbus_drop_count = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 速度开环控制
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user