Browse Source

giant现场调试确认

Ye Jin 6 tháng trước cách đây
mục cha
commit
cbafed26c2

+ 8 - 0
User project/1.FrameLayer/Source/main.c

@@ -148,6 +148,9 @@ void mn_voParaSet(void)
         cp_stHistoryPara.uwCadSensorAlamTimes = I2C_uwHistoryParaRead[28];
         cp_stHistoryPara.uwBikeSpdSensorAlamTimes = I2C_uwHistoryParaRead[29];
         cp_stHistoryPara.uwPosSensorAlamTimes = I2C_uwHistoryParaRead[30];
+        
+        cp_stHistoryPara.ulRealODOTrip = (((ULONG)I2C_uwHistoryParaRead[31]) << 16) + I2C_uwHistoryParaRead[32];
+        cp_stHistoryPara.ulRealODOTime = (((ULONG)I2C_uwHistoryParaRead[33]) << 16) + I2C_uwHistoryParaRead[34];
     }
     else
     {}
@@ -557,6 +560,11 @@ void mn_voEEHistoryParaUpdate(void)
     Syspara2.stHistoryPara.uwCadSensorAlamTimes.uwReal = cp_stHistoryPara.uwCadSensorAlamTimes;
     Syspara2.stHistoryPara.uwBikeSpdSensorAlamTimes.uwReal = cp_stHistoryPara.uwBikeSpdSensorAlamTimes;
     Syspara2.stHistoryPara.uwPosSensorAlamTimes.uwReal = cp_stHistoryPara.uwPosSensorAlamTimes;
+    
+    Syspara2.stHistoryPara.uwRealODOTripH.uwReal = (UWORD)(cp_stHistoryPara.ulRealODOTrip >> 16);
+    Syspara2.stHistoryPara.uwRealODOTripL.uwReal = (UWORD)cp_stHistoryPara.ulRealODOTrip;
+    Syspara2.stHistoryPara.uwRealODOTimeH.uwReal = (UWORD)(cp_stHistoryPara.ulRealODOTime >> 16);
+    Syspara2.stHistoryPara.uwRealODOTimeL.uwReal = (UWORD)cp_stHistoryPara.ulRealODOTime;
 }
 
 /***************************************************************

+ 2 - 0
User project/3.BasicFunction/Include/can.h

@@ -229,6 +229,7 @@ CAN_EXT CAN_Buf_TypeDef CAN_RxBuf_Struct_CDL;
 #ifdef _CAN_C_
 CAN_EXT void     CAN_Rx_ISR(CAN_Buf_TypeDef *ptCANRx, UBYTE ucLength);
 CAN_EXT void     CAN_SendData(UWORD ID, const UBYTE Data[], UWORD Length);
+CAN_EXT void     CAN_SendRemote(UWORD ID);
 CAN_EXT void     SendData(UWORD ID, UBYTE Mode, UWORD Command, const UBYTE *Data);
 CAN_EXT UBYTE    cd_ReadChar(const CAN_Buf_TypeDef *ptCANRx, UBYTE ucNum);
 CAN_EXT void     cd_DelChar(CAN_Buf_TypeDef *ptCANRx, UBYTE ucNum);
@@ -239,6 +240,7 @@ CAN_EXT ULONG    CRC32_Calculate(const UBYTE pData[], UWORD Length);
 #else
 CAN_EXT void     CAN_Rx_ISR(CAN_Buf_TypeDef *ptCANRx, UBYTE ucLength);
 CAN_EXT void     CAN_SendData(UWORD ID, const UBYTE Data[], UWORD Length);
+CAN_EXT void     CAN_SendRemote(UWORD ID);
 CAN_EXT void     SendData(UWORD ID, UBYTE Mode, UWORD Command, const UBYTE *Data);
 CAN_EXT UBYTE    cd_ReadChar(const CAN_Buf_TypeDef *ptCANRx, UBYTE ucNum);
 CAN_EXT void     cd_DelChar(CAN_Buf_TypeDef *ptCANRx, UBYTE ucNum);

+ 5 - 4
User project/3.BasicFunction/Include/canAppl.h

@@ -198,6 +198,7 @@ typedef struct
     char SN_Num[16];     ///>序列号 ASCII,0x2E结束,无效填充0x20
     char HW_Version[16]; ///>硬件版本 ASCII,0x2E结束,无效填充0x20
     char FW_Version[16]; ///>软件版本 ASCII,0x2E结束,无效填充0x20
+    char ProductLabel[32]; ///>电机标签 ASCII,0x2E结束,无效填充0x20
 } MC_VerInfo_Struct_t;
 
 /**
@@ -504,14 +505,14 @@ typedef struct
     UWORD uwBikeSpdSensorAlamTimes;
     UWORD uwPosSensorAlamTimes;
 
+    UWORD uwRealODOTripH;//不可清除
+    UWORD uwRealODOTripL;
+    UWORD uwRealODOTimeH;
+    UWORD uwRealODOTimeL;
     UWORD reserve1;
     UWORD reserve2;
     UWORD reserve3;
     UWORD reserve4;
-    UWORD reserve5;
-    UWORD reserve6;
-    UWORD reserve7;
-    UWORD reserve8;
 
 } UPC_HistoryInfo_Struct_t;
 

+ 1 - 0
User project/3.BasicFunction/Include/flash_master.h

@@ -54,6 +54,7 @@ typedef struct
     SLONG                slTorqAssGain[15][4];
     SLONG                slCadAssGain[5][4];
     MC_RS_ASCII_Struct_t ubRsASSCII;
+    UBYTE                ucProductLabel[32];
 } FLASH_PARA_TYPE;
 
 extern FLASH_PARA_TYPE flash_stPara;

+ 6 - 1
User project/3.BasicFunction/Include/giant_can.h

@@ -48,7 +48,8 @@
 #define MG_PASSIVEDATA3      0x6
 #define MG_PASSIVEDATA4      0x7
 //mode
-#define AD_SERVICEMODE       0x6
+#define AD_SERVICEMODE_S     0x6
+#define AD_SERVICEMODE_E     0xA
 #define AD_CHECKMODE         0xB
 #define AD_OFFMODE           0xC
 #define AD_ERRORMODE         0xD
@@ -90,12 +91,14 @@ typedef struct
     UBYTE ThrottlePowerPercentage;
     UBYTE RidingModeEn;
     UBYTE AdjustingMode;
+    UBYTE StartMode;
     UWORD WheelCircumference;
     UBYTE MaximumTorque;
     UBYTE Acceleration;
     UBYTE AssistRatio;
     UBYTE MaximumPower;
     UWORD SpeedLimitation;
+    UBYTE CommSleep;
 } GiantControlParams_Struct_t;
 /*****************************************
  *
@@ -115,7 +118,9 @@ void giant_10msTask(void);
 void giant_DataProcess(void);
 void giant_SendDriveChainPassiveData(UBYTE remoteMG, UBYTE DataAddr);
 void giant_SendDriveChainActiveData(UBYTE functiongroup, UBYTE dataaddr);
+void giant_SendRemote(UBYTE motiongroup);
 void giant_CANRxData_Process(void);
+SLONG giant_slPolynomial(const SWORD *value);
 /************************************************************************/
 
 #endif

