22. ST FOC 位置环(PMSM)¶
在本次实验中,使用的环境是MotorControl Workbench 5.4.4和STM32CubeMX(版本6.0.0), 在MotorControl Workbench 5.4.3中,新增了位置环的控制选择,但是在上位机控制界面, 却没有相关的控制逻辑,上位机只能用来调试速度控制和查看参数,所以本次实验, 主要是在MotorControl Workbench配置好FOC位置环的相关参数,然后通过STM32CubeMX 生成代码,最后的调试阶段,需要去手动写按键触发转动的控制逻辑。
22.1. MotorControl Workbench的配置¶
本次实验所以的是PMSM电机,使用的电机反馈信号是编码器。在之前的章节,有讲解过如何配置速度环, 而位置环的配置,基本是和速度环是一致的。所以基于PMSM_FOC_V5.44_Encoder_speed_control控制代码, 去修改为位置环控制代码。
下面去打开MotorControl Workbench 5.4.4,打开速度环的MotorControl Workbench配置,如下图:

其中cobtrol mode就可以去修改不同的控制模式,默认是速度模式,需要去将他修改为位置控制模式。 修改完这个选项以后,下面的PID参数,也需要去进行修改,这里可以参考我们配置好的参数,如果感觉 控制效果达不到要求的话,也可以去进行修改调试。
在这个工程中,关于电机参数、编码器参数、电流采样参数、电压采样参数都已经配置好了, 需要修改的就是控制模式,目前的模式是速度控制模式,需要将他修改为位置控制模式, 需要去点击Fimware Drive Management后,选择 Drive Settings,配置界面如下图所示:

修改完的参数如下图:

在MotorControl Workbench中,关于位置环的设置,只需要修改模式、PID参数即可。 在配置完所有参数后我们可以保存我们的项目了,点击Save Project就可以保存项目了。
我们可以点击Generation来生成代码,如下图所示,左侧可以选择 STM32CubeMX ,可以选择开发环境, 这里我们选择Keil MDK-ARM V5 ,固件版本可以选择最新或者已经下载好的版本,驱动类型选择HAL库。 配置好后就可以点击Generation生成代码了。如果之后还需要修改配置,那么我们可以点击 UPDATE 来更新代码。

22.2. 修改工程源码¶
我们生成的源码并不能直接编译、下载就能运行,主要是因为驱动需要一个引脚来控制 MOS 驱动芯片的开关, 所以需要增加一个引脚来控制 SD 引脚,初始化 SD 引脚有两种方法,一种是我们自己写代码来初始化, 还有一种是我们可以使用STM32CubeMX打开工程去选中引脚初始化。那这里我们选择使用STM32CubeMX去更改。
如下图所示,将PG12配置为GPIO_Output,并且将默认的电平输出设置为高电平, User Labe 项填写 SD 。 修改完成后保存关闭窗口,这里不使用STM32CubeMX来生成代码,需要回到Workbench, 使用Workbench来更新代码(注意,不是生成)。

Workbench:

到这一步,如果MotorControl Workbench 5.4.4上位机有关于位置环的调试界面的话,就可以直接连接上位机调试了。 但是目前上位机没有此功能,所以只能手写代码去验证。
在这里,去按键控制无刷电机工程将bsp_key.c和bsp_key.h两个文件复制到此工程中,以便我们使用按键进行调试。 这里关于按键如何配置我们就不在去进行讲解,直接去看如何控制电机。
在工程中,mc_api.c 文件里面,新增了位置控制接口和位置反馈接口。
位置控制接口:

位置反馈接口:

调用 MCI_ExecPositionCommand()函数设定最终的目标值和周期时间,注意周期 fDuration 的单位是 s,不是 ms, 毕竟位置控制到达目标位置是需要一定的时间的,跟速度和电流的控制周期是不一样的。fTargetPosition 则是以弧度为单位的目标值, 如果需要换算成转数,则可以用 fTargetPosition 除以2𝜋。例如目标位置是 500r,那么就需要500 ∗ 2𝜋。通常控制使用位置控制的时候就是使用这个。 函数。
在mc_interface.h文件中,还可以看见这里声明了各种API,其中有MCI_StartMotor()、MCI_StopMotor()、MCI_ExecPositionCommand()等, 他们分别是电机的启动、停止、位置控制函数,也是我们需要用到的。
位置接口函数:

下面我们就所以这三个API,去用按键实现位置的控制。实现是所以三个按键,分别是key1(启动电机), key2(停止电机),key3(控制电机位置)。
这三个函数的调用,都需要一个MCI_Handle_t * pHandle指针参数,在ui_task.c中,已经声明了一个MCP_Handle_t * pMCP = MC_NULL变量, 其中MCP_Handle_t结构体中有一个UI_Handle_t结构体,UI_Handle_t中有一个这三个函数的调用,都需要一个MCI_Handle_t,这就是我们需要的。 下面我们去实现这个控制逻辑,只需要简单调用几个API。
当按键1按下时,会调用电机使能,当按键2按下时,会失能电机,当按键3按下时,会调用位置函数,让电机转动100圈,时间是2秒。

22.3. 下载验证¶
当程序修改完成后,将pmsm电机的编码器、三相线连接到野火无刷开发板上, 野火无刷开发板接入24V电压,同时骄阳开发板的无刷电机驱动接口1连接到 野火无刷驱动板上,将刚刚修改好的代码下载到开发板中。
上电后先按下按键1使能电机,然后按下按键3,电机会旋转100圈。