欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

25.mc_api介绍及使用示例

程序员文章站 2022-07-15 15:58:37
...

25.mc_api介绍及使用示例


  使用ST FOC控制的电机开发环境MC SDK 即使用Workbench调用cubeMx生成源码工程后。进行基础的电机调试后,可以根据需要调用库函数中给出的API接口,实现用户自己的电机控制方式。
  FOC库给用户调用的电机控制接口,全部在mc_api.c文件块当中。这里面的函数就是用户与电机库控制之间的桥梁。ST 的MC SDK是可以用一片MCU同时独立驱动两台电机的,ST为每一台电机提供一组单独的函数接口供调用。并且这些函数的名字和参数都非常简化,很容易看出其功能和需要传入的参数。


先列出在mc_spi.h文件中申明的函数。然后在逐一解释每个函数的用法和注意点。
仅列出Motor1的相关函数。如果使用的是双电机,则M2的使用与M1的完全一致。

/* Starts Motor 1 */
bool MC_StartMotor1(void);

/* Stops Motor 1 */
bool MC_StopMotor1(void);

/* Programs a Speed ramp for Motor 1 */
void MC_ProgramSpeedRampMotor1( int16_t hFinalSpeed, uint16_t hDurationms );

/* Programs a Torque ramp for Motor 1 */
void MC_ProgramTorqueRampMotor1( int16_t hFinalTorque, uint16_t hDurationms );

/* Programs a current reference for Motor 1 */
void MC_SetCurrentReferenceMotor1( qd_t Iqdref );

/* Returns the state of the last submited command for Motor 1 */
MCI_CommandState_t  MC_GetCommandStateMotor1( void);

/* Stops the execution of the current speed ramp for Motor 1 if any */
bool MC_StopSpeedRampMotor1(void);

/* Returns true if the last submited ramp for Motor 1 has completed, false otherwise */
bool MC_HasRampCompletedMotor1(void);

/* Returns the current mechanical rotor speed reference set for Motor 1, expressed in the unit defined by #SPEED_UNIT */
int16_t MC_GetMecSpeedReferenceMotor1(void);

/* Returns the last computed average mechanical rotor speed for Motor 1, expressed in the unit defined by #SPEED_UNIT */
int16_t MC_GetMecSpeedAverageMotor1(void);

/* Returns the final speed of the last ramp programmed for Motor 1, if this ramp was a speed ramp */
int16_t MC_GetLastRampFinalSpeedMotor1(void);

/* Returns the current Control Mode for Motor 1 (either Speed or Torque) */
STC_Modality_t MC_GetControlModeMotor1(void);

/* Returns the direction imposed by the last command on Motor 1 */
int16_t MC_GetImposedDirectionMotor1(void);

/* Returns the current reliability of the speed sensor used for Motor 1 */
bool MC_GetSpeedSensorReliabilityMotor1(void);

/* returns the amplitude of the phase current injected in Motor 1 */
int16_t MC_GetPhaseCurrentAmplitudeMotor1(void);

/* returns the amplitude of the phase voltage applied to Motor 1 */
int16_t MC_GetPhaseVoltageAmplitudeMotor1(void);

/* returns current Ia and Ib values for Motor 1 */
ab_t MC_GetIabMotor1(void);

/* returns current Ialpha and Ibeta values for Motor 1 */
alphabeta_t MC_GetIalphabetaMotor1(void);

/* returns current Iq and Id values for Motor 1 */
qd_t MC_GetIqdMotor1(void);

/* returns Iq and Id reference values for Motor 1 */
qd_t MC_GetIqdrefMotor1(void);

/* returns current Vq and Vd values for Motor 1 */
qd_t MC_GetVqdMotor1(void);

/* returns current Valpha and Vbeta values for Motor 1 */
alphabeta_t MC_GetValphabetaMotor1(void);

/* returns the electrical angle of the rotor of Motor 1, in DDP format */
int16_t MC_GetElAngledppMotor1(void);

/* returns the current electrical torque reference for Motor 1 */
int16_t MC_GetTerefMotor1(void);

/* Sets the reference value for Id */
void MC_SetIdrefMotor1( int16_t hNewIdref );