+ 6 - 5
User project/3.BasicFunction/Include/i2c_master.h

@@ -111,7 +111,7 @@
 /*Reserve Para*/
 #define I2CReserve        \
     {                     \
-        500, 500, 0, 0, 0 \
+        0, 0, 0, 0, 0 \
     }
 
 /* Motor Para */
@@ -946,14 +946,15 @@ typedef struct
     UWORD_VALUE uwBikeSpdSensorAlamTimes;
     UWORD_VALUE uwPosSensorAlamTimes;
 
+    UWORD_VALUE uwRealODOTripH;//不可更改
+    UWORD_VALUE uwRealODOTripL;
+    UWORD_VALUE uwRealODOTimeH;
+    UWORD_VALUE uwRealODOTimeL;
+    
     UWORD_VALUE reserve1;
     UWORD_VALUE reserve2;
     UWORD_VALUE reserve3;
     UWORD_VALUE reserve4;
-    UWORD_VALUE reserve5;
-    UWORD_VALUE reserve6;
-    UWORD_VALUE reserve7;
-    UWORD_VALUE reserve8;
 } History_PARAMETER;
 
 typedef struct

+ 23 - 20
User project/3.BasicFunction/Source/AssistCurve.c

@@ -21,6 +21,7 @@
 #include "Cadence.h"
 #include "flash_master.h"
 #include "bikegearsensor.h"
+#include "giant_can.h"
 /******************************
  *
  *  Parameter
@@ -355,9 +356,9 @@ void ass_voAssitCoef(void)
 
     /*设置车速限幅*/
     ass_stCurLimCoef.uwBikeSpdThresHold1 = (UWORD)(((UQWORD)1000 << 20) * ass_stParaSet.uwAssistLimitBikeSpdStart /
-                                         ((UQWORD)36 * (ass_stParaCong.uwWheelPerimeter + (UWORD)ass_stParaCong.swDeltPerimeter) * FBASE)); // Q20    3216 = Q10(3.1415926)
+                                         ((UQWORD)36 * (ass_stParaCong.uwWheelPerimeter + ass_stParaCong.swDeltPerimeter) * FBASE)); // Q20    3216 = Q10(3.1415926)
     ass_stCurLimCoef.uwBikeSpdThresHold2 = (UWORD)(((UQWORD)1000 << 20) * ass_stParaSet.uwAssistLimitBikeSpdStop /
-                                         ((UQWORD)36 * (ass_stParaCong.uwWheelPerimeter + (UWORD)ass_stParaCong.swDeltPerimeter) * FBASE)); // Q20    3216 = Q10(3.1415926)
+                                         ((UQWORD)36 * (ass_stParaCong.uwWheelPerimeter + ass_stParaCong.swDeltPerimeter) * FBASE)); // Q20    3216 = Q10(3.1415926)
 
     ass_stCurLimCoef.ulBikeSpdDeltInv = (ULONG)(((UQWORD)1 << 20) / (ass_stCurLimCoef.uwBikeSpdThresHold2 - ass_stCurLimCoef.uwBikeSpdThresHold1)); // Q20;
     ass_stCurLimCoef.uwBikeSpdIqLimitK =
@@ -537,24 +538,25 @@ static void AssitCuvApplPerVolt(void) /* parasoft-suppress METRICS-28 "本项目
         ass_stCalCoef.swCadanceGain = 4096; //Q12
     }
     /*  Assist torque Cal using Assist Curve */
-    slTeTorAssitTmpPu = (SLONG)(ass_slPolynomial(&ass_stCalCoef.uwTorqueAssGain[ass_stCalIn.uwGearSt], &swTorqCmd, 14)); // Q14  转矩助力曲线
-    if(ass_stCalIn.uwGearSt == 5)
-    {
-        slTeTorAssitLinerPu = (((SLONG)swTorqCmd * LinerAssist[ass_stCalIn.uwGearSt-1] )>> 12) + 273; // Q14  转矩助力曲线线性段
-    }
-    else
-    {
-        slTeTorAssitLinerPu = (((SLONG)swTorqCmd * LinerAssist[ass_stCalIn.uwGearSt-1] )>> 12) + 273;
-    }
-   
-    if (slTeTorAssitTmpPu < slTeTorAssitLinerPu)
-    {
-        slTeTorAssitTmpPu = slTeTorAssitLinerPu;
-    }
-    else
-    {
-        //do nothing;
-    }
+    //slTeTorAssitTmpPu = (SLONG)(ass_slPolynomial(&ass_stCalCoef.uwTorqueAssGain[ass_stCalIn.uwGearSt], &swTorqCmd, 14)); // Q14  转矩助力曲线
+    slTeTorAssitTmpPu = (SLONG)giant_slPolynomial(&swTorqCmd);
+//    if(ass_stCalIn.uwGearSt == 5)
+//    {
+//        slTeTorAssitLinerPu = (((SLONG)swTorqCmd * LinerAssist[ass_stCalIn.uwGearSt-1] )>> 12) + 273; // Q14  转矩助力曲线线性段
+//    }
+//    else
+//    {
+//        slTeTorAssitLinerPu = (((SLONG)swTorqCmd * LinerAssist[ass_stCalIn.uwGearSt-1] )>> 12) + 273;
+//    }
+//   
+//    if (slTeTorAssitTmpPu < slTeTorAssitLinerPu)
+//    {
+//        slTeTorAssitTmpPu = slTeTorAssitLinerPu;
+//    }
+//    else
+//    {
+//        //do nothing;
+//    }
                                         
     swCadCmd = (SWORD)((((SLONG)ass_stCalIn.uwcadance * ass_stCalCoef.swSmoothGain) >> 12) * 10);  // 踏频指令斜坡
     slTeCadAssitTmpPu = ((SLONG)(ass_slPolynomial(&ass_stCalCoef.uwCadencAsseGain[ass_stCalIn.uwGearSt], &swCadCmd, 20))) >> 6; // Q20 - Q6 = Q14 //踏频助力曲线
