Ver Fonte

V7r1r2_20220427
1 增加硬件版本识别功能和故障检测功能;
2 母线电压补偿值降为一半;
3 修改力矩传感器故障检测,3个力矩传感器都出错时报力矩传感器故障;
4 踏频和转速的计算周期都改为1ms执行一次,滤波滞后时间都改为256ms,增加单向器打滑故障检测功能;
5 PB4和PB5都用来控制6V前灯;
6 屏蔽TE故障检测,增加发送TE不控制12V电源指令;
7 版本号变为V7r1r2_20220427;

white.xu há 3 anos atrás
pai
commit
baa568de11
42 ficheiros alterados com 2713 adições e 2466 exclusões
  1. 1 1
      Core/Inc/adc.h
  2. 25 1
      Core/Src/adc.c
  3. 1 1
      Core/Src/can.c
  4. 3 2
      Core/Src/main.c
  5. 5 0
      MDK-ARM/QD007A_CTL_APP.uvprojx
  6. 2409 2409
      MDK-ARM/QD007A_CTL_APP/QD007A_CTL_APP_CRC.hex
  7. BIN
      MDK-ARM/bin/MC_TTKZ010A_V3.0.1_20200106.bin
  8. BIN
      MDK-ARM/bin/MC_TTKZ010A_V3.0.3_20200114.bin
  9. BIN
      MDK-ARM/bin/MC_TTKZ010A_V3.0.5_20200316.bin
  10. BIN
      MDK-ARM/bin/MC_TTKZ010A_V3.0.5_20200403.bin
  11. BIN
      MDK-ARM/bin/MC_TTKZ010A_V3.1.0_20200417.bin
  12. BIN
      MDK-ARM/bin/MC_TTKZ010A_V3.1.1_20200506.bin
  13. BIN
      MDK-ARM/bin/MC_TTKZ010A_V3.2.0_20200622.bin
  14. BIN
      MDK-ARM/bin/MC_TTKZ010A_V3.2.0_20200624.bin
  15. BIN
      MDK-ARM/bin/MC_TTKZ010A_V3.2.0_20200707.bin
  16. BIN
      MDK-ARM/bin/MC_TTKZ010A_V3.2.0_20200708.bin
  17. BIN
      MDK-ARM/bin/MC_TTKZ010A_V3.2.1_20200916.bin
  18. BIN
      MDK-ARM/bin/MC_TTKZ010A_V3.2.1_20200929.bin
  19. BIN
      MDK-ARM/bin/MC_TTKZ010A_V3.2.2_20201110.bin
  20. BIN
      MDK-ARM/bin/MC_TTKZ010A_V3.2.2_20201111.bin
  21. BIN
      MDK-ARM/bin/MC_TTKZ010A_V3.2.3_20201203.bin
  22. BIN
      MDK-ARM/bin/MC_TTKZ010A_V3.2.4_20210128.bin
  23. BIN
      MDK-ARM/bin/MC_TTKZ010A_V3.2.4_20210202.bin
  24. BIN
      MDK-ARM/bin/MC_TTKZ010A_V3.2.4_20210202_1.bin
  25. BIN
      MDK-ARM/bin/MC_TTKZ010A_V3.2.5_20210414.bin
  26. BIN
      MDK-ARM/bin/MC_TTKZ010A_V3.2.5_20210414_1.bin
  27. BIN
      MDK-ARM/bin/QD007A_CTL_APP.bin
  28. 5 6
      MDK-ARM/startup_stm32f103xb.lst
  29. 6 7
      MDK-ARM/stm32f1xx_stucpuregsaddressing.lst
  30. 6 7
      MDK-ARM/stm32f1xx_stucpuwalkpatkeil.lst
  31. 6 7
      MDK-ARM/stm32f1xx_sturamwalkpatkeil.lst
  32. 1 0
      User/Inc/hall_sensor.h
  33. 8 0
      User/Inc/hardware_check.h
  34. 4 3
      User/Inc/var.h
  35. 6 3
      User/Src/cadence_sensor.c
  36. 130 4
      User/Src/fault_check.c
  37. 16 9
      User/Src/hall_sensor.c
  38. 57 0
      User/Src/hardware_check.c
  39. 1 1
      User/Src/light_driver.c
  40. 9 1
      User/Src/motor_control.c
  41. 12 3
      User/Src/tasks.c
  42. 2 1
      User/Src/var.c

+ 1 - 1
Core/Inc/adc.h