/* re-initializes Iq and Id references to their default values */
void MC_Clear_IqdrefMotor1(void);

/* Acknowledge a Motor Control fault on Motor 1 */
bool MC_AcknowledgeFaultMotor1( void );

/* Returns a bitfiled showing faults that occured since the State Machine of Motor 1 was moved to FAULT_NOW state */
uint16_t MC_GetOccurredFaultsMotor1(void);

/* Returns a bitfield showing all current faults on Motor 1 */
uint16_t MC_GetCurrentFaultsMotor1(void);

/* returns the current state of Motor 1 state machine */
State_t  MC_GetSTMStateMotor1(void);

MC_StartMotor1()

 调用该函数来启动电机的转动。如果电机当前的状态是空闲状态,则会立刻执行启动电机,进入启动状态;否则,丢弃该指令的执行。因此,使用这个指令前可以检查一下电机的当前运行状态。应用的时候,可以检查返回值以确认是否执行了电机的启动命令。从电机控制机制里的状态机来看,这个函数只是触发状态机从“IDLE”进入“IDLE-START”,如果这个命令成功执行则返回TRUE,否则FALSE。
 需要注意的是,在使用这个函数之前,需要先调用以下的任意一个函数,否则可能会导致没有预估的错误行为。

  • MC_ProgramSpeedRampMotor1()
  • MC_ProgramTorqueRampMotor1()
  • MC_SetCurrentReferenceMotor1()

 在Workbench中的Monitor中右侧Generic有同样的按钮 “Star Motor”。

MC_StopMotor1()

 调用该函数来停止电机的转动。如果电机当前的状态是“RUN”或者“START”,则会立刻执行停止电机名利;否则,丢弃该指令的执行。使用这个指令的时候,可以检查返回值以确认是否执行了电机的停止命令。从电机控制机制里的状态机来看,这个函数只是触发状态机从任意状态进入“ANY_STOP”,检查这个命令实际的执行,可以检查状态机是否变成了“IDLE”状态。
 在Workbench中的Monitor中右侧Generic有同样的按钮 “Stop Motor”。

MC_ProgramSpeedRampMotor1()

 该函数用于设置线性速度目标值,该函数有两个参数,hFinalSpeed是最终目标速度,hDuration是持续时间。最终目标速度的按照ST的转速定义是0.1Hz,转子的0.1HZ也就是0.1r/s。电机转速的常规表达是RPM,即转每分;ST的MCSDK中有三种速度的表达。这里使用的是 0.1转每秒。如果电机电机的转速是1000转,这里的值就是1000[rpm]/60s/10=16.7[0.1rps]。hDuration的时间是ms。hFinalSpeed的值如果是正值则表示正向转动,如果为负值则表示反向转动。
 执行这个函数之后,电机的运行状态就是Speed模式。该函数是的电机速度的目标值在运行过程中可以线性的变化,而非跳跃式的突变。
 调用这个函数的时候,设置并不一定执行,而是立即进入缓存队列中进行等待。当状态机变化到“START_RUN”或者“RUN”的时候才会立即被执行。任何时刻缓存中的指令只能保存一个,如果在指令等待的过程中有新的指令,那缓存中的指令被新的指令覆盖替换掉。需要知道当前指令是否已经被准确执行,可以调用MC_GetCommandStateMotor1()函数来获取缓存中最新指令的执行状态。
 monitor中也有同样的操作选项,“Speed controller”。

MC_ProgramTorqueRampMotor1()

 该函数的的控制效果与上一个SpeedRamp是一样的,只是该函数作用的对象是电机转矩。当点击以转矩模式运行的时候,该函数就是用来设置转矩目标值的。
 其中需要的两个参数,HFinalTorque是运行时候的电机转矩最终目标值,hDuarationms是持续时间。hDurationms的单位是ms。
 该函数被调用之后,电机的运行会切换到转矩模式。hFinaltorque是16位有符号数表示的Iq值,转换成安培的haul没需要用这个公式:Is16=Iamp65535Rs*Aop/Vdd;