@@ -1160,6 +1162,7 @@ static void ass_voAssitCurLim(UWORD gear, UWORD uwBikeSpeedHzPu, UWORD uwCurMaxP
 
     uwIqLimitTemp1 = (UWORD)(((ULONG)ass_stCurLimCoef.uwLimitGain[gear] * uwCurMaxPu) >> 10);
 
+    uwIqLimitTemp1 = uwCurMaxPu * stGiantControlParams.MaximumTorque * 10 / 75;
     ass_stCurLimOut.uwIqlimit = uwIqLimitTemp1;
 }
 

+ 60 - 0
User project/3.BasicFunction/Source/can.c

@@ -31,6 +31,8 @@ void     CAN_Rx_ISR(CAN_Buf_TypeDef *ptCANRx, UBYTE ucLength)
 {}
 void     CAN_SendData(UWORD ID, const UBYTE Data[], UWORD Length)
 {}
+void     CAN_SendRemote(UWORD ID)
+{}
 void     SendData(UWORD ID, UBYTE Mode, UWORD Command, const UBYTE *Data)
 {}
 UBYTE    cd_ReadChar(const CAN_Buf_TypeDef *ptCANRx, UBYTE ucNum)
@@ -179,6 +181,28 @@ void  CAN_SendData(UWORD ID, const UBYTE Data[], UWORD Length)
      }
 }
 
+void CAN_SendRemote(UWORD ID)
+{
+    //开始发送数据
+    pTxMsg->tx_sfid = ID;
+    pTxMsg->tx_ft = CAN_FT_REMOTE;
+    pTxMsg->tx_ff = CAN_FF_STANDARD;
+    pTxMsg->tx_dlen = 0;
+    
+    can_ubMbox = can_message_transmit(CAN0, pTxMsg);
+
+    OVtim = 0;
+    
+    while((can_transmit_states(CAN0,can_ubMbox) != CAN_TRANSMIT_OK) && (OVtim < 0XFFF))
+    {
+            OVtim++;
+    }
+
+    if (OVtim >= 0XFFF)
+    {
+        return;
+    }
+}
 
 static UBYTE CanSendData[255], CanSendData_CRC_Buf[255];
 void SendData(UWORD ID, UBYTE Mode, UWORD Command, const UBYTE *Data)
