Bläddra i källkod

1.添加硬件版本识别
2.通过硬件判断硬件是否有反相器芯片

leechard.li 3 år sedan
förälder
incheckning
67a2c14fd2

+ 2 - 2
Core/Src/main.c

@@ -62,11 +62,10 @@
 #include "fault_check.h"
 #include "app_loader.h"
 #include "stm32fxx_STUlib.h"
-#include "ICM20600.h"
 #include "ctf_process.h"
 #include "log_save.h"
 #include "flash_read_protection.h"
-
+#include "hardware_check.h"
 /* USER CODE END Includes */
 
 /* Private variables ---------------------------------------------------------*/
@@ -326,6 +325,7 @@ int main(void)
 			
 			//定时发送传感器数据给TE
 			MC_TE_SensorData_Process(&MC_TE_SensorData);
+			GetHardware_Versin( ADC1_Result_Filt[ADC1_RANK_HARDWARE_VER] );
 			
 			//指拨模式计算函数
 			SpdProportion_calculate();

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 2175 - 2175
MDK-ARM/QD007A_CTL_APP/QD007A_CTL_APP_CRC.hex


BIN
MDK-ARM/bin/QD007A_CTL_APP.bin


+ 4 - 0
User/Inc/app_loader.h

@@ -21,6 +21,10 @@
 extern void IAP_Init(void);
 extern MCU_Manufacturter_Struct_t IdentifyMCUManufacturer( void );
 
+
+
+
+
 #endif /*___APP_LOADER_H__ */
 
 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

+ 4 - 1
User/Inc/hall_sensor.h

@@ -12,7 +12,9 @@
 
 #define ANGLE_60D		10922
 #define ANGLE_120D  21844
-#define HALL_ORIGIN (int8_t)0
+//#define HALL_ORIGIN (int8_t)0
+#define HALL_ORIGIN (int16_t)(-180)
+
 
 //霍尔传感器检测结果
 typedef struct
@@ -22,6 +24,7 @@ typedef struct
 	uint16_t Delta_AngleSum;                   // 67.5度内步进角累加和
 	uint16_t SVM_Angle;                        // 电角度
 	TrueOrFalse_Flag_Struct_t IsStopFlag;      // 停止标志
+	TrueOrFalse_Flag_Struct_t InverterExistFlag;
 }MC_HallSensorData_Struct_t;
 
 //霍尔传感器输出状态

+ 1 - 1
User/Inc/hardware_check.h

@@ -3,6 +3,6 @@
 
 #include <stdint.h>
 
-char GetHardware_Versin(uint16_t VolaVal);
+extern void GetHardware_Versin(uint16_t VolaVal);
 
 #endif

+ 1 - 1
User/Inc/light_driver.h

@@ -10,7 +10,7 @@ typedef struct
 	uint16_t Pin;
 }MC_LightDriver_IO_Struct_t;
 
-extern MC_LightDriver_IO_Struct_t HeadLightIO_Groups[4], TailLightIO_Groups[3]; 
+extern MC_LightDriver_IO_Struct_t HeadLightIO_Groups[3], TailLightIO_Groups[3]; 
 
 void LightDriver_Init(void);
 void LightDriver_Process(MC_TailLight_Mode_Struct_t TailLight_Mode, MC_LightVoltage_Struct_t HeadLightVol, MC_LightVoltage_Struct_t TailLightVol, TrueOrFalse_Flag_Struct_t IsBreakFlag, MC_LightSwitch_Struct_t LightSwitchCode);

+ 7 - 13
User/Src/app_loader.c

