浏览代码

初版测试完成,完成2个循环充放电,无异常。

Dail 1 年之前
父节点
当前提交
28b69b8d91
共有 7 个文件被更改,包括 2752 次插入2567 次删除
  1. 3 3
      Core/Src/can.c
  2. 2530 2530
      MDK-ARM/QD007A_CTL_APP/QD007A_CTL_APP_CRC.hex
  3. 二进制
      MDK-ARM/bin/QD007A_CTL_APP.bin
  4. 3 1
      User/Inc/bms_magene.h
  5. 164 28
      User/Src/bms_magene.c
  6. 50 3
      User/Src/can_process.c
  7. 2 2
      User/Src/var.c

+ 3 - 3
Core/Src/can.c

@@ -214,7 +214,7 @@ void HAL_CAN_RxCpltCallback(CAN_HandleTypeDef *CanHandle)
 			CAN_Rx_ISR(&CAN_RxBuf_Struct_CDL,CanHandle->pRxMsg->DLC);
 			break;
 		}
-		case ID_PBU_TO_BMS: case ID_CDL_TO_BMS://接收仪表和CDL发送BMS的数据
+		case ID_PBU_TO_BMS: case ID_HMI_TO_BMS: case ID_CDL_TO_BMS://接收仪表和CDL发送BMS的数据
 		{
 		  CAN_RxBuf_Struct_To_BMS.ucBufID = CanHandle->pRxMsg->StdId;
 			CAN_Rx_ISR(&CAN_RxBuf_Struct_To_BMS,CanHandle->pRxMsg->DLC);
@@ -303,7 +303,7 @@ void CANFilterConfig_Scale32_IdMask_StandardIdOnly(void)
 {
   CAN_FilterConfTypeDef  sFilterConfig;  
   
-	//设置过滤器组0,指定接收发送给PBU和CDL的数据
+	//设置过滤器组0,指定接收发送给MC的数据
   sFilterConfig.FilterNumber = 0;//使用过滤器0             
   sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;//配置为掩码模式   
   sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;//设置为32位宽 
@@ -347,7 +347,7 @@ void CANFilterConfig_Scale32_IdMask_StandardIdOnly(void)
     Error_Handler();  
   }
 
-  //设置过滤器组2,指定接收enviolo的报文
+  //设置过滤器组2,指定接收读取BMS的报文
   sFilterConfig.FilterNumber = 2;             
   sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;//配置为掩码模式    
   sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;//设置为32位宽  

文件差异内容过多而无法显示
+ 2530 - 2530
MDK-ARM/QD007A_CTL_APP/QD007A_CTL_APP_CRC.hex


二进制
MDK-ARM/bin/QD007A_CTL_APP.bin


+ 3 - 1
User/Inc/bms_magene.h

@@ -10,6 +10,7 @@
 #define  BMS_MAGENE_BASE_RPDO 0x200
 
 //µç³ØµØÖ·
+#define BMS_MAGENE_ADDRESS_COM  0x10
 #define BMS_MAGENE_ADDRESS_MAIN 0x11
 #define BMS_MAGENE_ADDRESS_BACK 0x12
 
@@ -83,7 +84,8 @@ typedef struct
 {
     uint8_t PageID;
     uint8_t Code;
-    uint32_t Time;
+    uint16_t TimeH;
+    uint16_t TimeL;
     uint16_t DesignVol;
 }BMS_Magene_RtcInfo_Struct;
 

+ 164 - 28
User/Src/bms_magene.c

@@ -17,7 +17,8 @@ void BMS_InfoUpdate(void)
     else
         PeriodCnt = HAL_GetTick();
     //仅主电池打开
-    if((BMS_Magene_TPDOInfo_Main.BaseInfo.WorkState == 2) && (BMS_Magene_TPDOInfo_Back.BaseInfo.WorkState != 2))
+    if(((BMS_Magene_TPDOInfo_Main.BaseInfo.WorkState == 2) || (BMS_Magene_TPDOInfo_Main.BaseInfo.WorkState == 3)) && 
+	   ((BMS_Magene_TPDOInfo_Back.BaseInfo.WorkState != 2) && (BMS_Magene_TPDOInfo_Back.BaseInfo.WorkState != 3)))
     {
         //运行信息
         BMS_RunInfo.Voltage = BMS_Magene_TPDOInfo_Main.BaseInfo.Voltage;
@@ -58,15 +59,15 @@ void BMS_InfoUpdate(void)
         strcpy(BMS_DesignInfo.CellMode, "NONE    ");
         BMS_DesignInfo.CellNum = 0;
         //版本信息
-				strcpy(BMS_VerInfo.Mode, "MAGENE          ");
-				strcpy(BMS_VerInfo.SN_Num, "");
-				strcpy(BMS_VerInfo.HW_Version, "");
-			  strcpy(BMS_VerInfo.FW_Version, "");
+        strcpy(BMS_VerInfo.Mode, "MAGENE          ");
+        strcpy(BMS_VerInfo.SN_Num, "00000001");
+        strcpy(BMS_VerInfo.HW_Version, "V100");
+        strcpy(BMS_VerInfo.FW_Version, "V100");
         //生产信息
-				strcpy(BMS_MacInfo.Manufacturer, "MAGENE  ");
-				strcpy(BMS_MacInfo.MacAddr, "");
-				strcpy(BMS_MacInfo.MacDate, "");
-				strcpy(BMS_MacInfo.ProductTag, "");				
+        strcpy(BMS_MacInfo.Manufacturer, "MAGENE  ");
+        strcpy(BMS_MacInfo.MacAddr, "");
+        strcpy(BMS_MacInfo.MacDate, "");
+        strcpy(BMS_MacInfo.ProductTag, "");				
         //使用记录
         BMS_UsrLog.Max_Tmp = BMS_Magene_TPDOInfo_Main.TmpInfo.CellT_Max;
         BMS_UsrLog.Min_Tmp = BMS_Magene_TPDOInfo_Main.TmpInfo.CellT_Min;
@@ -74,7 +75,8 @@ void BMS_InfoUpdate(void)
         BMS_UsrLog.MaxChgTime = BMS_Magene_TPDOInfo_Main.StaInfo.MaxChargeTime;       
     }
     //仅副电池打开
-    else if((BMS_Magene_TPDOInfo_Main.BaseInfo.WorkState != 2) && (BMS_Magene_TPDOInfo_Back.BaseInfo.WorkState == 2))
+    else if(((BMS_Magene_TPDOInfo_Back.BaseInfo.WorkState == 2) || (BMS_Magene_TPDOInfo_Back.BaseInfo.WorkState == 3)) && 
+			((BMS_Magene_TPDOInfo_Main.BaseInfo.WorkState != 2) && (BMS_Magene_TPDOInfo_Main.BaseInfo.WorkState != 3)))
     {
         //运行信息
         BMS_RunInfo.Voltage = BMS_Magene_TPDOInfo_Back.BaseInfo.Voltage;
@@ -115,15 +117,15 @@ void BMS_InfoUpdate(void)
         strcpy(BMS_DesignInfo.CellMode, "NONE    ");
         BMS_DesignInfo.CellNum = 0;
         //版本信息
-				strcpy(BMS_VerInfo.Mode, "MAGENE          ");
-				strcpy(BMS_VerInfo.SN_Num, "");
-				strcpy(BMS_VerInfo.HW_Version, "");
-			  strcpy(BMS_VerInfo.FW_Version, "");
+        strcpy(BMS_VerInfo.Mode, "MAGENE          ");
+        strcpy(BMS_VerInfo.SN_Num, "");
+        strcpy(BMS_VerInfo.HW_Version, "");
+        strcpy(BMS_VerInfo.FW_Version, "");
         //生产信息
-				strcpy(BMS_MacInfo.Manufacturer, "MAGENE  ");
-				strcpy(BMS_MacInfo.MacAddr, "");
-				strcpy(BMS_MacInfo.MacDate, "");
-				strcpy(BMS_MacInfo.ProductTag, "");	
+        strcpy(BMS_MacInfo.Manufacturer, "MAGENE  ");
+        strcpy(BMS_MacInfo.MacAddr, "");
+        strcpy(BMS_MacInfo.MacDate, "");
+        strcpy(BMS_MacInfo.ProductTag, "");	
         //使用记录
         BMS_UsrLog.Max_Tmp = BMS_Magene_TPDOInfo_Back.TmpInfo.CellT_Max;
         BMS_UsrLog.Min_Tmp = BMS_Magene_TPDOInfo_Back.TmpInfo.CellT_Min;
@@ -131,7 +133,8 @@ void BMS_InfoUpdate(void)
         BMS_UsrLog.MaxChgTime = BMS_Magene_TPDOInfo_Back.StaInfo.MaxChargeTime;
     }
     //主副电池同时打开
-    else if((BMS_Magene_TPDOInfo_Main.BaseInfo.WorkState == 2) && (BMS_Magene_TPDOInfo_Back.BaseInfo.WorkState == 2))
+    else if(((BMS_Magene_TPDOInfo_Main.BaseInfo.WorkState == 2) || (BMS_Magene_TPDOInfo_Main.BaseInfo.WorkState == 3)) && 
+			((BMS_Magene_TPDOInfo_Back.BaseInfo.WorkState == 2) || (BMS_Magene_TPDOInfo_Back.BaseInfo.WorkState == 3)))
     {
         //暂不考虑
     }        
@@ -140,7 +143,14 @@ void BMS_InfoUpdate(void)
 /*BMS开关控制*/
 void BMS_SwitchCtl(void)
 {
-    //暂时只考虑单电池,电池需要先打开
+    //发送通用指令,主副电池同时发开,定时1s发送
+    static uint32_t PeriodCnt = 0;
+    uint8_t SendData[8] = {0xE4, 0x06, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00};
+    if((HAL_GetTick() - PeriodCnt) >= 1000)
+    {
+        PeriodCnt = HAL_GetTick();
+        CAN_SendData(BMS_MAGENE_BASE_RPDO + BMS_MAGENE_ADDRESS_COM, SendData, sizeof(SendData));
+    }
 }
 
 /*BMS在线检测*/
@@ -167,7 +177,70 @@ void BMS_CanProcess(BMS_Magene_CanData_Struct_t* CanData)
         {
             if(CanData->Data[0] == BMS_MAGENE_STATUS_PAGE_ID) //识别PageID
             {
-                memcpy((uint8_t*)&BMS_Magene_TPDOInfo_Main.BaseInfo.PageID + (CanData->Data[1] - 9) * 8 + 2, (uint8_t*)CanData->Data + 2, 6); //起始状态码为0x09
+                switch(CanData->Data[1]) //根据指令码放置不同位置
+                {
+                    case BMS_MAGENE_FUC_CODE_BASE_INFO:
+                    {
+                        memcpy((uint8_t*)&BMS_Magene_TPDOInfo_Main.BaseInfo.PageID + 2, (uint8_t*)CanData->Data + 2, 6);
+                        break;
+                    }
+                    case BMS_MAGENE_FUC_CODE_CAP_INFO:
+                    {
+                        memcpy((uint8_t*)&BMS_Magene_TPDOInfo_Main.CapInfo.PageID + 2, (uint8_t*)CanData->Data + 2, 6);
+                        break;
+                    }
+                    case BMS_MAGENE_FUC_CODE_CYC_INFO:
+                    {
+                        memcpy((uint8_t*)&BMS_Magene_TPDOInfo_Main.CycInfo.PageID + 2, (uint8_t*)CanData->Data + 2, 6);
+                        break;
+                    }
+                    case BMS_MAGENE_FUC_CODE_STA_INFO:
+                    {
+                        memcpy((uint8_t*)&BMS_Magene_TPDOInfo_Main.StaInfo.PageID + 2, (uint8_t*)CanData->Data + 2, 6);
+                        break;
+                    }
+                    case BMS_MAGENE_FUC_CODE_RTC_INFO:
+                    {
+                        memcpy((uint8_t*)&BMS_Magene_TPDOInfo_Main.RtcInfo.PageID + 2, (uint8_t*)CanData->Data + 2, 6);
+                        break;
+                    }
+                    case BMS_MAGENE_FUC_CODE_CELL1_INFO:
+                    {
+                        memcpy((uint8_t*)&BMS_Magene_TPDOInfo_Main.CellInfo1.PageID + 2, (uint8_t*)CanData->Data + 2, 6);
+                        break;
+                    }
+                    case BMS_MAGENE_FUC_CODE_CELL2_INFO:
+                    {
+                        memcpy((uint8_t*)&BMS_Magene_TPDOInfo_Main.CellInfo2.PageID + 2, (uint8_t*)CanData->Data + 2, 6);
+                        break;
+                    }
+                    case BMS_MAGENE_FUC_CODE_CELL3_INFO:
+                    {
+                        memcpy((uint8_t*)&BMS_Magene_TPDOInfo_Main.CellInfo3.PageID + 2, (uint8_t*)CanData->Data + 2, 6);
+                        break;
+                    }
+                    case BMS_MAGENE_FUC_CODE_CELL4_INFO:
+                    {
+                        memcpy((uint8_t*)&BMS_Magene_TPDOInfo_Main.CellInfo4.PageID + 2, (uint8_t*)CanData->Data + 2, 6);
+                        break;
+                    }
+                    case BMS_MAGENE_FUC_CODE_CELL5_INFO:
+                    {
+                        memcpy((uint8_t*)&BMS_Magene_TPDOInfo_Main.CellInfo5.PageID + 2, (uint8_t*)CanData->Data + 2, 6);
+                        break;
+                    }
+                    case BMS_MAGENE_FUC_CODE_TMP_INFO:
+                    {
+                        memcpy((uint8_t*)&BMS_Magene_TPDOInfo_Main.TmpInfo.PageID + 2, (uint8_t*)CanData->Data + 2, 6);
+                        break;
+                    }
+                    case BMS_MAGENE_FUC_CODE_SW_INFO:
+                    {
+                        memcpy((uint8_t*)&BMS_Magene_TPDOInfo_Main.BatStInfo.PageID + 2, (uint8_t*)CanData->Data + 2, 6);
+                        break;
+                    }
+                    default:break;
+                }
             }
             BMS_Magene_OnLineCheck_Main.OnLineFlag = 1;
             BMS_Magene_OnLineCheck_Main.TimeCnt = HAL_GetTick();
@@ -176,17 +249,80 @@ void BMS_CanProcess(BMS_Magene_CanData_Struct_t* CanData)
         {
             if(CanData->Data[0] == BMS_MAGENE_STATUS_PAGE_ID) //识别PageID
             {
-                memcpy((uint8_t*)&BMS_Magene_TPDOInfo_Back.BaseInfo.PageID + (CanData->Data[1] - 9) * 8 + 2, (uint8_t*)CanData->Data + 2, 6); //起始状态码为0x09
+                switch(CanData->Data[1]) //根据指令码放置不同位置
+                {
+                    case BMS_MAGENE_FUC_CODE_BASE_INFO:
+                    {
+                        memcpy((uint8_t*)&BMS_Magene_TPDOInfo_Back.BaseInfo.PageID + 2, (uint8_t*)CanData->Data + 2, 6);
+                        break;
+                    }
+                    case BMS_MAGENE_FUC_CODE_CAP_INFO:
+                    {
+                        memcpy((uint8_t*)&BMS_Magene_TPDOInfo_Back.CapInfo.PageID + 2, (uint8_t*)CanData->Data + 2, 6);
+                        break;
+                    }
+                    case BMS_MAGENE_FUC_CODE_CYC_INFO:
+                    {
+                        memcpy((uint8_t*)&BMS_Magene_TPDOInfo_Back.CycInfo.PageID + 2, (uint8_t*)CanData->Data + 2, 6);
+                        break;
+                    }
+                    case BMS_MAGENE_FUC_CODE_STA_INFO:
+                    {
+                        memcpy((uint8_t*)&BMS_Magene_TPDOInfo_Back.StaInfo.PageID + 2, (uint8_t*)CanData->Data + 2, 6);
+                        break;
+                    }
+                    case BMS_MAGENE_FUC_CODE_RTC_INFO:
+                    {
+                        memcpy((uint8_t*)&BMS_Magene_TPDOInfo_Back.RtcInfo.PageID + 2, (uint8_t*)CanData->Data + 2, 6);
+                        break;
+                    }
+                    case BMS_MAGENE_FUC_CODE_CELL1_INFO:
+                    {
+                        memcpy((uint8_t*)&BMS_Magene_TPDOInfo_Back.CellInfo1.PageID + 2, (uint8_t*)CanData->Data + 2, 6);
+                        break;
+                    }
+                    case BMS_MAGENE_FUC_CODE_CELL2_INFO:
+                    {
+                        memcpy((uint8_t*)&BMS_Magene_TPDOInfo_Back.CellInfo2.PageID + 2, (uint8_t*)CanData->Data + 2, 6);
+                        break;
+                    }
+                    case BMS_MAGENE_FUC_CODE_CELL3_INFO:
+                    {
+                        memcpy((uint8_t*)&BMS_Magene_TPDOInfo_Back.CellInfo3.PageID + 2, (uint8_t*)CanData->Data + 2, 6);
+                        break;
+                    }
+                    case BMS_MAGENE_FUC_CODE_CELL4_INFO:
+                    {
+                        memcpy((uint8_t*)&BMS_Magene_TPDOInfo_Back.CellInfo4.PageID + 2, (uint8_t*)CanData->Data + 2, 6);
+                        break;
+                    }
+                    case BMS_MAGENE_FUC_CODE_CELL5_INFO:
+                    {
+                        memcpy((uint8_t*)&BMS_Magene_TPDOInfo_Back.CellInfo5.PageID + 2, (uint8_t*)CanData->Data + 2, 6);
+                        break;
+                    }
+                    case BMS_MAGENE_FUC_CODE_TMP_INFO:
+                    {
+                        memcpy((uint8_t*)&BMS_Magene_TPDOInfo_Back.TmpInfo.PageID + 2, (uint8_t*)CanData->Data + 2, 6);
+                        break;
+                    }
+                    case BMS_MAGENE_FUC_CODE_SW_INFO:
+                    {
+                        memcpy((uint8_t*)&BMS_Magene_TPDOInfo_Back.BatStInfo.PageID + 2, (uint8_t*)CanData->Data + 2, 6);
+                        break;
+                    }
+                    default:break;
+                }
             }
             BMS_Magene_OnLineCheck_Back.OnLineFlag = 1;
             BMS_Magene_OnLineCheck_Back.TimeCnt = HAL_GetTick();
         }
-				//电池通信正常标志置位,用于续航计算
-				RemainDis.IsBMS_ComOK_Flag = TRUE;              
-				RemainDis.BMS_Com_DelayTimeCnt = HAL_GetTick();
-				//BMS通信正常标志置位
-			  IsComOK_BMS.IsOK_Flag = TRUE;
-			  IsComOK_BMS.OK_TrigTime = HAL_GetTick();
+        //电池通信正常标志置位,用于续航计算
+        RemainDis.IsBMS_ComOK_Flag = TRUE;
+        RemainDis.BMS_Com_DelayTimeCnt = HAL_GetTick();
+        //BMS通信正常标志置位
+        IsComOK_BMS.IsOK_Flag = TRUE;
+        IsComOK_BMS.OK_TrigTime = HAL_GetTick();
         CanData->RefreshFlag = 0;
     }
 }

