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

1、更改踏频传感器型号,方向和频率由传感器输出,根据硬件版本识别踏频传感器型号,调用不同的踏频计算函数;
2、增加平均车速、最大车速、卡路里计算,发送骑行历史时一起发送,平均功耗预留位用于存储最大车速和骑行消耗总能量;
3、模拟I2C延时参数由50改为20,延迟一次时间由3.7us缩短为1.5us,读一次启动值时间由2.84ms缩短为1.42ms;
4、取消骑行3km或骑行10min自动存储数据,取消温度最值更新时自动存储数据,统一用10min定时存储MC_RunLog1、MC_RideLog、MC_AvgPower。

dd пре 4 месеци
родитељ
комит
7143a1993c

+ 4 - 1
Core/Src/main.c

@@ -301,7 +301,7 @@ int main(void)
 			MC_DebugInfo_Update();
 			
 			//计算运行总时间
-			MC_RunTime_Cal(&MC_RunLog1.RunTime);
+			MC_RunTime_Cal();
 			
 			//温度历史数据记录
 			MC_TemperatureLogProcess();
@@ -331,6 +331,9 @@ int main(void)
 				MC_PowerOffBkp.Trip_Km = MC_RideLog.TRIP_Km;
 				MC_PowerOffBkp.Trip_Time = MC_RideLog.TRIP_Time;
 				MC_PowerOffBkp.Run_Time = MC_RunLog1.RunTime;
+				MC_PowerOffBkp.Log_ODO_Km = MC_RunLog1.ODO_Km;
+				MC_PowerOffBkp.Log_ODO_Time = MC_RunLog1.ODO_Time;
+				MC_PowerOffBkp.PedalPoweSum = MC_AvgPower.PedalPowerSum;
 				SaveDataToEEPROM_Flash(EEPROM_FLASH_ADDR_POWEROFF_BKP, (uint8_t*)&MC_PowerOffBkp.ODO_Km, 40);//写入掉电临时保存数据,写入前该区域需擦除为0xFF才能操作成功
 				SaveDataToEEPROM_Flash(EEPROM_FLASH_ADDR_POWEROFF_BKP_FLAG, (uint8_t*)"FLAG", 4); //掉电存储的数据标志更新
 				PowerDown_SaveFlag = FALSE;

+ 4 - 18
J-scope.jscope

@@ -4,13 +4,11 @@
     <Project>
         <Configuration>
             <JLink>
-                <Options IsRTTSession="0" IsRTTWithTimeStamp="1" SamplingPeriod="100" Connection="1" SerialNo="0" IP="" TargetDevice="Cortex-M3" TargetInterface="SWD" InterfaceSpeed="4000" />
+                <Options Connection="1" IsRTTSession="0" IsRTTWithTimeStamp="0" SamplingPeriod="100" SerialNo="0" JTAG_IRPre="0" JTAG_DRPre="0" IP="" TargetDevice="APM32F103RC" TargetInterface="SWD" InterfaceSpeed="4000" />
             </JLink>
-            <ElfFile Name="D:\MyData\zhouxiong9\Desktop\TT-KZ-010A_CTRL_APP\MDK-ARM\QD007A_CTL_APP\QD007A_CTL_APP.axf" />
-            <DataFile Name="" />
-            <RawFile Name="" />
+            <ElfFile Name="D:\SoftDesign\20190311_QD007A_CTL\TT-KZ-010A_CTRL_APP\TT-KZ-010A_CTRL_APP\MDK-ARM\QD007A_CTL_APP\QD007A_CTL_APP.axf" />
             <Scope>
-                <Options TimeResolutionUs="500000" />
+                <Options TimeResolutionUs="1000000" />
             </Scope>
         </Configuration>
         <Windows>
@@ -19,19 +17,7 @@
         </Windows>
         <SelectedSymbols>
             <Symbol>
-                <Options Name="Ref_Torque" Address="0x200000D8" Type="short" TypeID="11" Size="2" GraphColorRed="255" GraphColorGreen="215" GraphColorBlue="0" YMinSampled="-1" YMaxSampled="24592" YAvgSampled="85" Offset="4" ShowInGraph="1" YOffset="200" IsAutoConfig="0" YResolution="1000" MaxValue="40000" File="..\User\Src\motor_control.c" Scope="0" DrawStyle="0" />
-            </Symbol>
-            <Symbol>
-                <Options Name="Ref_Speed" Address="0x200000DA" Type="short" TypeID="11" Size="2" GraphColorRed="0" GraphColorGreen="255" GraphColorBlue="0" YMinSampled="-1" YMaxSampled="18461" YAvgSampled="0" Offset="6" ShowInGraph="1" YOffset="200" IsAutoConfig="0" YResolution="1000" MaxValue="20000" File="..\User\Src\motor_control.c" Scope="0" DrawStyle="0" />
-            </Symbol>
-            <Symbol>
-                <Options Name="BusCurrent" Address="0x2000081C" Type="ushort" TypeID="7" Size="2" GraphColorRed="0" GraphColorGreen="0" GraphColorBlue="176" YMinSampled="0" YMaxSampled="65535" YAvgSampled="2763" Offset="8" ShowInGraph="1" YOffset="200" IsAutoConfig="1" YResolution="20000" MaxValue="97600" File="..\User\Src\var.c" Scope="0" DrawStyle="0" />
-            </Symbol>
-            <Symbol>
-                <Options Name="qV_Component1" Address="0x2000002C" Type="short" TypeID="11" Size="2" GraphColorRed="255" GraphColorGreen="0" GraphColorBlue="0" YMinSampled="-27856" YMaxSampled="25557" YAvgSampled="3115" Offset="10" ShowInGraph="0" YOffset="200" IsAutoConfig="1" YResolution="20000" MaxValue="40000" File="..\User\Src\MC_Globals.c" Scope="0" DrawStyle="0" />
-            </Symbol>
-            <Symbol>
-                <Options Name="GasSensor" Address="0x20000510" Type="ushort" TypeID="7" Size="2" GraphColorRed="255" GraphColorGreen="0" GraphColorBlue="0" YMinSampled="0" YMaxSampled="65535" YAvgSampled="339" Offset="12" ShowInGraph="1" YOffset="200" IsAutoConfig="0" YResolution="2000" MaxValue="97600" File="..\Core\Src\adc.c" Scope="0" DrawStyle="0" />
+                <Options Name="SpeedRatio" Address="0x200001F6" Type="ushort" TypeID="7" Size="2" GraphColorRed="255" GraphColorGreen="0" GraphColorBlue="0" YMinSampled="0" YMaxSampled="257" YAvgSampled="0.425967" Offset="4" ShowInGraph="1" ACCoupling="0" YOffset="0" IsAutoConfig="0" YResolution="100" MaxValue="65535" File="..\User\Src\var.c" Scope="0" DrawStyle="0" />
             </Symbol>
         </SelectedSymbols>
     </Project>

+ 12 - 12
MDK-ARM/QD007A_CTL_APP.uvprojx

@@ -12,16 +12,16 @@
       <ToolsetName>ARM-ADS</ToolsetName>
       <TargetOption>
         <TargetCommonOption>
-          <Device>STM32F103RB</Device>
+          <Device>STM32F103RC</Device>
           <Vendor>STMicroelectronics</Vendor>
           <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>
+          <Cpu>IROM(0x08000000,0x00040000) IRAM(0x20000000,0x0000C000) CPUTYPE("Cortex-M3") CLOCK(12000000) ELITTLE</Cpu>
           <FlashUtilSpec></FlashUtilSpec>
           <StartupFile></StartupFile>
