[学习笔记] AC7811-FOC无感控制代码详解

[复制链接]
20158|71
 楼主| 狗啃模拟 发表于 2023-9-30 11:12 | 显示全部楼层
Stall_Check_Sensorless 堵转保护(无位置传感器)
可通过两种方式判断无传感模式下发生堵转情况:

1. 方差与平均转速平方的比例超过设定阈值。

2. 反电动势幅值与当前估算转速的比例超过设定阈值。
 楼主| 狗啃模拟 发表于 2023-9-30 11:12 | 显示全部楼层
  1. /*!
  2. * @brief Motor stall protection detection for position sensorless application.
  3. *
  4. * @param[in] pHandle: pointer to SPEED_RAMP_HANDLE structure
  5. * @param[in] smc: pointer to SMC_ESTIMATOR structure
  6. * @return status: fault diagnosis status, 0 OK; 1 fault; 2 unknown
  7. */
  8. int16_t Stall_Check_Sensorless(SPEED_RAMP_HANDLE *pHandle, SMC_ESTIMATOR *smc)
  9. {
  10.     int16_t status = DIAGNOSTIC_OK;

  11.     static int16_t bemfReliableCnt = 0;
  12.     int32_t avgSquareSpeed = 0;

  13.     int32_t bemfReliableThreshold = 0;
  14.     #if ((defined FLUX_OBSERVE) || (defined MRAS_OBSERVE))
  15.     int32_t estBemfSq = 0;
  16.     #endif

  17.     if ((g_startUpCtrl.startUpFlag >= 3) && (g_startUpCtrl.startUpFlag < 6))
  18.     {
  19.         //ASR_AvgSpeedCalc(pHandle);
  20.         avgSquareSpeed = (int32_t)(pHandle->avgSpeedFbk) * (int32_t)(pHandle->avgSpeedFbk);
  21.         bemfReliableThreshold = avgSquareSpeed;
  22.         g_bemfReliableThreshold = bemfReliableThreshold;
  23.         #if (defined SMC_OBSERVE)
  24.         Smc_GetBemfSq(smc);
  25. //        g_estBemfDebug = (smc->estBemfSq * BEMF_CONSISTENT_THRESHOLD) >> 4;
  26.         if ((((smc->estBemfSq * BEMF_CONSISTENT_THRESHOLD) >> 4) < bemfReliableThreshold))
  27.         {
  28.             if (++bemfReliableCnt >= BEMF_DBC)
  29.             {
  30.                 status = DIAGNOSTIC_FAIL;
  31.                 bemfReliableCnt = 0;
  32.                 g_protector.stallProFlag = 1;
  33.                 #if (defined STARTUP_CHECK_RESTART_ENABLE)
  34.                 #else
  35.                 Fault_Report(MOTOR_STALL_FAILURE);
  36.                 #endif
  37.             }
  38.         }
  39.         else
  40.         {
  41.             bemfReliableCnt=0;
  42.         }
  43.         #elif (defined FLUX_OBSERVE)//磁链观测
  44.         estBemfSq = (g_fluxObserver.emfAlpha * g_fluxObserver.emfAlpha + g_fluxObserver.emfBeta * g_fluxObserver.emfBeta) >> 8;
  45.         g_estBemfDebug = estBemfSq * BEMF_CONSISTENT_THRESHOLD;
  46.         if (((estBemfSq * BEMF_CONSISTENT_THRESHOLD) < bemfReliableThreshold) && (pHandle->varianceSpeed < 500000))
  47.             //保护方差与反电动势
  48.         {
  49.             if (++bemfReliableCnt >= BEMF_DBC)
  50.             {
  51.                 status = DIAGNOSTIC_FAIL;
  52.                 bemfReliableCnt = 0;
  53.                 g_protector.stallProFlag = 1;
  54.                 #if (defined STARTUP_CHECK_RESTART_ENABLE)
  55.                 #else
  56.                 Fault_Report(MOTOR_STALL_FAILURE);
  57.                 #endif
  58.             }
  59.         }
  60.         else
  61.         {
  62.             bemfReliableCnt = 0;
  63.         }
  64.         #elif (defined MRAS_OBSERVE)
  65.         estBemfSq = (g_mrasObserver.vdFilter * g_mrasObserver.vdFilter + g_mrasObserver.vqFilter * g_mrasObserver.vqFilter) >> 8;
  66. //        g_estBemfDebug = estBemfSq * BEMF_CONSISTENT_THRESHOLD;
  67.         if (((estBemfSq * BEMF_CONSISTENT_THRESHOLD) < bemfReliableThreshold) && (pHandle->varianceSpeed < 500000))
  68.         {
  69.             if (++bemfReliableCnt >= BEMF_DBC)
  70.             {
  71.                 status = DIAGNOSTIC_FAIL;
  72.                 bemfReliableCnt = 0;
  73.                 g_protector.stallProFlag = 1;
  74.                 #if (defined STARTUP_CHECK_RESTART_ENABLE)
  75.                 #else
  76.                 Fault_Report(MOTOR_STALL_FAILURE);
  77.                 #endif
  78.             }
  79.         }
  80.         else
  81.         {
  82.             bemfReliableCnt = 0;
  83.         }
  84.         #endif
  85.     }
  86.     else
  87.     {
  88. //        g_estBemfDebug = 0;
  89. //        g_bemfReliableThreshold = 0;
  90.     }

  91.     return status;
  92. }
 楼主| 狗啃模拟 发表于 2023-9-30 11:13 | 显示全部楼层
