Преглед изворни кода

与航顺程序保持一致

white.xu пре 3 година
родитељ
комит
03c9ba887d

+ 1 - 1
Core/Inc/main.h

@@ -49,7 +49,7 @@
 
 /* Private define ------------------------------------------------------------*/
 #define DEBUG 1
-
+#define NormalWork 1
 #define BREAK_IN_Pin GPIO_PIN_12
 #define BREAK_IN_GPIO_Port GPIOB
 #define BREAK_IN_EXTI_IRQn EXTI15_10_IRQn

+ 28 - 4
Core/Src/adc.c

@@ -480,7 +480,7 @@ void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
 	//更新母线电压 
 	BusVoltageFltSum += ((ADC1_Result[ADC1_RANK_VIN] << 10) - BusVoltageFltSum) >> 9;
 	MC_RunInfo.BusVoltage = (uint32_t)((BusVoltageFltSum >> 10) * 18382) >> 10;//3300 * 1047 / (4095 * 47)
-	MC_RunInfo.BusVoltage += (MC_RunInfo.BusCurrent >> 7) * 26; //根据母线电流和估算的线阻进行补偿, 补偿电阻 0.2 * 128 = 25.6
+	MC_RunInfo.BusVoltage += (MC_RunInfo.BusCurrent >> 7) * 12; //根据母线电流和估算的线阻进行补偿, 补偿电阻 0.2 * 128 = 25.6
 	if( MCUManufacturer == HK32F103RBT6 )
 	{
 	   MC_RunInfo.BusVoltage = ((MC_RunInfo.BusVoltage - 8100) * 1402) >> 10;
@@ -488,7 +488,7 @@ void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
 	
 	//更新母线电流
 	Temp_32 = (ADC1_Result[ADC1_RANK_CURRENT] - uw_current_offset) * 50000 >> 11;
-	Temp_32 = (Temp_32 <= 0) ? 0 : Temp_32;
+	Temp_32 = (Temp_32 <= 0) ? 0 : ((Temp_32 >= 50000) ? 50000 : Temp_32);
 	IdcFltSum += ((Temp_32 << 10) - IdcFltSum) >> 9;
 	MC_RunInfo.BusCurrent = IdcFltSum >> 10;
 	
@@ -560,7 +560,31 @@ void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
 			Temp_32 = ((Temp_32 <= 0) ? 0 : Temp_32 / 2);
 			break;
 		}
-		default://超过2个传感器异常
+		case 0x03://传感器1 2异常,取传感器3
+		{
+			Temp_16 = (ADC1_Result[ADC1_RANK_TORQUE_SENSOR_3] - TorqueSensor_3_Param.Torque_OffSetData.PresentData) * 100 / TorqueSensor_3_Param.Torque_Cal_K;
+			Temp_16 = (Temp_16 <= 0) ? 0 : Temp_16;
+			MC_RunInfo.TorqueSensorData3 = Temp_16 / 28;
+			Temp_32 = Temp_16;
+			break;
+		}
+		case 0x05://传感器1 3异常,取传感器2
+		{
+			Temp_16 = (ADC1_Result[ADC1_RANK_TORQUE_SENSOR_2] - TorqueSensor_2_Param.Torque_OffSetData.PresentData) * 100 / TorqueSensor_2_Param.Torque_Cal_K;
+			Temp_16 = (Temp_16 <= 0) ? 0 : Temp_16;
+			MC_RunInfo.TorqueSensorData2 = Temp_16 / 28;
+			Temp_32 = Temp_16;
+			break;
+		}
+		case 0x06://传感器2 3异常,取传感器1
+		{
+			Temp_16 = (ADC1_Result[ADC1_RANK_TORQUE_SENSOR_1] - TorqueSensor_1_Param.Torque_OffSetData.PresentData) * 100 / TorqueSensor_1_Param.Torque_Cal_K;
+			Temp_16 = (Temp_16 <= 0) ? 0 : Temp_16;
+			MC_RunInfo.TorqueSensorData1 = Temp_16 / 28;
+			Temp_32 = Temp_16;
+			break;
+		}	
+		default://超过3个传感器异常
 		{
 		  Temp_32 = 0;
 			break;
@@ -568,7 +592,7 @@ void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
 	}
 	
 	#if 1 //采用原始采集值