-          <FlashDriverDll>UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_128 -FS08000000 -FL020000 -FP0($$Device:STM32F103RB$Flash\STM32F10x_128.FLM))</FlashDriverDll>
+          <FlashDriverDll>UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_512 -FS08000000 -FL080000 -FP0($$Device:STM32F103RC$Flash\STM32F10x_512.FLM))</FlashDriverDll>
           <DeviceId>0</DeviceId>
-          <RegisterFile>$$Device:STM32F103RB$Device\Include\stm32f10x.h</RegisterFile>
+          <RegisterFile>$$Device:STM32F103RC$Device\Include\stm32f10x.h</RegisterFile>
           <MemoryEnv></MemoryEnv>
           <Cmp></Cmp>
           <Asm></Asm>
@@ -31,7 +31,7 @@
           <SLE66CMisc></SLE66CMisc>
           <SLE66AMisc></SLE66AMisc>
           <SLE66LinkerMisc></SLE66LinkerMisc>
-          <SFDFile>$$Device:STM32F103RB$SVD\STM32F103xx.svd</SFDFile>
+          <SFDFile>$$Device:STM32F103RC$SVD\STM32F103xx.svd</SFDFile>
           <bCustSvd>0</bCustSvd>
           <UseEnv>0</UseEnv>
           <BinPath></BinPath>
@@ -282,12 +282,12 @@
               <IRAM>
                 <Type>0</Type>
                 <StartAddress>0x20000000</StartAddress>
-                <Size>0x5000</Size>
+                <Size>0xc000</Size>
               </IRAM>
               <IROM>
                 <Type>1</Type>
                 <StartAddress>0x8000000</StartAddress>
-                <Size>0x20000</Size>
+                <Size>0x40000</Size>
               </IROM>
               <XRAM>
                 <Type>0</Type>
@@ -311,8 +311,8 @@
               </OCR_RVCT3>
               <OCR_RVCT4>
                 <Type>1</Type>
-                <StartAddress>0x8003000</StartAddress>
-                <Size>0x1cc00</Size>
+                <StartAddress>0x8000000</StartAddress>
+                <Size>0x40000</Size>
               </OCR_RVCT4>
               <OCR_RVCT5>
                 <Type>1</Type>
@@ -337,7 +337,7 @@
               <OCR_RVCT9>
                 <Type>0</Type>
                 <StartAddress>0x20000000</StartAddress>
-                <Size>0x5000</Size>
+                <Size>0xc000</Size>
               </OCR_RVCT9>
               <OCR_RVCT10>
                 <Type>0</Type>
@@ -849,8 +849,8 @@
   <RTE>
     <apis/>
     <components>
-      <component Cclass="CMSIS" Cgroup="CORE" Cvendor="ARM" Cversion="4.2.0" condition="Cortex-M Device">
-        <package name="CMSIS" schemaVersion="1.3" url="http://www.keil.com/pack/" vendor="ARM" version="4.4.0"/>
+      <component Cclass="CMSIS" Cgroup="CORE" Cvendor="ARM" Cversion="5.3.0" condition="ARMv6_7_8-M Device">
+        <package name="CMSIS" schemaVersion="1.3" url="http://www.keil.com/pack/" vendor="ARM" version="5.6.0"/>
         <targetInfos>
           <targetInfo name="QD007A_CTL_APP"/>
         </targetInfos>

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


BIN
MDK-ARM/bin/QD007A_CTL_APP.bin


+ 9 - 7
MDK-ARM/startup_stm32f103xb.lst

@@ -516,18 +516,20 @@ ARM Macro Assembler    Page 8
   334 00000004         
   335 00000004         
   336 00000004                 END
-Command Line: --debug --xref --cpu=Cortex-M3 --apcs=interwork --depend=.\qd007a
-_ctl_app\startup_stm32f103xb.d -o.\qd007a_ctl_app\startup_stm32f103xb.o -ID:\So
+Command Line: --debug --xref --diag_suppress=9931 --cpu=Cortex-M3 --apcs=interw
+ork --depend=.\qd007a_ctl_app\startup_stm32f103xb.d -o.\qd007a_ctl_app\startup_
 
 
 
 ARM Macro Assembler    Page 9 
 
 
-ftDesign\20190311_QD007A_CTL\TT-KZ-010A_CTRL_APP\TT-KZ-010A_CTRL_APP\MDK-ARM\RT
-E -IC:\Keil_v5\ARM\PACK\ARM\CMSIS\4.1.0\CMSIS\Include -IC:\Keil_v5\ARM\PACK\Kei
-l\STM32F1xx_DFP\1.0.4\Device\Include --predefine="__MICROLIB SETA 1" --list=sta
-rtup_stm32f103xb.lst startup_stm32f103xb.s
+stm32f103xb.o -ID:\SoftDesign\20190311_QD007A_CTL\TT-KZ-010A_CTRL_APP\TT-KZ-010
+A_CTRL_APP\MDK-ARM\RTE -IC:\Keil_v5\ARM\PACK\ARM\CMSIS\5.6.0\CMSIS\Core\Include
+ -IC:\Keil_v5\ARM\PACK\Keil\STM32F1xx_DFP\2.3.0\Device\Include --predefine="__M
+ICROLIB SETA 1" --predefine="__UVISION_VERSION SETA 515" --predefine="_RTE_ SET
+A 1" --predefine="STM32F10X_HD SETA 1" --list=startup_stm32f103xb.lst startup_s
+tm32f103xb.s
 
 
 
@@ -1257,4 +1259,4 @@ Symbol: __main
       At line 152 in file startup_stm32f103xb.s
 Comment: __main used once
 2 symbols
-405 symbols in table
+408 symbols in table

+ 16 - 8
MDK-ARM/stm32f1xx_stucpuregsaddressing.lst

@@ -121,13 +121,21 @@ ARM Macro Assembler    Page 2
                                                             ler
    98 00000096                 ENDP
    99 00000096                 END
-Command Line: --debug --xref --cpu=Cortex-M3 --apcs=interwork --depend=.\qd007a
-_ctl_app\stm32f1xx_stucpuregsaddressing.d -o.\qd007a_ctl_app\stm32f1xx_stucpure
-gsaddressing.o -ID:\SoftDesign\20190311_QD007A_CTL\TT-KZ-010A_CTRL_APP\TT-KZ-01
-0A_CTRL_APP\MDK-ARM\RTE -IC:\Keil_v5\ARM\PACK\ARM\CMSIS\4.1.0\CMSIS\Include -IC
-:\Keil_v5\ARM\PACK\Keil\STM32F1xx_DFP\1.0.4\Device\Include --predefine="__MICRO
-LIB SETA 1" --list=stm32f1xx_stucpuregsaddressing.lst ..\SelfTestUser\src_speci
-fic\stm32f1xx_STUCpuRegsAddressing.s
+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:\SoftDesign\20190311_QD007A_CTL\TT-KZ-0
+10A_CTRL_APP\TT-KZ-010A_CTRL_APP\MDK-ARM\RTE -IC:\Keil_v5\ARM\PACK\ARM\CMSIS\5.
+6.0\CMSIS\Core\Include -IC:\Keil_v5\ARM\PACK\Keil\STM32F1xx_DFP\2.3.0\Device\In
+clude --predefine="__MICROLIB SETA 1" --predefine="__UVISION_VERSION SETA 515" 
+--predefine="_RTE_ SETA 1" --predefine="STM32F10X_HD SETA 1" --list=stm32f1xx_s
+
+
+
+ARM Macro Assembler    Page 3 
+
+
+tucpuregsaddressing.lst ..\SelfTestUser\src_specific\stm32f1xx_STUCpuRegsAddres
+sing.s
 
 
 
