【BMS】BJB MC33772 電流測量

一、硬體準備

1、主控板子:S32K312 板子

2、BJB 板子:MC33772 BJB 板子

3、硬體連接:

兩個板子獨立 12V 供電,外部電流接線流經分流器 Shunt ,分流器方向從下往上流向得到正值數據。
 4、BJB 測量電流電路注意事項
 
① 板子上預留的外部電壓模擬測試電流採樣電路需要去掉,如下圖,BJB 板子電路圖如示意圖一致
 

二、軟體準備

1、S32DS 軟體 IDE

2、軟體包獲取:

① 進入官網下載 ,Go on Package manager webpage.

② 勾選 S32K344 HVBMS ,然後下載

3、環境安裝

S32K312 以及 S32 DS 安裝環境查看《BMS_SWInstalationGuide_Hvbms_2024.pdf》,在上述官網頁面點擊下圖位置,即可下載用戶指導手冊,按照手冊一步步下載安裝即可完成環境的安裝

4、軟體更改

晶片更換為 S32K312 ,上述已經下載了 S32K344 的 BMS 例程,按照 S32K344 的 EB tresos 配置,在S32K312 的例程上,直接在 EB tresos 更改外設,添加 MC33772 ,MC33665 對應的組件即可,如下圖,其他外設配置可以參考 S32K344 例程。(如客戶及用戶此步驟無法操作,可以聯繫 我們 WPI ATU ,在允許的情況下可以提供這套移植好的 demo)

三、測量電流軟體流程

1、 查看數據手冊

《ds633730 - MC33772C Datasheet.pdf》裡面有提示:電流採樣使能後至少等待 2.7us 後才能進行 ADC 轉化。

2、 ADC 採樣配置

配置 ADC 採樣平均次數,次數越高採樣時間越長,在 EB 配置當中,ADC2 的採樣解析度設置為 15bit

 

3、 查看代碼配置,進行修改:先使能 電流採樣,再進行 ADC 轉換

HVBMS_Errors Bjb_StartMeas(void)
{
Std_ReturnType Status = E_OK;
/* Clear TD */
Status = Bms_TD_Clear(&BmsTDCfg_Tpl2);

/* Start measurements */


Status |= Bcc_772c_CC_ControlMeasurements(BCC_772C_ALL_CHAIN_TPL, BCC_772C_ALL_DEVICE_TPL, BCC_772C_CC_START, &BmsTDCfg_Tpl2);

/* Add 2 ms delay to wait for the device to finish current measurement */
Status |= Bms_TD_InsertPhyEvent(&BmsTDCfg_Tpl2, PHY_TIMER, 2000U);
Status |= Bcc_772c_COM_InsertNop(BS_CHAIN_ADDR, 1, &BmsTDCfg_Tpl2);

/* Call Bcc_772c_Send */
Status |= Bms_TD_Send(&BmsTDCfg_Tpl2, &PhyError);
if(Status != E_OK)
{
return ERROR_BJB_START_MEASUREMENTS_TD_FILL;
}

/* Wait until PHY processes the request */
Td_Wait(&BmsTDCfg_Tpl2);
if(PhyError != PHY_NO_ERROR)
{
return ERROR_BJB_START_MEASUREMENTS_TD_SEND;
}

/* Clear TD */
Status = Bms_TD_Clear(&BmsTDCfg_Tpl2);

Status |= Bcc_772c_MSR_StartConversion(BCC_772C_ALL_CHAIN_TPL, BCC_772C_ALL_DEVICE_TPL, MC33772C_ADC_CFG_AVG_8_SAMPLES_ENUM_VAL, &BmsTDCfg_Tpl2);
/* Add 2 ms delay to wait for the device to finish current measurement */
Status |= Bms_TD_InsertPhyEvent(&BmsTDCfg_Tpl2, PHY_TIMER, 2000U);
Status |= Bcc_772c_COM_InsertNop(BS_CHAIN_ADDR, 1, &BmsTDCfg_Tpl2);

/* Call Bcc_772c_Send */
Status |= Bms_TD_Send(&BmsTDCfg_Tpl2, &PhyError);
if(Status != E_OK)
{
return ERROR_BJB_START_MEASUREMENTS_TD_FILL;
}

/* Wait until PHY processes the request */
Td_Wait(&BmsTDCfg_Tpl2);
if(PhyError != PHY_NO_ERROR)
{
return ERROR_BJB_START_MEASUREMENTS_TD_SEND;
}

/* Clear TD */
Status = Bms_TD_Clear(&BmsTDCfg_Tpl2);
return NO_ERROR;
}

