上一篇中电机的转动为逆时针方向,如果要让电机反转,也就是顺时针方向,那也很简单,就是在电机监视器界面,将速度数值设为负数即可,此时,再点启动按钮,电机即开始以顺时针方向转动,如下图所示:
通过电机监视器控制电机的启停以及调节相关参数还是非常方便的,当然实际使用中我们不可能通过电机监视器来完成,还是得通过编程方式来实现对电机的控制,为此,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 编辑通过电机监视器控制电机的启停以及调节相关参数确实是方便
与实际使用用ST的驱动库实现的功能,区别大不?
引用: qwqwqw2088 发表于 2023-7-2 17:40 通过电机监视器控制电机的启停以及调节相关参数确实是方便 与实际使用用ST的驱动库实现的功能,区别大不 ...
mc_api.h中定义的基本功能电机监视器里基本都能实现,区别不大。