@@ -239,4 +247,4 @@ ssing.s
 ssing.s
 Comment: FailSafePOR used once
 3 symbols
-338 symbols in table
+341 symbols in table

+ 9 - 8
MDK-ARM/stm32f1xx_stucpuwalkpatkeil.lst

@@ -1591,13 +1591,14 @@ ARM Macro Assembler    Page 25
  1170 000006D0         
  1171 000006D0         
  1172 000006D0                 END
-Command Line: --debug --xref --cpu=Cortex-M3 --apcs=interwork --depend=.\qd007a
-_ctl_app\stm32f1xx_stucpuwalkpatkeil.d -o.\qd007a_ctl_app\stm32f1xx_stucpuwalkp
-atkeil.o -ID:\SoftDesign\20190311_QD007A_CTL\TT-KZ-010A_CTRL_APP\TT-KZ-010A_CTR
-L_APP\MDK-ARM\RTE -IC:\Keil_v5\ARM\PACK\ARM\CMSIS\4.1.0\CMSIS\Include -IC:\Keil
-_v5\ARM\PACK\Keil\STM32F1xx_DFP\1.0.4\Device\Include --predefine="__MICROLIB SE
-TA 1" --list=stm32f1xx_stucpuwalkpatkeil.lst ..\SelfTestUser\src_specific\stm32
-f1xx_STUCpuWalkpatKEIL.s
+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:\SoftDesign\20190311_QD007A_CTL\TT-KZ-010A_CT
+RL_APP\TT-KZ-010A_CTRL_APP\MDK-ARM\RTE -IC:\Keil_v5\ARM\PACK\ARM\CMSIS\5.6.0\CM
+SIS\Core\Include -IC:\Keil_v5\ARM\PACK\Keil\STM32F1xx_DFP\2.3.0\Device\Include 
+--predefine="__MICROLIB SETA 1" --predefine="__UVISION_VERSION SETA 515" --pred
+efine="_RTE_ SETA 1" --predefine="STM32F10X_HD SETA 1" --list=stm32f1xx_stucpuw
+alkpatkeil.lst ..\SelfTestUser\src_specific\stm32f1xx_STUCpuWalkpatKEIL.s
 
 
 
@@ -2665,4 +2666,4 @@ KEIL.s
 KEIL.s
 
 1 symbol
-398 symbols in table
+401 symbols in table

+ 9 - 8
MDK-ARM/stm32f1xx_sturamwalkpatkeil.lst

@@ -428,13 +428,14 @@ ARM Macro Assembler    Page 7
   329 000001F2                 ENDP
   330 000001F2         
   331 000001F2                 END
-Command Line: --debug --xref --cpu=Cortex-M3 --apcs=interwork --depend=.\qd007a
-_ctl_app\stm32f1xx_sturamwalkpatkeil.d -o.\qd007a_ctl_app\stm32f1xx_sturamwalkp
-atkeil.o -ID:\SoftDesign\20190311_QD007A_CTL\TT-KZ-010A_CTRL_APP\TT-KZ-010A_CTR
-L_APP\MDK-ARM\RTE -IC:\Keil_v5\ARM\PACK\ARM\CMSIS\4.1.0\CMSIS\Include -IC:\Keil
-_v5\ARM\PACK\Keil\STM32F1xx_DFP\1.0.4\Device\Include --predefine="__MICROLIB SE
-TA 1" --list=stm32f1xx_sturamwalkpatkeil.lst ..\SelfTestUser\src_specific\stm32
-f1xx_STURamWalkpatKEIL.s
+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:\SoftDesign\20190311_QD007A_CTL\TT-KZ-010A_CT
+RL_APP\TT-KZ-010A_CTRL_APP\MDK-ARM\RTE -IC:\Keil_v5\ARM\PACK\ARM\CMSIS\5.6.0\CM
+SIS\Core\Include -IC:\Keil_v5\ARM\PACK\Keil\STM32F1xx_DFP\2.3.0\Device\Include 
+--predefine="__MICROLIB SETA 1" --predefine="__UVISION_VERSION SETA 515" --pred
+efine="_RTE_ SETA 1" --predefine="STM32F10X_HD SETA 1" --list=stm32f1xx_sturamw
+alkpatkeil.lst ..\SelfTestUser\src_specific\stm32f1xx_STURamWalkpatKEIL.s
 
 
 
@@ -811,4 +812,4 @@ IL.s
       None
 Comment: FailSafePOR unused
 1 symbol
-360 symbols in table
+363 symbols in table

+ 1 - 1
User/Inc/I2C_Analog.h

@@ -3,7 +3,7 @@
 
 #include "stm32f1xx_hal.h"
 