-	  #if 1 //正常运行
+	  #if NormalWork //正常运行
 	  ADC_SensorData.TorqueSensor = Temp_32;
 	  #else //用于寿命测试,模拟输入力矩
 	  if(HAL_GetTick() < 5000)

+ 1 - 1
Core/Src/usart.c

@@ -58,7 +58,7 @@ void MX_USART3_UART_Init(void)
 {
 
   huart3.Instance = USART3;
-  huart3.Init.BaudRate = 9696;
+  huart3.Init.BaudRate = 9600;
   huart3.Init.WordLength = UART_WORDLENGTH_8B;
   huart3.Init.StopBits = UART_STOPBITS_1;
   huart3.Init.Parity = UART_PARITY_NONE;

+ 1 - 1
MDK-ARM/QD007A_CTL_APP.uvprojx

@@ -15,7 +15,7 @@
         <TargetCommonOption>
           <Device>STM32F103RB</Device>
           <Vendor>STMicroelectronics</Vendor>
-          <PackID>Keil.STM32F1xx_DFP.1.1.0</PackID>
+          <PackID>Keil.STM32F1xx_DFP.2.3.0</PackID>
           <PackURL>http://www.keil.com/pack/</PackURL>
           <Cpu>IROM(0x08000000,0x20000) IRAM(0x20000000,0x5000) CPUTYPE("Cortex-M3") CLOCK(12000000) ELITTLE</Cpu>
           <FlashUtilSpec></FlashUtilSpec>

Разлика између датотеке није приказан због своје велике величине
+ 2404 - 2404
MDK-ARM/QD007A_CTL_APP/QD007A_CTL_APP_CRC.hex


BIN
MDK-ARM/bin/QD007A_CTL_APP.bin


+ 6 - 6
MDK-ARM/startup_stm32f103xb.lst

@@ -524,12 +524,12 @@ ork --depend=.\qd007a_ctl_app\startup_stm32f103xb.d -o.\qd007a_ctl_app\startup_
 ARM Macro Assembler    Page 9 
 
 
-stm32f103xb.o -ID:\MOTINOVA系统\Motor\TT_KZ_010A\TT-KZ-010A_CTRL_APP_HK32\TT-KZ
--010A_CTRL_APP\MDK-ARM\RTE\_QD007A_CTL_APP -IC:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.
-0\CMSIS\Include -IC:\Keil_v5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include -
--predefine="__MICROLIB SETA 1" --predefine="__UVISION_VERSION SETA 522" --prede
-fine="_RTE_ SETA 1" --predefine="STM32F10X_MD SETA 1" --list=startup_stm32f103x
-b.lst startup_stm32f103xb.s
+stm32f103xb.o -ID:\MOTINOVA系统\Motor\Pegasi\TC013097-CXW2201创新维定制程序\TT-
+KZ-010A_CTRL_APP\MDK-ARM\RTE\_QD007A_CTL_APP -IC:\Keil_v5\ARM\PACK\ARM\CMSIS\5.
+0.0\CMSIS\Include -IC:\Keil_v5\ARM\PACK\Keil\STM32F1xx_DFP\2.3.0\Device\Include
+ --predefine="__MICROLIB SETA 1" --predefine="__UVISION_VERSION SETA 522" --pre
+define="_RTE_ SETA 1" --predefine="STM32F10X_MD SETA 1" --list=startup_stm32f10
+3xb.lst startup_stm32f103xb.s
 
 
 

+ 7 - 7
MDK-ARM/stm32f1xx_stucpuregsaddressing.lst

@@ -123,19 +123,19 @@ ARM Macro Assembler    Page 2
    99 00000096                 END
 Command Line: --debug --xref --diag_suppress=9931 --cpu=Cortex-M3 --apcs=interw
 ork --depend=.\qd007a_ctl_app\stm32f1xx_stucpuregsaddressing.d -o.\qd007a_ctl_a
-pp\stm32f1xx_stucpuregsaddressing.o -ID:\MOTINOVA系统\Motor\TT_KZ_010A\TT-KZ-01
-0A_CTRL_APP_HK32\TT-KZ-010A_CTRL_APP\MDK-ARM\RTE\_QD007A_CTL_APP -IC:\Keil_v5\A
-RM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include -IC:\Keil_v5\ARM\PACK\Keil\STM32F1xx_DFP\
-1.1.0\Device\Include --predefine="__MICROLIB SETA 1" --predefine="__UVISION_VER
-SION SETA 522" --predefine="_RTE_ SETA 1" --predefine="STM32F10X_MD SETA 1" --l
+pp\stm32f1xx_stucpuregsaddressing.o -ID:\MOTINOVA系统\Motor\Pegasi\TC013097-CXW
+2201创新维定制程序\TT-KZ-010A_CTRL_APP\MDK-ARM\RTE\_QD007A_CTL_APP -IC:\Keil_v5
+\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include -IC:\Keil_v5\ARM\PACK\Keil\STM32F1xx_DF
+P\2.3.0\Device\Include --predefine="__MICROLIB SETA 1" --predefine="__UVISION_V
+ERSION SETA 522" --predefine="_RTE_ SETA 1" --predefine="STM32F10X_MD SETA 1" -
 
 
 
 ARM Macro Assembler    Page 3 
 
 
-ist=stm32f1xx_stucpuregsaddressing.lst ..\SelfTestUser\src_specific\stm32f1xx_S
-TUCpuRegsAddressing.s
+-list=stm32f1xx_stucpuregsaddressing.lst ..\SelfTestUser\src_specific\stm32f1xx
+_STUCpuRegsAddressing.s
 
 
 

+ 7 - 7
MDK-ARM/stm32f1xx_stucpuwalkpatkeil.lst

@@ -1593,13 +1593,13 @@ ARM Macro Assembler    Page 25
  1172 000006D0                 END
 Command Line: --debug --xref --diag_suppress=9931 --cpu=Cortex-M3 --apcs=interw
 ork --depend=.\qd007a_ctl_app\stm32f1xx_stucpuwalkpatkeil.d -o.\qd007a_ctl_app\
-stm32f1xx_stucpuwalkpatkeil.o -ID:\MOTINOVA系统\Motor\TT_KZ_010A\TT-KZ-010A_CTR
-L_APP_HK32\TT-KZ-010A_CTRL_APP\MDK-ARM\RTE\_QD007A_CTL_APP -IC:\Keil_v5\ARM\PAC
-K\ARM\CMSIS\5.0.0\CMSIS\Include -IC:\Keil_v5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\
-Device\Include --predefine="__MICROLIB SETA 1" --predefine="__UVISION_VERSION S
-ETA 522" --predefine="_RTE_ SETA 1" --predefine="STM32F10X_MD SETA 1" --list=st
-m32f1xx_stucpuwalkpatkeil.lst ..\SelfTestUser\src_specific\stm32f1xx_STUCpuWalk
-patKEIL.s
+stm32f1xx_stucpuwalkpatkeil.o -ID:\MOTINOVA系统\Motor\Pegasi\TC013097-CXW2201创
+新维定制程序\TT-KZ-010A_CTRL_APP\MDK-ARM\RTE\_QD007A_CTL_APP -IC:\Keil_v5\ARM\P
+ACK\ARM\CMSIS\5.0.0\CMSIS\Include -IC:\Keil_v5\ARM\PACK\Keil\STM32F1xx_DFP\2.3.
+0\Device\Include --predefine="__MICROLIB SETA 1" --predefine="__UVISION_VERSION
+ SETA 522" --predefine="_RTE_ SETA 1" --predefine="STM32F10X_MD SETA 1" --list=
+stm32f1xx_stucpuwalkpatkeil.lst ..\SelfTestUser\src_specific\stm32f1xx_STUCpuWa
+lkpatKEIL.s
 
 
 

+ 7 - 7
MDK-ARM/stm32f1xx_sturamwalkpatkeil.lst

@@ -430,13 +430,13 @@ ARM Macro Assembler    Page 7
   331 000001F2                 END
 Command Line: --debug --xref --diag_suppress=9931 --cpu=Cortex-M3 --apcs=interw
 ork --depend=.\qd007a_ctl_app\stm32f1xx_sturamwalkpatkeil.d -o.\qd007a_ctl_app\
-stm32f1xx_sturamwalkpatkeil.o -ID:\MOTINOVA系统\Motor\TT_KZ_010A\TT-KZ-010A_CTR
-L_APP_HK32\TT-KZ-010A_CTRL_APP\MDK-ARM\RTE\_QD007A_CTL_APP -IC:\Keil_v5\ARM\PAC
-K\ARM\CMSIS\5.0.0\CMSIS\Include -IC:\Keil_v5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\
-Device\Include --predefine="__MICROLIB SETA 1" --predefine="__UVISION_VERSION S
-ETA 522" --predefine="_RTE_ SETA 1" --predefine="STM32F10X_MD SETA 1" --list=st
-m32f1xx_sturamwalkpatkeil.lst ..\SelfTestUser\src_specific\stm32f1xx_STURamWalk
-patKEIL.s
+stm32f1xx_sturamwalkpatkeil.o -ID:\MOTINOVA系统\Motor\Pegasi\TC013097-CXW2201创
+新维定制程序\TT-KZ-010A_CTRL_APP\MDK-ARM\RTE\_QD007A_CTL_APP -IC:\Keil_v5\ARM\P
+ACK\ARM\CMSIS\5.0.0\CMSIS\Include -IC:\Keil_v5\ARM\PACK\Keil\STM32F1xx_DFP\2.3.
+0\Device\Include --predefine="__MICROLIB SETA 1" --predefine="__UVISION_VERSION
+ SETA 522" --predefine="_RTE_ SETA 1" --predefine="STM32F10X_MD SETA 1" --list=
+stm32f1xx_sturamwalkpatkeil.lst ..\SelfTestUser\src_specific\stm32f1xx_STURamWa
+lkpatKEIL.s
 
 
 

+ 1 - 1
SelfTestUser/src_middlewares/stm32fxx_STUaddressing.c

@@ -3,7 +3,7 @@
 #include "stm32fxx_STUaddressing.h"
 
 
-volatile uint32_t testCell_1    __attribute__((at(0x20000600)));  //?à?D??¨2Zero??,?¤??¨°?ਤ¨°??¨¢¨?¨¢¨o??¨2???3?¨a?
+volatile uint32_t testCell_1    __attribute__((at(0x20000600)));  //必须在Zero段,否则编译会提示内存冲突
 volatile uint32_t testCell_2    __attribute__((at(0x20000610)));
 
 uint8_t STU_AddressingTest(void)

+ 1 - 1
User/Inc/remain_distance.h

@@ -50,7 +50,7 @@ typedef struct
 extern Remain_Dis_t RemainDis;
 
 extern void RD_RemainDis_Init(uint16_t uwWheelLength, TrueOrFalse_Flag_Struct_t BMS_COM_OK, uint16_t BusVoltage, uint8_t DesignVol, uint16_t BMS_RC);
-extern void RD_CalculateRemainDis(uint32_t WheelTurnCnt, uint16_t RemainCap, uint8_t SOC, uint16_t BusCurrent);
+extern void RD_CalculateRemainDis(uint32_t WheelTurnCnt, uint16_t RemainCap, uint8_t SOC, uint16_t BusCurrent) ;
 extern void RD_SaveAndUpdateInfo(MC_GearSt_Struct_t GearSt, MC_AssistRunMode_Struct_t MC_AssistRunMode);
 extern uint8_t Battery_SocCal(uint16_t Voltage);
 

+ 4 - 3
User/Inc/var.h

@@ -78,7 +78,7 @@ typedef union
 		uint32_t Fault_TE_MCU             :1;//TE MCU故障
 		uint32_t Fault_TE_Circuit         :1;//TE 电路故障
 		uint32_t Fault_MC_Check           :1;//MC校验失败
-		uint32_t RS1 :1;
+		uint32_t Fault_Machine            :1;//机械故障
 		uint32_t RS2 :1;
 		uint32_t RS3 :1;
 		uint32_t RS4 :1;
@@ -251,7 +251,8 @@ typedef struct
 	uint16_t PBU_Check_FaultCnt;     //PBU校验错误次数 ,地址偏移32
 	uint8_t T_PCB_Max;               //PCB历史最高温,地址偏移34
 	uint8_t T_PCB_Min;               //PCB历史最低温,地址偏移35
-	uint8_t RS1[4];                  //预留,地址偏移36
+	uint8_t MachineFaultCnt;         //单向器打滑故障次数,地址偏移36
+    uint8_t RS1[3];
 	uint8_t T_Coil_Max;              //绕组历史最高温,地址偏移40
 	uint8_t T_Coil_Min;	             //绕组历史最低温,地址偏移41
 	uint8_t T_MCU_Max;               //MCU历史最高温,地址偏移42
@@ -486,7 +487,7 @@ extern MC_AttitudeAngle_Struct_t MC_AttitudeAngle;
 extern MC_RideLog_Struct_t MC_RideLog;
 extern MC_AvgPower_Struct_t MC_AvgPower;
 extern MCU_Manufacturter_Struct_t MCUManufacturer;                         
-
+extern uint16_t SpeedRatio;
 /**************************全局变量声明End***************************/
 
 /**************************全局函数声明Begin*************************/

+ 4 - 4
User/Src/app_loader.c

@@ -31,19 +31,19 @@ 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) ) //2ì¨?é?¤?yè·
+  if( (*(uint8_t *)0xE00FFFD0 == 0x05)&&(*(uint8_t *)0xE00FFFE0 == 0x9B)&&(*(uint8_t *)0xE00FFFE4 == 0x52)&&(*(uint8_t *)0xE00FFFE8 == 0x05) ) //2台验证正确
 	{
     manufacturer = HK32F103RBT6;
 	}	