@@ -791,6 +815,29 @@ void DataProcess(UWORD ID, UBYTE Mode, UWORD Cmd, UBYTE Data[]) /* parasoft-supp
             SendData(ID_MC_TO_CDL, MODE_REPORT, 0xB226, (UBYTE *)&MC_UpcInfo.stMotorInfo.uwPolePairs);
             break;
         }
+        case 0x3B10: 
+        {
+            memcpy(&MC_RideLog.ODO_Km, Data, DataLength);
+            
+            cp_stHistoryPara.ulODOTrip = MC_RideLog.ODO_Km;
+            cp_stHistoryPara.ulODOTime = MC_RideLog.ODO_Time;
+            cp_stHistoryPara.ulTripSum = MC_RideLog.TRIP_Km;
+            cp_stHistoryPara.ulTripSumTime = MC_RideLog.TRIP_Time;
+            
+            MC_UpcInfo.stHistoryInfo.uwODOTripH = (UWORD)(cp_stHistoryPara.ulODOTrip >> 16);
+            MC_UpcInfo.stHistoryInfo.uwODOTripL = (UWORD)cp_stHistoryPara.ulODOTrip;
+            MC_UpcInfo.stHistoryInfo.uwODOTimeH = (UWORD)(cp_stHistoryPara.ulODOTime >> 16);
+            MC_UpcInfo.stHistoryInfo.uwODOTimeL = (UWORD)cp_stHistoryPara.ulODOTime;
+            MC_UpcInfo.stHistoryInfo.uwTripSumH = (UWORD)(cp_stHistoryPara.ulTripSum >> 16);
+            MC_UpcInfo.stHistoryInfo.uwTripSumL = (UWORD)cp_stHistoryPara.ulTripSum;
+            MC_UpcInfo.stHistoryInfo.uwTripSumTimeH = (UWORD)(cp_stHistoryPara.ulTripSumTime >> 16);
+            MC_UpcInfo.stHistoryInfo.uwTripSumTimeL = (UWORD)cp_stHistoryPara.ulTripSumTime;
+           
+            cp_stBikeRunInfoPara.ulRiTime = 0;
+            
+            SendData(ID_MC_TO_CDL, MODE_REPORT, 0xA903, (UBYTE *)"ACK");
+            break;
+        }
         case 0x3B28: 
         {
             memcpy(&MC_UpcInfo.stMotorInfo, Data, DataLength);
@@ -824,6 +871,14 @@ void DataProcess(UWORD ID, UBYTE Mode, UWORD Cmd, UBYTE Data[]) /* parasoft-supp
             SendData(ID_MC_BC, MODE_REPORT, 0xA903, (UBYTE *)"ACK");
             break;
         }
+        case 0x3D20: //写入电机标签信息
+        {
+            memcpy(MC_VerInfo.ProductLabel, Data, DataLength);
+            //执行存储操作
+            memcpy(flash_stPara.ucProductLabel, MC_VerInfo.ProductLabel, sizeof(flash_stPara.ucProductLabel));
+            SendData(ID_MC_TO_CDL, MODE_REPORT, 0xA903, (UBYTE *)"ACK");
+            break;
+        }
         case 0x3E00: 
         {
             MC_UpcInfo.stMContorlInfo.uwSPIPosOffsetOrigin = spi_stResolverOut.swSpiThetaOffsetOrignPu;
@@ -1024,6 +1079,11 @@ void DataProcess(UWORD ID, UBYTE Mode, UWORD Cmd, UBYTE Data[]) /* parasoft-supp
             SendData(ID_MC_BC, MODE_REPORT, 0xA903, (UBYTE *)"ACK");
             break;
         }
+        case 0x4E00: 
+        {
+            SendData(ID_MC_TO_CDL, MODE_REPORT, 0xBB20, (UBYTE *)MC_VerInfo.ProductLabel);
+            break;
+        }
         case 0x5002: //启动校准
         {
             AngleTest = TRUE;

+ 16 - 2
User project/3.BasicFunction/Source/canAppl.c

@@ -61,6 +61,7 @@ UBYTE                    MC_BC_COM = 0;
 static LPF_OUT                    BMS_swCurIdcLpf;
 BOOL blBMSCommFault = FALSE;
 static UWORD uwRemainDistanceCal;
+UWORD  ulPowerOnUsedTime = 0;
 BOOL AngleTest = FALSE;
 
 void Can_voUpdateMC_UpcInfo(void)
@@ -170,6 +171,11 @@ void Can_voUpdateMC_UpcInfo(void)
     MC_UpcInfo.stHistoryInfo.uwCadSensorAlamTimes = cp_stHistoryPara.uwCadSensorAlamTimes;
     MC_UpcInfo.stHistoryInfo.uwBikeSpdSensorAlamTimes = cp_stHistoryPara.uwBikeSpdSensorAlamTimes;
     MC_UpcInfo.stHistoryInfo.uwPosSensorAlamTimes = cp_stHistoryPara.uwPosSensorAlamTimes;
+    
+    MC_UpcInfo.stHistoryInfo.uwRealODOTripH = (UWORD)(cp_stHistoryPara.ulRealODOTrip >> 16);
+    MC_UpcInfo.stHistoryInfo.uwRealODOTripL = (UWORD)cp_stHistoryPara.ulRealODOTrip;
+    MC_UpcInfo.stHistoryInfo.uwRealODOTimeH = (UWORD)(cp_stHistoryPara.ulRealODOTime >> 16);
+    MC_UpcInfo.stHistoryInfo.uwRealODOTimeL = (UWORD)cp_stHistoryPara.ulRealODOTime;
 
     MC_UpcInfo.stTestParaInfo.uwEEFirstDefaultSetFlg = cp_stFlg.ParaFirstSetFlg;
     MC_UpcInfo.stTestParaInfo.uwSPIOffsetFirstSetFlg = cp_stFlg.SpiOffsetFirstSetFlg;
@@ -252,6 +258,8 @@ void Can_voInitMC_Run(void)
     memcpy(MC_VerInfo.Mode, flash_stPara.ubMotorVersion, sizeof(flash_stPara.ubMotorVersion));
     // SN
     memcpy(MC_VerInfo.SN_Num, flash_stPara.ubSN, sizeof(flash_stPara.ubSN));
+    // ProductLabel
+    memcpy(MC_VerInfo.ProductLabel, flash_stPara.ucProductLabel, sizeof(flash_stPara.ucProductLabel));
     // Product information
     //    memcpy(MC_MacInfo.Manufacturer, flash_stPara.ubProdInfo.Manufacturer, sizeof(flash_stPara.ubProdInfo));
     memcpy(&MC_MacInfo, &flash_stPara.ubProdInfo, sizeof(flash_stPara.ubProdInfo));
@@ -271,7 +279,11 @@ void Can_voMC_Run_1ms(void) /* parasoft-suppress METRICS-28 "本项目圈复杂
     if (cp_stBikeRunInfoPara.BikeSpeedKmH > 30)
     {
         cp_stBikeRunInfoPara.ulRiTime++;
+    }
+    if(++ulPowerOnUsedTime>=60000) //1min
+    {
         cp_stHistoryPara.ulUsedTime++;
+        ulPowerOnUsedTime=0;
     }
 
     // Error Cnt record and Error Display Set
@@ -663,8 +675,8 @@ void Can_voMC_Run_200ms(void)
     //MC_RunInfo.Power = (scm_swIqFdbLpfPu * 250 * cof_uwIbAp / 1500) >> 14;                                      //MaxIq = 15A,MaxPower=250W
     MC_RunInfo.BusVoltage = (UWORD)((((ULONG)adc_stUpOut.uwVdcLpfPu + (ULONG)BMS_VoltEstimat.uwVdcCompPu) * cof_uwUbVt * 100) >> 14); //母线电压 1mV
     //MC_RunInfo.BusCurrent = (UWORD)((ULONG)BMS_VoltEstimat.swIdcPu * cof_uwIbAp * 100 >> 14);                                  //母线电流 1mA
-    BMS_VoltEstimat.uwIbusLpf = (BMS_swCurIdcLpf.slY.sw.hi * cof_uwIbAp * 10) >> 14;
-    MC_RunInfo.BusCurrent = (scm_swIqFdbLpfPu * cof_uwIbAp * 10) >> 14;
+    BMS_VoltEstimat.uwIbusLpf = (BMS_swCurIdcLpf.slY.sw.hi * cof_uwIbAp * 15) >> 14;//mA
+    MC_RunInfo.BusCurrent = (ABS(scm_swIqFdbLpfPu) * cof_uwIbAp * 10) >> 14;
     MC_RunInfo.Cadence = (UBYTE)(((ULONG)cadence_stFreGetOut.uwLPFFrequencyPu * cof_uwFbHz * 60) >> 20);                              //踏频 1rpm
     MC_RunInfo.Torque = (UBYTE)(((ULONG)torsensor_stTorSensorOut.uwTorqueLPFPu * cof_uwTorqNm / 10) >> 14);                    //踩踏力矩 1Nm
     MC_RunInfo.CadenceDir = (MC_CadenceDir_Struct_t)cadence_stFreGetOut.cadence_dir;                                  //踩踏方向 0-正,1-反,2-停止
@@ -723,6 +735,7 @@ void Can_Trip_Cal(void)
     {
         MC_RunInfo.Ride_Km++;
         cp_stHistoryPara.ulODOTrip++; // Unit: 0.1km
+        cp_stHistoryPara.ulRealODOTrip++; // Unit: 0.1km
         cp_stHistoryPara.ulTripSum++;
         Can_RemainTrip_Cal();
         bikespeed_stFreGetOut.blUpdateTripCntFlg = FALSE;
@@ -733,6 +746,7 @@ void Can_Trip_Cal(void)
 
     MC_RideLog.ODO_Time = cp_stHistoryPara.ulODOTime + (cp_stBikeRunInfoPara.ulRiTime >> 10) / 60;      // min
     MC_RideLog.TRIP_Time = cp_stHistoryPara.ulTripSumTime + (cp_stBikeRunInfoPara.ulRiTime >> 10) / 60; // min
+    cp_stHistoryPara.ulRealODOTime = cp_stHistoryPara.ulRealODOTime + (cp_stBikeRunInfoPara.ulRiTime >> 10) / 60;
     
     /*TRIP里程超9999.9km时,清除TRIP里程和时间*/
     if(MC_RideLog.TRIP_Km > 99999)