-#define DLY_US 50 
+#define DLY_US 20 
 
 typedef struct
 {

+ 6 - 1
User/Inc/cadence_sensor.h

@@ -42,6 +42,11 @@ extern uint16_t MC_Cadence_Array[10];
 
 extern uint8_t Cadence_ReadHallState(void);
 extern void CadenceSensor_GPIO_Init(void);
-extern void CadenceSensor_Process(MC_CadenceResult_Struct_t* p_MC_CadenceResult, uint16_t StopDelayTime, uint8_t StarCount, TrueOrFalse_Flag_Struct_t UpSlopeFlag);
+
+//适用双通道输出传感器,根据相位判断方向
+extern void CadenceSensor_Process1(MC_CadenceResult_Struct_t* p_MC_CadenceResult, uint16_t StopDelayTime, uint8_t StarCount, TrueOrFalse_Flag_Struct_t UpSlopeFlag);
+
+//适用频率和方向输出传感器,
+extern void CadenceSensor_Process2(MC_CadenceResult_Struct_t* p_MC_CadenceResult, uint16_t StopDelayTime, uint8_t StarCount, TrueOrFalse_Flag_Struct_t UpSlopeFlag);
 
 #endif

+ 2 - 1
User/Inc/fault_check.h

@@ -7,7 +7,8 @@
 #include "motor_control.h"
 
 extern void MC_Fault_HallSensor_Process(MC_HallSensorStatus_Struct_t HallSensorStatus, MC_ErrorCode_Struct_t* p_MC_ErrorCode);
-extern void MC_Fault_CadenceSensor_Process(uint16_t Torque, uint16_t BikeSpeed, MC_ErrorCode_Struct_t* p_MC_ErrorCode);
+extern void MC_Fault_CadenceSensor_Process1(uint16_t Torque, uint16_t BikeSpeed, MC_ErrorCode_Struct_t* p_MC_ErrorCode);
+extern void MC_Fault_CadenceSensor_Process2(uint16_t Torque, uint16_t BikeSpeed, MC_ErrorCode_Struct_t* p_MC_ErrorCode);
 extern void MC_Fault_Check_Process(void);
 
 #endif

+ 2 - 1
User/Inc/tasks.h

@@ -20,11 +20,12 @@ extern uint8_t MC_CadenceLimit_Cal(uint8_t Cadence, uint16_t Current, uint8_t T_
 extern void PowerOff_Process(TrueOrFalse_Flag_Struct_t ReturnEnable);
 extern void MC_CanRxCheck_Process(MC_SupportFlag_Struct_t NoPBU_Flag, MC_SupportFlag_Struct_t NoHMI_Flag, MC_WorkMode_Struct_t WorkMode, MC_GearSt_Struct_t* GearSt);
 extern void MC_UartRxCheck_Process(void);
-extern void MC_RunTime_Cal(uint32_t* p_Runtime);
+extern void MC_RunTime_Cal(void);
 extern void MC_DeviceCheck(Device_CheckInfo_Struct_t* p_Device, MC_ErrorCode_Struct_t* p_ErrorCode);
 extern void Cal_SyncClockFreq(uint16_t* Result);
 extern void MC_TemperatureLogProcess(void);
 extern void MC_TE_SensorScan(MC_TE_SensorData_Struct_t* p_MC_TE_SensorData);
 extern void NoPBUMode_Ini( void );
 extern void BikeRatioCal_Process(uint16_t MotorSpeed, uint16_t Cadence, uint16_t BikeSpeed, Bike_RatioCal_Struct_t* p_Bike_RatioCal);
+
 #endif

+ 21 - 6
User/Inc/var.h

@@ -327,12 +327,22 @@ typedef struct
 //MC骑行历史信息,占用空间16bytes
 typedef struct
 {
-  uint32_t ODO_Km;     //ODO里程,地址偏移0
-	uint32_t ODO_Time;   //ODO时间,地址偏移4
-	uint32_t TRIP_Km;    //TRIP里程,地址偏移8
-	uint32_t TRIP_Time;  //TRIP时间,地址偏移12
+  uint32_t  ODO_Km;     //ODO里程,地址偏移0
+	uint32_t  ODO_Time;   //ODO时间,地址偏移4
+	uint32_t  TRIP_Km;    //TRIP里程,地址偏移8
+	uint32_t  TRIP_Time;  //TRIP时间,地址偏移12
 }MC_RideLog_Struct_t;
 
+//MC骑行信息,占用空间16bytes
+typedef struct
+{
+  uint16_t SpeedAvg;    //平均车速
+	uint16_t SpeedMax;    //最高车速
+	uint32_t Cal_Trip;    //卡路里Trip
+	uint16_t Cal_Once;    //卡路里Once
+	uint8_t RS[6];
+}MC_RideInfo_Struct_t;
+
 //MC版本信息,占用空间64bytes
 typedef struct
 {
@@ -361,7 +371,8 @@ typedef struct
 	uint32_t Run_Time;
 	uint32_t Log_ODO_Km;
 	uint32_t Log_ODO_Time;
-	uint32_t RS[3];
+	uint32_t PedalPoweSum;
+	uint32_t RS[2];
 }MC_PowerOffBkp_Struct_t;
 
 //电池运行状态,占用空间1bytes
@@ -509,7 +520,8 @@ typedef struct
 	uint16_t GearSt_SPORT;  //SPORT平均功耗,单位mAh/km
 	uint16_t GearSt_TURBO;  //TURBO平均功耗,单位mAh/km
 	uint16_t GearSt_SMART;  //SMART平均功耗,单位mAh/km
-	uint16_t Rs[3];
+	uint16_t SpeedMax;      //预留最高车速
+	uint32_t PedalPowerSum; //人力累计功率,单位Wmin,	
 }MC_AvgPower_Struct_t;
 
 //传动比计算参数
@@ -570,6 +582,7 @@ extern ComOK_Check_Struct_t IsComOK_HMI;
 extern ComOK_Check_Struct_t IsComOK_BMS;
 extern MC_AttitudeAngle_Struct_t MC_AttitudeAngle;
 extern MC_RideLog_Struct_t MC_RideLog;
+extern MC_RideInfo_Struct_t MC_RideInfo;
 extern MC_AvgPower_Struct_t MC_AvgPower;
 extern MCU_Manufacturter_Struct_t MCUManufacturer;                         
 extern uint16_t SpeedRatio;
@@ -577,6 +590,8 @@ extern uint16_t HardwareVersion_AD;
 extern TrueOrFalse_Flag_Struct_t VersionIdentifyFinishedFlag;
 extern TrueOrFalse_Flag_Struct_t PowerDown_SaveFlag;
 extern Bike_RatioCal_Struct_t Bike_RatioCalParam;
+extern int32_t PedalPowerFltSum;
+
 
 /**************************全局变量声明End***************************/
 

+ 117 - 1
User/Src/cadence_sensor.c

@@ -46,7 +46,7 @@ void CadenceSensor_GPIO_Init(void)
 }
 
 //踏频传感器检测处理
