本帖最后由 sumoon_yao 于 2023-7-2 16:07 编辑
上一篇中电机的转动为逆时针方向,如果要让电机反转,也就是顺时针方向,那也很简单,就是在电机监视器界面,将速度数值设为负数即可,此时,再点启动按钮,电机即开始以顺时针方向转动,如下图所示:
通过电机监视器控制电机的启停以及调节相关参数还是非常方便的,当然实际使用中我们不可能通过电机监视器来完成,还是得通过编程方式来实现对电机的控制,为此,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电机驱动相关的知识还要不断的花时间去学习,有了经验后再来和大家一起分享。