+ 1 - 0
User project/3.BasicFunction/Source/flash_master.c

@@ -131,6 +131,7 @@ void flash_voParaInit(void)
     strncpy(flash_stPara.ubMotorVersion, (char *)"MIGIC_C1", 8);
     strncpy(flash_stPara.ubProdInfo.MacBrand, (char *)"MM_MC1", 6);
 #endif
+    strncpy(flash_stPara.ubMotorVersion, (char *)"MOAA    ", 8);
     strncpy(flash_stPara.ubProdInfo.Manufacturer, (char *)"TTIUM", 5);
     strncpy(flash_stPara.ubProdInfo.MacAddr, (char *)"WUHAN", 5);
     flash_voWrite();

+ 156 - 39
User project/3.BasicFunction/Source/giant_can.c

@@ -44,14 +44,55 @@ void giant_Init(void)
     stGiantControlParams.RidingModeEn = 0;
     stGiantControlParams.AdjustingMode = 0x0B;//check mode
     stGiantControlParams.WheelCircumference = 2182;//mm
+    stGiantControlParams.StartMode = 2;
+    stGiantControlParams.SpeedLimitation = 4500;
 }
+
 void giant_10msTask(void)
 {
     static UBYTE giant_10mscount = 0;
     
-    if((power_stPowStateOut.powerstate == POWER_OFF) || ((stGiantControlParams.AdjustingMode >= AD_SERVICEMODE) && (stGiantControlParams.AdjustingMode <= AD_CHECKMODE)))
+    
+    if(stGiantControlParams.AdjustingMode == AD_CHECKMODE)
     {
-        return;
+        if((cp_ulSystickCnt - ulOBC_ComTimeOutCount) > 1750)
+        {
+            stGiantControlParams.CommSleep = 2;
+            
+            power_stPowStateOut.powerstate = POWER_OFF;
+            power_stPowStateOut.blPowerStartupFlg = FALSE;
+        }
+        else if((cp_ulSystickCnt - ulOBC_ComTimeOutCount) > 1500)
+        {
+            stGiantControlParams.CommSleep = 1;
+        }
+        else
+        {
+            stGiantControlParams.CommSleep = 0;
+        }
+    }
+    else if((stGiantControlParams.AdjustingMode >= AD_SERVICEMODE_S) && (stGiantControlParams.AdjustingMode <= AD_SERVICEMODE_E))
+    {
+        ulOBC_ComTimeOutCount = cp_ulSystickCnt;
+        stGiantControlParams.CommSleep = 0;
+    }
+    else
+    {
+        if((cp_ulSystickCnt - ulOBC_ComTimeOutCount) > 750)
+        {
+            stGiantControlParams.CommSleep = 2;
+            
+            power_stPowStateOut.powerstate = POWER_OFF;
+            power_stPowStateOut.blPowerStartupFlg = FALSE;
+        }
+        else if((cp_ulSystickCnt - ulOBC_ComTimeOutCount) > 500)
+        {
+            stGiantControlParams.CommSleep = 1;
+        }
+        else
+        {
+            stGiantControlParams.CommSleep = 0;
+        }
     }
     
     giant_10mscount++;
@@ -59,6 +100,15 @@ void giant_10msTask(void)
     {
         giant_10mscount = 0;
         
+        if(stGiantControlParams.CommSleep == 1)
+        {
+            giant_SendRemote(0x2);
+        }
+        
+        if((power_stPowStateOut.powerstate == POWER_OFF) || ((stGiantControlParams.AdjustingMode >= AD_SERVICEMODE_S) && (stGiantControlParams.AdjustingMode <= AD_CHECKMODE)))
+        {
+            return;
+        }
         giant_SendDriveChainActiveData(FG_NORMALDATA, 0x0);
         giant_SendDriveChainActiveData(FG_NORMALDATA, 0x1);
         giant_SendDriveChainActiveData(FG_NORMALDATA, 0x2);
@@ -70,6 +120,7 @@ void giant_10msTask(void)
         giant_SendDriveChainActiveData(FG_NORMALDATA, 0xF);
     }
 }
+
 void giant_DataProcess(void)
 {
     if(pRxMsg2->rx_ft == CAN_FT_DATA)
@@ -144,10 +195,27 @@ void giant_DataProcess(void)
                             
                             if((pRxMsg2->rx_data[4] & 0x04) == 0x04)//Reset odometer distance and odometer time
                             {
-                              
+                                MC_RideLog.ODO_Km = 0;
+                                MC_RideLog.ODO_Time = 0;
+                                
+                                cp_stHistoryPara.ulODOTrip = 0;
+                                cp_stHistoryPara.ulODOTime = 0;
+//                                cp_stHistoryPara.ulTripSum = 0;
+//                                cp_stHistoryPara.ulTripSumTime = 0;
+                                
+                                MC_UpcInfo.stHistoryInfo.uwODOTripH = 0;
+                                MC_UpcInfo.stHistoryInfo.uwODOTripL = 0;
+                                MC_UpcInfo.stHistoryInfo.uwODOTimeH = 0;
+                                MC_UpcInfo.stHistoryInfo.uwODOTimeL = 0;
+//                                MC_UpcInfo.stHistoryInfo.uwTripSumH = 0;
+//                                MC_UpcInfo.stHistoryInfo.uwTripSumL = 0;
+//                                MC_UpcInfo.stHistoryInfo.uwTripSumTimeH = 0;
+//                                MC_UpcInfo.stHistoryInfo.uwTripSumTimeL = 0;
+                               
+                                cp_stBikeRunInfoPara.ulRiTime = 0;
                             }
                             
-                            ass_stParaCong.uwStartMode = ((pRxMsg2->rx_data[6] & 0xC0) >> 6);//Start mode,1-soft,2-normal,3-strong
+                            stGiantControlParams.StartMode = ((pRxMsg2->rx_data[6] & 0xC0) >> 6);//Start mode,1-soft,2-normal,3-strong
                         }
                         break;
                     }
