无传感器 FOC 电机控制库概述¶
1. 软件概述¶
无传感器磁场定向控制 (FOC) 库包含三个主要层:应用层、HAL 层和 MSPM0 DriverLib。
Fig. 1 无传感器 FOC 架构¶
1.1 应用层概述¶
用户特定的应用程序(例如 GUI)位于该层。在这一层,可以配置和使用电机驱动器模块的各种实例。如果用户需要执行任何硬件特定的操作,建议使用 HAL 模块中的 API。
1.2 HAL 模块¶
概述¶
硬件抽象层 (HAL) 会创建一个抽象层,以提供用于配置不同引脚和外设的 API。使用 HAL 的目标是抽象处理所有器件特定的配置,从而通过最大程度地减少其他元件所需的更新来简化库到各种硬件的移植。HAL 旨在仅抽象处理应用所需的引脚或外设,同时仍然具有移植到其他 MSPM0 MCU 或电机驱动器的灵活性和可扩展性。
HAL 旨在将特定数量的引脚或通道与外设关联。例如,考虑 GPIO 的用例。HAL 具有枚举 HAL_GPIO_OUT_PIN,其中将所有 GPIO 输出引脚包含为成员,如下所示。
/*! @enum HAL_GPIO_OUT_PIN */
typedef enum{
/*! Index associated to output GPIO PIN 0 */
HAL_GPIO_OUT_PIN_0 = 0,
/*! Index associated to output GPIO PIN 1 */
HAL_GPIO_OUT_PIN_1,
/*! Total number of output GPIO pins */
HAL_GPIO_OUT_PIN_MAX,
}HAL_GPIO_OUT_PIN;
为了将 HAL GPIO 引脚映射到真实的硬件引脚,使用了一个由 HAL_GPIO_OUT_PIN 枚举成员进行索引的结构。该结构存储各种成员,如端口实例、引脚名称等。请参见下面的 gpioOUT 结构,该结构会保存有关端口和引脚的数据。
gpioOUT[HAL_GPIO_OUT_PIN_0].iomux = GENERIC_GPIO_OUT_PINO_0_IOMUX;
gpioOUT[HAL_GPIO_OUT_PIN_0].port = GENERIC_GPIO_OUT_PORT;
gpioOUT[HAL_GPIO_OUT_PIN_0].pin = GENERIC_GPIO_OUT_PINO_0_PIN;
请注意,GENERIC_GPIO_OUT_PINO_0_PIN 在 TI SysConfig 生成的文件中定义,具体行如下所示:
#define GENERIC_GPIO_OUT_PINO_0_PIN (DL_GPIO_PIN_26)
因此,HAL_GPIO_OUT_PIN_0 间接引用 DL_GPIO_PIN_0,但这种映射的优点是:由于 TI SysConfig 控制 GENERIC_GPIO_OUT_PINO_0_PIN 的生成,因此很容易在 TI SysConfig GUI 中更改引脚。HAL 会自动遵循此行为,而无需用户更改 HAL 层中的任何代码。
如上所示,当通过 HAL 访问硬件时,我们需要传递 HAL 特定枚举,如 HAL_GPIO_OUT_PIN_0。这些枚举存储在访问 HAL 层的实例中。对于 DRV8323RS 电机驱动器,我们使用被分配给 HAL 枚举的引脚来初始化重要引脚的实例,如下面的代码片段所示。
drv8323rs.enable = HAL_GPIO_OUT_PIN_0;
drv8323rs.nfault = HAL_PWM_FAULT_0;
drv8323rs.spi = HAL_SPI_CHANNEL_0;
drv8323rs.spiCS = HAL_SPI_CS_2;
drv8323rs.vsenvm = HAL_ADC_CHANNEL_1;
drv8323rs.isena = HAL_ADC_CHANNEL_2;
drv8323rs.isenb = HAL_ADC_CHANNEL_0;
如果需要将 ENABLE 引脚设置为高电平,则使用 API DRV8323RS_enable() 并通过其传递 DRV8323RS 实例。代码片段如下所示:
void DRV8323RS_enable(DRV8323RS_Instance *handle)
{
/* Enable the DRV8323RS */
HAL_setGPIOVal(handle->enable, HAL_GPIO_VALUE_HIGH);
/* Startup delay for the DRV8323RS SPI to be ready */
HAL_delayMilliSeconds(DRV8323RS_SPI_READY_DELAY_MS);
}
当 DRV8323RS_enable() 与 HAL 层交互时,会传递 DRV8323RS 实例的成员。这与使用其他 HAL API(例如计时器、SPI、DAC 等)的概念相同。用户可以随意扩展 HAL 的 API 以支持 MSPM0 的其他外设和特性,但为了确保能轻松迁移到该库的新版本,强烈建议不要修改现有的 API。
1.3 电机驱动器模块¶
电机驱动器模块将 HAL API 用作电机驱动器特定操作 API,例如 SPI 读取、SPI 写入、电压和电流测量。该模块的理念是独立于硬件并使用 HAL API 来执行电机驱动器特定的硬件任务。
电机驱动器引脚关联¶
在使用电机驱动器模块之前,用户需要指定映射到电机驱动器实例的 HAL 枚举。请参阅以下代码片段。
/* Assign the pins specific for the DRV */
drv8323rs.enable = HAL_GPIO_OUT_PIN_0;
drv8323rs.nfault = HAL_PWM_FAULT_0;
drv8323rs.spi = HAL_SPI_CHANNEL_0;
drv8323rs.spiCS = HAL_SPI_CS_2;
drv8323rs.vsenvm = HAL_ADC_CHANNEL_1;
drv8323rs.isena = HAL_ADC_CHANNEL_2;
drv8323rs.isenb = HAL_ADC_CHANNEL_0;
电机驱动器 API¶
电机驱动器模块提供简单的 API,用户可以将其与电机驱动器模块的实例一同使用。 电机驱动器模块 API 还处理电机驱动器特定逻辑,同时保持 API 通用,因此用户可以使用不同的电机驱动器,而不必担心内部逻辑有任何差异。例如,下面是用于更新 drv8323rs 中 SPI 寄存器的 API。
void DRV8323RS_spiUpdateRegister(DRV8323RS_Instance *handle,
DRV8323RS_REG_ADDR addr, uint32_t mask, uint16_t data)
{
uint16_t dataValue;
dataValue = (uint16_t) DRV8323RS_spiRead(handle, addr);
dataValue &= ~(mask);
dataValue|= data;
DRV8323RS_spiWrite(handle, addr, dataValue);
}
请注意,在上面的代码片段中,DRV8323RS 中 spi 寄存器的任何位都可以修改。不同器件的寄存器地址可以不同,但这里使用枚举器 DRV8323RS_REG_ADDR,因此用户不需要知道每个寄存器的地址。
1.4 无传感器 FOC 库模块¶
概述¶
无传感器 FOC 库包含用于三相无传感器 FOC 电机控制的通用算法。用户可以使用该模块中的 API 来配置和控制 FOC 电机控制。该模块负责根据 FOC 算法设置 PWM 调制,并通过 HAL API 来使用任何硬件资源。用户需要为 FOC 模块映射 HAL PWM 通道。下面是将 HAL PWM 通道分配给 foc 模块的代码片段。
/* Assign the pins specific for FOC */
foc.pwmAHal = HAL_PWM_CHANNEL_1;
foc.pwmBHal = HAL_PWM_CHANNEL_2;
foc.pwmCHal = HAL_PWM_CHANNEL_0;
1.5 MSPM0 DriverLib 概述¶
MSPM0 DriverLib 是一组功能齐全的 API,用于配置、控制和操作 MSPM0 平台的硬件外设。更多信息,请参阅 DriverLib 文档。
2. 软件用户指南¶
无传感器 FOC 软件可与 CCS 调试窗口一同使用。如果用户想将该软件和 GUI 一同使用,请查看特定硬件的 GUI 用户指南。
2.1 设置电机参数¶
电机参数可以在 motor_parameter.h 文件中找到。无传感器 FOC 需要四个电机参数:
定子电阻,Rs (Ω)
定子电感,Ls (H)
电机极数量
电机基准 RPM 最大值
Fig. 2 电机参数 c 文件位置¶
这些参数是使用电机的 #elif 语句定义的。若要为自定义电机定义这些参数,请修改 USER_MOTOR 的 #define 语句中的 MOTOR_PARA_RS、MOTOR_PARA_LS、MOTOR_PARA_POLES 和 MOTOR_PARA_BASE_RPM。若要添加另一个电机,请复制并粘贴下面的 #elif 语句,并将 USER_MOTOR 重命名为另一个名称。
#elif (USER_MOTOR)
/* Define the electrical motor parameters (User motor) */
/* @brief Stator resistance (ohm) */
#define MOTOR_PARA_RS 1.7
/* @brief Stator inductance (H) */
#define MOTOR_PARA_LS 0.004
/* @brief Number of poles */
#define MOTOR_PARA_POLES 8
/* @brief Base RPM */
#define MOTOR_PARA_BASE_RPM 5000
若要选择在 motor_params.h 中定义的电机,请点击工具栏中的“Project”->“Properties”。 在“Properties”窗口中,依次转到“Build”->“Arm Compiler”->“Predefined Symbols”。预定义的电机名称为 LVSERVOMTR=1。若要更改预定义的电机名称,请点击 “Edit” 并将 LVSERVOMTR 更改为 motor_params.h 中定义的另一个电机,例如 LVBLDCMTR 或 USER_MOTOR。
Fig. 3 显示 LVSERVOMTR=1 符号¶
2.2 设置系统参数¶
初始参数可在 drv8323rs-gui.h 文件中找到,具体形式为 #define GUI_DEFAULT_XXXX。用户必须根据需要设置这些参数。默认情况下,为 LVSERVOMTR 电机设置默认参数。
初始参数 |
说明 |
|---|---|
DRV_VDS_LVL |
DRV8323RS 的 VDS 比较器阈值 |
DRV_SEN_LVL |
DRV8323RS 的 OCP 电平 |
DRV_CSA_GAIN |
DRV8323RS 的 CSA 增益设置 |
DRV_RSHUNT |
DRV8323RS 中的 Rshunt 阻值 |
FOC_RS |
为 FOC 选择的电机相电阻 |
FOC_LS |
为 FOC 选择的电机相电感 |
FOC_POLES |
为 FOC 选择的电机极 |
FOC_BASE_RPM |
为 FOC 选择的基准 rpm |
FOC_PWMFREQ |
FOC 的 PWM 频率 |
FOC_PWMADCSAMPLE |
ADC 采样中的 PWM 计数 |
FOC_CNTRLDIV |
FOC 的控制环路分压器,仅设置为 1 |
FOC_DEADBAND |
死区,以 ns 为单位 |
FOC_RSHUNT |
Rshunt 电阻值 |
FOC_VOLT_RATIO |
总线电压转换率 |
FOC_AMP_GAIN |
电流放大器增益 |
FOC_KSLIDE |
Kslide 系数值 |
FOC_PISPD_KP |
速度 PI 控制器的比例系数 |
FOC_PISPD_KI |
速度 PI 控制器的积分系数 |
FOC_PISPD_MAX |
速度 PI 控制器的最大值输出 |
FOC_PISPD_MIN |
速度 PI 控制器的最小值输出 |
FOC_PISPD_DIV |
针对 FOC 控制环路频率的速度 PI 控制器执行分频器 |
FOC_PIIQ_KP |
Iq PI 控制器的比例系数 |
FOC_PIIQ_KI |
Iq PI 控制器的积分系数 |
FOC_PIIQ_MAX |
Iq PI 控制器的最大值输出 |
FOC_PIIQ_MIN |
Iq PI 控制器的最小值输出 |
FOC_PIID_KP |
Id PI 控制器的比例系数 |
FOC_PIID_KI |
Id PI 控制器的积分系数 |
FOC_PIID_MAX |
Id PI 控制器的最大值输出 |
FOC_PIID_MIN |
Id PI 控制器的最小值输出 |
2.3 选择构建级别¶
该软件包使用增量式系统构建来演示完整的定点 无传感器磁场定向控制解决方案。共有 5 个可选的构建级别选项来逐步验证功能。
构建级别 |
说明 |
|---|---|
LEVEL1 |
模块功能检查。 |
LEVEL2 |
验证 ADC、帕克/克拉克,校准偏移量。 |
LEVEL3 |
验证电流(扭矩)闭环以及 PID 和速度测量。 |
LEVEL4 |
验证速度估算和转子位置估算。 |
LEVEL5 |
验证速度闭环、速度 PID 和 eSMO。 |
若要在 foc.h 中选择构建级别,请点击工具栏中的“Project”->“Properties”。在“Properties”窗口中,依次转到“Build”->“Arm Compiler”->“Predefined Symbols”。预定义的 BUILDLEVEL 名称为 LEVEL5。若要更改预定义的构建级别,请点击“Edit”并将 LEVEL5 更改为在 foc.h 中定义的另一个构建级别。
Fig. 4 构建级别¶
重要说明¶
构建级别仅用于验证模块。当使用低于 LEVEL5 的构建级别时,用户只能在空载条件下使用电机。用户应使用 LEVEL5 作为最终构建级别,以在负载条件下测试电机。
2.4 用于控制电机的变量¶
下方是包含在调试窗口中用于控制电机的变量列表。注意,对于 IQ24 类型的变量,请通过右键点击变量并更改为 IQ 类型 24 来设置类型。
变量 |
说明 |
类型 |
|---|---|---|
enableFOC |
控制是启用还是禁用 FOC。如果设为 0,则禁用 PWM,并且驱动处于高阻态。如果设为 1,则根据 FOC 代码设置 PWM 输出。 |
布尔 |
lsw |
控制 FOC 状态。如果设为 0,则将电机与 A 相对齐。如果设为 1,则以 speedRef 变量设置的速度在开环中旋转电机。如果设为 2,则以 speedRef 变量设置的速度在闭环中旋转电机。lsw=2 不适用于 LEVEL5 以外的构建级别,并且不应设置。 |
int |
idRef |
设置对齐电流(标幺值)。 |
IQ24 |
iqRef |
设置 lsw = 1 下的 q 轴电流(标幺值)。 |
IQ24 |
speedRef |
设置用于开环加速且 lsw = 2 下的基准速度 |
IQ24 |
speedEst.EstimatedSpeed |
显示估算的电机速度(标幺值)。 |
IQ24 |
speedEst.EstimatedSpeedRpm |
显示估算的电机速度(以 RPM 为单位)。 |
int |
piSpd.Kp |
速度 PI 中的比例常量。 |
IQ24 |
piSpd.Ki |
速度 PI 中的积分常量。 |
IQ24 |
piId.Kp |
Id 电流 PI 中的比例常量。 |
IQ24 |
piId.Ki |
Id 电流 PI 中的积分常量。 |
IQ24 |
piIq.Kp |
Iq 电流 PI 中的比例常量。 |
IQ24 |
piIq.Ki |
Iq 电流 PI 中的积分常量。 |
IQ24 |
guiOverCurrentLimit |
以安培为单位的相电流值,高于该值时,软件将触发过流 |
float |
guiVmOverVoltageLimit |
以伏特为单位的电压值,高于该值时,软件将触发过压故障。 |
float |
guiVmUnderVoltageLimit |
以伏特为单位的电压值,低于该值时,软件将触发欠压故障。 |
float |
gui_faults.clearFault |
如果设为 1,则清除所有故障位。 |
bool |
gui_faults.drvFault |
在检测到 drv 故障时设置。 |
bool |
gui_faults.uvlo |
在检测到欠压时设置。 |
bool |
gui_faults.ovlo |
在检测到过压时设置。 |
bool |
gui_faults.ocp |
在检测到过流时设置。 |
bool |
2.5 电机运行¶
电机运行的步骤如下:
检查 enableFOC 是否为 0。
检查“gui_faults”结构中是否设置了任何故障位。如果设置了任何故障,请通过设置 gui_faults.clearFault = 1 来清除故障。
将 idRef 设置为所需的对齐电流。
将 iqRef 设置为所需的开环电流。
将 speedRef 设置为所需的开环速度。
设置 lsw = 0 可使电机与 A 相对齐。请注意,当 enableFOC = 0 时,FOC 当前被禁用。
设置 enableFOC = 1 可启用 FOC 代码来驱动 PWM。因为 lsw = 0,所以我们应该在 A 相中看到正电流,在 B 相和 C 相中看到一半的负电流。如果电流不是恒定的,请参阅针对 Id 的 PI 调优。
设置 lsw = 1 可切换到开环。电机开始旋转并加速至在 speedRef 中设置的速度。如果电机振动,则复位为 lsw = 0 并设置更高的 IdRef 值。A 相电流应为正弦波。如果电流存在尖峰或波形失真,请参阅针对 Iq 的 PI 调优。
设置 lsw = 2 可切换到闭环。估算的电机速度 (speedEst.EstimatedSpeed) 应在负载条件下与 speedRef 匹配,并且电机应继续平稳运行。
提高或降低 speedRef 则可以所需的电机速度运行。检查斜升后电机速度是否稳定,是否未出现速度振荡,特别是在施加负载时。如果电机速度不稳定或最终速度存在振荡,请使用速度 PI 控制器修改速度控制响应。
若要停止电机,请设置 enableFOC = 0。
如果发生故障,则会在 gui_faults 结构中设置相应的故障。
若要清除故障,请移除故障条件并设置 gui_faults.clearFault。相应的故障位将被清除。
2.6 电机调优¶
PI 控制器调优¶
共有 3 个 PI 控制器:速度 PI 控制器、Id 电流 PI 控制器和 Iq 电流 PI 控制器。若要对 PI 控制器进行调优,用户应首先调整 Kp,然后调整该 PI 控制器的 Ki。 对 PI 控制器进行调优的方法如下:
使用 lsw = 0 可对 PI Id 增益(piId.kp、piId.ki)进行调优
使用 lsw = 1 可对 PI Iq 增益(piIq.kp、piIq.ki)进行调优
在 PI 速度增益中使用 lsw = 2(piSpd.kp、piSpd.ki)
2.7 记录变量¶
用户可以添加 __ENABLE_LOG 预定义符号来启用日志记录。用户可以设置日志索引和变量,如以下代码所示:
FOC_addVarToLog(FOC_LOG_IDX_0, phaseVolt.Valpha);
若要以图表形式查看记录的数据,用户可以添加变量 cssLog[X],其中 X 是索引。右键点击该变量,然后选择“Graph”。
Fig. 5 图形图像¶
选择“Continuous Refresh”模式可查看连续数据。
Fig. 6 图形图像¶
请注意,启用日志记录功能后,软件会占用 24KB 的额外 SRAM 空间来存储值。
2.8 访问 SPI 寄存器¶
软件允许分别更改 DRV SPI 寄存器中的值。可通过 3 个选项写入 SPI 寄存器。下面是要使用的变量和示例。
SPI 寄存器中有 3 个选项:
将 8 位数据写入寄存器
变量 |
说明 |
|---|---|
gui_spi.writeRegFlag |
设为 1 时写入寄存器。 |
gui_spi.writeRegAddr |
设置要写入的寄存器地址。 |
gui_spi.writeRegData |
设置要写入的寄存器数据。 |
例如,若要将 0x01 写入栅极驱动器 HS 寄存器,请选择 gui_spi.writeRegAddr 为 DRV8323RS_REG_ADDR_GATE_DRIVE_HS,设置 gui_spi.writeRegData = 0x01,然后设置 gui_spi.writeRegFlag = 1。
更新 SPI 寄存器中的某些位
变量 |
说明 |
|---|---|
gui_spi.writeBitfieldRegFlag |
设为 1 时写入位字段。 |
gui_spi.writeBitfieldRegAddr |
设置要写入位字段的寄存器地址。 |
gui_spi.bitfieldRegPosData |
设置要写入位字段的位置。 |
gui_spi.bitfieldRegMaskData |
设置要写入位字段的掩码。 |
gui_spi.writeBitfieldRegData |
设置要写入位字段的数据。 |
若要设置 IDRIVEP_HS = 0x03 寄存器,请选择 gui_spi.writeBitfieldRegAddr 为 DRV8323RS_REG_ADDR_GATE_DRIVE_HS,设置 gui_spi.bitfieldRegPosData = 0x04,设置 gui_spi.bitfieldRegMaskData = 0x03,设置 gui_spi.writeBitfieldRegData = 0x03,然后设置 gui_spi.writeBitfieldRegFlag = 1。
读取 SPI 寄存器
变量 |
说明 |
|---|---|
gui_spi.readRegFlag |
设为 1 时读取寄存器。 |
gui_spi.readRegAddr |
设置要读取的寄存器地址。 |
gui_spi.readRegData |
显示从寄存器读取的数据。 |
若要读取栅极驱动器 HS 寄存器,请选择 gui_spi.readRegAddr 为 DRV8323RS_REG_ADDR_GATE_DRIVE_HS,然后设置 gui_spi.writeRegFlag = 1。读取的数据可以在 gui_spi.readRegData 中看到。
3. API 指南¶
4. 已知问题¶
1.编译时针对 IQrepeat 函数发出函数隐式声明警告。 2.当前的解决方案支持高达 100W 的功率。在低速下施加高扭矩会导致电机以高 rpm 向后旋转。
5. 支持的器件¶
DRV8323RS¶
支持的 MSPM0 Launchpad
链接