作者:沉尸(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计算出了Iα 和 Iβ ,那么后面继续的处理在哪调用呢?

图8
从类图可知:调用“PhaseControlLaw<N>::get_output()”,这个是纯虚函数,
实际上会调用“AlphaBetaFrameController::get_output()”。

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

图10
这个函数里面进行了“Park”变换、“反Park”变换,转换成pwm控制参数等
现在脉络基本清晰了:
1)

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

被折叠的 条评论
为什么被折叠?