@@ -170,14 +238,6 @@ void giant_DataProcess(void)
                             MC_RunInfo.LightSwitch = MC_ControlCode.LightSwitch;
                             
                             stGiantControlParams.WheelCircumference = (pRxMsg2->rx_data[2] + (pRxMsg2->rx_data[3]<<8));//Tire circumference,900-2500mm                            
-//                            if(stGiantControlParams.WheelCircumference < 900)
-//                            {
-//                                stGiantControlParams.WheelCircumference = 900;//default
-//                            }
-//                            else if(stGiantControlParams.WheelCircumference > 2500)
-//                            {
-//                                stGiantControlParams.WheelCircumference = 2500;//default
-//                            }
         
                             stGiantControlParams.MaximumTorque = ((pRxMsg2->rx_data[4] & 0xF0)>>4);//Maximum torque,*10Nm
 //                            if(0 == stGiantControlParams.MaximumTorque)
@@ -265,6 +325,10 @@ void giant_DataProcess(void)
         stGiantStandardRemoteFrameID_rx.RequireNodeGroup = (UBYTE)((pRxMsg2->rx_sfid & 0x0F0)>>4);
         stGiantStandardRemoteFrameID_rx.ResponseNodeGroup = (UBYTE)(pRxMsg2->rx_sfid & 0x00F);
         
+        if(stGiantStandardRemoteFrameID_rx.RequireNodeGroup == NODE_USERINTERFACE)
+        {
+            ulOBC_ComTimeOutCount = cp_ulSystickCnt;
+        }
         if((stGiantStandardRemoteFrameID_rx.ResponseNodeGroup == NODE_ALL) || (stGiantStandardRemoteFrameID_rx.ResponseNodeGroup == NODE_DRIVECHAIN))//
         {
             switch(stGiantStandardRemoteFrameID_rx.MotionGroup)
@@ -375,12 +439,12 @@ void giant_SendDriveChainPassiveData(UBYTE remoteMG, UBYTE DataAddr)
         }
         case 0xB:
         {
-            memcpy(data, MC_VerInfo.SN_Num, 8);//SN1
+            memcpy(data, MC_VerInfo.ProductLabel, 8);//SN1
             break;
         }
         case 0xC:
         {
-            memcpy(data, &MC_VerInfo.SN_Num[8], 8);//SN2
+            memcpy(data, &MC_VerInfo.ProductLabel[8], 8);//SN2
             break;
         }
         case 0xF:
@@ -402,7 +466,7 @@ void giant_SendDriveChainActiveData(UBYTE functiongroup, UBYTE dataaddr)
     UBYTE len = 8;
     UBYTE data[8] = {0,};
     UWORD ID = 0;
-    
+
     ID = ((functiongroup<<9)
           |(NODE_DRIVECHAIN<<5)
           |(DB_ACTIVEDATA<<4)
@@ -512,10 +576,10 @@ void giant_SendDriveChainActiveData(UBYTE functiongroup, UBYTE dataaddr)
             data[1] = (UBYTE)((MC_RunInfo.Ride_Km & 0xFF00) >> 8);
             data[2] = (UBYTE)((MC_RunInfo.Ride_Time/60) & 0xFF);//ride time after power on,min
             data[3] = (UBYTE)(((MC_RunInfo.Ride_Time/60) & 0xFF00) >> 8);
-//            data[4] = (UBYTE)((MC_RideLog.ODO_Km/10) & 0xFF);//  total ride distance Can’t be reset
-//            data[5] = (UBYTE)(((MC_RideLog.ODO_Km/10) & 0xFF00) >> 8);
-//            data[6] = (UBYTE)((MC_RideLog.ODO_Time/60) & 0xFF);// rtotal ride time Can’t be reset
-//            data[7] = (UBYTE)(((MC_RideLog.ODO_Time/60) & 0xFF00) >> 8);
+            data[4] = (UBYTE)((cp_stHistoryPara.ulRealODOTrip/10) & 0xFF);//  total ride distance Can’t be reset
+            data[5] = (UBYTE)(((cp_stHistoryPara.ulRealODOTrip/10) & 0xFF00) >> 8);
+            data[6] = (UBYTE)((cp_stHistoryPara.ulRealODOTime/60) & 0xFF);// rtotal ride time Can’t be reset
+            data[7] = (UBYTE)(((cp_stHistoryPara.ulRealODOTime/60) & 0xFF00) >> 8);
             break;
         }
         case 0x8:
@@ -548,23 +612,37 @@ void giant_SendDriveChainActiveData(UBYTE functiongroup, UBYTE dataaddr)
     CAN_SendData(ID, data, len);
 }
 
