打印
[电机控制专用MCU]

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

[复制链接]
109|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
a976209770|  楼主 | 2024-12-30 12:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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_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 的故障检测与处理模块通过快速环和慢速环的结合,保障了系统的安全性和稳定性:
  • 检测机制: 通过计数器和时间阈值避免误判。
  • 保护机制: 实现了快速响应和慢速恢复。
  • 优化方向: 可结合硬件加速和低速观测器优化,提高系统可靠性。



使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

37

主题

40

帖子

0

粉丝