@@ -31,31 +31,25 @@ void IAP_Init(void)
 MCU_Manufacturter_Struct_t IdentifyMCUManufacturer( void )
 {
 	MCU_Manufacturter_Struct_t manufacturer = STM32F103RBT6;
-  if( (*(uint8_t *)0xE00FFFD0 == 0x05)&&(*(uint8_t *)0xE00FFFE0 == 0x9B)&&(*(uint8_t *)0xE00FFFE4 == 0x52)&&(*(uint8_t *)0xE00FFFE8 == 0x05) )
+  if( (*(uint8_t *)0xE00FFFD0 == 0x05)&&(*(uint8_t *)0xE00FFFE0 == 0x9B)&&(*(uint8_t *)0xE00FFFE4 == 0x52)&&(*(uint8_t *)0xE00FFFE8 == 0x05) ) //2̨ÑéÖ¤ÕýÈ·
 	{
     manufacturer = HK32F103RBT6;
-		MC_VerInfo.HW_Version[10] = '3';
-	}
-	else if( (*(uint32_t *)0xE0042000) == 0x13030410 )
-	{
-		manufacturer = GD32F103RBT6;
-		MC_VerInfo.HW_Version[10] = '4';
-	}		
-	else if( (*(uint8_t *)0xE00FFFD0 == 0x04)&&(*(uint8_t *)0xE00FFFE0 == 0xC3)&&(*(uint8_t *)0xE00FFFE4 == 0xB4)&&(*(uint8_t *)0xE00FFFE8 == 0x0B) )
+	}	
+	else if( (*(uint8_t *)0xE00FFFD0 == 0x04)&&(*(uint8_t *)0xE00FFFE0 == 0xC3)&&(*(uint8_t *)0xE00FFFE4 == 0xB4)&&(*(uint8_t *)0xE00FFFE8 == 0x0B) ) //4̨ÑéÖ¤ÕýÈ·
 	{
 		manufacturer = APM32F103RBT6;
-		MC_VerInfo.HW_Version[10] = '2';
 	}	
 	else if( (*(uint8_t *)0xE00FFFD0 == 0x00)&&(*(uint8_t *)0xE00FFFE0 == 0x10)&&(*(uint8_t *)0xE00FFFE4 == 0x04)&&(*(uint8_t *)0xE00FFFE8 == 0x0A) ) //4̨ÑéÖ¤ÕýÈ·
 	{
     manufacturer = STM32F103RBT6;
-		MC_VerInfo.HW_Version[10] = '1';
 	}
+	else if( (*(uint32_t *)0xE0042000) == 0x13030410 )  //2̨ÑéÖ¤ÕýÈ·
+	{
+		manufacturer = GD32F103RBT6;
+	}	
 	else
 	{
 		manufacturer = NoName;
-		MC_VerInfo.HW_Version[10] = '0';
 	}
-	
 	return manufacturer;
 }	

+ 74 - 0
User/Src/fault_check.c

@@ -793,6 +793,80 @@ void MC_Fault_Circuit_Process(MC_ErrorCode_Struct_t* p_MC_ErrorCode)
 	}
 }
 