-	else if( (*(uint8_t *)0xE00FFFD0 == 0x04)&&(*(uint8_t *)0xE00FFFE0 == 0xC3)&&(*(uint8_t *)0xE00FFFE4 == 0xB4)&&(*(uint8_t *)0xE00FFFE8 == 0x0B) ) //4ì¨?é?¤?yè·
+	else if( (*(uint8_t *)0xE00FFFD0 == 0x04)&&(*(uint8_t *)0xE00FFFE0 == 0xC3)&&(*(uint8_t *)0xE00FFFE4 == 0xB4)&&(*(uint8_t *)0xE00FFFE8 == 0x0B) ) //4台验证正确
 	{
 		manufacturer = APM32F103RBT6;
 	}	
-	else if( (*(uint8_t *)0xE00FFFD0 == 0x00)&&(*(uint8_t *)0xE00FFFE0 == 0x10)&&(*(uint8_t *)0xE00FFFE4 == 0x04)&&(*(uint8_t *)0xE00FFFE8 == 0x0A) ) //4ì¨?é?¤?yè·
+	else if( (*(uint8_t *)0xE00FFFD0 == 0x00)&&(*(uint8_t *)0xE00FFFE0 == 0x10)&&(*(uint8_t *)0xE00FFFE4 == 0x04)&&(*(uint8_t *)0xE00FFFE8 == 0x0A) ) //4台验证正确
 	{
     manufacturer = STM32F103RBT6;
 	}
