一、硬體準備
1、主控板子:S32K312 板子
2、BJB 板子:MC33772 BJB 板子
3、硬體連接:
兩個板子獨立 12V 供電,外部電流接線流經分流器 Shunt ,分流器方向從下往上流向得到正值數據。
4、BJB 測量電流電路注意事項
① 板子上預留的外部電壓模擬測試電流採樣電路需要去掉,如下圖,BJB 板子電路圖如示意圖一致
二、軟體準備
1、S32DS 軟體 IDE
2、軟體包獲取:
② 勾選 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;
}
評論