ZHCUBZ5A September 2021 – April 2024
C2000 MCU 可與 BLDC 電機(jī)驅(qū)動(dòng)器搭配使用,用于驅(qū)動(dòng)三相 BLDC 或 PMSM 電機(jī)應(yīng)用。此通用實(shí)驗(yàn)工程可支持各種預(yù)定義的 BLDC 電機(jī)驅(qū)動(dòng)器。用戶可以參考實(shí)驗(yàn)工程中的示例代碼,并按照本節(jié)中所述的步驟來實(shí)現(xiàn)更新的或不受支持的 BLDC 電機(jī)驅(qū)動(dòng)器。本節(jié)以帶 SPI 的 DRV8323RS 為例。
如果 BLDC 電機(jī)驅(qū)動(dòng)器支持 SPI,請(qǐng)參閱現(xiàn)有的 BLDC 電機(jī)驅(qū)動(dòng)器文件(drv8323s.h 和 drv8323s.c),并根據(jù)需要在 drv8xxx.h 和 drv8xxx.c 文件中更改寄存器和 API 函數(shù)定義。BLDC 電機(jī)驅(qū)動(dòng)器寄存器映射的詳細(xì)說明可在 BLDC 電機(jī)驅(qū)動(dòng)器器件的數(shù)據(jù)表中找到。
為驅(qū)動(dòng)程序文件創(chuàng)建一組新的文件夾,與 DRV8323 一樣(“\libraries\drvic\drv8323\include”和“\libraries\drvic\drv8323\source”)。
首先,將 BLDC 電機(jī)驅(qū)動(dòng)器源文件添加到您正在處理的工程中。添加文件的方法有兩種。
使用編輯器打開 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" />
或者,右鍵點(diǎn)擊 Project Explorer 窗口內(nèi)的工程名稱,并選擇“Add Files”。接下來,導(dǎo)航至以下文件夾并從“\libraries\drvic\drv8323\source”中選擇設(shè)計(jì)的驅(qū)動(dòng)程序文件,然后選擇“Link to Files”。
#include "drv8323s.h"
為了確??梢哉_找到頭文件,請(qǐng)?jiān)凇癙roject Properties”->“Build”->“C2000 Compiler”->“Include Options”->“Add dir to #include search path”中添加指向頭文件的目錄。
或者,通過在 universal_motorcontrol_lab.projectspec projectspec 文件中添加以下內(nèi)容,將目錄添加到頭文件中。
-I${SDK_ROOT}/libraries/drvic/drv8323/include
請(qǐng)參閱 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
將電機(jī)驅(qū)動(dòng)器與 SPI 配合使用時(shí),必須從 MCU 正確配置 SPI,以匹配與 BLDC 電機(jī)驅(qū)動(dòng)器器件正確通信所需的格式。
在 hal.c 文件的 HAL_setupGPIOs() 中為 SPI 函數(shù)配置相關(guān) GPIO。確保查看 BLDC 電機(jī)驅(qū)動(dòng)器數(shù)據(jù)表,以確定每個(gè) 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() 中為波特率、數(shù)據(jù)幀配置 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);