ODrive0.5.5源码分析(5) FOC相关

本文详细探讨了FOC(磁场定向控制)在电机控制中的实现过程,从电流测量到Clarke变换、Park变换,再到PWM更新。通过类图和代码示例,阐述了控制流程的关键步骤,包括在何处调用哪些函数以及如何计算电机控制参数。

作者:沉尸(5912129@qq.com)

前言:

         1)本章探讨FOC控制的几个过程分别是在那些函数中进行调用?

         2)这些函数在什么时间节点被调用?

         3)最后剖析FOC控制代码中的详细计算细节。

先画出FOC相关的类图:

简洁类图:

 图1

详细类图:

 图2

说明:上图中纯虚函数特别用红色标识。

经过前面几篇文章讲述的“ADC的处理”以及“时钟和定时器”方面的内容,我们已经知道了3相电流是在哪个时间节点被采集到的,且在哪个函数里面从寄存器中取出然后放入到对应变量中了。

于是,FOC的相关控制就可以开始了:

“MotorControl\motor.cpp”中函数“current_meas_cb()”:

 图3

“MotorControl\motor.hpp”有定义:

PhaseControlLaw<3>* control_law_;

看上面类图,可知:

control_law_->on_measurement 实际上调用AlphaBetaFrameController:: on_measurement

贴出代码:(来自“MotorControl\foc.cpp”)

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

Motor::Error AlphaBetaFrameController::on_measurement(

            std::optional<float> vbus_voltage,

            std::optional<std::array<float, 3>> currents,

            uint32_t input_timestamp) {

    std::optional<float2D> Ialpha_beta;

   

    if (currents.has_value()) {

        // Clarke transform

        Ialpha_beta = {

            (*currents)[0],

            one_by_sqrt3 * ((*currents)[1] - (*currents)[2])

        };

    }

   

    return on_measurement(vbus_voltage, Ialpha_beta, input_timestamp);

}

Ln14 ~ Ln17

通过Clarke变换计算出了“Ialpha_beta”

计算公式参考《马达控制之FOC原理》

中的式子(2-3)

Ln20:

         调用了同一个类“AlphaBetaFrameController”中另一个 “on_measurement()” 重载函数(参数类型不同),但是这个函数是个纯虚函数:

图5

最后的结果就是调用继承了“AlphaBetaFrameController”的派生类中“on_measurement()”的实现,比如:

         “ResistanceMeasurementControlLaw::measurement()”

FieldOrientedController::on_measurement()”

因为“control_law_”虽然是一个基类指针,它被赋值肯定会是“ResistanceMeasurementControlLaw”或者“FieldOrientedController”等等这样的派生类对象。从源码中摘录证实如下:

图6

我们继续来看“FieldOrientedController::on_measurement”做了些啥工作:

 图7

简单地将计算出来的值保存到相应的变量中而已!!!

现在,通过Clarke计算出了  和 ,那么后面继续的处理在哪调用呢?

图8

从类图可知:调用“PhaseControlLaw<N>::get_output()”,这个是纯虚函数,

实际上会调用“AlphaBetaFrameController::get_output()”。

图9

“AlphaBetaFrameController:: get_alpha_beta_output()”是一个纯虚函数,所以我们要看派生类中的相应函数“FieldOrientedController::get_alpha_beta_output()”

 图10

这个函数里面进行了“Park”变换、“反Park”变换,转换成pwm控制参数等

现在脉络基本清晰了:

1)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值