-void CadenceSensor_Process(MC_CadenceResult_Struct_t* p_MC_CadenceResult, uint16_t StopDelayTime, uint8_t StarCount, TrueOrFalse_Flag_Struct_t UpSlopeFlag)
+void CadenceSensor_Process1(MC_CadenceResult_Struct_t* p_MC_CadenceResult, uint16_t StopDelayTime, uint8_t StarCount, TrueOrFalse_Flag_Struct_t UpSlopeFlag)
 {
 	static MC_CadenceSensorStatus_Struct_t MC_CadenceSensorStatus;
 	static TrueOrFalse_Flag_Struct_t IsFirstEnterFalg = TRUE;
@@ -181,6 +181,122 @@ void CadenceSensor_Process(MC_CadenceResult_Struct_t* p_MC_CadenceResult, uint16
 	MC_CadenceSensorStatus.HallGropuStatus_Old = MC_CadenceSensorStatus.HallGropuStatus;
 }
 
+void CadenceSensor_Process2(MC_CadenceResult_Struct_t* p_MC_CadenceResult, uint16_t StopDelayTime, uint8_t StarCount, TrueOrFalse_Flag_Struct_t UpSlopeFlag)
+{
+  static MC_CadenceSensorStatus_Struct_t MC_CadenceSensorStatus;
+	static TrueOrFalse_Flag_Struct_t IsFirstEnterFalg = TRUE;
+	uint8_t CadenceHallStatus1, CadenceHallStatus2, CadenceHallStatus3;
+	
+	//读取霍尔信号
+	CadenceHallStatus1 = Cadence_ReadHallState();
+	CadenceHallStatus2 = Cadence_ReadHallState();
+	CadenceHallStatus3 = Cadence_ReadHallState();	
+	//连续采集三次霍尔,三次状态都一致才更新霍尔状态,防us级干扰
+	if( (CadenceHallStatus1==CadenceHallStatus2)&&(CadenceHallStatus2==CadenceHallStatus3) ) 
+	{
+		MC_CadenceSensorStatus.HallGropuStatus = CadenceHallStatus3;
+	}
+	if(IsFirstEnterFalg == TRUE)
+	{
+	  MC_CadenceSensorStatus.HallGropuStatus_Old = MC_CadenceSensorStatus.HallGropuStatus;
+		IsFirstEnterFalg = FALSE;
+	}
+	
+	//正反转判断
+	if(MC_CadenceSensorStatus.HallGropuStatus != MC_CadenceSensorStatus.HallGropuStatus_Old)
+	{
+	  static uint16_t BackwordDelayCnt1 = 0;
+		if((MC_CadenceSensorStatus.HallGropuStatus & 0x02) == 0x02) //正转
+		{
+			p_MC_CadenceResult->Cadence_Dir = MC_Cadence_Forward;
+			BackwordDelayCnt1 = 0;
+		}
+		else //反转
+		{
+			BackwordDelayCnt1++;
+			if(BackwordDelayCnt1 >= 4)//检测到连续4次反向脉冲则判断为反转,约4/120*360=12度
+			{
+				p_MC_CadenceResult->Cadence_Dir = MC_Cadence_Backward;
+				BackwordDelayCnt1 = 0;
+			}
+		}
+	}
+  
+  //踏频计算与停止判断
+	static uint32_t CadenceCalTimeCnt = 0;       //用于计算蹋频值
+	static int32_t Cadence_ActiveFlt = 0;
+	static uint16_t CadenceTemp;	
+	static uint8_t CadenceStarFlagCnt = 0;       //用于判断启动
+	static uint32_t CadenceStopJudgeTimeCnt = 0; //用于判断停止	
+	uint8_t CadenceStartThresholdValue = 2;  //踏频启动阈值,霍尔信号数,6度/个
+	
+	if((MC_CadenceSensorStatus.HallGropuStatus & 0x01) != (MC_CadenceSensorStatus.HallGropuStatus_Old & 0x01))
+	{	  
+	  //踏频计算及滤波处理
+	  CadenceTemp	= 500 / (HAL_GetTick() - CadenceCalTimeCnt);//转1圈有120个信号,根据两个信号之间的时间计算踏频值rpm
+		CadenceCalTimeCnt = HAL_GetTick();
+		
+		/*上坡时,启动阈值为1*/
+		if(UpSlopeFlag == TRUE)
+		{
+			CadenceStartThresholdValue =  1;
+		}
+		else
+		{
+			CadenceStartThresholdValue =  StarCount;
+		}
+		
+		//起步判断
+		if(p_MC_CadenceResult->Cadence_Dir == MC_Cadence_Forward)
+		{
+		  CadenceStarFlagCnt++;
+			if(CadenceStarFlagCnt >= CadenceStartThresholdValue)
+			{
+			  p_MC_CadenceResult->IsStopFlag = FALSE;
+			}
+		}
+		else
+		{
+		  p_MC_CadenceResult->IsStopFlag = TRUE;
+		}
+		
+		/*根据踏频的信号,对力矩进行滤波处理*/
+		p_MC_CadenceResult->torqueByCadence = torqueFilteredThroughCadence(ADC_SensorData.TorqueSensor,1);
+		
+		//更新停机计时数值
+		CadenceStopJudgeTimeCnt = HAL_GetTick();
+		
+		p_MC_CadenceResult->TrigCount++;
+	}
+	Cadence_ActiveFlt += (((int32_t)CadenceTemp << 10) - Cadence_ActiveFlt) >> 8;
+	p_MC_CadenceResult->Cadence_Data = (uint8_t)(Cadence_ActiveFlt >> 10);
+	
+	//停机判断
+	/*
+  n < 20rpm, k = 3
+  n > 40rpm, k = 1
+  20rpm <= n <= 40rpm, k = -0.1 * n + 5
+  */  
+  uint16_t k = 100;
+  k = (CadenceTemp < 20) ? 300 : ((CadenceTemp > 40) ? 100 : (500 - CadenceTemp * 10));
+  StopDelayTime = k * StopDelayTime / 100;
+	if((HAL_GetTick() - CadenceStopJudgeTimeCnt) > StopDelayTime)
+	{
+		p_MC_CadenceResult->IsStopFlag = TRUE;
+		p_MC_CadenceResult->Cadence_Dir = MC_Cadence_Stop;
+		p_MC_CadenceResult->Cadence_Data = 0;
+		CadenceTemp = 0;
+		Cadence_ActiveFlt = 0;
+		CadenceStarFlagCnt =0;
+		
+		/*清零相关变量*/
+		p_MC_CadenceResult->torqueByCadence = torqueFilteredThroughCadence(ADC_SensorData.TorqueSensor,0);		
+	}
+	
+	MC_CadenceSensorStatus.HallGropuStatus_Old = MC_CadenceSensorStatus.HallGropuStatus;
+	
+}
+
 uint16_t torqueFilteredThroughCadence(uint16_t torque_temp, uint8_t modeFlag)
 {
 	#define T_FIFO_LENGTH 30                       //每个信号6度,30为180度 

+ 9 - 0
User/Src/can_process.c

@@ -225,6 +225,7 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 				case 0x3500://OBC查询骑行历史
 				{
 				  SendData(ID_MC_BC, MODE_REPORT, 0x1510, (uint8_t*)&MC_RideLog.ODO_Km);
+					SendData(ID_MC_BC, MODE_REPORT, 0x1A10, (uint8_t*)&MC_RideInfo.SpeedAvg);
 					break;
 				}
 				case 0x3605://OBC清除TRIP信息
@@ -247,6 +248,9 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 						SendData(ID_MC_TO_PBU, MODE_REPORT, 0x5303, (uint8_t*)"ACK");
 						MC_RunInfo.Ride_Km = 0;
 						MC_RunInfo.Ride_Time = 0;
+						MC_AvgPower.SpeedMax = 0;	
+						SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_AVG_POWER, sizeof(MC_AvgPower_Struct_t), (uint8_t*)&MC_AvgPower.GearSt_ECO);
+						PedalPowerFltSum = 0;
 					}
 					break;
 				}
@@ -445,6 +449,7 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 			  case 0x3400://查询电机骑行历史信息
 				{
 					SendData(ID_MC_BC, MODE_REPORT, 0x1510, (uint8_t*)&MC_RideLog.ODO_Km);
+					SendData(ID_MC_BC, MODE_REPORT, 0x1A10, (uint8_t*)&MC_RideInfo.SpeedAvg);
 					break;
 				}
 				case 0x3505://清除TRIP信息
@@ -467,6 +472,9 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 						SendData(ID_MC_TO_HMI, MODE_REPORT, 0x7403, (uint8_t*)"ACK");
 						MC_RunInfo.Ride_Km = 0;
 						MC_RunInfo.Ride_Time = 0;
+						MC_AvgPower.SpeedMax = 0;	
+            SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_AVG_POWER, sizeof(MC_AvgPower_Struct_t), (uint8_t*)&MC_AvgPower.GearSt_ECO);						
+						PedalPowerFltSum = 0;
 					}
 				}
 				default:break;
@@ -752,6 +760,7 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 				case 0x2E00://查询骑行历史信息
 				{
 					SendData(ID_MC_BC, MODE_REPORT, 0x1510, (uint8_t*)&MC_RideLog.ODO_Km);
+					SendData(ID_MC_BC, MODE_REPORT, 0x1A10, (uint8_t*)&MC_RideInfo.SpeedAvg);
 					break;
 				}
 				case 0x2F00://读取姿态传感器数值

+ 4 - 1
User/Src/eeprom_24c02.c

@@ -447,9 +447,12 @@ int8_t SavePowerOffBakData(I2C_Handle_Struct_t* I2C_Handle, TrueOrFalse_Flag_Str
 		MC_RideLog.TRIP_Time = MC_PowerOffBkp.Trip_Time;
 		MC_RunLog1.ODO_Km = MC_PowerOffBkp.Log_ODO_Km;
 		MC_RunLog1.ODO_Time = MC_PowerOffBkp.Log_ODO_Time;
+		MC_AvgPower.PedalPowerSum = MC_PowerOffBkp.PedalPoweSum;
 		if(SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_RIDE_LOG, sizeof(MC_RideLog_Struct_t), (uint8_t*)&MC_RideLog.ODO_Km) == ACK_FAIL)
 		{
-			SaveParamToEEprom_24C02(I2C_Handle, EEPROM_24C02_ADDR_RIDE_LOG, sizeof(MC_RideLog_Struct_t), (uint8_t*)&MC_RideLog.ODO_Km);
+			SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_RUN_LOG1, sizeof(MC_RunLog1_Struct_t), (uint8_t*)&MC_RunLog1.PowerOnCnt);
+			SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_RIDE_LOG, sizeof(MC_RideLog_Struct_t), (uint8_t*)&MC_RideLog.ODO_Km);
+			SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_AVG_POWER, sizeof(MC_AvgPower_Struct_t), (uint8_t*)&MC_AvgPower.GearSt_ECO);
 		}
 	}
 	

+ 56 - 3
User/Src/fault_check.c