+//硬件识别故障
+void MC_Fault_Hardware_Identify(TrueOrFalse_Flag_Struct_t TEComOKFlag, uint16_t SyncClockFreqScan, uint16_t Hardware_AD, TrueOrFalse_Flag_Struct_t *inverterExistFlag, MC_ErrorCode_Struct_t* p_MC_ErrorCode)
+{
+	static uint32_t TimeCount_HardwareFault=0;
+	static uint8_t HardwareFaultCount=0, HardwareFaultCount2=0;
+	
+	if( HAL_GetTick() < 5000) return;
+	
+	if( p_MC_ErrorCode->ERROR_Bit.Fault_Circuit == 0)  //单向器没有故障时开始检测,有故障后故障一直存在,故障检测不再执行
+	{
+		if( (HAL_GetTick()-TimeCount_HardwareFault)>=20 )  //20ms执行一次故障判断
+		{
+			TimeCount_HardwareFault = HAL_GetTick();
+			if(*inverterExistFlag == TRUE) //电路板有反相器和TE
+			{
+				if( ((TEComOKFlag == TRUE)||(SyncClockFreqScan>200))&&((Hardware_AD>1986)&&(Hardware_AD<2110)) ) 
+				{
+					HardwareFaultCount=0;	
+				}
+				else 
+				{
+					HardwareFaultCount++;
+					if( HardwareFaultCount>= 50)                  
+					{
+						HardwareFaultCount = 0;
+						p_MC_ErrorCode->ERROR_Bit.Fault_Circuit = 1;
+						//记录故障日志
+						MC_ErrorLogSaveInfo.NotesInfo1 = 6;       
+						MC_ErrorLogSaveInfo.NotesInfo2 = SyncClockFreqScan;
+						MC_ErrorLogSaveInfo.NotesInfo3 = Hardware_AD;
+						ErrorLogSave_Update(&MC_ErrorLogSaveInfo);
+						IsErrorLogSaveInfoUpdateFlag = TRUE;
+						//存储故障次数
+						MC_RunLog2.Circuit_FaultCnt++;
+						RunLogSaveIndex = 2;
+					}							
+				}		
+			}		
+			else
+			{
+				if( (TEComOKFlag == TRUE)||(SyncClockFreqScan>200) )
+				{
+					*inverterExistFlag = TRUE;
+				}
+				else
+				{
+					if( (Hardware_AD>3723)||(Hardware_AD<372) )
+					{
+						HardwareFaultCount2++;
+						if( HardwareFaultCount2>= 50)                  
+						{
+							HardwareFaultCount2 = 0;
+							p_MC_ErrorCode->ERROR_Bit.Fault_Circuit = 1;
+							//记录故障日志
+							MC_ErrorLogSaveInfo.NotesInfo1 = 6;       
+							MC_ErrorLogSaveInfo.NotesInfo2 = SyncClockFreqScan;
+							MC_ErrorLogSaveInfo.NotesInfo3 = Hardware_AD;
+							ErrorLogSave_Update(&MC_ErrorLogSaveInfo);
+							IsErrorLogSaveInfoUpdateFlag = TRUE;
+							//存储故障次数
+							MC_RunLog2.Circuit_FaultCnt++;
+							RunLogSaveIndex = 2;
+						}							
+					}
+					else
+					{
+						HardwareFaultCount2 = 0;
+					}
+				}
+			}				
+		}
+	}
+}
+
 /***********************全局函数定义***********************/
 //霍尔传感器故障检测
 void MC_Fault_HallSensor_Process(MC_HallSensorStatus_Struct_t HallSensorStatus, MC_ErrorCode_Struct_t* p_MC_ErrorCode)

+ 13 - 6
User/Src/hall_sensor.c

@@ -19,7 +19,7 @@ const uint16_t HallAngle_Data[8] =
 };
 
 //全局变量定义
-MC_HallSensorData_Struct_t MC_HallSensorData = {0, 0, 0, 0, TRUE};
+MC_HallSensorData_Struct_t MC_HallSensorData = {0, 0, 0, 0, TRUE, TRUE};
 
 /**************************局部函数定义*************************/
 
@@ -30,11 +30,18 @@ MC_HallSensorData_Struct_t MC_HallSensorData = {0, 0, 0, 0, TRUE};
 uint8_t Hall_ReadState(void)
 {
   uint8_t ReadValue;
-			
-	ReadValue = (uint8_t)(HAL_GPIO_ReadPin(HALL_C_GPIO_Port, HALL_C_Pin));        //HALL C	
-	ReadValue |= (uint8_t)(HAL_GPIO_ReadPin(HALL_B_GPIO_Port, HALL_B_Pin)) << 1;  //HALL B
-	ReadValue |= (uint8_t)(HAL_GPIO_ReadPin(HALL_A_GPIO_Port, HALL_A_Pin)) << 2;  //HALL A
-			
+  if(MC_HallSensorData.InverterExistFlag == TRUE)  //存在反相器
+	{
+		ReadValue  = (uint8_t)(HAL_GPIO_ReadPin(HALL_C_GPIO_Port, HALL_C_Pin));        //HALL C  
+		ReadValue |= (uint8_t)(HAL_GPIO_ReadPin(HALL_B_GPIO_Port, HALL_B_Pin)) << 1;  //HALL B
+		ReadValue |= (uint8_t)(HAL_GPIO_ReadPin(HALL_A_GPIO_Port, HALL_A_Pin)) << 2;  //HALL A   			
+	}
+	else                                            //不存在反相器,软件反相
+	{
+		ReadValue  = (uint8_t)((HAL_GPIO_ReadPin(HALL_C_GPIO_Port, HALL_C_Pin) == GPIO_PIN_RESET)?1:0);                //HALL C  
+		ReadValue |= (uint8_t)((HAL_GPIO_ReadPin(HALL_B_GPIO_Port, HALL_B_Pin) == GPIO_PIN_RESET)?1:0) << 1;          //HALL B
+		ReadValue |= (uint8_t)((HAL_GPIO_ReadPin(HALL_A_GPIO_Port, HALL_A_Pin) == GPIO_PIN_RESET)?1:0) <<  2;        //HALL A
+	}
   return(ReadValue & 0x07);
 }
 