+void giant_SendRemote(UBYTE motiongroup)
+{
+    UWORD ID = 0;
+    
+    ID = ((motiongroup<<8)
+          |(NODE_DRIVECHAIN<<4)
+          |NODE_USERINTERFACE);
+    
+    CAN_SendRemote(ID);
+}
+
 void giant_CANRxData_Process(void)
 {
     if(stGiantControlParams.RefreshFlag)
     {
-        stGiantControlParams.RefreshFlag = FALSE;
-        
-        if((stGiantControlParams.AdjustingMode  == 0xC) || (stGiantControlParams.ManualSleepEn) || (stGiantControlParams.AutomaticSleepEn) || ((cp_ulSystickCnt - ulOBC_ComTimeOutCount) < 1500))//Off state
+        stGiantControlParams.RefreshFlag = FALSE;    
+        if((stGiantControlParams.AdjustingMode == AD_OFFMODE) || (stGiantControlParams.ManualSleepEn) || (stGiantControlParams.AutomaticSleepEn))//Off state
+    {
+        power_stPowStateOut.powerstate = POWER_OFF;
+        power_stPowStateOut.blPowerStartupFlg = FALSE;
+    }
+        ass_stParaCong.uwStartMode = stGiantControlParams.StartMode;
+        if((stGiantControlParams.AdjustingMode >= AD_CHECKMODE) && (stGiantControlParams.AdjustingMode <= AD_OFFMODE))
         {
-            power_stPowStateOut.powerstate = POWER_OFF;
-            power_stPowStateOut.blPowerStartupFlg = FALSE;
+            MC_ControlCode.GearSt = MC_GearSt_OFF;
         }
-        
-        if((stGiantControlParams.AdjustingMode >= AD_SERVICEMODE) && (stGiantControlParams.AdjustingMode <= AD_ERRORMODE))
+        else if(stGiantControlParams.WalkEn == 1)
         {
-            MC_ControlCode.GearSt = MC_GearSt_OFF;
+            MC_ControlCode.GearSt = MC_GearSt_WALK;
         }
-        else if(stGiantControlParams.AssistRatio == 0)
+        else if((stGiantControlParams.AdjustingMode >= AD_SERVICEMODE_S) && (stGiantControlParams.AdjustingMode <= AD_SERVICEMODE_E))
         {
             MC_ControlCode.GearSt = MC_GearSt_OFF;
         }
@@ -572,9 +650,9 @@ void giant_CANRxData_Process(void)
         {
             MC_ControlCode.GearSt = MC_GearSt_OFF;
         }
-        else if(stGiantControlParams.WalkEn == 1)
+        else if(stGiantControlParams.AssistRatio == 0)
         {
-            MC_ControlCode.GearSt = MC_GearSt_WALK;
+            MC_ControlCode.GearSt = MC_GearSt_OFF;
         }
         else
         {
@@ -582,16 +660,32 @@ void giant_CANRxData_Process(void)
         }
         MC_RunInfo.GearSt = (UBYTE)MC_ControlCode.GearSt;
         
-        //轮径更新
-        if((stGiantControlParams.AdjustingMode == AD_CHECKMODE) && (MC_UpcInfo.stBikeInfo.uwWheelPerimeter != (stGiantControlParams.WheelCircumference/10)))
+        if(stGiantControlParams.AdjustingMode == AD_CHECKMODE)
         {
-            MC_UpcInfo.stBikeInfo.uwWheelPerimeter = stGiantControlParams.WheelCircumference/10;
-            
-            MC_UpcInfo.stBikeInfo.uwSaveFlg = 0;
-            cp_stFlg.ParaSaveEEFlg = FALSE;
-            cp_stFlg.ParaUpdateFlg = TRUE;
-            cp_stFlg.ParaBikeInfoUpdateFlg = TRUE;
-            cp_stFlg.ParaAssistUpdateFinishFlg = TRUE;
+            //轮径更新
+            UWORD tmpdata;
+            if(stGiantControlParams.WheelCircumference < 900)
+            {
+                tmpdata = 90;//default
+            }
+            else if(stGiantControlParams.WheelCircumference > 2500)
+            {
+                tmpdata = 250;//default
+            }
+            else
+            {
+                tmpdata = stGiantControlParams.WheelCircumference/10;
+            }
+            if((stGiantControlParams.AdjustingMode == AD_CHECKMODE) && (MC_UpcInfo.stBikeInfo.uwWheelPerimeter != tmpdata))
+            {
+                MC_UpcInfo.stBikeInfo.uwWheelPerimeter = tmpdata;
+                
+                MC_UpcInfo.stBikeInfo.uwSaveFlg = 0;
+                cp_stFlg.ParaSaveEEFlg = FALSE;
+                cp_stFlg.ParaUpdateFlg = TRUE;
+                cp_stFlg.ParaBikeInfoUpdateFlg = TRUE;
+                cp_stFlg.ParaAssistUpdateFinishFlg = TRUE;
+            }
         }
         
         //限速更新
@@ -610,6 +704,29 @@ void giant_CANRxData_Process(void)
         }
     }
 }