@@ -66,7 +66,7 @@ extern ADC_HandleTypeDef hadc2;
 #define ADC1_RANK_TORQUE_SENSOR_1 4
 #define ADC1_RANK_TORQUE_SENSOR_2 5
 #define ADC1_RANK_TORQUE_SENSOR_3 6
-#define ADC1_RANK_3V3_TE          7
+#define ADC1_RANK_HARDWARE_VER    7
 #define ADC1_RANK_GAS             8
 #define ADC1_RANK_TP_MCU          9
 #define ADC1_RANK_VREF            10

+ 25 - 1
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) * 13; //根据母线电流和估算的线阻进行补偿, 补偿电阻 0.2 * 128 = 25.6
 	
 	//更新母线电流
 	Temp_32 = (ADC1_Result[ADC1_RANK_CURRENT] - uw_current_offset) * 50000 >> 11;
@@ -556,6 +556,30 @@ void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
 			Temp_32 = ((Temp_32 <= 0) ? 0 : Temp_32 / 2);
 			break;
 		}
+		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://超过2个传感器异常
 		{
 		  Temp_32 = 0;

+ 1 - 1
Core/Src/can.c

@@ -64,7 +64,7 @@ void MX_CAN_Init(void)
 {
 
   hcan.Instance = CAN1;
-  hcan.Init.Prescaler = 48;
+  hcan.Init.Prescaler = 24;
   hcan.Init.Mode = CAN_MODE_NORMAL;
   hcan.Init.SJW = CAN_SJW_1TQ;
   hcan.Init.BS1 = CAN_BS1_4TQ;

+ 3 - 2
Core/Src/main.c

@@ -65,7 +65,7 @@
 #include "ctf_process.h"
 #include "log_save.h"
 #include "flash_read_protection.h"
-
+#include "hardware_check.h"
 /* USER CODE END Includes */
 
 /* Private variables ---------------------------------------------------------*/
@@ -98,7 +98,7 @@ int main(void)
   IAP_Init();  //Bootloader 200ms
 	MCUManufacturer = IdentifyMCUManufacturer();
   //Flash读保护设置
-  #if 1
+  #if 0
   Flash_ReadProtection();
   #endif
 		
@@ -324,6 +324,7 @@ int main(void)
 			
 			//定时发送传感器数据给TE
 			MC_TE_SensorData_Process(&MC_TE_SensorData);
+			GetHardware_Versin( ADC1_Result_Filt[ADC1_RANK_HARDWARE_VER] );
 			
 			//指拨模式计算函数
 			SpdProportion_calculate();

+ 5 - 0
MDK-ARM/QD007A_CTL_APP.uvprojx

@@ -609,6 +609,11 @@
               <FileType>1</FileType>
               <FilePath>..\User\Src\flash_read_protection.c</FilePath>
             </File>
+            <File>
+              <FileName>hardware_check.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\User\Src\hardware_check.c</FilePath>
+            </File>
           </Files>
         </Group>
         <Group>

Diff do ficheiro suprimidas por serem muito extensas
+ 2409 - 2409
MDK-ARM/QD007A_CTL_APP/QD007A_CTL_APP_CRC.hex


BIN
MDK-ARM/bin/MC_TTKZ010A_V3.0.1_20200106.bin


BIN
MDK-ARM/bin/MC_TTKZ010A_V3.0.3_20200114.bin


BIN
MDK-ARM/bin/MC_TTKZ010A_V3.0.5_20200316.bin


BIN
MDK-ARM/bin/MC_TTKZ010A_V3.0.5_20200403.bin


BIN
MDK-ARM/bin/MC_TTKZ010A_V3.1.0_20200417.bin


BIN
MDK-ARM/bin/MC_TTKZ010A_V3.1.1_20200506.bin


BIN
MDK-ARM/bin/MC_TTKZ010A_V3.2.0_20200622.bin


BIN
MDK-ARM/bin/MC_TTKZ010A_V3.2.0_20200624.bin


BIN
MDK-ARM/bin/MC_TTKZ010A_V3.2.0_20200707.bin


BIN
MDK-ARM/bin/MC_TTKZ010A_V3.2.0_20200708.bin


BIN
MDK-ARM/bin/MC_TTKZ010A_V3.2.1_20200916.bin


BIN
MDK-ARM/bin/MC_TTKZ010A_V3.2.1_20200929.bin


BIN
MDK-ARM/bin/MC_TTKZ010A_V3.2.2_20201110.bin


BIN
MDK-ARM/bin/MC_TTKZ010A_V3.2.2_20201111.bin


BIN
MDK-ARM/bin/MC_TTKZ010A_V3.2.3_20201203.bin


BIN
MDK-ARM/bin/MC_TTKZ010A_V3.2.4_20210128.bin


BIN
MDK-ARM/bin/MC_TTKZ010A_V3.2.4_20210202.bin


BIN
MDK-ARM/bin/MC_TTKZ010A_V3.2.4_20210202_1.bin


BIN
MDK-ARM/bin/MC_TTKZ010A_V3.2.5_20210414.bin


BIN
MDK-ARM/bin/MC_TTKZ010A_V3.2.5_20210414_1.bin


BIN
MDK-ARM/bin/QD007A_CTL_APP.bin


+ 5 - 6
MDK-ARM/startup_stm32f103xb.lst

@@ -524,12 +524,11 @@ ork --depend=.\qd007a_ctl_app\startup_stm32f103xb.d -o.\qd007a_ctl_app\startup_
 ARM Macro Assembler    Page 9 
 
 
-stm32f103xb.o -ID:\MOTINOVAϵͳ\Motor\Pegasi\TT-KZ-010A_CTRL_APP_GD32\TT-KZ-010
-A_CTRL_APP\MDK-ARM\RTE\_QD007A_CTL_APP -IC:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CM
-SIS\Include -IC:\Keil_v5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include --pre
-define="__MICROLIB SETA 1" --predefine="__UVISION_VERSION SETA 522" --predefine
-="_RTE_ SETA 1" --predefine="STM32F10X_MD SETA 1" --list=startup_stm32f103xb.ls
-t startup_stm32f103xb.s
+stm32f103xb.o -ID:\MOTINOVAϵͳ\Motor\TTKZ019A\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_v
+5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include --predefine="__MICROLIB SETA
+ 1" --predefine="__UVISION_VERSION SETA 522" --predefine="_RTE_ SETA 1" --prede
+fine="STM32F10X_MD SETA 1" --list=startup_stm32f103xb.lst startup_stm32f103xb.s
 
 
 

+ 6 - 7
MDK-ARM/stm32f1xx_stucpuregsaddressing.lst

@@ -123,19 +123,18 @@ 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\Pegasi\TT-KZ-010A_C
-TRL_APP_GD32\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\1.1.
-0\Device\Include --predefine="__MICROLIB SETA 1" --predefine="__UVISION_VERSION
- SETA 522" --predefine="_RTE_ SETA 1" --predefine="STM32F10X_MD SETA 1" --list=
+pp\stm32f1xx_stucpuregsaddressing.o -ID:\MOTINOVAϵͳ\Motor\TTKZ019A\TT-KZ-010A
+_CTRL_APP\MDK-ARM\RTE\_QD007A_CTL_APP -IC:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMS
+IS\Include -IC:\Keil_v5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include --pred
+efine="__MICROLIB SETA 1" --predefine="__UVISION_VERSION SETA 522" --predefine=
+"_RTE_ SETA 1" --predefine="STM32F10X_MD SETA 1" --list=stm32f1xx_stucpuregsadd
 
 
 
 ARM Macro Assembler    Page 3 
 
 
-stm32f1xx_stucpuregsaddressing.lst ..\SelfTestUser\src_specific\stm32f1xx_STUCp
-uRegsAddressing.s
+ressing.lst ..\SelfTestUser\src_specific\stm32f1xx_STUCpuRegsAddressing.s
 
 
 

+ 6 - 7
MDK-ARM/stm32f1xx_stucpuwalkpatkeil.lst

@@ -1593,13 +1593,12 @@ 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\Pegasi\TT-KZ-010A_CTRL_AP
-P_GD32\TT-KZ-010A_CTRL_APP\MDK-ARM\RTE\_QD007A_CTL_APP -IC:\Keil_v5\ARM\PACK\AR
-M\CMSIS\5.0.0\CMSIS\Include -IC:\Keil_v5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Devi
-ce\Include --predefine="__MICROLIB SETA 1" --predefine="__UVISION_VERSION SETA 
-522" --predefine="_RTE_ SETA 1" --predefine="STM32F10X_MD SETA 1" --list=stm32f
-1xx_stucpuwalkpatkeil.lst ..\SelfTestUser\src_specific\stm32f1xx_STUCpuWalkpatK
-EIL.s
+stm32f1xx_stucpuwalkpatkeil.o -ID:\MOTINOVAϵͳ\Motor\TTKZ019A\TT-KZ-010A_CTRL_
+APP\MDK-ARM\RTE\_QD007A_CTL_APP -IC:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Inc
+lude -IC:\Keil_v5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include --predefine=
+"__MICROLIB SETA 1" --predefine="__UVISION_VERSION SETA 522" --predefine="_RTE_
+ SETA 1" --predefine="STM32F10X_MD SETA 1" --list=stm32f1xx_stucpuwalkpatkeil.l
+st ..\SelfTestUser\src_specific\stm32f1xx_STUCpuWalkpatKEIL.s
 
 
 

+ 6 - 7
MDK-ARM/stm32f1xx_sturamwalkpatkeil.lst

@@ -430,13 +430,12 @@ 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\Pegasi\TT-KZ-010A_CTRL_AP
-P_GD32\TT-KZ-010A_CTRL_APP\MDK-ARM\RTE\_QD007A_CTL_APP -IC:\Keil_v5\ARM\PACK\AR
-M\CMSIS\5.0.0\CMSIS\Include -IC:\Keil_v5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Devi
-ce\Include --predefine="__MICROLIB SETA 1" --predefine="__UVISION_VERSION SETA 
-522" --predefine="_RTE_ SETA 1" --predefine="STM32F10X_MD SETA 1" --list=stm32f
-1xx_sturamwalkpatkeil.lst ..\SelfTestUser\src_specific\stm32f1xx_STURamWalkpatK
-EIL.s
+stm32f1xx_sturamwalkpatkeil.o -ID:\MOTINOVAϵͳ\Motor\TTKZ019A\TT-KZ-010A_CTRL_
+APP\MDK-ARM\RTE\_QD007A_CTL_APP -IC:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Inc
+lude -IC:\Keil_v5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include --predefine=
+"__MICROLIB SETA 1" --predefine="__UVISION_VERSION SETA 522" --predefine="_RTE_
+ SETA 1" --predefine="STM32F10X_MD SETA 1" --list=stm32f1xx_sturamwalkpatkeil.l
+st ..\SelfTestUser\src_specific\stm32f1xx_STURamWalkpatKEIL.s
 
 
 

+ 1 - 0
User/Inc/hall_sensor.h

@@ -22,6 +22,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;
 
 //霍尔传感器输出状态

+ 8 - 0
User/Inc/hardware_check.h

@@ -0,0 +1,8 @@
+#ifndef __HARDWARE_CHECK_H_
+#define __HARDWARE_CHECK_H_
+
+#include <stdint.h>
+
+extern void GetHardware_Versin(uint16_t VolaVal);
+
+#endif

+ 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*************************/

+ 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))
 	{

+ 130 - 4
User/Src/fault_check.c

@@ -105,9 +105,9 @@ 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 = 120000 / Cadence;  //根据踏频计算踩踏2圈的时间,要考虑空踩情况
 		DelayTime = (DelayTime < 250) ? 250 : DelayTime;
 		if((HAL_GetTick() - p_SensorCheck->TrigTimeCnt_1) > (DelayTime * 2))
 		{
@@ -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,126 @@ void MC_Fault_Circuit_Process(MC_ErrorCode_Struct_t* p_MC_ErrorCode)
 	}
 }
 