Current_Sensor_Check 相电流中点检测保护
上电初始化阶段调用,获取三相电流中点偏移大小,超过 5%中点偏移电压
 楼主| 狗啃模拟 发表于 2023-9-30 11:13 | 显示全部楼层
  1. #if (CUR_SAMPLE_MODE == THREE_SHUNT_SAMPLE) //电流传感器采样零点漂移检查,电流采样ADC零漂移值超过限制,这是故障。
  2.     /* 2048 *5% = 102 */
  3.     if (Math_Qabs(adcSampleReal->icOffset - 2048) > 102)
  4.     {
  5.         Fault_Report(PHASEC_CURRENT_MIDPOINT_FAILURE);
  6.     }
  7.     else
  8.     {
  9.         Fault_Clear(PHASEC_CURRENT_MIDPOINT_FAILURE);
  10.     }
  11. #else
  12. #endif
tpgf 发表于 2023-10-12 09:22 | 显示全部楼层
转速和电流之间的算法是固定的关系吗
qcliu 发表于 2023-10-12 10:14 | 显示全部楼层
如何控制步进电机的转速以及采集转速呢
coshi 发表于 2023-10-12 10:35 | 显示全部楼层
我们如何精准的测得当前电机的转速呢
wiba 发表于 2023-10-12 11:01 | 显示全部楼层
发生堵转的时候电流会不会明显增大呢
caigang13 发表于 2023-10-12 20:36 来自手机 | 显示全部楼层
矢量控制对三相电流采样要求确实要高些。
kxsi 发表于 2023-10-12 21:21 | 显示全部楼层
如果对这些信号检测的实时性要求高的话 是不是就需要跑一下系统了呢
drer 发表于 2023-10-12 21:59 | 显示全部楼层
这种双环控制的交互关系如何进行处理呢
tpgf 发表于 2023-10-21 11:50 | 显示全部楼层
这种无感的控制算法可以分为几大类呢
xiaoqizi 发表于 2023-10-21 13:10 | 显示全部楼层
三相电流的相位差是不是是固定值呢
八层楼 发表于 2023-10-21 13:45 | 显示全部楼层
一般这种算法所用的参数是全局变量还是局部变量啊
keaibukelian 发表于 2023-10-21 20:23 | 显示全部楼层
一般这种电机控制的代码 为了保证实时性能是不是都需要跑系统呢
wowu 发表于 2023-10-21 21:00 | 显示全部楼层
电机做零速保护的作用是什么呢
paotangsan 发表于 2023-10-21 21:30 | 显示全部楼层
我们采集的电流是脉动电流 通过什么算法得到有效值呢
天天向善 发表于 2023-11-6 10:09 | 显示全部楼层
是否有必要运行系统以确保通用电机
LinkMe 发表于 2023-11-6 12:13 | 显示全部楼层
三相电流的相位差是一个固定值吗
软核硬核 发表于 2023-12-8 12:39 | 显示全部楼层
怎么节制步进机电的转速和收集转速呢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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