@@ -1064,7 +1064,7 @@ void MC_Fault_HallSensor_Process(MC_HallSensorStatus_Struct_t HallSensorStatus,
 }
 
 //踏频传感器故障检测
-void MC_Fault_CadenceSensor_Process(uint16_t Torque, uint16_t BikeSpeed, MC_ErrorCode_Struct_t* p_MC_ErrorCode)
+void MC_Fault_CadenceSensor_Process1(uint16_t Torque, uint16_t BikeSpeed, MC_ErrorCode_Struct_t* p_MC_ErrorCode)
 {
 	static uint8_t Hall_1_Trg = 0; //霍尔1信号变化标志
 	static uint8_t Hall_1_Cont = 0;//霍尔1状态
@@ -1126,7 +1126,7 @@ void MC_Fault_CadenceSensor_Process(uint16_t Torque, uint16_t BikeSpeed, MC_Erro
 			//判断霍尔2
 			if(Hall_2_Trg == 0)
 			{
-			  if((HAL_GetTick() - Hall_2_Fault_TrigTimeCnt) > 5000)
+			  if((HAL_GetTick() - Hall_2_Fault_TrigTimeCnt) > 10000)
 				{
 				  p_MC_ErrorCode->ERROR_Bit.Fault_CadenceSensor = 1;
 					//记录故障日志
@@ -1147,7 +1147,7 @@ void MC_Fault_CadenceSensor_Process(uint16_t Torque, uint16_t BikeSpeed, MC_Erro
       //判断霍尔1和霍尔2黏连
       if(Hall_1_2_EQA_Flag == 0) 
 			{
-			  if((HAL_GetTick() - Hall_1_2_EQA_TrigTimeCnt) > 5000)
+			  if((HAL_GetTick() - Hall_1_2_EQA_TrigTimeCnt) > 10000)
 				{
 				  p_MC_ErrorCode->ERROR_Bit.Fault_CadenceSensor = 1;
 					//记录故障日志
@@ -1175,6 +1175,59 @@ void MC_Fault_CadenceSensor_Process(uint16_t Torque, uint16_t BikeSpeed, MC_Erro
 	}
 }
 
+void MC_Fault_CadenceSensor_Process2(uint16_t Torque, uint16_t BikeSpeed, MC_ErrorCode_Struct_t* p_MC_ErrorCode)
+{
+	static uint8_t Hall_2_Trg = 0; //霍尔2信号变化标志
+	static uint8_t Hall_2_Cont = 0;//霍尔2状态
+	static uint32_t Hall_2_Fault_TrigTimeCnt = 0;
+	static uint8_t Hall_2_State;
+		
+	Hall_2_State = HAL_GPIO_ReadPin(CADENCE_2_GPIO_Port, CADENCE_2_Pin);
+	
+	//更新霍尔2信号变化状态,相同为0,不同为1
+	Hall_2_Trg = Hall_2_State ^ Hall_2_Cont;
+	Hall_2_Cont = Hall_2_State;
+	
+	if(HAL_GetTick() < 1000)
+	{
+		Hall_2_Fault_TrigTimeCnt = HAL_GetTick();
+		return;
+	}
+	
+	if(p_MC_ErrorCode->ERROR_Bit.Fault_CadenceSensor == 0)
+	{		
+		//两个霍尔传感器分别检测是否存在开路或短路 
+		if((Torque > 1200) && (BikeSpeed > 70))
+		{
+			//判断霍尔2
+			if(Hall_2_Trg == 0)
+			{
+			  if((HAL_GetTick() - Hall_2_Fault_TrigTimeCnt) > 10000)
+				{
+				  p_MC_ErrorCode->ERROR_Bit.Fault_CadenceSensor = 1;
+					//记录故障日志
+					MC_ErrorLogSaveInfo.NotesInfo1 = 2;
+		  		ErrorLogSave_Update(&MC_ErrorLogSaveInfo);
+			  	IsErrorLogSaveInfoUpdateFlag = TRUE;
+					//存储故障次数
+          MC_RunLog2.CadenceSensor_FaultCnt++;
+					RunLogSaveIndex = 2;
+					
+					return;
+				}
+			}
+			else
+			{
+			  Hall_2_Fault_TrigTimeCnt = HAL_GetTick();
+			}		
+		}
+		else
+		{
+		  Hall_2_Fault_TrigTimeCnt = HAL_GetTick();
+		}
+	}
+}
+
 //故障检测
 void MC_Fault_Check_Process(void)
 {	

+ 1 - 1
User/Src/hardware_check.c

@@ -68,7 +68,7 @@ void GetHardware_Versin(uint16_t VolaVal)
 						#else
 						Error
 						#endif
-						MC_VerInfo.HW_Version[7] =Hardware_VersionTable[Count];
+						MC_VerInfo.HW_Version[7] = Hardware_VersionTable[Count];
 						VersionIdentifyFinishedFlag = TRUE;
 						return ;
 					}

+ 92 - 23
User/Src/tasks.c

@@ -44,12 +44,24 @@ void HAL_SYSTICK_Callback(void)
 	}
 
 	//踏频传感器采集及计算
-	CadenceSensor_Process(&MC_CadenceResult, MC_ConfigParam1.StopTime, (MC_ConfigParam1.CadenceStarNum == 0) ? 2 : MC_ConfigParam1.CadenceStarNum, FALSE);
+	if(VersionIdentifyFinishedFlag == TRUE)
+	{
+		if(MC_VerInfo.HW_Version[7] < 'C')
+	    CadenceSensor_Process1(&MC_CadenceResult, MC_ConfigParam1.StopTime, (MC_ConfigParam1.CadenceStarNum == 0) ? 2 : MC_ConfigParam1.CadenceStarNum, FALSE);
+		else
+			CadenceSensor_Process2(&MC_CadenceResult, MC_ConfigParam1.StopTime, (MC_ConfigParam1.CadenceStarNum == 0) ? 2 : MC_ConfigParam1.CadenceStarNum, FALSE);
+	}	
 	
 	//踏频传感器故障检测
 	if(MC_WorkMode == MC_WorkMode_Run)
 	{
-	  MC_Fault_CadenceSensor_Process(ADC_SensorData.TorqueSensor, MC_RunInfo.BikeSpeed, &MC_ErrorCode);
+	  if(VersionIdentifyFinishedFlag == TRUE)
+		{
+			if(MC_VerInfo.HW_Version[7] < 'C')
+		    MC_Fault_CadenceSensor_Process1(ADC_SensorData.TorqueSensor, MC_RunInfo.BikeSpeed, &MC_ErrorCode);		
+			else
+				MC_Fault_CadenceSensor_Process2(ADC_SensorData.TorqueSensor, MC_RunInfo.BikeSpeed, &MC_ErrorCode);
+		}		
 	}
 	
 	//根据电机工作模式(MC_WorkMode)、力矩传感器和指拨AD值(ADC_SensorData)、控制档位(MC_ControlCode.GearSt)计算控制FOC输入值(MC_CalParam)
@@ -172,6 +184,9 @@ void MC_RunInfo_Update(void)
 		//计算力矩值
 		MC_RunInfo.Torque = ADC_SensorData.TorqueSensor / 28;
 		
+		//踩踏功率计算		
+		PedalPowerFltSum += (((int32_t)(MC_RunInfo.Cadence * MC_RunInfo.Torque * 107) - PedalPowerFltSum) >> 4);  //P = n * T / 9.55		
+		
 		//当前助力档位
 		MC_RunInfo.GearSt = MC_ControlCode.GearSt;
 		
@@ -237,12 +252,12 @@ void MC_RunInfo_Update(void)
 			MC_RunInfo.Ride_Km++;
 			MC_RunInfo.ODO_Km = MC_RideLog.ODO_Km / 10;
 			
-			#if 1 //自动存储骑行里程
+			#if 0 //自动存储骑行里程
 			static uint8_t SavePeriodCount = 0;
 			SavePeriodCount++;
 			if(SavePeriodCount >= 30)//存储周期为3km
 			{
-				SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_RUN_LOG1, sizeof(MC_RunLog1_Struct_t), (uint8_t*)&MC_RunLog1.PowerOnCnt);
+				SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_RUN_LOG1, sizeof(MC_RunLog_Struct_t), (uint8_t*)&MC_RunLog.PowerOnCnt);
 				SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_RIDE_LOG, sizeof(MC_RideLog_Struct_t), (uint8_t*)&MC_RideLog.ODO_Km);
 				SavePeriodCount = 0;
 			}
@@ -274,22 +289,50 @@ void MC_RunInfo_Update(void)
 			//更新骑行历史信息中骑行时间
 	  	MC_RideLog.ODO_Time++;
 			MC_RunLog1.ODO_Time++;
+			MC_RideLog.TRIP_Time++;
 			#if 0 //时间是否自动归零
-			MC_RideLog.ODO_Time = (MC_RideLog.ODO_Time > 599999) ? 0 : MC_RideLog.ODO_Time;   //超过9999h59min,清零
-			MC_RideLog.TRIP_Time = (MC_RideLog.TRIP_Time > 599999) ? 0 : MC_RideLog.TRIP_Time;//超过9999h59min,清零
+			if(MC_RideLog.ODO_Time > 599999)
+				MC_RideLog.ODO_Time = 0;
+			if(MC_RideLog.TRIP_Info.TripTime_MaxSpeed.TRIP_Time > 599999)
+				MC_RideLog.TRIP_Info.TripTime_MaxSpeed.TRIP_Time > 599999 = 0;
 			#endif
-			MC_RideLog.TRIP_Time++;
+			//骑行功率累计
+			MC_AvgPower.PedalPowerSum += (PedalPowerFltSum >> 10); //Wmin			
 		}
 		//存储骑行总时间
+		#if 0 //根据骑行时间自动存储
 		if(SavePeriod_Cnt >= 600)  //累计骑行600s进行存储
 		{
 		  SavePeriod_Cnt = 0;
 			SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_RUN_LOG1, sizeof(MC_RunLog1_Struct_t), (uint8_t*)&MC_RunLog1.PowerOnCnt);
-      SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_RIDE_LOG, sizeof(MC_RideLog_Struct_t), (uint8_t*)&MC_RideLog.ODO_Km);
+      SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_RIDE_LOG, sizeof(MC_RideLog_Struct_t), (uint8_t*)&MC_RideLog.ODO_Km);		
 		}
