[原创] 三相BLDC电机驱动板STEVAL-SPIN3202测评之电机正反转与速度控制

sumoon_yao   2023-7-2 15:58 楼主

  上一篇中电机的转动为逆时针方向,如果要让电机反转,也就是顺时针方向,那也很简单,就是在电机监视器界面,将速度数值设为负数即可,此时,再点启动按钮,电机即开始以顺时针方向转动,如下图所示:

 

155618qjvued5c3l0clj0q.png

 

  通过电机监视器控制电机的启停以及调节相关参数还是非常方便的,当然实际使用中我们不可能通过电机监视器来完成,还是得通过编程方式来实现对电机的控制,为此,ST公司提供了电机驱动库,用户可以通过API函数完成对电机的驱动控制,其主要接口函数如下。由于ST的电机驱动库可以同时控制2个电机,所以API函数就以尾缀1和2来区分,一般我们只控制一个电机,因此都使用尾缀为1的API函数。

 

函数名称 函数形参 函数返回值 函数功能
MC_StartMotor1 void bool 启动电机
MC_StopMotor1 void bool 停止电机
MC_ProgramSpeedRampMotor1 hFinalSpeed,hDurationms void 设定目标速度以及持续时间
MC_ProgramTorqueRampMotor1 hFinalTorque,hDurationms void 设定目标力矩以及持续时间
MC_SetCurrentReferenceMotor1 Iqdref,Idref void 设定 Iq, Id 参考
MC_GetCommandStateMotor1 void MCI_Command State_t 返回指令执行状态
MC_StopSpeedRampMotor1 void bool 停止速度指令执行,速度指令保存为执行停止前速度指令
MC_StopRampMotor1 void bool 停止执行电机正在运行的斜坡
MC_HasRampCompletedMotor1 void bool 指令是否执行完成
MC_GetMecSpeedReferenceMotor1 void int16_t 返回机械参考速度
MC_GetMecSpeedAverageMotor1 void int16_t 返回平均机械速度
MC_GetLastRampFinalSpeedMotor1 void int16_t 返回上次指令速度
MC_GetControlModeMotor1 void STC_Modality_t 返回控制模式
MC_GetImposedDirectionMotor1 void int16_t 返回电机转动方向
MC_GetSpeedSensorReliabilityMotor1 void bool 返回当前速度传感器可信度
MC_GetPhaseCurrentAmplitudeMotor1 void int16_t 返回电流值
MC_GetPhaseVoltageAmplitudeMotor1 void int16_t 返回电压值
MC_GetIabMotor1 void ab_t 返回 a, b 相电流
MC_GetIalphabetaMotor1 void alphabeta_t 返回 clark 变换后的 Iα,Iβ
MC_GetIqdrefMotor void qd_t 返回 Id, Iq 参考
MC_GetVqdMotor1 void qd_t 返回变换电压量 Vd, Vq
MC_GetValphabetaMotor1 void alphabeta_t 返回变换电压量 Vα, Vβ
MC_GetElAngledppMotor1 void int16_t 返回电角度 DPP 数据
MC_GetTerefMotor1 void int16_t 返回电流参考
MC_SetIdrefMotor1 hNewIdref void 设定电流 Id 参考
MC_Clear_IqdrefMotor1 void void Iq,Id 数据回到默认值
MC_AcknowledgeFaultMotor1   bool 清除异常状态
MC_GetOccurredFaultsMotor1 void uint16_t 得到发生了的故障状态
MC_GetCurrentFaultsMotor1 void uint16_t 得到当前的故障状态
MC_GetSTMStateMotor1 void State_t 得到电机状态

 

  通过这些API,对电机实现基本的控制完全没有问题。比如要实现电机从静止状态到目标转速的启动时间可调,或者实现电机从某个速度到静止状态的停止时间可调,那就可以通过函数MC_ProgramSpeedRampMotor1()来完成。行业应用中需要变频控制(防叠),电机不能以某个恒定的速度持续运转,需要实现升速-保持-降速-保持的循环控制,且4个阶段的时间可调,那也可以通过函数MC_ProgramSpeedRampMotor1()实现。下面的程序就是一个测试用例,为了方便看效果,没有使用for循环,主程序的while循环如下:

 

MC_ProgramSpeedRampMotor1(100,500);

MC_StartMotor1();

HAL_Delay(2000);

MC_ProgramSpeedRampMotor1(125,500);

HAL_Delay(2000);

MC_ProgramSpeedRampMotor1(150,500);

HAL_Delay(2000);

MC_ProgramSpeedRampMotor1(175,500);

HAL_Delay(2000);

MC_ProgramSpeedRampMotor1(200,500);

HAL_Delay(2000);

MC_ProgramSpeedRampMotor1(225,500);

HAL_Delay(2000);

MC_ProgramSpeedRampMotor1(250,500);

HAL_Delay(10000);

MC_ProgramSpeedRampMotor1(225,500);

HAL_Delay(2000);

MC_ProgramSpeedRampMotor1(200,500);

HAL_Delay(2000);

MC_ProgramSpeedRampMotor1(175,500);

HAL_Delay(2000);

MC_ProgramSpeedRampMotor1(150,500);

HAL_Delay(2000);

MC_ProgramSpeedRampMotor1(125,500);

HAL_Delay(2000);

MC_ProgramSpeedRampMotor1(100,500);

HAL_Delay(2000);

MC_StopMotor1();

HAL_Delay(10000);

 

  电机从静止状态慢慢加速到1500转/分,保持10秒钟,再慢慢回到静止状态,等待10秒钟后重复上述动作。从实际运行效果来看,达到了电机运行速度可以按需控制的目的。这个实际运行效果也可以通过电机监视器来观看,也就是说,程序下载完成后,程序自动运行,控制电机循环启停,这个时候我们仍然可以通过电机监视器界面,连接串口后就可以看到电机的实际运转状况。当然为避免控制出问题,此时不要点击监视器界面的按钮,也不要按评估板上的启停按钮。

 上面的程序中,如果将函数MC_ProgramSpeedRampMotor1()的第一个参数全部改为负数,如MC_ProgramSpeedRampMotor1(-250,500)则电机将按反方向(顺时针)运转。

 另外关于转矩与速度这块,受制于测试条件,所有测试只是电机的空载测试,无法进行带载测试,所以实际使用中遇到的带载慢反转问题,可能涉及到底层驱动问题,待条件具备后再进一步研究。

 

   本次有关STEVAL-SPIN3202评估板的初步测评就到这了,这只是电机驱动控制的一个皮毛,很多BLDC电机驱动相关的知识还要不断的花时间去学习,有了经验后再来和大家一起分享。

本帖最后由 sumoon_yao 于 2023-7-2 16:07 编辑

回复评论 (3)

通过电机监视器控制电机的启停以及调节相关参数确实是方便

与实际使用用ST的驱动库实现的功能,区别大不?

点赞  2023-7-2 17:40
引用: qwqwqw2088 发表于 2023-7-2 17:40 通过电机监视器控制电机的启停以及调节相关参数确实是方便 与实际使用用ST的驱动库实现的功能,区别大不 ...

mc_api.h中定义的基本功能电机监视器里基本都能实现,区别不大。

点赞  2023-7-3 09:38
通过电机监视器控制电机的启停以及调节相关参数确实是方便
点赞  2023-7-19 11:30
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复