+ 48 - 39
User/Src/hardware_check.c

@@ -1,48 +1,57 @@
 #include "hardware_check.h"
-
-/******************************************************************************
-* @Discrible: 通过分压电阻来识别不同的硬件版本,以0.45V为起始判断值,步进为0.3V
-******************************************************************************
-* @Recode    date       version	        author             modify 
-*          ------------------------------------------------------------------
-*          20220125      V1.0          leechard             create
-* 
-*******************************************************************************/
-const uint16_t Hardware_Table[10]={
-	558,
-	930,
-	1302,
-	1675,
-	2047,
-	2419,
-	2792,
-	3164,
-	3536,
-	3908
+#include "adc.h"
+#include "hall_sensor.h"
+const uint16_t Hardware_ADTable[9]={
+	620, //0.50V
+	930, //0.75V
+	1241,//1.00V
+	1551,//1.25V
+	2544,//2.05V
+	2854,//2.30V
+	3164,//2.55V
+	3474,//2.80V
+	4096 //3.30V
+};
+const char Hardware_VersionTable[9]={
+	'-',
+	'A', 
+	'B', 
+	'C',
+	'*',
+	'D',
+	'E',
+	'F',
+	'+'
 };
 
-/******************************************************************************
-* @Function:  char GetHardware_Versin(uint16_t VolaVal)
-* @Discrible: 通过分压电阻来识别不同的硬件版本,默认只支持10个版本
-* @Param:  采集到ADC的值
-* @Return: ASSIC对应的 'I'~'R' 超出为 '@'  
-* @Others:    
-******************************************************************************
-* @Recode    date       version	        author             modify 
-*          ------------------------------------------------------------------
-*          20220125      V1.0          leechard             create
-* 
-*******************************************************************************/
-char GetHardware_Versin(uint16_t VolaVal)
+
+void GetHardware_Versin(uint16_t VolaVal)
 {
 	uint8_t Count;
+	static _Bool VersionIdentifyExecuteFlag = FALSE;
 	
-	for(Count=0; Count<10; Count++)
+	if(HAL_GetTick() > 2000) //3soó?aê?ê?±e
 	{
-		if(VolaVal <= Hardware_Table[Count])
+		if(VersionIdentifyExecuteFlag == FALSE)
 		{
-			return 'I'+Count;
-		}
-	}
-	return '@';
+			VersionIdentifyExecuteFlag = TRUE;
+			if( (IsComOK_TE.IsOK_Flag == TRUE)||(MC_TE_SyncClockFreqScan>200)||((VolaVal>1986)&&(VolaVal<2110)) ) //óD·′?à?÷oíTEμ?μ??·°?
+			{
+				MC_HallSensorData.InverterExistFlag = TRUE;
+			}
+			else             //?T·′?à?÷oíTEμ?μ??·°?
+			{
+				MC_HallSensorData.InverterExistFlag = FALSE;
+				for(Count=0; Count<9; Count++)
+				{
+					if(VolaVal <= Hardware_ADTable[Count])
+					{
+						strncpy(MC_VerInfo.HW_Version, (char*)"TTKZ019A.", 9);
+						MC_VerInfo.HW_Version[7] =Hardware_VersionTable[Count];
+						return ;
+					}
+				}
+			}
+	  }
+  }
 }

+ 4 - 6
User/Src/light_driver.c

@@ -1,11 +1,10 @@
 #include "light_driver.h"
 