+		#endif
 		
 		//平均功耗
 		MC_RunInfo.PowerPerKm = RemainDis.Power_per_km_result / 10;
+
+    //骑行信息计算
+		do
+		{		
+			uint16_t PowerAvg;
+	    //最大车速
+			if(MC_AvgPower.SpeedMax < MC_RunInfo.BikeSpeed)
+				MC_AvgPower.SpeedMax = MC_RunInfo.BikeSpeed;
+			MC_RideInfo.SpeedMax = MC_AvgPower.SpeedMax;
+			//平均车速
+			if(MC_RideLog.TRIP_Time == 0)
+				MC_RideInfo.SpeedAvg = 0;
+			else
+				MC_RideInfo.SpeedAvg = MC_RideLog.TRIP_Km * 60 / MC_RideLog.TRIP_Time;
+			//卡路里
+			if(MC_RideLog.ODO_Time == 0)
+				PowerAvg = 0;
+			else
+				PowerAvg = MC_AvgPower.PedalPowerSum /  MC_RideLog.ODO_Time;
+			MC_RideInfo.Cal_Trip = PowerAvg * 66 * MC_RideLog.TRIP_Time / 1000; //Cal = P * 1.1 * 3.6 * t(h)
+			MC_RideInfo.Cal_Once = PowerAvg * 11 * MC_RunInfo.Ride_Time / 10000; //Cal = P * 1.1 * 3.6 * t(h)
+		}while(0);		
 		
 	}
 }
@@ -306,8 +349,8 @@ void MC_DebugInfo_Update(void)
 		MC_DebugInfo.SysFSM2 = FOC_Status;                                //FOC状态
 		MC_DebugInfo.SysFSM3 = 0;
 		MC_DebugInfo.SysFSM4 = 0;
-		MC_DebugInfo.IdRef = IqFluxLessRef;                               //IdRef
-		MC_DebugInfo.IqRef = IdFluxLessRef;                               //IqRef
+		MC_DebugInfo.IdRef = IdFluxLessRef;                               //IdRef
+		MC_DebugInfo.IqRef = IqFluxLessRef;                               //IqRef
 		MC_DebugInfo.UdRef = Stat_Volt_q_d.qV_Component2;                 //UdRef
 		MC_DebugInfo.UqRef = Stat_Volt_q_d.qV_Component1;                 //UqRef
 		MC_DebugInfo.PedalTorquePer = ADC_SensorData.TorqueSensor;        //力矩AD,减去零点
@@ -645,6 +688,7 @@ void PowerOff_Process(TrueOrFalse_Flag_Struct_t ReturnEnable)
 		MC_PowerOffBkp.Run_Time = MC_RunLog1.RunTime;
 		MC_PowerOffBkp.Log_ODO_Km = MC_RunLog1.ODO_Km;
 		MC_PowerOffBkp.Log_ODO_Time = MC_RunLog1.ODO_Time;
+		MC_PowerOffBkp.PedalPoweSum = MC_AvgPower.PedalPowerSum;
 		SaveDataToEEPROM_Flash(EEPROM_FLASH_ADDR_POWEROFF_BKP, (uint8_t*)&MC_PowerOffBkp.ODO_Km, 40);//写入掉电临时保存数据,写入前该区域需擦除为0xFF才能操作成功
 		SaveDataToEEPROM_Flash(EEPROM_FLASH_ADDR_POWEROFF_BKP_FLAG, (uint8_t*)"FLAG", 4); //掉电存储的数据标志更新
 		SaveFlag = SET;
@@ -766,20 +810,25 @@ void MC_UartRxCheck_Process(void)
 }
 
 //运行总时间计算
-void MC_RunTime_Cal(uint32_t* p_Runtime)
+void MC_RunTime_Cal()
 {
   static uint32_t PeriodTimeCnt = 0;
-	static uint8_t SavePeriodCount = 0;
+	static uint32_t SavePeriodCount = 0;
 	
 	if((HAL_GetTick()- PeriodTimeCnt) >= 60000)
 	{
-	  PeriodTimeCnt = HAL_GetTick(); 
-		(*p_Runtime)++;
-		//存储运行总时间
+	  PeriodTimeCnt = HAL_GetTick();
+		MC_RunLog1.RunTime++;
 		SavePeriodCount++;
-		if(SavePeriodCount >= 10)  //自动存储周期10min
+	}
+	//自动存储历史数据
+	if(SavePeriodCount >= 10)  //自动存储周期10min
+	{
+		if(MC_CalParam.Foc_Flag == RESET)
 		{
 			SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_RUN_LOG1, sizeof(MC_RunLog1_Struct_t), (uint8_t*)&MC_RunLog1.PowerOnCnt);
+			SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_RIDE_LOG, sizeof(MC_RideLog_Struct_t), (uint8_t*)&MC_RideLog.ODO_Km);
+			SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_AVG_POWER, sizeof(MC_AvgPower_Struct_t), (uint8_t*)&MC_AvgPower.GearSt_ECO);
 			SavePeriodCount = 0;
 		}
 	}
