ZHCUBZ5A September 2021 – April 2024
C2000 MCU 可与 BLDC 电机驱动器搭配使用,用于驱动三相 BLDC 或 PMSM 电机应用。此通用实验工程可支持各种预定义的 BLDC 电机驱动器。用户可以参考实验工程中的示例代码,并按照本节中所述的步骤来实现更新的或不受支持的 BLDC 电机驱动器。本节以带 SPI 的 DRV8323RS 为例。
如果 BLDC 电机驱动器支持 SPI,请参阅现有的 BLDC 电机驱动器文件(drv8323s.h 和 drv8323s.c),并根据需要在 drv8xxx.h 和 drv8xxx.c 文件中更改寄存器和 API 函数定义。BLDC 电机驱动器寄存器映射的详细说明可在 BLDC 电机驱动器器件的数据表中找到。
为驱动程序文件创建一组新的文件夹,与 DRV8323 一样(“\libraries\drvic\drv8323\include”和“\libraries\drvic\drv8323\source”)。
首先,将 BLDC 电机驱动器源文件添加到您正在处理的工程中。添加文件的方法有两种。
使用编辑器打开 universal_motorcontrol_lab.projectspec projectspec 文件,按如下所示将文件添加到工程中。
<file action="link" path="SDK_ROOT/libraries/drvic/drv8323/source/drv8323s.c" targetDirectory="src_board" applicableConfigurations="Flash_lib_DRV8323RS" />
<file action="link" path="SDK_ROOT/libraries/drvic/drv8323/include/drv8323s.h" targetDirectory="src_board" applicableConfigurations="Flash_lib_DRV8323RS" />
或者,右键点击 Project Explorer 窗口内的工程名称,并选择“Add Files”。接下来,导航至以下文件夹并从“\libraries\drvic\drv8323\source”中选择设计的驱动程序文件,然后选择“Link to Files”。
#include "drv8323s.h"
为了确保可以正确找到头文件,请在“Project Properties”->“Build”->“C2000 Compiler”->“Include Options”->“Add dir to #include search path”中添加指向头文件的目录。
或者,通过在 universal_motorcontrol_lab.projectspec projectspec 文件中添加以下内容,将目录添加到头文件中。
-I${SDK_ROOT}/libraries/drvic/drv8323/include
请参阅 DRV8323 文件,按如下所示添加支持代码。
在 hal_obj.h 文件中添加定义。
#define DRAdd the defines in hal_obj.h fileVIC_Obj DRV8323_Obj
#define DRVIC_VARS_t DRV8323_VARS_t
#define DRVIC_Handle DRV8323_Handle
#define DRVICVARS_Handle DRV8323VARS_Handle
#define DRVIC_init DRV8323_init
#define DRVIC_enable DRV8323_enable
#define DRVIC_writeData DRV8323_writeData
#define DRVIC_readData DRV8323_readData
#define DRVIC_setupSPI DRV8323_setupSPI
#define DRVIC_setSPIHandle DRV8323_setSPIHandle
#define DRVIC_setGPIOCSNumber DRV8323_setGPIOCSNumber
#define DRVIC_setGPIOENNumber DRV8323_setGPIOENNumber
将 drvic 接口句柄和 SPI 句柄添加到 HAL_Obj:
uint32_t spiHandle; //!< the SPI handle
DRVIC_Handle drvicHandle; //!< the drvic interface handle
DRVIC_Obj drvic; //!< the drvic interface object
uint32_t gateEnableGPIO;
// BSXL8353RS_REVA
将电机驱动器与 SPI 配合使用时,必须从 MCU 正确配置 SPI,以匹配与 BLDC 电机驱动器器件正确通信所需的格式。
在 hal.c 文件的 HAL_setupGPIOs() 中为 SPI 函数配置相关 GPIO。确保查看 BLDC 电机驱动器数据表,以确定每个 SPI 引脚是否需要外部上拉或下拉电阻器,或者是否配置为推挽引脚。
// GPIO5->Connect to GPIO5 using a jumper wire->M1_DRV_SCS
GPIO_setPinConfig(GPIO_5_SPIA_STE);
GPIO_setDirectionMode(5, GPIO_DIR_MODE_OUT);
GPIO_setPadConfig(5, GPIO_PIN_TYPE_STD);
// GPIO09->M1_DRV_SCLK*
GPIO_setPinConfig(GPIO_9_SPIA_CLK);
GPIO_setDirectionMode(9, GPIO_DIR_MODE_OUT);
GPIO_setPadConfig(9, GPIO_PIN_TYPE_PULLUP);
// GPIO10->SPIA_SOMI->M1_DRV_SDO*
GPIO_setPinConfig(GPIO_10_SPIA_SOMI);
GPIO_setDirectionMode(10, GPIO_DIR_MODE_IN);
GPIO_setPadConfig(10, GPIO_PIN_TYPE_PULLUP);
// GPIO11->SPIA_SIMO->M1_DRV_SDI*
GPIO_setPinConfig(GPIO_11_SPIA_SIMO);
GPIO_setDirectionMode(11, GPIO_DIR_MODE_OUT);
GPIO_setPadConfig(11, GPIO_PIN_TYPE_PULLUP);
在 hal.c 文件中的 HAL_setupSPI() 中为波特率、数据帧配置 SPI 控制寄存器:
// Must put SPI into reset before configuring it
SPI_disableModule(obj->spiHandle);
// SPI configuration. Use a 500kHz SPICLK and 16-bit word size, 25MHz LSPCLK
SPI_setConfig(obj->spiHandle, DEVICE_LSPCLK_FREQ, SPI_PROT_POL0PHA0,
SPI_MODE_MASTER, 400000, 16);
SPI_disableLoopback(obj->spiHandle);
SPI_setEmulationMode(obj->spiHandle, SPI_EMULATION_FREE_RUN);
SPI_enableFIFO(obj->spiHandle);
SPI_setTxFifoTransmitDelay(obj->spiHandle, 0x10);
SPI_clearInterruptStatus(obj->spiHandle, SPI_INT_TXFF);
// Configuration complete. Enable the module.
SPI_enableModule(obj->spiHandle);
//! \brief Defines the gpio for enabling Power Module
#define MTR1_GATE_EN_GPIO 29
//! \brief Defines the gpio for the nFAULT of Power Module
#define MTR1_PM_nFAULT_GPIO 34
// setup the spi for drv8323/drv8353/drv8316
HAL_setupSPI(handle);
// setup the drv8323s/drv8353s/drv8316s interface
HAL_setupGate(handle);
// turn on the DRV8323/DRV8353/DRV8316 if present
HAL_enableDRV(obj->halMtrHandle);
// initialize the DRV8323/DRV8353/DRV8316 interface
HAL_setupDRVSPI(obj->halMtrHandle, &drvicVars_M1);
drvicVars_M1.ctrlReg05.bit.VDS_LVL = DRV8323_VDS_LEVEL_1P700_V;
drvicVars_M1.ctrlReg05.bit.OCP_MODE = DRV8323_AUTOMATIC_RETRY;
drvicVars_M1.ctrlReg05.bit.DEAD_TIME = DRV8323_DEADTIME_100_NS;
drvicVars_M1.ctrlReg06.bit.CSA_GAIN = DRV8323_Gain_10VpV;
drvicVars_M1.ctrlReg06.bit.LS_REF = false;
drvicVars_M1.ctrlReg06.bit.VREF_DIV = true;
drvicVars_M1.ctrlReg06.bit.CSA_FET = false;
drvicVars_M1.writeCmd = 1;
HAL_writeDRVData(obj->halMtrHandle, &drvicVars_M1);