本帖最后由 a976209770 于 2024-12-30 12:31 编辑
前言电机运行中,故障检测与处理是保障系统安全的重要环节。在APM32M3514中,故障检测模块覆盖了常见的过流、过压、欠压、超速等故障类型,并提供了高效的处理机制。本篇文章将基于代码中的实现,深入解析其故障检测机制及处理流程。
一、故障检测实现
故障检测的核心逻辑通过 fault_detect_fast 函数实现,该函数定期运行,以实时检测电机运行过程中的异常。主要检测以下故障类型:
- 过压(Over Voltage)
- 欠压(Under Voltage)
- 过流(Over Current,软件实现)
- 超速(Over Speed)
- 速度反馈错误(Speed Feedback Error)
二、代码实现
fault_detect_fast 函数解析void fault_detect_fast(Motor_TypeDef *Motor)
{
/* 检测过压故障 */
if (Motor->Foc.s16Vbus > DCBUS_OVER)
{
Motor->User.stc_fault.u16_OvCnt++;
if (Motor->User.stc_fault.u16_OvCnt > Motor->User.stc_fault.u16_OvTime)
{
Motor->User.stc_fault.u16_Fault** = OVER_VOL; // 设置过压故障标志
}
}
else
{
Motor->User.stc_fault.u16_OvCnt = 0; // 清除计数器
}
/* 检测欠压故障 */
if (Motor->Foc.s16Vbus < DCBUS_UNDER)
{
Motor->User.stc_fault.u16_UvCnt++;
if (Motor->User.stc_fault.u16_UvCnt > Motor->User.stc_fault.u16_UvTime)
{
Motor->User.stc_fault.u16_Fault** = UNDER_VOL; // 设置欠压故障标志
}
}
else
{
Motor->User.stc_fault.u16_UvCnt = 0; // 清除计数器
}
/* 检测过流故障(软件实现) */
if (abs(Motor->Foc.stc_Iuvw.s16q15_U) >= OC_VALUE || abs(Motor->Foc.stc_Iuvw.s16q15_V) >= OC_VALUE)
{
Motor->User.stc_fault.u16_OcCnt++;
if (Motor->User.stc_fault.u16_OcCnt > Motor->User.stc_fault.u16_OcTime)
{
Motor->User.stc_fault.u16_Fault** = OVER_CUR_SOFT; // 设置过流故障标志
}
}
else
{
Motor->User.stc_fault.u16_OcCnt = 0; // 清除计数器
}
/* 检测超速故障 */
if (abs(Motor->Foc.s16q15SpdObs) >= OVER_SPEED_VALUE)
{
Motor->User.stc_fault.u16_OsCnt++;
if (Motor->User.stc_fault.u16_OsCnt > Motor->User.stc_fault.u16_OsTime)
{
Motor->User.stc_fault.u16_Fault** = OVER_SPEED; // 设置超速故障标志
}
}
else
{
Motor->User.stc_fault.u16_OsCnt = 0; // 清除计数器
}
/* 检测速度反馈错误 */
if (Motor->Foc.s16SpdCmd > 0 && Motor->stc_SmoPara.s16q15SpdObs < 0 && eM1_RunSubState == RunState_Spin)
{
Motor->User.stc_fault.u16_PllErrCnt++;
if (Motor->User.stc_fault.u16_PllErrCnt > Motor->User.stc_fault.u16_PllErrTime)
{
Motor->User.stc_fault.u16_Fault** = SPEED_FDBK; // 设置速度反馈错误标志
}
}
else
{
Motor->User.stc_fault.u16_PllErrCnt = 0; // 清除计数器
}
#if (1 == STALL_ENABLE)
/* 检测失速故障 */
if (eM1_RunSubState == RunState_Spin)
{
uint8_t u8ErrorTemp = stall_check(&Motor->stc_Stall, Motor->Foc.u16q15Vdq_sqrt, Motor->stc_SmoPara.s16q15SpdObs);
if (u8ErrorTemp != 0)
{
Motor->User.stc_fault.u16_Fault** = STALL_SPEED; // 设置失速故障标志
}
}
#endif
}
三、故障类型与检测机制
[td]故障类型 | 触发条件 | 故障标志 | 过压 | s16Vbus > DCBUS_OVER | OVER_VOL | 欠压 | s16Vbus < DCBUS_UNDER | UNDER_VOL | 过流 | s16q15_UVW>OC_VALUE | s16q15_U | 超速 | ` | s16q15SpdObs | 速度反馈错误 | 速度方向与命令方向不符 | SPEED_FDBK | 失速(可选) | 调用 stall_check 检测转子锁死 | STALL_SPEED |
四、故障处理
1. 故障处理流程
故障检测到后,会通过以下流程处理:
- 设置故障标志: 通过 u16_Fault** 标志指示当前的故障类型。
- 切换到故障状态: 在主状态机中,当检测到故障标志时,系统会切换到故障状态。
- 进一步处理: 在故障状态下,慢速环继续监测故障是否恢复。
2. 状态机中的故障处理
故障状态机切换void M1_Run_Fast(void)
{
fault_detect_fast(&Motor_type);
/* 如果检测到故障,切换到故障状态 */
if (Motor_type.User.stc_fault.u16_Fault**)
{
M1_SwitchFault();
}
}
故障状态慢速环
void M1_Fault_Slow(void)
{
static uint16_t u16FaultTimeCnt;
/* 显示故障信息 */
Fault_LED_Disp();
/* 如果故障已解除,清除故障状态 */
if (0 == Motor_type.Foc.s16SpdCmd)
{
u16FaultTimeCnt++;
if (u16FaultTimeCnt > Motor_type.User.u16FaultReleaseTimeCmd)
{
variable_reset(&Motor_type); // 重置电机参数
M1_SwitchFaultStop(); // 切换到停止状态
u16FaultTimeCnt = 0;
}
}
}
故障恢复- 如果故障条件消失并达到一定时间(u16FaultReleaseTimeCmd),系统会清除故障标志,并切换到停止状态。
过流保护和超速保护分别通过实时监测电机的电流和速度实现。这些保护机制的实现基于软件逻辑,结合计数器与设定的阈值来判断故障,并在检测到故障时触发保护操作。
五、代码保护的实现(以过流保护为例)
过流保护的主要逻辑位于 fault_detect_fast 函数中,具体实现如下:
过流保护代码/* 检测过流故障(软件实现) */
if (abs(Motor->Foc.stc_Iuvw.s16q15_U) >= OC_VALUE || abs(Motor->Foc.stc_Iuvw.s16q15_V) >= OC_VALUE)
{
Motor->User.stc_fault.u16_OcCnt++;
if (Motor->User.stc_fault.u16_OcCnt > Motor->User.stc_fault.u16_OcTime)
{
Motor->User.stc_fault.u16_Fault** = OVER_CUR_SOFT; // 设置过流故障标志
}
}
else
{
Motor->User.stc_fault.u16_OcCnt = 0; // 清除计数器
}
实现逻辑- 采样电流数据:
- 电机三相电流通过 ADC 采样后,存储在 stc_Iuvw 的 s16q15_U 和 s16q15_V 中。
- 过流保护主要检测 U 相和 V 相的电流。
- 阈值判断:
- 比较当前电流绝对值与预设的过流阈值 OC_VALUE。
- 如果任一相的电流超过阈值,增加过流计数器 u16_OcCnt。
- 计数器判断:
- 当计数器值 u16_OcCnt 超过允许的时间阈值 u16_OcTime 时,判定为过流故障,设置故障标志 OVER_CUR_SOFT。
- 计数器清零:
- 如果电流恢复正常(小于 OC_VALUE),清除计数器 u16_OcCnt。
保护机制- 延时保护:
- 实时性:
- fault_detect_fast 函数定期运行(通常在快速环中),实现实时监测。
六、总结
APM32M3514 的故障检测与处理模块通过快速环和慢速环的结合,保障了系统的安全性和稳定性:
- 检测机制: 通过计数器和时间阈值避免误判。
- 保护机制: 实现了快速响应和慢速恢复。
- 优化方向: 可结合硬件加速和低速观测器优化,提高系统可靠性。
|