+ 50 - 3
User/Src/can_process.c

@@ -128,13 +128,13 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 		}
 		
 		//处理仪表发送BMS的指令
-		case ID_PBU_TO_BMS: case ID_CDL_TO_BMS:
+		case ID_PBU_TO_BMS:
 		{
 			if((BMS_Magene_OnLineCheck_Main.OnLineFlag == 1) || (BMS_Magene_OnLineCheck_Back.OnLineFlag == 1))
 			{
 				switch(Cmd)
 				{
-					//仪表指令
+					//OBC指令
 					case 0x5000: //读取运行信息
 					{
 						SendData(ID_BMS_BC, MODE_REPORT, 0x1010, (uint8_t*)&BMS_RunInfo.Voltage);
@@ -159,7 +159,54 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 					{
 						SendData(ID_BMS_BC, MODE_REPORT, 0x1810, (uint8_t*)&BMS_UsrLog.Max_Tmp);
 						break;
+					}					
+					default:break;
+				}
+			}		  
+			break;
+		}
+		
+        //处理HMI发送BMS指令
+		case ID_HMI_TO_BMS:
+		{
+			if((BMS_Magene_OnLineCheck_Main.OnLineFlag == 1) || (BMS_Magene_OnLineCheck_Back.OnLineFlag == 1))
+			{
+				switch(Cmd)
+				{
+					//OBC指令
+					case 0x5000: //读取版本信息
+					{
+						SendData(ID_BMS_BC, MODE_REPORT, 0x1540, (uint8_t*)&BMS_VerInfo.Mode);
+						break;
+					}
+					case 0x5100: //读取设计信息
+					{
+						SendData(ID_BMS_BC, MODE_REPORT, 0x1410, (uint8_t*)&BMS_DesignInfo.Capacity);
+						break;
+					}
+					case 0x5200: //读取电芯电压
+					{
+						SendData(ID_BMS_BC, MODE_REPORT, 0x1120, (uint8_t*)&BMS_CellVol.Cell1);
+						break;
 					}
+					case 0x5300: //读取使用记录
+					{
+						SendData(ID_BMS_BC, MODE_REPORT, 0x1810, (uint8_t*)&BMS_UsrLog.Max_Tmp);
+						break;
+					}				
+					default:break;
+				}
+			}		  
+			break;
+		}
+
+		//处理CDL发送BMS指令
+		case ID_CDL_TO_BMS:
+		{
+			if((BMS_Magene_OnLineCheck_Main.OnLineFlag == 1) || (BMS_Magene_OnLineCheck_Back.OnLineFlag == 1))
+			{
+				switch(Cmd)
+				{					
 					//CDL指令
 					case 0x3300: //读取版本信息
 					{
@@ -191,7 +238,7 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 			}		  
 			break;
 		}
-		
+
 		//处理PBU发送的指令
 		case ID_PBU_BC: case ID_PBU_TO_MC:
 		{	  		

+ 2 - 2
User/Src/var.c

@@ -689,7 +689,7 @@ void Var_Init(void)
 	
   //软件版本	
 	#if defined BARD_250K
-  strncpy(MC_VerInfo.FW_Version, (char*)"V7r2r3_20231118C", 16);
+  strncpy(MC_VerInfo.FW_Version, (char*)"V7r2r3_20240620C", 16);
 	#elif defined BARD_125K
 	strncpy(MC_VerInfo.FW_Version, (char*)"V3r4r3_20231118C", 16);
 	#else
@@ -700,7 +700,7 @@ void Var_Init(void)
 	MC_VerInfo.FW_Version[15] = '.';
   #endif
 	//软件标识
-	strncpy(Firmware_Special, (char*)"TC011000-MS0000-V0r0.           ", 32);
+	strncpy(Firmware_Special, (char*)"EC2024X039-GA0067-V0r1.           ", 32);
 	//编译时间
 	do
 	{

部分文件因为文件数量过多而无法显示