a976209770 发表于 2024-12-30 12:30

APM32M3514 FOC算法解析系列——第6篇:故障检测与处理

本帖最后由 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
}三、故障类型与检测机制


故障类型触发条件故障标志
过压s16Vbus > DCBUS_OVEROVER_VOL
欠压s16Vbus < DCBUS_UNDERUNDER_VOL
过流s16q15_UVW>OC_VALUEs16q15_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 的故障检测与处理模块通过快速环和慢速环的结合,保障了系统的安全性和稳定性:

[*]检测机制: 通过计数器和时间阈值避免误判。
[*]保护机制: 实现了快速响应和慢速恢复。
[*]优化方向: 可结合硬件加速和低速观测器优化,提高系统可靠性。



页: [1]
查看完整版本: APM32M3514 FOC算法解析系列——第6篇:故障检测与处理