打印

foc代码分析

[复制链接]
54|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
keer_zu|  楼主 | 2025-3-25 08:18 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

[i=s] 本帖最后由 keer_zu 于 2025-3-25 08:20 编辑 [/i]<br /> <br />

upload 附件:foc.zip

ODrive的FOC(磁场定向控制)代码分析如下:

1. 代码结构

  • 核心类FieldOrientedController,继承自 AlphaBetaFrameControllerComponentBase,支持电流控制模式和电压控制模式。
  • 关键文件
    • foc.hpp:定义类的接口、配置参数、状态变量和输入端口。
    • foc.cpp:实现控制逻辑,包括Clarke/Park变换、PI控制、调制信号生成等。

2. 核心功能

(1) 坐标变换

  • Clarke变换AlphaBetaFrameController::on_measurement):

    • 将三相电流(currents[3])转换为静止坐标系下的αβ分量(Ialpha_beta)。
    • 公式:
    • image.png

    Park变换get_alpha_beta_output):

    • 将αβ电流转换为旋转坐标系下的dq分量(Idq),依赖相位估计(phase_phase_vel_)。
    • 公式: image.png
  • 逆Park变换get_alpha_beta_output):

    • 将调制信号从dq坐标系转换回αβ坐标系,用于生成PWM信号。

    (2) 控制模式

    • 电流控制模式enable_current_control_ == true):
      • 使用PI控制器跟踪 Idq_setpoint,结合前馈电压 Vdq_setpoint
      • 积分抗饱和逻辑:当调制信号幅值超过80%时,抑制积分项(v_current_control_integral_d/q *= 0.99)。
    • 电压控制模式
      • 直接使用 Vdq_setpoint生成调制信号,无反馈控制。

    (3) 调制信号生成

    • 调用 SVM函数进行空间矢量调制,生成三相PWM占空比(tA, tB, tC)。
    • 错误处理:检测NaN和调制幅值超限(ERROR_MODULATION_IS_NANERROR_MODULATION_MAGNITUDE)。

使用特权

评论回复

相关帖子

沙发
keer_zu|  楼主 | 2025-3-25 08:21 | 只看该作者

3. 关键细节

(1) 时间同步

  • 通过时间戳(i_timestamp_ctrl_timestamp_)确保电流测量与控制循环同步。
  • 若时间差超过 MAX_CONTROL_LOOP_UPDATE_TO_CURRENT_UPDATE_DELTA,返回 ERROR_BAD_TIMING

(2) 错误处理

  • 覆盖多种异常场景:
    • 未初始化(ERROR_CONTROLLER_INITIALIZING)。
    • 数据缺失(如 ERROR_UNKNOWN_VOLTAGE_COMMAND)。
    • 调制异常(如NaN或幅值超限)。

(3) 积分抗饱和

  • 当调制信号饱和时,积分项按比例衰减(0.99),避免积分累积导致控制发散。

使用特权

评论回复
板凳
keer_zu|  楼主 | 2025-3-25 08:21 | 只看该作者

4. 潜在改进点

  • 效率优化(代码中已标记TODO):
    • PWM更新速率高于电流采样时,可复用之前的 mod_dmod_q以减少计算量。
  • 配置灵活性
    • 调制幅值限制(0.80f * sqrt3_by_2)和积分衰减系数(0.99)应支持外部配置。
  • 相位预测
    • 当前相位预测基于线性外推(phase_vel * time_delta),可能在高动态场景下引入误差,需验证鲁棒性。

使用特权

评论回复
地板
keer_zu|  楼主 | 2025-3-25 08:21 | 只看该作者

5. 总结

  • 优点
    • 结构清晰,模块化设计(分离Clarke/Park变换、SVM调制、控制逻辑)。
    • 完善的错误检测和抗饱和机制。
  • 注意事项
    • 需确保 SVM函数正确实现,避免调制失败。
    • 时间戳同步逻辑需硬件配合,防止溢出或漂移。
    • 电流/电压设定值的来源(如 Idq_setpoint_src_)需可靠,避免空值引发异常。

此代码实现了FOC的核心功能,适用于电机控制场景,但在高动态或高精度应用中需进一步优化参数和时序处理。

使用特权

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

本版积分规则

个人签名:qq群:49734243 Email:zukeqiang@gmail.com

1408

主题

12639

帖子

53

粉丝