+
+//机械故障
+void MC_Fault_Machine_Process(uint16_t MotorSpeed, uint16_t CadenceSpeed, uint16_t TorqueApp, 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)&&(TorqueApp > 200) )
+			{
+				if( speedratio > 1500 ) 
+				{
+					ClutchFaultCount++;
+					if( ClutchFaultCount>= 50)                  //速比连续出错50次判断为故障,时间将近1s
+					{
+						p_MC_ErrorCode->ERROR_Bit.Fault_Machine = 1;
+						//记录故障日志
+						MC_ErrorLogSaveInfo.NotesInfo1 = 1;       //单向器打滑故障
+						MC_ErrorLogSaveInfo.NotesInfo2 = speedratio;
+						ErrorLogSave_Update(&MC_ErrorLogSaveInfo);
+						IsErrorLogSaveInfoUpdateFlag = TRUE;
+						//存储故障次数
+						MC_RunLog1.MachineFaultCnt++;
+						RunLogSaveIndex = 1;
+					}
+				}
+				else 
+				{
+					ClutchFaultCount=0;			
+				}					
+			}
+			else
+			{
+				ClutchFaultCount=0;
+			}
+		}
+	}
+}
+
+
+
+
+//硬件识别故障
+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)
@@ -1057,10 +1177,16 @@ void MC_Fault_Check_Process(void)
 	MC_Fault_MOS_Process(ADC_3ShuntCurrent_RMSValue, &MC_ErrorCode);
 
   //TE故障检测
