[i=s] 本帖最后由 keer_zu 于 2025-3-25 08:20 编辑 [/i]<br />
<br />
附件:foc.zip
ODrive的FOC(磁场定向控制)代码分析如下:
1. 代码结构
- 核心类:
FieldOrientedController ,继承自 AlphaBetaFrameController 和 ComponentBase ,支持电流控制模式和电压控制模式。
- 关键文件:
foc.hpp :定义类的接口、配置参数、状态变量和输入端口。
foc.cpp :实现控制逻辑,包括Clarke/Park变换、PI控制、调制信号生成等。
2. 核心功能
(1) 坐标变换
-
Clarke变换(AlphaBetaFrameController::on_measurement ):
- 将三相电流(
currents[3] )转换为静止坐标系下的αβ分量(Ialpha_beta )。
- 公式:

Park变换(get_alpha_beta_output ):
- 将αβ电流转换为旋转坐标系下的dq分量(
Idq ),依赖相位估计(phase_ 和 phase_vel_ )。
- 公式:

-
-
逆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_NAN 和 ERROR_MODULATION_MAGNITUDE )。
|