-MC_LightDriver_IO_Struct_t HeadLightIO_Groups[4] = 
+MC_LightDriver_IO_Struct_t HeadLightIO_Groups[3] = 
 {
-	{GPIOB, GPIO_PIN_4},  //QD007I版本 前灯6V
+  {GPIOB, GPIO_PIN_4|GPIO_PIN_5},  //前灯6V
   {GPIOB, GPIO_PIN_6},  //前灯12V
   {GPIOB, GPIO_PIN_7},  //前灯随电池电压
-	{GPIOB, GPIO_PIN_5},  //QD007J版本 前灯6V
 };
 MC_LightDriver_IO_Struct_t TailLightIO_Groups[3] = 
 {
@@ -22,8 +21,7 @@ static void LightDriver_IO_Control(MC_LightDriver_IO_Struct_t* IO_Groups, uint8_
 	{
 		for(i=0; i<Len; i++)
 		{
-		  //HAL_GPIO_WritePin(IO_Groups[i].Port, IO_Groups[i].Pin, (i == ID) ? GPIO_PIN_SET: GPIO_PIN_RESET);
-			HAL_GPIO_WritePin(IO_Groups[i].Port, IO_Groups[i].Pin, (i%3 == ID) ? GPIO_PIN_SET: GPIO_PIN_RESET);//同时兼容QD007I与QD007J
+		  HAL_GPIO_WritePin(IO_Groups[i].Port, IO_Groups[i].Pin, (i == ID) ? GPIO_PIN_SET: GPIO_PIN_RESET);
 	  }
 	}
 	else//关灯时,关闭所有控制IO
@@ -45,7 +43,7 @@ void LightDriver_Init(void)
 	__HAL_RCC_GPIOB_CLK_ENABLE();
 	
   /*Configure GPIO pin Output Level */
-  for(i=0; i< 4; i++)
+  for(i=0; i< 3; i++)
 	{
 	  //前灯组
 		HAL_GPIO_WritePin(HeadLightIO_Groups[i].Port, HeadLightIO_Groups[i].Pin, GPIO_PIN_RESET);

+ 1 - 1
User/Src/motor_control.c

@@ -664,7 +664,7 @@ MC_CalParam_Struct_t MC_AssistRunMode_Torque_Process(uint16_t SenorData, MC_Gear
 	uint16_t SoftStartAcc = 0;
 	#endif
 
-	#if 1
+	#if 0
 	
 	//²È̤Á¦¾ØÊäÈë
   MC_TorqueProcess_Param.TorqueApp = SenorData;

+ 9 - 0
User/Src/tasks.c

@@ -442,6 +442,15 @@ void MC_TE_SensorData_Process(MC_TE_SensorData_Struct_t* p_MC_TE_SensorData)
     }
     else if(IsSendDataToTE_Step == SENDSENSOR)//正常发送数据到TE
     {
+			//发送指令,TE不控制12V电源
+      static uint8_t Count = 0;
+      uint8_t Data[1] = {0};
+      if(Count++ <= 5)
+      {
+        SendUartDataToTE(&UART_TxBuff_Struct3, 0x07FF, MODE_WRITE, 0x1301, (uint8_t*)Data);
+        HAL_Delay(10);
+      }
+			
       SendUartDataToTE(&UART_TxBuff_Struct3, 0x07FF, MODE_REPORT, 0x1014, (uint8_t*)&p_MC_TE_SensorData->AD_Torque);
     }
 		PeriodTimeCnt = HAL_GetTick();

+ 5 - 3
User/Src/uart_process.c

@@ -11,7 +11,7 @@
 void UART_DataProcess(uint8_t Mode, uint16_t Command, uint8_t* Data)
 {
   uint8_t DataLength;
-	uint16_t Data16_Temp = 0;
+	uint16_t Data16_Temp;
 	
 	//通信正常标志
 	IsComOK_TE.IsOK_Flag = TRUE;
@@ -42,7 +42,8 @@ void UART_DataProcess(uint8_t Mode, uint16_t Command, uint8_t* Data)
 			{
 			  if(Data16_Temp < Ver_Table[i]) break;
 			}
-			MC_VerInfo.HW_Version[5] = 'I' + i;//旧版本TE不支持该指令
+//			strncpy(MC_VerInfo.HW_Version, (char*)"TTKZ010   ", 10);
+			MC_VerInfo.HW_Version[7] = 'F' + i;
 			break;
 		}
     default:
@@ -130,7 +131,8 @@ void Uart_RxData_Process(USART_Buf_TypeDef* ptUartRx, uint16_t TimeOut)
 						}
 						if((HAL_GetTick() - DelayTimeCnt) > TimeOut)//超时,单位ms
 						{
-						  UART_DelChar(ptUartRx, ptUartRx->ucBufCnt);
+//						  UART_DelChar(ptUartRx, ptUartRx->ucBufCnt);
+							DelayTimeCnt = HAL_GetTick();
 							IsWaitRX_Flag = FALSE;
 						}
 						return;

+ 13 - 12
User/Src/var.c

@@ -485,7 +485,7 @@ void Var_Init(void)
 					
 	//BMS校验信息初始化为0
 	memset((uint8_t*)BMS_CheckInfo.MAC_ID, 0, sizeof(BMS_CheckInfo));
-	
+	 
 	//HMI校验信息初始化为0
 	memset((uint8_t*)HMI_CheckInfo.MAC_ID, 0, sizeof(HMI_CheckInfo));
 	
@@ -499,25 +499,26 @@ void Var_Init(void)
 	memcpy((uint8_t*)&PBU_ConfigParam.GearsNum, (uint8_t*)&PBU_ConfigParam_Default.GearsNum, sizeof(PBU_ConfigParam_Struct_t));
 		
 	//MC版本信息初始化,Mode和SN从EEPROM读取
-  strncpy(MC_VerInfo.HW_Version, (char*)"QD007H.", 7);//长度不超过10
-	//通过分压电阻判断对应的硬件版本
-	MC_VerInfo.HW_Version[5] = GetHardware_Versin(ADC1_Result[ADC1_RANK_HARDWARE_VER]);
-
-	
-	strncpy(MC_VerInfo.FW_Version, (char*)"V6r1r0_20211202.", 16);
+	strncpy(MC_VerInfo.HW_Version, (char*)"TTKZ010D.       ", 16);
+	strncpy(MC_VerInfo.FW_Version, (char*)"V7r1r2_20220428C", 16);
 	strncpy(Firmware_Special, (char*)"TC011000-MS0000-V0r0.           ", 32);
-		
+	if(MCUManufacturer == NoName) MC_VerInfo.HW_Version[10] = '0';
+	else if(MCUManufacturer == STM32F103RBT6) MC_VerInfo.HW_Version[10] = '1';
+	else if(MCUManufacturer == APM32F103RBT6) MC_VerInfo.HW_Version[10] = '2';
+	else if(MCUManufacturer == HK32F103RBT6) MC_VerInfo.HW_Version[10] = '3';
+	else if(MCUManufacturer == GD32F103RBT6) MC_VerInfo.HW_Version[10] = '4';
+	else MC_VerInfo.HW_Version[10] = '0';
 	//电机型号
-	strncpy(MC_VerInfo.Mode, (char*)"VL65XX & VS75XX.", 16);
+	strncpy(MC_VerInfo.Mode, (char*)"PG80XX & PSX0XX.", 16);
 	
 	//电机序列号
 	strncpy(MC_VerInfo.SN_Num, (char*)"0000000000000000", 16);
 	
 	//生产信息
-	strncpy(MC_MacInfo.Manufacturer, (char*)"TTIUM.  ", 8);  //生产信息
+	strncpy(MC_MacInfo.Manufacturer, (char*)"MOTINOVA", 8);  //生产信息
 	strncpy(MC_MacInfo.MacAddr, (char*)"WUHAN.  ", 8);
-	strncpy(MC_MacInfo.MacDate, (char*)"20210101", 8);
-		
+	strncpy(MC_MacInfo.MacDate, (char*)"20210901", 8);
+
 	//MCU ID读取
 	memcpy((uint8_t*)MC_CheckInfo.MAC_ID, (uint8_t*)(0x1FFFF7E8), 12);
 	

Vissa filer visades inte eftersom för många filer har ändrats