-	#if 1
+	#if 0
 	MC_Fault_TE_Process(&MC_TE_SensorStatus, IsComOK_TE.IsOK_Flag, &MC_ErrorCode);
 	#endif
 	
 	//电路故障检测
 	MC_Fault_Circuit_Process(&MC_ErrorCode);
+	
+	//单向器打滑故障检测
+	MC_Fault_Machine_Process(MC_RunInfo.MotorSpeed, MC_CadenceResult.Cadence_Data, ADC_SensorData.TorqueSensor, SpeedRatio, &MC_ErrorCode);
+
+	//硬件识别故障
+	MC_Fault_Hardware_Identify(IsComOK_TE.IsOK_Flag, MC_TE_SyncClockFreqScan, ADC1_Result_Filt[ADC1_RANK_HARDWARE_VER], &MC_HallSensorData.InverterExistFlag, &MC_ErrorCode);
 }

+ 16 - 9
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);
 }
 
@@ -156,7 +163,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 +176,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
 	}
 	

+ 57 - 0
User/Src/hardware_check.c

@@ -0,0 +1,57 @@
+#include "hardware_check.h"
+#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',
+	'+'
+};
+
+
+void GetHardware_Versin(uint16_t VolaVal)
+{
+	uint8_t Count;
+	static _Bool VersionIdentifyExecuteFlag = FALSE;
+	
+	if(HAL_GetTick() > 2000) //3s后开始识别
+	{
+		if(VersionIdentifyExecuteFlag == FALSE)
+		{
+			VersionIdentifyExecuteFlag = TRUE;
+			if( (IsComOK_TE.IsOK_Flag == TRUE)||(MC_TE_SyncClockFreqScan>200)||((VolaVal>1986)&&(VolaVal<2110)) ) //有反相器和TE的电路板
+			{
+				MC_HallSensorData.InverterExistFlag = TRUE;
+			}
+			else             //无反相器和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 ;
+					}
+				}
+			}
+	  }
+  }
+}

