在 FOC(磁场定向控制)系统中,电机必须校准角度(即 “电角度零位校准”),核心原因是FOC 算法依赖精确的转子磁场方向(电角度)来控制电压矢量,而 “机械角度” 与 “电角度” 并非天然对应,必须通过校准建立映射关系。结合你的代码(如Check_Sensor函数),具体原因如下:
1. 机械角度 ≠ 电角度,必须校准才能建立对应关系
-
机械角度:指电机转子实际转动的物理角度(如 AS5600 磁编码器直接读取的角度,单位:rad 或度),反映转子的空间位置。
-
电角度:指与转子磁场相关的电气角度,计算公式为:
电角度 = 机械角度 × 极对数 + 零位补偿(你的代码中
M0_electricAngle函数实现了这一转换:(机械角度 × M0_PP × M0_DIR) - M0_zero_elc_Angle)例如:若电机极对数为 7(
M0_PP=7),转子机械转动 1 圈(360° 机械角度),电角度会变化 7×360°=2520°(即 7 圈)。 -
问题:出厂时,电机的机械零位(如转子某一齿的位置)与电零位(磁场方向为 0° 的位置)不重合,且无固定规律(因生产误差)。若不校准,计算的电角度会存在固定偏差。
2. FOC 算法的核心依赖:准确的电角度
FOC 的本质是 “将三相交流电机等效为直流电机控制”,通过控制与磁场垂直的电压分量(q 轴电压Uq)来调节转矩,这要求电压矢量必须与转子磁场保持精确的 90° 相位差(即依赖准确的电角度)。
-
若电角度不准:电压矢量与磁场的相位差偏离 90°,会导致:
- 转矩下降(相同电压下输出转矩减小);
- 电流增大(能量浪费,电机发热严重);
- 电机抖动、噪声大,甚至无法稳定运行。
-
你的代码中,
SetPhaseVoltage函数直接使用电角度计算电压矢量:c
运行
Motor->Ualpha = -Uq*sin(angle_el); // angle_el为电角度 Motor->Ubeta = Uq*cos(angle_el);若
angle_el(电角度)存在偏差,Ualpha和Ubeta的计算会出错,最终导致 PWM 输出错误。
3. 校准过程:强制锁定转子,记录电角度零位
你的代码中Check_Sensor函数通过以下步骤实现校准,本质是 “人为建立机械角度与电角度的对应关系”:
c
运行
// 以M0电机为例
SetPhaseVoltage(&M0, 3, _3PI_2); // 输出固定电压矢量(3V,电角度270°)
delay_ms(3000); // 转子被磁场力锁定在固定机械位置
M0_zero_elc_Angle = M0_electricAngle(); // 记录此时的电角度作为“零位补偿值”- 原理:输出固定电角度(如 270°)的电压矢量时,转子会被磁场力 “吸” 到唯一的机械位置(此时机械角度固定)。
- 校准后,
M0_zero_elc_Angle会补偿机械角度与电角度的固有偏差,确保后续计算的电角度准确反映磁场方向。
总结:校准的核心目的
角度校准是为了消除机械角度与电角度的固有偏差,确保 FOC 算法能准确计算与转子磁场同步的电压矢量,最终实现电机的高效、平稳、高精度控制。若不校准,FOC 系统会因 “电压与磁场不同步” 而失效,表现为电机无法启动、抖动、发热或转速失控。
你的代码中,Check_Sensor函数是校准的核心,通过锁定转子并记录零位补偿值,为后续的电角度计算提供基准,这是 FOC 控制必不可少的步骤。
极对数(Pole Pairs) 是指电机转子磁场的磁极对数,即 “N 极和 S 极” 成对出现的数量。它是机械角度与电角度转换的核心参数,直接影响 FOC 算法的准确性。