4、 讀取數據

HVBMS_Errors Bjb_ReadMeasurementsResults(BjbMeasurementType MeasurementType)
{
volatile Std_ReturnType Status = E_OK;
uint8 BS_Device_Addr;
Bcc_772c_CcISenseValueType CcIsense[BS_DEVICE_CNT];
//Bjb_ReadIsolation();

Status = Bms_TD_Clear(&BmsTDCfg_Tpl2);
uint16 CurrentData[BS_DEVICE_CNT][5] = {0,0};
/* Start measurements */
do
{
/* Read current measurements */
if(MeasurementType == BJB_CURRENT_MEASUREMENT)
{
//delay 10ms
Status |= Bms_TD_InsertPhyEvent(&BmsTDCfg_Tpl2, PHY_TIMER, 5000);
Status |= Bcc_772c_CC_ControlMeasurements(BCC_772C_ALL_CHAIN_TPL, BCC_772C_ALL_DEVICE_TPL, BCC_772C_CC_RESTART, &BmsTDCfg_Tpl2);
/* Add 2 ms delay to wait for the device to finish current measurement */
Status |= Bms_TD_InsertPhyEvent(&BmsTDCfg_Tpl2, PHY_TIMER, 2000U);
Status |= Bcc_772c_COM_InsertNop(BS_CHAIN_ADDR, 1, &BmsTDCfg_Tpl2);

/* Call Bcc_772c_Send */
Status |= Bms_TD_Send(&BmsTDCfg_Tpl2, &PhyError);
if(Status != E_OK)
{
return ERROR_BJB_START_MEASUREMENTS_TD_FILL;
}

/* Wait until PHY processes the request */
Td_Wait(&BmsTDCfg_Tpl2);
if(PhyError != PHY_NO_ERROR)
{
return ERROR_BJB_START_MEASUREMENTS_TD_SEND;
}

/* Clear TD */
Status = Bms_TD_Clear(&BmsTDCfg_Tpl2);

for(BS_Device_Addr = 1; BS_Device_Addr <= BS_DEVICE_CNT; BS_Device_Addr++)
{
Status |= Bcc_772c_CC_GetData(BS_CHAIN_ADDR, BS_Device_Addr, &BmsTDCfg_Tpl2);
}
Status |= Bms_TD_Send(&BmsTDCfg_Tpl2, &PhyError);
if(Status != E_OK)
{
return ERROR_BJB_READ_MEASUREMENTS_CURRENT_TD_FILL;
}

/* Wait until PHY processes the request */
Td_Wait(&BmsTDCfg_Tpl2);
if(PhyError != PHY_NO_ERROR)
{
return ERROR_BJB_READ_MEASUREMENTS_CURRENT_TD_SEND;
}
/* Check DATA_RDY bits for current measurements */
if( ((((BmsTDCfg_Tpl2).PhyTD)->Response).Data[9] & 0x8000)&
((((BmsTDCfg_Tpl2).PhyTD)->Response).Data[12] & 0x8000)&
((((BmsTDCfg_Tpl2).PhyTD)->Response).Data[24] & 0x8000)&
((((BmsTDCfg_Tpl2).PhyTD)->Response).Data[27] & 0x8000) )
{
Status = E_OK;
}
else
Status = E_NOT_OK;

if(Status != E_OK)
{
return ERROR_BJB_READ_MEASUREMENTS_CURRENT_VALUE_EXTRACT;
}

/* Read current measurements */
for(BS_Device_Addr = 1; BS_Device_Addr <= BS_DEVICE_CNT; BS_Device_Addr++)
{
/* RShunt 100 uOhm */
CcIsense[BS_Device_Addr-1].RShunt = RSHUNT;
Status |= Bcc_772c_CC_ExtractISense(BS_CHAIN_ADDR, BS_Device_Addr, &CcIsense[BS_Device_Addr-1], &BmsTDCfg_Tpl2);
PackCurrent[BS_Device_Addr-1] = CcIsense[BS_Device_Addr-1].ISense;//單位 mA
}
break;
}
} while(0);
Status = Bms_TD_Clear(&BmsTDCfg_Tpl2);

return NO_ERROR;
}

四、參考資料

1、MC33772 數據手冊

2、BJB 用戶參考手冊 UM11847

★博文內容均由個人提供,與平台無關,如有違法或侵權,請與網站管理員聯繫。

★文明上網,請理性發言。內容一周內被舉報5次,發文人進小黑屋喔~

評論