MC_SetCurrentReferenceMotor1()

 这个函数是直接设置Iq和Id电流参考值的函数,该函数只会在状态机是“START_RUN”或者“RUN”的时候生效,否则就是进入缓存队列等待。
 该函数需要的参数Iqdref的变量类型时Curr_Componets。如果其子成员ql_Componet1的数值是负数,则表示电机反向转动。
 在monitor中的Current controller设置内容一致。

MC_GetCommandStateMotor1()

 这个函数返回最新的指令的执行状态。部分指令在调用的时候,并不一定立马被执行了,而是先放入缓存队列当中,等到合适的时候才会被执行。这个函数就可以知道,缓存中的罪行指令的执行状态。
 返回值会是下列中的一个:

  • MCI_BUFFER_EMPTY:缓存队列空
  • MCI_COMMAND_NOT_ALREADY_EXECUTED:指令未被执行
  • MCI_COMMAND_EXECUTED_SUCCESFULLY指令被成功执行
  • MCI_COMMAND_EXECUTED_UNSUCCESFULLY指令执行失败
     指令被执行之后,无论成功与否,调用该指令都会将指令状态设置为MCI_BUFFER_EMPTY。

MC_StopSpeedRampMotor1()

 这个函数可以停止目标速度的线性递增。MC_ProgramSpeedRampMotor1()是执行电机目标速度线性控制的;而这个函数则是停止目标速度的线性变化。如果SpeedRamp的指令正在被执行,则该指令将会被立即停止,目标速度将会维持在当前值。
 由于执行SpeedRamp的过程中被强行停止,所以当前停止后的目标速度是不确定的。
 monitor中有相应的按钮“Stop Ramp”。

MC_HasRampCompletedMotor1()

 该函数用于获取目标速度的变化状态。如果已经执行完SpeedRamp命令则返回True,否则返回false。

MC_GetMecSpeedReferenceMotor1()

 该函数用于获取电机机械转速的实际目标值。在调用线性目标速度控制函数MC_ProgramSpeedRampMotor1()之后可以调用MC_StopSpeedRampMotor1()来终止指令的执行。终止之后,电机速度有一个不固定的目标值。调用该函数则可以返回这个不确定的目标值。

MC_GetMecSpeedAverageMotor1()

 这个函数用来获取电机的平均机械转速,返回值是电机转速的平均值,单位是0.1hz。比如返回值是300,则转每分表示的转速为 3000.160=1800rpm.

MC_GetLastRampFinalSpeedMotor1()

 该函数返回用户设置的最终速度目标值。该函数并不是获取电机速度值,也不是获取电机实际速度目标值,而是调用MC_ProgramSpeedRampMotor1()之后所设置的最终目标速度值。

MC_GetControlModeMotor1()

 该函数用于获取当前运行模式。电机运行模式有两种,Torque转矩模式和Speed速度模式。其返回值是枚举变量STC_Modality_t中的STC_TORQUE_MODE或者STC_SPEED_MODE

MC_GetImposedDirectionMotor1()

 该函数用于获取由最新的指令所设置的电机转动方向值。最新的指令指的是调用控制函数MC_ProgramSpeedRampMotor1(),MC_ProgramTorqueRampMotor1()和MC_SetCurrentRenferenceMotor1()。当调用这些函数的时候会设置一个目标值,这个目标值的正负就是电机转动的方向。调用该函数就是获取这个电机的方向。如果电机方向为负则返回-1,否则返回1。

MC_GetSpeedSensorReliabilityMotor1()

 检查速度传感器是否可靠。电机的速度传感器反馈回来的数据如果超过了设置的数值范围,就会增加速度反馈错误次数。速度反馈错误次数超过了一定数值,就会认为速度传感器是不可靠的。
 当速度传感器不可靠时,该函数返回FALSE,否则返回true。

MC_GetPhaseCurrentAmplitudeMotor1()

 该函数用于获取电机的相电流(0-to-peak)。其返回值是16位的有符号数s16A。s16A的数字量化为1[s16A]=Imax/32768。Imax是可测量的电流最大值,电流采样信号经过运放之后存在偏移值,满量程是0-Imax,不存在负值,所以数字量化的时候是32768而不是65535。
 由于连接到ADC引脚的电流信号电压被抬升了1.65V,所以在计算Imax的时候需要除以2,最后得到的就是:Imax=Vdd/(2RsAop)。如果需要转换成安培(Amps),则使用:Iamp=Is16aVdd/(65535Rs*Aop)。