@@ -911,7 +960,7 @@ void MC_DeviceCheck(Device_CheckInfo_Struct_t* p_Device, MC_ErrorCode_Struct_t*
 			{
 			  p_ErrorCode->ERROR_Bit.Fault_BMS_Check = 1;
 				MC_RunLog1.BMS_Check_FaultCnt++;
-				SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_RUN_LOG1, sizeof(MC_RunLog1_Struct_t), (uint8_t*)&MC_RunLog1.PowerOnCnt);
+				RunLogSaveIndex = 1;				
 			}
 			break;
 		}
@@ -925,7 +974,7 @@ void MC_DeviceCheck(Device_CheckInfo_Struct_t* p_Device, MC_ErrorCode_Struct_t*
 			{
 			  p_ErrorCode->ERROR_Bit.Fault_PBU_Check = 1;
 				MC_RunLog1.PBU_Check_FaultCnt++;
-				SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_RUN_LOG1, sizeof(MC_RunLog1_Struct_t), (uint8_t*)&MC_RunLog1.PowerOnCnt);
+				RunLogSaveIndex = 1;				
 			}
 			break;
 		}
@@ -939,7 +988,7 @@ void MC_DeviceCheck(Device_CheckInfo_Struct_t* p_Device, MC_ErrorCode_Struct_t*
 			{
 			  p_ErrorCode->ERROR_Bit.Fault_HMI_Check = 1;
 				MC_RunLog1.HMI_Check_FaultCnt++;
-				SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_RUN_LOG1, sizeof(MC_RunLog1_Struct_t), (uint8_t*)&MC_RunLog1.PowerOnCnt);
+				RunLogSaveIndex = 1;				
 			}
 			break;
 		}
@@ -961,7 +1010,6 @@ void Cal_SyncClockFreq(uint16_t* Result)
 void MC_TemperatureLogProcess(void)
 {
   static uint32_t PeriodTimeCnt = 0;
-	static uint16_t SavePeriodCnt = 0;
 	static TrueOrFalse_Flag_Struct_t DataChangeFlag = FALSE;
 	
 	if(HAL_GetTick() < 10000)  //开机前10s不处理
@@ -1010,6 +1058,8 @@ void MC_TemperatureLogProcess(void)
 		}		
 		
 		//自动存储
+		#if 0
+		static uint16_t SavePeriodCnt = 0;
 		SavePeriodCnt++;
 		if((SavePeriodCnt > 12) && (DataChangeFlag == TRUE)) //1min
 		{
@@ -1017,6 +1067,7 @@ void MC_TemperatureLogProcess(void)
 			DataChangeFlag = FALSE;
 			SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_RUN_LOG1, sizeof(MC_RunLog1_Struct_t), (uint8_t*)&MC_RunLog1.PowerOnCnt);	
 		}
+		#endif
 	}
 }
 
@@ -1080,19 +1131,37 @@ void Device_Handshake_Process(void)
 {
 	static uint32_t PeriodCnt = 0;
 	static uint8_t i = 0;
-	if((HAL_GetTick() - PeriodCnt) >= 500)
+	static uint8_t HandShakeFlag1 = 0, HandShakeFlag2 = 0;
+	
+	//开机时判断是否发送心跳
+	if(HandShakeFlag1 == 0)
+	{
+	  if(IsComOK_BMS.IsOK_Flag == TRUE)
+			HandShakeFlag1 = 1;
+	}
+	
+	if(HandShakeFlag2 == 0)
+	{
+		if(IsComOK_PBU.IsOK_Flag == TRUE)
+				HandShakeFlag2 = 1;
+	}
+	
+	//定时循环发送心跳
+	if((HAL_GetTick() - PeriodCnt) >= 1000)
 	{
  	  PeriodCnt = HAL_GetTick();
 		if(i == 0)
 		{
 		  //BMS
-		  SendData(ID_MC_TO_BMS, MODE_READ, 0x3009, (uint8_t*)"HANDSHAKE");
+			if(HandShakeFlag1 == 1)
+				SendData(ID_MC_TO_BMS, MODE_READ, 0x3009, (uint8_t*)"HANDSHAKE");
 			i = 1;
 		}
 		else if(i == 1)
 		{
 		  //OBC
-		  SendData(ID_MC_TO_PBU, MODE_READ, 0x5009, (uint8_t*)"HANDSHAKE");
+			if(HandShakeFlag2 == 1)
+				SendData(ID_MC_TO_PBU, MODE_READ, 0x5009, (uint8_t*)"HANDSHAKE");
 			i = 0;
 		}
 		

+ 5 - 1
User/Src/var.c

@@ -41,6 +41,7 @@ ComOK_Check_Struct_t IsComOK_HMI = {FALSE, 0};            //HMI通
 ComOK_Check_Struct_t IsComOK_BMS = {FALSE, 0};            //BMS通信状态标志
 MC_AttitudeAngle_Struct_t MC_AttitudeAngle;               //姿态传感器数值
 MC_RideLog_Struct_t MC_RideLog;                           //骑行历史
+MC_RideInfo_Struct_t MC_RideInfo;                         //骑行信息
 MC_AvgPower_Struct_t MC_AvgPower;                         //助力平均功耗
 MCU_Manufacturter_Struct_t MCUManufacturer;               //MCU生厂商
 uint16_t SpeedRatio;
@@ -49,6 +50,7 @@ TrueOrFalse_Flag_Struct_t VersionIdentifyFinishedFlag = FALSE;
 TrueOrFalse_Flag_Struct_t PowerDown_SaveFlag = FALSE;
 TrueOrFalse_Flag_Struct_t IsFirstPowerOnFlag = FALSE;
 Bike_RatioCal_Struct_t Bike_RatioCalParam = {0,0,0,100,10,0,0};//传动比计算
+int32_t PedalPowerFltSum = 0;                             //踩踏功率
 
 //BMS默认设计信息
 const BMS_DesignInfo_Struct_t BMS_DesignInfo_Default =
@@ -331,7 +333,9 @@ const MC_AvgPower_Struct_t MC_AvgPower_Default =
 	(uint16_t)160,
 	(uint16_t)190,
 	(uint16_t)270,
-	(uint16_t)180
+	(uint16_t)180,
+	(uint16_t)0,
+	(uint32_t)0,
 };
 
 //MC骑行历史信息,占用32bytes

+ 16 - 0
修改说明.txt

@@ -572,3 +572,19 @@ V7.2.3_20231118-1 20240328
 17、马达参数增加极对数;
 19、生产信息增加产品标识。
 
+V7.2.3_20231118-1 20240408
+1、解决低电量时SOC=0xFF的问题。
+
+V7.2.3_20231118-1 20240801
+1、增加仪表和电池的心跳包,轮流定时1s发送。
+
+V7.2.3_20231118-1 20250427
+1、更改踏频传感器型号,方向和频率由传感器输出,根据硬件版本识别踏频传感器型号,调用不同的踏频计算函数;
+2、增加平均车速、最大车速、卡路里计算,发送骑行历史时一起发送,平均功耗预留位用于存储最大车速和骑行消耗总能量;
+3、模拟I2C延时参数由50改为20,延迟一次时间由3.7us缩短为1.5us,读一次启动值时间由2.84ms缩短为1.42ms;
+4、取消骑行3km或骑行10min自动存储数据,取消温度最值更新时自动存储数据,统一用10min定时存储MC_RunLog1、MC_RideLog、MC_AvgPower。
+
+
+
+
+

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