keer_zu 发表于 2025-3-25 08:18

foc代码分析

本帖最后由 keer_zu 于 2025-3-25 08:20 编辑

[!(/source/plugin/zhanmishu_markdown/template/editor/images/upload.svg) 附件:foc.zip](forum.html?mod=attachment&aid=2386716 "attachment")

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

### 1. **代码结构**

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

### 2. **核心功能**

#### (1) **坐标变换**

* **Clarke变换**(`AlphaBetaFrameController::on_measurement`):

* 将三相电流(`currents`)转换为静止坐标系下的αβ分量(`Ialpha_beta`)。
* 公式:
* !(data/attachment/forum/202503/25/081755qkwl43bq3ks303zl.png "image.png")

**Park变换**(`get_alpha_beta_output`):

* 将αβ电流转换为旋转坐标系下的dq分量(`Idq`),依赖相位估计(`phase_`和 `phase_vel_`)。
* 公式:
    !(data/attachment/forum/202503/25/081816ca7yl4lzucqca4jn.png "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_NAN`和 `ERROR_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_d`和 `mod_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的核心功能,适用于电机控制场景,但在高动态或高精度应用中需进一步优化参数和时序处理。
页: [1]
查看完整版本: foc代码分析