5103|0

24

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

【ST电机评测】任务四 -- MCSDK 版本v4与v5之不同 [复制链接]

MCSDK v5v4的不同
这个原本有些难度,毕竟需要即有版本4的使用经验,也要有版本5的使用经验,才有可能了解其不同,或者说改进。而且,只有深入地使用才能深入地知道其不同。
开始的第一步,从ReleaseNotes中了解了部分信息,但这个信息有些了,还是不够。然后在从其他的地方继续学习比较。
下面是看到的不同或者改进的地方。
1. 操作流上的简化
版本4生产程序代码,需要2步: 第一步先生成STM32CubeMX的工程,然后第二部使用STM32CubeMX来生成指定IDE的工程。此后,才能在IDE中进行程序修改,编译和下载调试等操作。而且也没有监控可以直接连接板子使用。
而版本5中简化了,在后台直接调用STM32CubeMX生成代码,然后就可以打开IDE进行操作了。其隐藏了中间的STM32CubeMX的衔接操作,简化了用户的操作。但按照版本4的操作依然可以完成代码生成和后续操作开发。
如图:



此内容由EEWORLD论坛网友stp111原创,如需转载或用于商业用途需征得作者同意并注明出处

2. 开发的API风格
在版本5中,使用了c语言开发的风格,使用类型MCI_Handle_t指针来标识库接口。代码如下:
```
typedef struct
{
  STM_Handle_t *pSTM; /*!< State machine object used by MCI.*/
  SpeednTorqCtrl_Handle_t *pSTC; /*!< Speed and torque controller object used by MCI.*/
  pFOCVars_t pFOCVars;    /*!< Pointer to FOC vars used by MCI.*/
  MCI_UserCommands_t lastCommand; /*!< Last command coming from the user.*/
  int16_t hFinalSpeed;        /*!< Final speed of last ExecSpeedRamp command.*/
  int16_t hFinalTorque;       /*!< Final torque of last ExecTorqueRamp
                                   command.*/
  Curr_Components Iqdref;     /*!< Current component of last
                                   SetCurrentReferences command.*/
  uint16_t hDurationms;       /*!< Duration in ms of last ExecSpeedRamp or
                                   ExecTorqueRamp command.*/
  MCI_CommandState_t CommandState; /*!< The status of the buffered command.*/
  STC_Modality_t LastModalitySetByUser; /*!< The last STC_Modality_t set by the
                                             user. */
} MCI_Handle_t;
```
Hight-levelAPI使用该指针进行操作:
```
/* Exported functions ------------------------------------------------------- */
void MCI_Init( MCI_Handle_t * pHandle, STM_Handle_t *pSTM, SpeednTorqCtrl_Handle_t *pSTC, pFOCVars_t pFOCVars );
void MCI_ExecBufferedCommands( MCI_Handle_t * pHandle );
void MCI_ExecSpeedRamp( MCI_Handle_t * pHandle,  int16_t hFinalSpeed, uint16_t hDurationms );
void MCI_ExecTorqueRamp( MCI_Handle_t * pHandle,  int16_t hFinalTorque, uint16_t hDurationms );
void MCI_SetCurrentReferences( MCI_Handle_t * pHandle, Curr_Components Iqdref );
bool MCI_StartMotor( MCI_Handle_t * pHandle );
bool MCI_StopMotor( MCI_Handle_t * pHandle );
bool MCI_FaultAcknowledged( MCI_Handle_t * pHandle );
bool MCI_EncoderAlign( MCI_Handle_t * pHandle );
MCI_CommandState_t  MCI_IsCommandAcknowledged( MCI_Handle_t * pHandle );
State_t  MCI_GetSTMState( MCI_Handle_t * pHandle );
uint16_t MCI_GetOccurredFaults( MCI_Handle_t * pHandle );
uint16_t MCI_GetCurrentFaults( MCI_Handle_t * pHandle );
int16_t MCI_GetMecSpeedRef01Hz( MCI_Handle_t * pHandle );
int16_t MCI_GetAvrgMecSpeed01Hz( MCI_Handle_t * pHandle );
/*int16_t MCI_GetTorque( MCI_Handle_t * pHandle );*/
int16_t MCI_GetPhaseCurrentAmplitude( MCI_Handle_t * pHandle );
int16_t MCI_GetPhaseVoltageAmplitude( MCI_Handle_t * pHandle );
STC_Modality_t MCI_GetControlMode( MCI_Handle_t * pHandle );
int16_t MCI_GetImposedMotorDirection( MCI_Handle_t * pHandle );
int16_t MCI_GetLastRampFinalSpeed( MCI_Handle_t * pHandle );
bool MCI_RampCompleted( MCI_Handle_t * pHandle );
bool MCI_StopSpeedRamp( MCI_Handle_t * pHandle );
bool MCI_GetSpdSensorReliability( MCI_Handle_t * pHandle );
int16_t MCI_GetAvrgMecSpeed01Hz( MCI_Handle_t * pHandle );
int16_t MCI_GetMecSpeedRef01Hz( MCI_Handle_t * pHandle );
Curr_Components MCI_GetIab( MCI_Handle_t * pHandle );
Curr_Components MCI_GetIalphabeta( MCI_Handle_t * pHandle );
Curr_Components MCI_GetIqd( MCI_Handle_t * pHandle );
Curr_Components MCI_GetIqdHF( MCI_Handle_t * pHandle );
Curr_Components MCI_GetIqdref( MCI_Handle_t * pHandle );
Volt_Components MCI_GetVqd( MCI_Handle_t * pHandle );
Volt_Components MCI_GetValphabeta( MCI_Handle_t * pHandle );
int16_t MCI_GetElAngledpp( MCI_Handle_t * pHandle );
int16_t MCI_GetTeref( MCI_Handle_t * pHandle );
int16_t MCI_GetPhaseCurrentAmplitude( MCI_Handle_t * pHandle );
int16_t MCI_GetPhaseVoltageAmplitude( MCI_Handle_t * pHandle );
void MCI_SetIdref( MCI_Handle_t * pHandle, int16_t hNewIdref );
void MCI_Clear_Iqdref( MCI_Handle_t * pHandle );
```
版本5完全变成c的风格了。而版本4使用c模拟C++,采样C++风格。
所以,所有的API形式上都做了变动。
3. 有介绍提到,在版本5中,从STM32CubeMX固件中的HAL层代替了版本4中的SPL。但这是STM32Cube附带的,和MC_SDK应该关心不大。
4. 在版本5中,各种feature的代码分割开了,比如FOC控制的,就没有SixStep相关的API及代码了;这样代码就更简洁,没有大量的macro存在了,也容易阅读了。比如下面的API代码是6-Step BLDC的API,那么在FOC工程中不见了。
```
MC_SixStep_INIT()
MC_SixStep_RESET()
```
参考:
UM2124
AN5143

此帖出自stm32/stm8论坛
点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表