[电机控制专用MCU] APM32M3514 FOC算法解析系列——第6篇:故障检测与处理

[复制链接]
986|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 函数解析
  1. void fault_detect_fast(Motor_TypeDef *Motor)
  2. {
  3.     /* 检测过压故障 */
  4.     if (Motor->Foc.s16Vbus > DCBUS_OVER)
  5.     {
  6.         Motor->User.stc_fault.u16_OvCnt++;
  7.         if (Motor->User.stc_fault.u16_OvCnt > Motor->User.stc_fault.u16_OvTime)
  8.         {
  9.             Motor->User.stc_fault.u16_Fault** = OVER_VOL; // 设置过压故障标志
  10.         }
  11.     }
  12.     else
  13.     {
  14.         Motor->User.stc_fault.u16_OvCnt = 0; // 清除计数器
  15.     }

  16.     /* 检测欠压故障 */
  17.     if (Motor->Foc.s16Vbus < DCBUS_UNDER)
  18.     {
  19.         Motor->User.stc_fault.u16_UvCnt++;
  20.         if (Motor->User.stc_fault.u16_UvCnt > Motor->User.stc_fault.u16_UvTime)
  21.         {
  22.             Motor->User.stc_fault.u16_Fault** = UNDER_VOL; // 设置欠压故障标志
  23.         }
  24.     }
  25.     else
  26.     {
  27.         Motor->User.stc_fault.u16_UvCnt = 0; // 清除计数器
  28.     }

  29.     /* 检测过流故障(软件实现) */
  30.     if (abs(Motor->Foc.stc_Iuvw.s16q15_U) >= OC_VALUE || abs(Motor->Foc.stc_Iuvw.s16q15_V) >= OC_VALUE)
  31.     {
  32.         Motor->User.stc_fault.u16_OcCnt++;
  33.         if (Motor->User.stc_fault.u16_OcCnt > Motor->User.stc_fault.u16_OcTime)
  34.         {
  35.             Motor->User.stc_fault.u16_Fault** = OVER_CUR_SOFT; // 设置过流故障标志
  36.         }
  37.     }
  38.     else
  39.     {
  40.         Motor->User.stc_fault.u16_OcCnt = 0; // 清除计数器
  41.     }

  42.     /* 检测超速故障 */
  43.     if (abs(Motor->Foc.s16q15SpdObs) >= OVER_SPEED_VALUE)
  44.     {
  45.         Motor->User.stc_fault.u16_OsCnt++;
  46.         if (Motor->User.stc_fault.u16_OsCnt > Motor->User.stc_fault.u16_OsTime)
  47.         {
  48.             Motor->User.stc_fault.u16_Fault** = OVER_SPEED; // 设置超速故障标志
  49.         }
  50.     }
  51.     else
  52.     {
  53.         Motor->User.stc_fault.u16_OsCnt = 0; // 清除计数器
  54.     }

  55.     /* 检测速度反馈错误 */
  56.     if (Motor->Foc.s16SpdCmd > 0 && Motor->stc_SmoPara.s16q15SpdObs < 0 && eM1_RunSubState == RunState_Spin)
  57.     {
  58.         Motor->User.stc_fault.u16_PllErrCnt++;
  59.         if (Motor->User.stc_fault.u16_PllErrCnt > Motor->User.stc_fault.u16_PllErrTime)
  60.         {
  61.             Motor->User.stc_fault.u16_Fault** = SPEED_FDBK; // 设置速度反馈错误标志
  62.         }
  63.     }
  64.     else
  65.     {
  66.         Motor->User.stc_fault.u16_PllErrCnt = 0; // 清除计数器
  67.     }

  68. #if (1 == STALL_ENABLE)
  69.     /* 检测失速故障 */
  70.     if (eM1_RunSubState == RunState_Spin)
  71.     {
  72.         uint8_t u8ErrorTemp = stall_check(&Motor->stc_Stall, Motor->Foc.u16q15Vdq_sqrt, Motor->stc_SmoPara.s16q15SpdObs);
  73.         if (u8ErrorTemp != 0)
  74.         {
  75.             Motor->User.stc_fault.u16_Fault** = STALL_SPEED; // 设置失速故障标志
  76.         }
  77.     }
  78. #endif
  79. }
三、故障类型与检测机制

[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. 状态机中的故障处理
故障状态机切换
  1. void M1_Run_Fast(void)
  2. {
  3.     fault_detect_fast(&Motor_type);

  4.     /* 如果检测到故障,切换到故障状态 */
  5.     if (Motor_type.User.stc_fault.u16_Fault**)
  6.     {
  7.         M1_SwitchFault();
  8.     }
  9. }
故障状态慢速环
  1. void M1_Fault_Slow(void)
  2. {
  3.     static uint16_t u16FaultTimeCnt;

  4.     /* 显示故障信息 */
  5.     Fault_LED_Disp();

  6.     /* 如果故障已解除,清除故障状态 */
  7.     if (0 == Motor_type.Foc.s16SpdCmd)
  8.     {
  9.         u16FaultTimeCnt++;
  10.         if (u16FaultTimeCnt > Motor_type.User.u16FaultReleaseTimeCmd)
  11.         {
  12.             variable_reset(&Motor_type); // 重置电机参数
  13.             M1_SwitchFaultStop();       // 切换到停止状态
  14.             u16FaultTimeCnt = 0;
  15.         }
  16.     }
  17. }
故障恢复
  • 如果故障条件消失并达到一定时间(u16FaultReleaseTimeCmd),系统会清除故障标志,并切换到停止状态。

过流保护超速保护分别通过实时监测电机的电流和速度实现。这些保护机制的实现基于软件逻辑,结合计数器与设定的阈值来判断故障,并在检测到故障时触发保护操作。

五、代码保护的实现(以过流保护为例)
过流保护的主要逻辑位于 fault_detect_fast 函数中,具体实现如下:

过流保护代码
  1. /* 检测过流故障(软件实现) */
  2. if (abs(Motor->Foc.stc_Iuvw.s16q15_U) >= OC_VALUE || abs(Motor->Foc.stc_Iuvw.s16q15_V) >= OC_VALUE)
  3. {
  4.     Motor->User.stc_fault.u16_OcCnt++;
  5.     if (Motor->User.stc_fault.u16_OcCnt > Motor->User.stc_fault.u16_OcTime)
  6.     {
  7.         Motor->User.stc_fault.u16_Fault** = OVER_CUR_SOFT; // 设置过流故障标志
  8.     }
  9. }
  10. else
  11. {
  12.     Motor->User.stc_fault.u16_OcCnt = 0; // 清除计数器
  13. }
实现逻辑
  • 采样电流数据:
    • 电机三相电流通过 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 的故障检测与处理模块通过快速环和慢速环的结合,保障了系统的安全性和稳定性:
  • 检测机制: 通过计数器和时间阈值避免误判。
  • 保护机制: 实现了快速响应和慢速恢复。
  • 优化方向: 可结合硬件加速和低速观测器优化,提高系统可靠性。



您需要登录后才可以回帖 登录 | 注册

本版积分规则

40

主题

43

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部