+
+SLONG giant_slPolynomial(const SWORD *value)
+{
+    SLONG out;
+    UWORD gian;
+    
+    if(stGiantControlParams.StartMode == 1)
+    {
+        gian = 82;
+    }
+    else if(stGiantControlParams.StartMode == 3)
+    {
+        gian = 123;
+    }
+    else
+    {
+        gian = 102;
+    }
+    
+    out = stGiantControlParams.AssistRatio * *value * gian >> 10;
+    
+    return out;
+}
 /*************************************************************************
  End of this File (EOF)!
  Do not put anything after this part!

+ 5 - 1
User project/3.BasicFunction/Source/i2c_master.c

@@ -694,7 +694,11 @@ void i2c_voGetValueFrmBuffer(const I2C_RXCRC_OUT *out)
     Syspara2.stHistoryPara.uwCadSensorAlamTimes.uwReal = I2C_uwHistoryParaRead[28];
     Syspara2.stHistoryPara.uwBikeSpdSensorAlamTimes.uwReal = I2C_uwHistoryParaRead[29];
     Syspara2.stHistoryPara.uwPosSensorAlamTimes.uwReal = I2C_uwHistoryParaRead[30];
-
+    
+    Syspara2.stHistoryPara.uwRealODOTripH.uwReal = I2C_uwHistoryParaRead[31];
+    Syspara2.stHistoryPara.uwRealODOTripL.uwReal = I2C_uwHistoryParaRead[32];
+    Syspara2.stHistoryPara.uwRealODOTimeH.uwReal = I2C_uwHistoryParaRead[33];
+    Syspara2.stHistoryPara.uwRealODOTimeL.uwReal = I2C_uwHistoryParaRead[34];
 }
 
 

+ 16 - 15
User project/3.BasicFunction/Source/power.c

@@ -67,7 +67,8 @@ void power_voPowerManagement(UWORD uwPowerPara, ULONG SysTickCnt, ULONG OBC_Butt
     ULONG ulPowerStartDelayTime;
     ULONG ulPowerOFFDelayTime;
     
-    ulPowerStartDelayTime =  (ULONG)(power_stPowStateCof.uwPowerStartTouchTimeCnt + ((uwPowerPara & 0xF000)>>12) * 200);//ms
+    //ulPowerStartDelayTime =  (ULONG)(power_stPowStateCof.uwPowerStartTouchTimeCnt + ((uwPowerPara & 0xF000)>>12) * 200);//ms
+    ulPowerStartDelayTime = 5;
     ulPowerOFFDelayTime =  (ULONG)(power_stPowStateCof.uwPowerShutTouchTimeCnt + ((uwPowerPara & 0x0F00)>>8) * 200);//ms
     ulAutoPowerOffDelayTime = (ULONG)((uwPowerPara & 0x00FF) * 60);//s
     
@@ -128,20 +129,20 @@ void power_voPowerManagement(UWORD uwPowerPara, ULONG SysTickCnt, ULONG OBC_Butt
                 AutoPowerOffTimeCnt = SysTickCnt;
             }
             //Stand for ulAutoPowerOffDelayTime seconds to POWER_OFF
-            if((uwTorqueIn < 20) && (CadenceIn < 5) && (BikeSpeed < 10) && ((SysTickCnt - OBC_ButtonSetTimeCnt) > 1000))
-            {
-                if(SysTickCnt - AutoPowerOffTimeCnt > ulAutoPowerOffDelayTime * 1000) //unit s
-                {
-                    power_stPowStateOut.powerstate = POWER_OFF; 
-                    power_stPowStateOut.blPowerStartupFlg = FALSE;
-                    //Send power off command
-                    SendData(ID_MC_BC, MODE_REPORT, 0x1808, (uint8_t *)"SHUTDOWN");
-                }
-            }
-            else
-            {
-                AutoPowerOffTimeCnt = SysTickCnt;
-            }  
+//            if((uwTorqueIn < 20) && (CadenceIn < 5) && (BikeSpeed < 10) && ((SysTickCnt - OBC_ButtonSetTimeCnt) > 1000))
+//            {
+//                if(SysTickCnt - AutoPowerOffTimeCnt > ulAutoPowerOffDelayTime * 1000) //unit s
+//                {
+//                    power_stPowStateOut.powerstate = POWER_OFF; 
+//                    power_stPowStateOut.blPowerStartupFlg = FALSE;
+//                    //Send power off command
+//                    SendData(ID_MC_BC, MODE_REPORT, 0x1808, (uint8_t *)"SHUTDOWN");
+//                }
+//            }
+//            else
+//            {
+//                AutoPowerOffTimeCnt = SysTickCnt;
+//            }  
             break;
         }  
         case POWER_OFF: // 关机处理,等待数据存储完成,关闭LOCK

+ 3 - 3
User project/4.BasicHardwSoftwLayer/1.BasicHardwLayer/Source/hwsetup.c

@@ -663,7 +663,7 @@ void hw_voInitTim0(void)
     /* automatic output enable, break, dead time and lock configuration*/
     timer_breakpara.runoffstate      = TIMER_ROS_STATE_ENABLE;
     timer_breakpara.ideloffstate     = TIMER_IOS_STATE_ENABLE ;
-    timer_breakpara.deadtime         = cp_stControlPara.swIPMDeadTimeNs / 100 * TIM0CLK_KHZ / 1000 / 10;;
+    timer_breakpara.deadtime         = 72;//cp_stControlPara.swIPMDeadTimeNs / 100 * TIM0CLK_KHZ / 1000 / 10;;
     timer_breakpara.breakpolarity    = TIMER_BREAK_POLARITY_LOW;
     timer_breakpara.outputautostate  = TIMER_OUTAUTO_DISABLE;
     timer_breakpara.protectmode      = TIMER_CCHP_PROT_OFF;
@@ -1018,7 +1018,7 @@ void hw_voInitCAN(void)
     can_parameter.time_triggered = DISABLE;
     can_parameter.auto_bus_off_recovery = ENABLE;
     can_parameter.auto_wake_up = DISABLE;
-    can_parameter.auto_retrans = DISABLE;
+    can_parameter.auto_retrans = ENABLE;
     can_parameter.rec_fifo_overwrite = DISABLE;
     can_parameter.trans_fifo_order = DISABLE;
     can_parameter.working_mode = CAN_NORMAL_MODE;
@@ -1049,7 +1049,7 @@ void hw_voInitCAN(void)
     can_filter.filter_list_low = (uint16_t)(((uint32_t)ID_BC_FILTER << 21) | CAN_FF_STANDARD | CAN_FT_DATA) & 0xFFFF;
     can_filter.filter_mask_high = (uint16_t)((((uint32_t)ID_BC_MASK << 21) & 0xFFFF0000U) >> 16);
     can_filter.filter_mask_low =  (uint16_t)((((uint32_t)ID_BC_MASK << 21) & 0xFFFF) | CAN_FF_STANDARD | CAN_FT_DATA);
-    can_filter.filter_fifo_number = CAN_FIFO0;
+    can_filter.filter_fifo_number = CAN_FIFO1;
     can_filter.filter_enable = ENABLE;
     can_filter_init(&can_filter);
 

+ 3 - 0
User project/4.BasicHardwSoftwLayer/2.BasicSoftwLayer/Include/CodePara.h

@@ -276,6 +276,9 @@ typedef struct
     UWORD uwCadSensorAlamTimes;
     UWORD uwBikeSpdSensorAlamTimes;
     UWORD uwPosSensorAlamTimes;
+    
+    ULONG ulRealODOTrip;
+    ULONG ulRealODOTime;
 
 } CP_HISTORY_PARA;
 

+ 3 - 0
User project/4.BasicHardwSoftwLayer/2.BasicSoftwLayer/Source/CodePara.c

@@ -242,6 +242,9 @@ void CodeParaInit(void)
     cp_stHistoryPara.uwCadSensorAlamTimes = 0;
     cp_stHistoryPara.uwBikeSpdSensorAlamTimes = 0;
     cp_stHistoryPara.uwPosSensorAlamTimes = 0;
+    
+    cp_stHistoryPara.ulRealODOTrip = 0;
+    cp_stHistoryPara.ulRealODOTime = 0;
 
     ///////////////////////////////////////////////////////
     cp_stBikeRunInfoPara.uwBikeGear = 0;