Kaynağa Gözat

兼容小牙盘传感器标定设备:
1,四段力矩分别设定为13Nm、35Nm、55Nm、75Nm;
2,针对单力矩和三力矩分别响应对应的读零点、写入校准系数、写入启动值指令;
3,写入校准系数时等比例更新四段力矩采集值;
4,写入启动值时更新13Nm采集值,并根据75Nm采集值线性修正35Nm和55Nm采集值。

目前版本单力矩标定正常,三力矩取得的运行信息预留1、2、3计算三个系数,考虑取消,即后期统一用三力矩标定。

dd 3 ay önce
ebeveyn
işleme
e21e1e3ab2
2 değiştirilmiş dosya ile 170 ekleme ve 44 silme
  1. 8 8
      3.BasicFunction/Include/i2c_master.h
  2. 162 36
      3.BasicFunction/Source/usart.c

+ 8 - 8
3.BasicFunction/Include/i2c_master.h

@@ -324,35 +324,35 @@
     }
 #define I2CuwBikeTor1StepRealNm \
     {                           \
-        200         \
+        130         \
     }
 #define I2CuwBikeTor1StepADC \
     {                        \
-        100     \
+        65     \
     }
 #define I2CuwBikeTor2StepRealNm \
     {                           \
-        400         \
+        350         \
     }
 #define I2CuwBikeTor2StepADC \
     {                        \
-        200     \
+        175     \
     }
 #define I2CuwBikeTor3StepRealNm \
     {                           \
-        600         \
+        550         \
     }
 #define I2CuwBikeTor3StepADC \
     {                        \
-        300     \
+        275     \
     }
 #define I2CuwBikeTor4StepRealNm \
     {                           \
-        800         \
+        750         \
     }
 #define I2CuwBikeTor4StepADC \
     {                        \
-        400      \
+        375      \
     }
 #define I2CuwCadSensorPulseNm              \
     {                                      \

+ 162 - 36
3.BasicFunction/Source/usart.c

@@ -646,40 +646,6 @@ void DataProcess(USART_Buf_TypeDef* ptUartTx, UWORD ID, UBYTE Mode, UWORD Cmd, U
             break;
         }
 
-        case 0x3000: //按小牙盘原协议返回控制参数2
-        {
-            MC_ConfigParam2_Struct_t MC_ConfigParam2;
-            MC_ConfigParam2.ZeroAngle_Pitch = 0;
-            MC_ConfigParam2.ZeroAngle_Roll = 0;
-            MC_ConfigParam2.UseAttitudeAngle_Flag = 0xAA;
-            MC_ConfigParam2.MC_Light_Mode = MC_UpcInfo.stBikeInfo.uwLightConfig >> 12;
-            MC_ConfigParam2.HeadLightVol = MC_UpcInfo.stBikeInfo.uwLightConfig;
-            MC_ConfigParam2.TailLightVol = (MC_UpcInfo.stBikeInfo.uwLightConfig >> 8) & 0x0F;
-            MC_ConfigParam2.u16OverspeedWarnVal = 0;
-            MC_ConfigParam2.u16EffectVal = MC_UpcInfo.stBikeInfo2.uwRearLightDuty;
-            MC_ConfigParam2.u16Prediv = MC_UpcInfo.stBikeInfo2.uwRearLightCycle;
-            MC_ConfigParam2.SpeedLimitStartAdj = 0;
-            MC_ConfigParam2.SpeedLimitEndAdj = 0;
-            MC_ConfigParam2.SpeedLimitAdj = MC_UpcInfo.stBikeInfo2.swDeltaBikeSpeedLimit;
-            MC_ConfigParam2.RS1 = 0;
-            MC_ConfigParam2.UserAdjParam2_ECO.MaxCurrent_K_GAIN = 100;
-            MC_ConfigParam2.UserAdjParam2_ECO.MaxTorque_K_GAIN = 100;
-            MC_ConfigParam2.UserAdjParam2_NORM.MaxCurrent_K_GAIN = 100;
-            MC_ConfigParam2.UserAdjParam2_NORM.MaxTorque_K_GAIN = 100;
-            MC_ConfigParam2.UserAdjParam2_SPORT.MaxCurrent_K_GAIN = 100;
-            MC_ConfigParam2.UserAdjParam2_SPORT.MaxTorque_K_GAIN = 100;
-            MC_ConfigParam2.UserAdjParam2_TURBO.MaxCurrent_K_GAIN = 100;
-            MC_ConfigParam2.UserAdjParam2_TURBO.MaxTorque_K_GAIN = 100;
-            MC_ConfigParam2.UserAdjParam2_SMART.MaxCurrent_K_GAIN = 100;
-            MC_ConfigParam2.UserAdjParam2_SMART.MaxTorque_K_GAIN = 100;
-            MC_ConfigParam2.RS2[0] = 0;
-            MC_ConfigParam2.RS2[1] = 0;
-            MC_ConfigParam2.RS2[2] = 0;
-            MC_ConfigParam2.RS2[3] = 0;
-            SendData(ptUartTx, ID_MC_TO_CDL, MODE_REPORT, 0xAD20, (UBYTE*)&MC_ConfigParam2.ZeroAngle_Pitch);
-            break;
-        }
-
         case 0x1E00: //查询历史信息
         {
             SendData(ptUartTx, ID_MC_TO_CDL, MODE_REPORT, 0xB74C, (UBYTE *)&MC_UpcInfo.stHistoryInfo.uwOpenTimes);
@@ -691,6 +657,15 @@ void DataProcess(USART_Buf_TypeDef* ptUartTx, UWORD ID, UBYTE Mode, UWORD Cmd, U
             SendData(ptUartTx, ID_MC_TO_CDL, MODE_REPORT, 0xA520, (UBYTE *)MC_MacInfo.Manufacturer);
             break;
         }
+        
+        case 0x2000: //小牙盘原单力矩读零点
+        {
+            #ifndef TORSENSOR3NUM
+            UBYTE TempData[24] = {0,};
+            SendData(ptUartTx, ID_MC_TO_CDL, MODE_REPORT, 0xA318, (UBYTE*)TempData);
+            #endif
+            break;
+        }
 
         case 0x2210: //写入电机型号
         {
@@ -816,6 +791,54 @@ void DataProcess(USART_Buf_TypeDef* ptUartTx, UWORD ID, UBYTE Mode, UWORD Cmd, U
             break;
         }
 
+        case 0x2900: //小牙盘原单力矩查询校正信息
+        {
+            #ifndef TORSENSOR3NUM
+            UBYTE DataTemp[4]; //Byte1~Byte2:启动值,取13Nm采集值;Byte3~Byte4:校正系数,取75Nm采集值/375
+            DataTemp[0] = MC_UpcInfo.stSensorInfo.uwBikeTor1StepADC;
+            DataTemp[1] = MC_UpcInfo.stSensorInfo.uwBikeTor1StepADC >> 8;
+            DataTemp[2] = MC_UpcInfo.stSensorInfo.uwBikeTor4StepADC * 100 / 375; //AD * 100 / 400
+            DataTemp[3] = 0;
+            SendData(ptUartTx, ID_MC_TO_CDL, MODE_REPORT, 0xAA04, (UBYTE*)DataTemp);
+            #endif
+            break;
+        }
+
+        case 0x2A01: //小牙盘原单力矩写入力矩传感器标定系数,根据系数更新13Nm, 35Nm, 55Nm, 75Nm默认系数
+        {            
+            #ifndef TORSENSOR3NUM
+            MC_UpcInfo.stSensorInfo.uwBikeTor1StepADC = 65 * Data[0] / 100;
+            MC_UpcInfo.stSensorInfo.uwBikeTor2StepADC = 175 * Data[0] / 100;
+            MC_UpcInfo.stSensorInfo.uwBikeTor3StepADC = 275 * Data[0] / 100;
+            MC_UpcInfo.stSensorInfo.uwBikeTor4StepADC = 375 * Data[0] / 100;
+            cp_stFlg.ParaSaveEEFlg = TRUE;
+            cp_stFlg.ParaUpdateFlg = TRUE;
+            cp_stFlg.ParaSensorInfoUpdateFlg = TRUE;
+            cp_stFlg.ParaAssistUpdateFinishFlg = TRUE;
+            SendData(ptUartTx, ID_MC_BC, MODE_REPORT, 0xA903, (UBYTE *)"ACK");
+            #endif
+            break;
+        }
+
+        case 0x2B02: //小牙盘原单力矩和三力矩写入力矩传感器启动值
+        {
+            //更新13Nm采集值
+            UWORD DataTemp = 0;
+            DataTemp = Data[0] + (UWORD)(Data[1] << 8);
+            MC_UpcInfo.stSensorInfo.uwBikeTor1StepADC = MC_UpcInfo.stSensorInfo.uwBikeTor1StepADC * (DataTemp * 10 / 28) / MC_UpcInfo.stSensorInfo.uwBikeTor1StepRealNm;
+            //线性修正,结合75Nm标定值计算35Nm和55Nm采集值
+            ULONG k;
+            k = ((ULONG)(MC_UpcInfo.stSensorInfo.uwBikeTor4StepADC - MC_UpcInfo.stSensorInfo.uwBikeTor1StepADC) << 14) / (750 - 130);
+            MC_UpcInfo.stSensorInfo.uwBikeTor2StepADC = MC_UpcInfo.stSensorInfo.uwBikeTor1StepADC + (((350 - 130) * k) >> 14);
+            MC_UpcInfo.stSensorInfo.uwBikeTor3StepADC = MC_UpcInfo.stSensorInfo.uwBikeTor1StepADC + (((550 - 130) * k) >> 14);
+            cp_stFlg.ParaSaveEEFlg = TRUE;
+            cp_stFlg.ParaUpdateFlg = TRUE;
+            cp_stFlg.ParaSensorInfoUpdateFlg = TRUE;
+            cp_stFlg.ParaAssistUpdateFinishFlg = TRUE;
+            SendData(ptUartTx, ID_MC_BC, MODE_REPORT, 0xA903, (UBYTE *)"ACK");
+            break;
+        }
+
         case 0x2C01: //控制指令
         {
             MC_MotorSPD_rpm_Percent = *Data;
@@ -848,6 +871,109 @@ void DataProcess(USART_Buf_TypeDef* ptUartTx, UWORD ID, UBYTE Mode, UWORD Cmd, U
             SendData(ptUartTx, ID_MC_BC, MODE_REPORT, 0x1510, (UBYTE *)&MC_RideLog.ODO_Km);
             break;
         }
+        
+        case 0x3000: //按小牙盘原协议返回控制参数2
+        {
+            MC_ConfigParam2_Struct_t MC_ConfigParam2;
+            MC_ConfigParam2.ZeroAngle_Pitch = 0;
+            MC_ConfigParam2.ZeroAngle_Roll = 0;
+            MC_ConfigParam2.UseAttitudeAngle_Flag = 0xAA;
+            MC_ConfigParam2.MC_Light_Mode = MC_UpcInfo.stBikeInfo.uwLightConfig >> 12;
+            MC_ConfigParam2.HeadLightVol = MC_UpcInfo.stBikeInfo.uwLightConfig;
+            MC_ConfigParam2.TailLightVol = (MC_UpcInfo.stBikeInfo.uwLightConfig >> 8) & 0x0F;
+            MC_ConfigParam2.u16OverspeedWarnVal = 0;
+            MC_ConfigParam2.u16EffectVal = MC_UpcInfo.stBikeInfo2.uwRearLightDuty;
+            MC_ConfigParam2.u16Prediv = MC_UpcInfo.stBikeInfo2.uwRearLightCycle;
+            MC_ConfigParam2.SpeedLimitStartAdj = 0;
+            MC_ConfigParam2.SpeedLimitEndAdj = 0;
+            MC_ConfigParam2.SpeedLimitAdj = MC_UpcInfo.stBikeInfo2.swDeltaBikeSpeedLimit;
+            MC_ConfigParam2.RS1 = 0;
+            MC_ConfigParam2.UserAdjParam2_ECO.MaxCurrent_K_GAIN = 100;
+            MC_ConfigParam2.UserAdjParam2_ECO.MaxTorque_K_GAIN = 100;
+            MC_ConfigParam2.UserAdjParam2_NORM.MaxCurrent_K_GAIN = 100;
+            MC_ConfigParam2.UserAdjParam2_NORM.MaxTorque_K_GAIN = 100;
+            MC_ConfigParam2.UserAdjParam2_SPORT.MaxCurrent_K_GAIN = 100;
+            MC_ConfigParam2.UserAdjParam2_SPORT.MaxTorque_K_GAIN = 100;
+            MC_ConfigParam2.UserAdjParam2_TURBO.MaxCurrent_K_GAIN = 100;
+            MC_ConfigParam2.UserAdjParam2_TURBO.MaxTorque_K_GAIN = 100;
+            MC_ConfigParam2.UserAdjParam2_SMART.MaxCurrent_K_GAIN = 100;
+            MC_ConfigParam2.UserAdjParam2_SMART.MaxTorque_K_GAIN = 100;
+            MC_ConfigParam2.RS2[0] = 0;
+            MC_ConfigParam2.RS2[1] = 0;
+            MC_ConfigParam2.RS2[2] = 0;
+            MC_ConfigParam2.RS2[3] = 0;
+            SendData(ptUartTx, ID_MC_TO_CDL, MODE_REPORT, 0xAD20, (UBYTE*)&MC_ConfigParam2.ZeroAngle_Pitch);
+            break;
+        }
+
+        case 0x3201: //小牙盘原三力矩读零点
+        {
+            #ifdef TORSENSOR3NUM
+            UBYTE DataTemp[26] = {0, };
+            DataTemp[0] = Data[0];
+            switch(DataTemp[0])
+            {
+                case 1:
+                {
+                    DataTemp[23] = MC_UpcInfo.stSensorInfo.uwTorSensorOffsetNow1;
+                    DataTemp[24] = MC_UpcInfo.stSensorInfo.uwTorSensorOffsetNow1 >> 8;
+                    break;
+                }
+                case 2:
+                {
+                    DataTemp[23] = MC_UpcInfo.stSensorInfo.uwTorSensorOffsetNow2;
+                    DataTemp[24] = MC_UpcInfo.stSensorInfo.uwTorSensorOffsetNow2 >> 8;
+                    break;
+                }
+                case 3:
+                {
+                    DataTemp[23] = MC_UpcInfo.stSensorInfo.uwTorSensorOffsetNow3;
+                    DataTemp[24] = MC_UpcInfo.stSensorInfo.uwTorSensorOffsetNow3 >> 8;
+                    break;
+                }
+            }
+            SendData(ptUartTx, ID_MC_TO_CDL, MODE_REPORT, 0xAE1A, DataTemp);
+            #endif
+            break;
+        }
+
+        case 0x3301: //小牙盘原三力矩读校正系数
+        {
+            #ifdef TORSENSOR3NUM
+            UBYTE DataTemp[2] = {0, };
+            DataTemp[0] = Data[0];
+            DataTemp[1] = MC_UpcInfo.stSensorInfo.uwBikeTor4StepADC * 100 / 375; //AD * 100 / 400
+            SendData(ptUartTx, ID_MC_TO_CDL, MODE_REPORT, 0xAF02, DataTemp);
+            #endif
+            break;
+        }
+
+        case 0x3402: //小牙盘原三力矩写校正系数
+        {
+            #ifdef TORSENSOR3NUM
+            MC_UpcInfo.stSensorInfo.uwBikeTor1StepADC = 65 * Data[1] / 100;
+            MC_UpcInfo.stSensorInfo.uwBikeTor2StepADC = 175 * Data[1] / 100;
+            MC_UpcInfo.stSensorInfo.uwBikeTor3StepADC = 275 * Data[1] / 100;
+            MC_UpcInfo.stSensorInfo.uwBikeTor4StepADC = 375 * Data[1] / 100;
+            cp_stFlg.ParaSaveEEFlg = TRUE;
+            cp_stFlg.ParaUpdateFlg = TRUE;
+            cp_stFlg.ParaSensorInfoUpdateFlg = TRUE;
+            cp_stFlg.ParaAssistUpdateFinishFlg = TRUE;
+            SendData(ptUartTx, ID_MC_BC, MODE_REPORT, 0xA903, (UBYTE *)"ACK");
+            #endif
+            break;
+        }
+
+        case 0x3500: //小牙盘原三力矩查询启动值
+        {
+            #ifdef TORSENSOR3NUM
+            UBYTE DataTemp[2]; //启动值,取13Nm采集值
+            DataTemp[0] = MC_UpcInfo.stSensorInfo.uwBikeTor1StepADC;
+            DataTemp[1] = MC_UpcInfo.stSensorInfo.uwBikeTor1StepADC >> 8;
+            SendData(ptUartTx, ID_MC_TO_CDL, MODE_REPORT, 0xB002, DataTemp);
+            #endif
+            break;
+        }
 
         case 0x3909: // 历史信息清除
         {
@@ -873,13 +999,13 @@ void DataProcess(USART_Buf_TypeDef* ptUartTx, UWORD ID, UBYTE Mode, UWORD Cmd, U
             }
             break;
         }
-        ////////////////////////////////////////
+        
         case 0x3A00: //读取马达信息
         { 
             SendData(ptUartTx, ID_MC_TO_CDL, MODE_REPORT, 0xB226, (UBYTE *)&MC_UpcInfo.stMotorInfo.uwPolePairs);
             break;
         }
-           case 0x3B10: 
+        case 0x3B10: //写入骑行ODO和TRIP
         {
             memcpy(&MC_RideLog.ODO_Km, Data, DataLength);