+ 1 - 1
User/Src/light_driver.c

@@ -2,7 +2,7 @@
 
 MC_LightDriver_IO_Struct_t HeadLightIO_Groups[3] = 
 {
-  {GPIOB, GPIO_PIN_4},  //ǰµÆ6V
+  {GPIOB, GPIO_PIN_4|GPIO_PIN_5},  //ǰµÆ6V
   {GPIOB, GPIO_PIN_6},  //ǰµÆ12V
   {GPIOB, GPIO_PIN_7},  //ǰµÆËæµç³Øµçѹ
 };

+ 9 - 1
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; 
@@ -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)
 		{

+ 12 - 3
User/Src/tasks.c

@@ -347,7 +347,7 @@ void MC_TE_SensorScan(MC_TE_SensorData_Struct_t* p_MC_TE_SensorData)
 	//ADC数据更新采集
 	p_MC_TE_SensorData->AD_BusCurrent = ADC1_Result_Filt[ADC1_RANK_CURRENT];
 	p_MC_TE_SensorData->AD_CoilTemp = ADC1_Result_Filt[ADC1_RANK_NTC_COIL];
-	p_MC_TE_SensorData->AD_TE_Voltage = ADC1_Result_Filt[ADC1_RANK_3V3_TE];
+	p_MC_TE_SensorData->AD_TE_Voltage = 2048;
 	p_MC_TE_SensorData->AD_Torque = ADC1_Result_Filt[ADC1_RANK_TORQUE_SENSOR_1];
 	
 	//踏频霍尔1
@@ -444,6 +444,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();
@@ -870,8 +879,8 @@ void MC_TemperatureLogProcess(void)
 	static uint16_t SavePeriodCnt = 0;
 	static TrueOrFalse_Flag_Struct_t DataChangeFlag = FALSE;
 	
-	if((IsSendDataToTE_Step == SENDUPDATA) || (IsComOK_TE.IsOK_Flag == FALSE))  //TE升级状态,或TE通讯失败状态下,不存储历史温度,TE无APP时对主控采集AD有影响
-	{
+	if(HAL_GetTick() < 10000)  //开机前10s不处理
+  {
 	  PeriodTimeCnt = HAL_GetTick();
 		return;
 	}

+ 2 - 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,7 @@ void Var_Init(void)
 		
 	//MC版本信息初始化,Mode和SN从EEPROM读取
   strncpy(MC_VerInfo.HW_Version, (char*)"TTKZ010D.       ", 16);
-	strncpy(MC_VerInfo.FW_Version, (char*)"V3r3r1_20211203.", 16);
+	strncpy(MC_VerInfo.FW_Version, (char*)"V7r1r2_20220427", 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';

Alguns ficheiros não foram mostrados porque muitos ficheiros mudaram neste diff