-	else if( (*(uint32_t *)0xE0042000) == 0x13030410 )  //2ì¨?é?¤?yè·
+	else if( (*(uint32_t *)0xE0042000) == 0x13030410 )  //2台验证正确
 	{
 		manufacturer = GD32F103RBT6;
 	}	

+ 6 - 3
User/Src/cadence_sensor.c

@@ -99,7 +99,7 @@ void CadenceSensor_Process(MC_CadenceResult_Struct_t* p_MC_CadenceResult, uint16
 	//踏频计算及启动和停止判断
 	static uint32_t CadenceCalTimeCnt = 0;       //用于计算蹋频值
 	static int32_t Cadence_ActiveFlt = 0;
-	uint16_t CadenceTemp;
+	static uint16_t CadenceTemp;
 	
 	static uint8_t CadenceStarFlagCnt = 0;       //用于判断启动
 	static uint32_t CadenceStopJudgeTimeCnt = 0; //用于判断停止
@@ -112,8 +112,8 @@ void CadenceSensor_Process(MC_CadenceResult_Struct_t* p_MC_CadenceResult, uint16
 	  CadenceTemp	= 1000 / (HAL_GetTick() - CadenceCalTimeCnt);//转1圈有60个信号,根据两个信号之间的时间计算踏频值rpm
 		CadenceCalTimeCnt = HAL_GetTick();
 		
-		Cadence_ActiveFlt += (((int32_t)CadenceTemp << 8) - Cadence_ActiveFlt) >> 4;
-		p_MC_CadenceResult->Cadence_Data = (uint8_t)(Cadence_ActiveFlt >> 8);
+//		Cadence_ActiveFlt += (((int32_t)CadenceTemp << 8) - Cadence_ActiveFlt) >> 4;
+//		p_MC_CadenceResult->Cadence_Data = (uint8_t)(Cadence_ActiveFlt >> 8);
 		
 		/*上坡时,启动阈值为1*/
 		if(UpSlopeFlag == TRUE)
@@ -146,6 +146,9 @@ void CadenceSensor_Process(MC_CadenceResult_Struct_t* p_MC_CadenceResult, uint16
 		CadenceStopJudgeTimeCnt = HAL_GetTick();
 	}
 	
+	Cadence_ActiveFlt += (((int32_t)CadenceTemp << 10) - Cadence_ActiveFlt) >> 8;
+	p_MC_CadenceResult->Cadence_Data = (uint8_t)(Cadence_ActiveFlt >> 10);
+	
 	//停机判断
 	if(p_MC_CadenceResult->Cadence_Data < (1500 / StopDelayTime))
 	{

+ 48 - 2
User/Src/fault_check.c

@@ -105,7 +105,7 @@ void MC_Fault_TorqueSensor_Process_Single(uint16_t ADC_Data, uint8_t Num, Toruqe
 
 	p_SensorCheck->DiffStdResult = GetStandardDeviation(p_SensorCheck->TorqueArray, sizeof(p_SensorCheck->TorqueArray) / 2);
 	//标准差较小
-	if(p_SensorCheck->DiffStdResult < 12)
+	if(p_SensorCheck->DiffStdResult < 10)
 	{
 		DelayTime = 60000 / Cadence;  //根据踏频计算踩踏1圈的时间,要考虑空踩情况
 		DelayTime = (DelayTime < 250) ? 250 : DelayTime;
@@ -188,7 +188,7 @@ void MC_Fault_TorqueSensor_Process(uint16_t* SensorData,
 	//综合判断
 	if(p_MC_ErrorCode->ERROR_Bit.Fault_TorqueSensor == 0)
 	{
-	  if((SensorFaultStatus->FaultBit.Sensor1 + SensorFaultStatus->FaultBit.Sensor2 + SensorFaultStatus->FaultBit.Sensor3) > 1)//超过2个传感器异常
+	  if((SensorFaultStatus->FaultBit.Sensor1 + SensorFaultStatus->FaultBit.Sensor2 + SensorFaultStatus->FaultBit.Sensor3) > 2)//超过3个传感器异常
 		{
 		  p_MC_ErrorCode->ERROR_Bit.Fault_TorqueSensor = 1;
 			//记录故障日志
@@ -842,6 +842,49 @@ void MC_Fault_Circuit_Process(MC_ErrorCode_Struct_t* p_MC_ErrorCode)
 	}
 }
 
+//机械故障
+void MC_Fault_Machine_Process(uint16_t MotorSpeed, uint16_t CadenceSpeed, ADC_SensorData_Struct_t SensorData, uint16_t speedratio, MC_ErrorCode_Struct_t* p_MC_ErrorCode)
+{
+	static uint32_t TimeCount_ClutchFault=0;
+	static uint16_t ClutchFaultCount=0;
+	
+	if( p_MC_ErrorCode->ERROR_Bit.Fault_Machine == 0)  //单向器没有故障时开始检测,有故障后故障一直存在,故障检测不再执行
+	{
+		if( (HAL_GetTick()-TimeCount_ClutchFault)>=20 )  //20ms执行一次故障判断
+		{
+			TimeCount_ClutchFault = HAL_GetTick();
+			if( (MotorSpeed > 500)&&(CadenceSpeed >= 15)&&(SensorData.TorqueSensor > 200)&&(SensorData.GasSensor < 50) )
+			{
+				if( speedratio > 1500 ) 
+				{
+					ClutchFaultCount++;
+					if( ClutchFaultCount>= 50)                  //速比连续出错50次判断为故障,时间将近1s
+					{
+						ClutchFaultCount=0;
+						p_MC_ErrorCode->ERROR_Bit.Fault_Machine = 1;
+						//记录故障日志
+						MC_ErrorLogSaveInfo.NotesInfo1 = 1;       //单向器打滑故障
+						MC_ErrorLogSaveInfo.NotesInfo2 = SensorData.TorqueSensor;
+						MC_ErrorLogSaveInfo.NotesInfo3 = SensorData.GasSensor;
+						ErrorLogSave_Update(&MC_ErrorLogSaveInfo);
+						IsErrorLogSaveInfoUpdateFlag = TRUE;
+						//存储故障次数
+						MC_RunLog1.MachineFaultCnt++;
+						RunLogSaveIndex = 1;
+					}
+				}
+				else 
+				{
+					ClutchFaultCount=0;			
+				}					
+			}
+			else
+			{
+				ClutchFaultCount=0;
+			}
+		}
+	}
+}
 /***********************全局函数定义***********************/
 //霍尔传感器故障检测
 void MC_Fault_HallSensor_Process(MC_HallSensorStatus_Struct_t HallSensorStatus, MC_ErrorCode_Struct_t* p_MC_ErrorCode)
@@ -1063,4 +1106,7 @@ void MC_Fault_Check_Process(void)
 	
 	//电路故障检测
 	MC_Fault_Circuit_Process(&MC_ErrorCode);
+
+	//单向器打滑故障检测
+	MC_Fault_Machine_Process(MC_RunInfo.MotorSpeed, MC_CadenceResult.Cadence_Data, ADC_SensorData, SpeedRatio, &MC_ErrorCode);
 }

+ 3 - 3
User/Src/hall_sensor.c

@@ -156,7 +156,7 @@ int16_t MotorSpeedCal(uint16_t SVM_Angle, TrueOrFalse_Flag_Struct_t IsStopFlag)
 	static int16_t Result = 0;
 	
 	PreCnt++;
-	if(PreCnt >=8 )
+	if(PreCnt >=15 )
 	{
 	  PreCnt = 0;
 		AngleStep = (int32_t)(MC_HallSensorData.SVM_Angle - SVM_Angle_Old);
@@ -169,9 +169,9 @@ int16_t MotorSpeedCal(uint16_t SVM_Angle, TrueOrFalse_Flag_Struct_t IsStopFlag)
 		  AngleStep = 0;
 		}
 		SVM_Angle_Old = MC_HallSensorData.SVM_Angle;
-		AngleStep = AngleStep * 15000;//f = [Angle(k-1)-Angle(k)]/Tc
+		AngleStep = AngleStep * 1000;//f = [Angle(k-1)-Angle(k)]/Tc
 		FreqMotorFlt += (AngleStep - FreqMotorFlt) >> 8;
-		FreqMotor = FreqMotorFlt >> 19;
+		FreqMotor = FreqMotorFlt >> 16;
 		Result = 60 * FreqMotor >> 3;// 8n=60*f/p
 	}
 	

+ 10 - 2
User/Src/motor_control.c

@@ -12,7 +12,6 @@
 #include "pwm_driver.h"
 #include "math_tools.h"
 #include "power12V_driver.h"
-
 /************************全局变量定义************************/
 //工作模式
 MC_WorkMode_Struct_t MC_WorkMode = MC_WorkMode_Run; 
@@ -663,7 +662,7 @@ MC_CalParam_Struct_t MC_AssistRunMode_Torque_Process(uint16_t SenorData, MC_Gear
 	uint16_t SoftStartAcc = 0;
 	#endif
 
-	#if 1
+	#if NormalWork
 	
 	//踩踏力矩输入
   MC_TorqueProcess_Param.TorqueApp = SenorData;
@@ -796,9 +795,18 @@ MC_CalParam_Struct_t MC_AssistRunMode_Torque_Process(uint16_t SenorData, MC_Gear
 	//力矩给定升降速处理
 	else
 	{
+		static int32_t SpeedRatio_NoFlt=1092;
+		static int32_t speedRatio_temp=1092<<12;
+		
 		/*调节助力比,使用经过踏频信号滤波处理的力矩值*/
 		MC_TorqueProcess_Param.TorqueApp = SenorDataByCadence;
 		
+		if( (MC_RunInfo.MotorSpeed > 500)&&(MC_CadenceResult.Cadence_Data >= 15)&&(MC_TorqueProcess_Param.TorqueApp > 200) )
+		{
+			SpeedRatio_NoFlt= (100*MC_RunInfo.MotorSpeed)/MC_CadenceResult.Cadence_Data;
+			speedRatio_temp += ((SpeedRatio_NoFlt << 12) - speedRatio_temp) >> 10;
+			SpeedRatio = speedRatio_temp >> 12;
+		}
 		//按照助力档位调节力矩输入值
 		switch(GearSt)
 		{

+ 3 - 3
User/Src/tasks.c

@@ -580,7 +580,7 @@ void PowerOff_Process(TrueOrFalse_Flag_Struct_t ReturnEnable)
 	{
 		PeriodTimeCnt = HAL_GetTick();
 		Count = 0;
-	  while(Count < 10)//等待1s退出,避免关机时抖动
+	  while(Count < 10)
 		{
 		  if((HAL_GetTick() - PeriodTimeCnt) > 100)
 			{
@@ -878,8 +878,8 @@ void MC_TemperatureLogProcess(void)
 	static uint16_t SavePeriodCnt = 0;
 	static TrueOrFalse_Flag_Struct_t DataChangeFlag = FALSE;
 	
-	if(HAL_GetTick() < 10000)  //开机前10s不处理
-  {
+	if(HAL_GetTick() < 10000)  //
+	{
 	  PeriodTimeCnt = HAL_GetTick();
 		return;
 	}

+ 5 - 1
User/Src/var.c

@@ -39,6 +39,7 @@ MC_AttitudeAngle_Struct_t MC_AttitudeAngle;               //
 MC_RideLog_Struct_t MC_RideLog;                           //骑行历史
 MC_AvgPower_Struct_t MC_AvgPower;                         //助力平均功耗
 MCU_Manufacturter_Struct_t MCUManufacturer;               //MCU生厂商
+uint16_t SpeedRatio;
 //BMS默认设计信息
 const BMS_DesignInfo_Struct_t BMS_DesignInfo_Default =
 {
@@ -497,7 +498,10 @@ void Var_Init(void)
 		
 	//MC版本信息初始化,Mode和SN从EEPROM读取
   strncpy(MC_VerInfo.HW_Version, (char*)"TTKZ010D.       ", 16);
-	strncpy(MC_VerInfo.FW_Version, (char*)"V3r3r1_20211206.", 16);
+  strncpy(MC_VerInfo.FW_Version, (char*)"V3r3r2_20220506C", 16);
+  #if NormalWork
+	MC_VerInfo.FW_Version[15] = '.';
+  #endif
 	strncpy(Firmware_Special, (char*)"TC011000-MS0000HK-V0r0.         ", 32);
 	if(MCUManufacturer == NoName) MC_VerInfo.HW_Version[10] = '0';
 	else if(MCUManufacturer == STM32F103RBT6) MC_VerInfo.HW_Version[10] = '1';

Неке датотеке нису приказане због велике количине промена