MC_GetPhaseVoltageAmplitudeMotor1()

 该函数用于获取瞬时的电机相电压(0-to-peak)。其返回值是16位有符号数s16V。s16V格式的定义如下:1[s16V]=Vmax/32768。如果转换成伏特则:Vvolts=Vs16v*Vbus/(sqrt(3)*3268)。

MC_GetIabMotor1()

 该函数用于获取电机Ia,Ib电流值。返回值是Curr_Components,这是一个有两个int16数的结构体。

MC_GetIalphabetaMotor1()

 该函数用于获取电机Iα,Iβ电流值。返回值是Curr_Components,这是一个有两个int16数的结构体。

MC_GetIqdMotor1()

 该函数用于获取电机Iq,Id电流值。

MC_GetIqdrefMotor1()

 该函数用于获取电机Iq,Id电流的目标值。

MC_GetVqdMotor1()

 该函数用于获取电流值的Vq,Vd。返回值是Volt_Components,这是一个有两个int16数的结构体。

MC_GetValphabetaMotor1()

 该函数用于获取电流值的Vα,Vβ。返回值是Volt_Components,这是一个有两个int16数的结构体。

MC_GetElAngledppMotor1()

 该函数用于获取电机转子的电角度。返回值是以dpp格式的电角度。
 在MC API中使用的角度测量单位是s16degree,定义为1[s16degree]=2π[rad]/65535。

MC_GetTerefMotor1()

 该函数用于获取转矩的目标值。返回值是s16格式的Iq电流值。

MC_SetIdrefMotor1()

在Speed或Torque目标值爬坡变化的过程,是有FOC内部提供目标值实现的。在目标值爬坡过程,正常情况下电流的目标值Idref是由内部计算提供,然后用于电机控制,儿该函数则允许强行修改Idref的值。该函数对于弱磁控制或者MTPA最大转矩使能的时候是无效的。

MC_Clear_IqdrefMotor1()

 该函数可以将Iq,Id的目标值重新初始化为默认值。

MC_AcknowledgeFaultMotor1()

用户调用这个函数前,如果电机发生了故障,电机将停留在“FAULT_OVER”状态,并保留故障代码。在调用这个函数之后,状态机将清除故障代码的记录,并恢复到IDLE状态。
 如果在调用该函数的时候状态机不是在错误状态,则该函数返回false,否则返回true。在workbench的monitor上有相同功能的按钮“Fault Ack”。

MC_GetOccurredFaultsMotor1()

 该函数用于获取状态机进入“FUALT_NOW”状态之后发生过的故障代码。返回一个16位数的故障代码,0表示没有错误。monitor上有相应的指示灯“Faults”。
有如下的故障类型:

#define  MC_NO_ERROR  (uint16_t)(0x0000u)      /**< @brief No error.*/
#define  MC_NO_FAULTS  (uint16_t)(0x0000u)     /**< @brief No error.*/
#define  MC_FOC_DURATION  (uint16_t)(0x0001u)  /**< @brief Error: FOC rate to high.*/
#define  MC_OVER_VOLT  (uint16_t)(0x0002u)     /**< @brief Error: Software over voltage.*/
#define  MC_UNDER_VOLT  (uint16_t)(0x0004u)    /**< @brief Error: Software under voltage.*/
#define  MC_OVER_TEMP  (uint16_t)(0x0008u)     /**< @brief Error: Software over temperature.*/
#define  MC_START_UP  (uint16_t)(0x0010u)      /**< @brief Error: Startup failed.*/
#define  MC_SPEED_FDBK  (uint16_t)(0x0020u)    /**< @brief Error: Speed feedback.*/
#define  MC_BREAK_IN  (uint16_t)(0x0040u)      /**< @brief Error: Emergency input (Over current).*/
#define  MC_SW_ERROR  (uint16_t)(0x0080u)      /**< @brief Software Error.*/

MC_GetCurrentFaultsMotor1()

 该函数用于获取当前出现的错误状态。

MC_GetSTMStateMotor1()

 该函数用于获取状态机的当前状态。

相关标签: ST FOC mc_api