Преглед на файлове

增加单力矩传感器宏定义,并增加动态标定。

dd преди 4 месеца
родител
ревизия
b47af83564

Файловите разлики са ограничени, защото са твърде много
+ 4 - 0
.launches/empty_LP_MSPM0G3507_APP_Normal_20250107.launch


+ 2 - 0
3.BasicFunction/Include/torquesensor.h

@@ -28,6 +28,8 @@ typedef _Bool  BOOL;
 #define TORSENSOR_USEAUTOZERO 2  //自动零点
 #define TORSENSOR_USEMOL      TORSENSOR_USEAUTOZERO
 
+#define TORSENSOR3NUM  //三力矩标识
+
 #define TORQUE_MAX_RANGE           1000         // MAX TORQUE 0.1Nm
 #define TORQUE_MIN_RANGE           5            // MIN TOEQUE 0.1Nm
 #define TORQUE_VOLTAGE_MAX_RANGE   3000         // MAX voltage mV

+ 34 - 15
3.BasicFunction/Source/torquesensor.c

@@ -200,10 +200,14 @@ void torsensor_voTorADC(void) // need to match ADC_StartConversion(ADC1);
     if (torsensor_stTorSensorOut.blTorqueErrorFlg == TRUE)
     {
         torsensor_stTorSensorOut.uwTorquePu = 0;
+        #ifdef TORSENSOR3NUM
         if( ((TORQUEVOLREG1() < 4000) && (TORQUEVOLREG1() > 10)) &&
             ((TORQUEVOLREG2() < 4000) && (TORQUEVOLREG2() > 10)) &&
             ((TORQUEVOLREG3() < 4000) && (TORQUEVOLREG3() > 10))
           )
+        #else
+        if((TORQUEVOLREG1() < 4000) && (TORQUEVOLREG1() > 10))
+        #endif
         {
             torsensor_stTorSensorOut.uwTorqueErrorCnt++;
             if (torsensor_stTorSensorOut.uwTorqueErrorCnt > 1000)
@@ -259,10 +263,14 @@ void torsensor_voTorADC(void) // need to match ADC_StartConversion(ADC1);
             torsensor_stTorSensorOut.uwTorquePu = torsensor_stTorSensorCof.uwBikeTorStep4NmPu;
         }
 #elif (TORSENSOR_USEMOL == TORSENSOR_USEAUTOZERO)
+        #ifdef TORSENSOR3NUM
         torsensor_stTorSensorOut.uwTorqueReg = abs( (SWORD)(TORQUEVOLREG1() - torsensor_stTorSensorCof.uwTorqueOffsetNow1) +
                                                     (SWORD)(TORQUEVOLREG2() - torsensor_stTorSensorCof.uwTorqueOffsetNow2) +
                                                     (SWORD)(TORQUEVOLREG3() - torsensor_stTorSensorCof.uwTorqueOffsetNow3)
                                                   ) / 3;
+        #else
+        torsensor_stTorSensorOut.uwTorqueReg = abs( (SWORD)(TORQUEVOLREG1() - torsensor_stTorSensorCof.uwTorqueOffsetNow1));
+        #endif
         if (torsensor_stTorSensorOut.uwTorqueReg <= torsensor_stTorSensorCof.uwTorqueOffset)
         {
             torsensor_stTorSensorOut.uwTorquePu = 0;
@@ -302,11 +310,14 @@ void torsensor_voTorADC(void) // need to match ADC_StartConversion(ADC1);
         torsensor_stTorSensorOut.uwTorquePercent =
             (((ULONG)torsensor_stTorSensorOut.uwTorqueLPFPu) << 14) /
             (torsensor_stTorSensorCof.uwMaxSensorTorquePu - torsensor_stTorSensorCof.uwMinSensorTorquePu); // Q15
-
+        #ifdef TORSENSOR3NUM
         if(((TORQUEVOLREG1() > 4000) || (TORQUEVOLREG1() < 10)) ||
            ((TORQUEVOLREG2() > 4000) || (TORQUEVOLREG2() < 10)) ||
            ((TORQUEVOLREG3() > 4000) || (TORQUEVOLREG3() < 10))
           )
+        #else
+        if((TORQUEVOLREG1() > 4000) || (TORQUEVOLREG1() < 10))
+        #endif
         {
             torsensor_stTorSensorOut.uwTorqueErrorCnt++;
             if (torsensor_stTorSensorOut.uwTorqueErrorCnt > 5000)
@@ -326,6 +337,7 @@ void torsensor_voTorADC(void) // need to match ADC_StartConversion(ADC1);
 
 void TorqueSensorRegFltCal(void)
 {
+    #ifdef TORSENSOR3NUM
     TorqueSensorRegFlt.SensorPer1 = TORQUEVOLREG1();
     TorqueSensorRegFlt.SensorPer2 = TORQUEVOLREG2();
     TorqueSensorRegFlt.SensorPer3 = TORQUEVOLREG3();
@@ -335,24 +347,33 @@ void TorqueSensorRegFltCal(void)
     TorqueSensorRegFlt.SensorFlt2 = TorqueSensorRegFlt.SensorFltSum2 >> 10;
     TorqueSensorRegFlt.SensorFltSum3 += ((TorqueSensorRegFlt.SensorPer3 << 10) - TorqueSensorRegFlt.SensorFltSum3) >> 8;
     TorqueSensorRegFlt.SensorFlt3 = TorqueSensorRegFlt.SensorFltSum3 >> 10;
+    #else
+    TorqueSensorRegFlt.SensorPer1 = TORQUEVOLREG1();
+    TorqueSensorRegFlt.SensorFltSum1 += ((TorqueSensorRegFlt.SensorPer1 << 10) - TorqueSensorRegFlt.SensorFltSum1) >> 8;
+    TorqueSensorRegFlt.SensorFlt1 = TorqueSensorRegFlt.SensorFltSum1 >> 10;
+    #endif
 }
 
 //零点更新
 void TorqueSensorOffSetAuto()
 {
-    SLONG SumTemp = 0;
     static UBYTE SetFlag = 0;
     static BOOL OffSet_RefreshFlag = FALSE;
-    if(SetFlag == 0)
+    if(SetFlag == 0) //开机后执行一次获取初始值
     {
+        #ifdef TORSENSOR3NUM
         torsensor_stTorSensorCof.uwTorqueOffsetNow1 = TORQUEVOLREG1();
         torsensor_stTorSensorCof.uwTorqueOffsetNow2 = TORQUEVOLREG2();
         torsensor_stTorSensorCof.uwTorqueOffsetNow3 = TORQUEVOLREG3();
+        #else
+        torsensor_stTorSensorCof.uwTorqueOffsetNow1 = TORQUEVOLREG1();
+        #endif
         SetFlag = 1;
         OffSet_RefreshFlag = TRUE;
     }
-    else
+    else //更新为较小值
     {
+        #ifdef TORSENSOR3NUM
         if(TorqueSensorRegFlt.SensorFlt1 < torsensor_stTorSensorCof.uwTorqueOffsetNow1)
         {
             torsensor_stTorSensorCof.uwTorqueOffsetNow1 = TorqueSensorRegFlt.SensorFlt1;
@@ -368,20 +389,18 @@ void TorqueSensorOffSetAuto()
             torsensor_stTorSensorCof.uwTorqueOffsetNow3 = TorqueSensorRegFlt.SensorFlt3;
             OffSet_RefreshFlag = TRUE;
         }
+        #else
+        if(TorqueSensorRegFlt.SensorFlt1 < torsensor_stTorSensorCof.uwTorqueOffsetNow1)
+        {
+            torsensor_stTorSensorCof.uwTorqueOffsetNow1 = TorqueSensorRegFlt.SensorFlt1;
+            OffSet_RefreshFlag = TRUE;
+        }
+        #endif
     }
     if(OffSet_RefreshFlag == TRUE)
     {
-        if(SumTemp <= 0)
-        {
-            torsensor_stTorSensorCof.uwTorqueOffset = 0;
-            torsensor_stTorSensorCof.uwTorqueOffsetPowerUp = torsensor_stTorSensorCof.uwTorqueOffset;
-        }
-
-        else
-        {
-            torsensor_stTorSensorCof.uwTorqueOffset = SumTemp / 3;
-            torsensor_stTorSensorCof.uwTorqueOffsetPowerUp = torsensor_stTorSensorCof.uwTorqueOffset;
-        }
+        torsensor_stTorSensorCof.uwTorqueOffset = 0;
+        torsensor_stTorSensorCof.uwTorqueOffsetPowerUp = torsensor_stTorSensorCof.uwTorqueOffset;
         OffSet_RefreshFlag = FALSE;
     }
 }

+ 28 - 18
3.BasicFunction/Source/usart.c

@@ -57,6 +57,7 @@
 #include "UserGpio_Config.h"
 //#include "api.h"
 //#include "board_config.h"
+
 /* Private variables ---------------接收缓存区------------------------------------------*/
 
 UBYTE UART_RxBuff_OBC[UART_BUFF_SIZE];
@@ -896,38 +897,46 @@ void DataProcess(USART_Buf_TypeDef* ptUartTx, UWORD ID, UBYTE Mode, UWORD Cmd, U
         case 0x4104: //写入力矩传感器参数
         {
             UWORD SAVETemp[2];
+            SWORD Temp;
+            ULONG TempSum = 0;
+            ULONG TimeDelayTick = 0;
             memcpy(&SAVETemp, Data, DataLength);
-            if (SAVETemp[0] == 1)
+
+            for(UBYTE i = 0; i < 128; i++)
             {
-                MC_UpcInfo.stSensorInfo.uwBikeTor1StepRealNm = SAVETemp[1];
-                MC_UpcInfo.stSensorInfo.uwBikeTor1StepADC = ((TORQUEVOLREG1() - torsensor_stTorSensorCof.uwTorqueOffsetNow1) +
+                #ifdef TORSENSOR3NUM
+                Temp = ((TORQUEVOLREG1() - torsensor_stTorSensorCof.uwTorqueOffsetNow1) +
                                                              (TORQUEVOLREG2() - torsensor_stTorSensorCof.uwTorqueOffsetNow2) +
                                                              (TORQUEVOLREG3() - torsensor_stTorSensorCof.uwTorqueOffsetNow3)) / 3;
-                SendData(ptUartTx, ID_MC_BC, MODE_REPORT, 0xA903, (uint8_t *)"ACK");
+                #else
+                Temp = TORQUEVOLREG1() - torsensor_stTorSensorCof.uwTorqueOffsetNow1;
+                #endif
+                TempSum += (Temp < 0) ? 0 : Temp;
+                TimeDelayTick = cp_ulSystickCnt;
+                while((cp_ulSystickCnt - TimeDelayTick) < 10)
+                {
+                    asm("NOP");
+                }
+            }
+            if (SAVETemp[0] == 1)
+            {
+                MC_UpcInfo.stSensorInfo.uwBikeTor1StepRealNm = SAVETemp[1];
+                MC_UpcInfo.stSensorInfo.uwBikeTor1StepADC = TempSum >> 7;
             }
             else if (SAVETemp[0] == 2)
             {
                 MC_UpcInfo.stSensorInfo.uwBikeTor2StepRealNm = SAVETemp[1];
-                MC_UpcInfo.stSensorInfo.uwBikeTor2StepADC = ((TORQUEVOLREG1() - torsensor_stTorSensorCof.uwTorqueOffsetNow1) +
-                                                             (TORQUEVOLREG2() - torsensor_stTorSensorCof.uwTorqueOffsetNow2) +
-                                                             (TORQUEVOLREG3() - torsensor_stTorSensorCof.uwTorqueOffsetNow3)) / 3;
-                SendData(ptUartTx, ID_MC_BC, MODE_REPORT, 0xA903, (uint8_t *)"ACK");
+                MC_UpcInfo.stSensorInfo.uwBikeTor2StepADC = TempSum >> 7;
             }
             else if (SAVETemp[0] == 3)
             {
                 MC_UpcInfo.stSensorInfo.uwBikeTor3StepRealNm = SAVETemp[1];
-                MC_UpcInfo.stSensorInfo.uwBikeTor3StepADC = ((TORQUEVOLREG2() - torsensor_stTorSensorCof.uwTorqueOffsetNow1) +
-                                                             (TORQUEVOLREG2() - torsensor_stTorSensorCof.uwTorqueOffsetNow2) +
-                                                             (TORQUEVOLREG3() - torsensor_stTorSensorCof.uwTorqueOffsetNow3)) / 3;
-                SendData(ptUartTx, ID_MC_BC, MODE_REPORT, 0xA903, (uint8_t *)"ACK");
+                MC_UpcInfo.stSensorInfo.uwBikeTor3StepADC = TempSum >> 7;
             }
             else if (SAVETemp[0] == 4)
             {
                 MC_UpcInfo.stSensorInfo.uwBikeTor4StepRealNm = SAVETemp[1];
-                MC_UpcInfo.stSensorInfo.uwBikeTor4StepADC = ((TORQUEVOLREG3() - torsensor_stTorSensorCof.uwTorqueOffsetNow1) +
-                                                             (TORQUEVOLREG2() - torsensor_stTorSensorCof.uwTorqueOffsetNow2) +
-                                                             (TORQUEVOLREG3() - torsensor_stTorSensorCof.uwTorqueOffsetNow3)) / 3;
-                SendData(ptUartTx, ID_MC_BC, MODE_REPORT, 0xA903, (uint8_t *)"ACK");
+                MC_UpcInfo.stSensorInfo.uwBikeTor4StepADC = TempSum >> 7;
             }
             else
             {}
@@ -936,6 +945,7 @@ void DataProcess(USART_Buf_TypeDef* ptUartTx, UWORD ID, UBYTE Mode, UWORD Cmd, U
             cp_stFlg.ParaUpdateFlg = TRUE;
             cp_stFlg.ParaSensorInfoUpdateFlg = TRUE;
             cp_stFlg.ParaAssistUpdateFinishFlg = TRUE;
+            SendData(ptUartTx, ID_MC_BC, MODE_REPORT, 0xA903, (uint8_t *)"ACK");
             break;
         }
         case 0x420E: //写入其它传感器参数
@@ -1132,7 +1142,7 @@ void DataProcess(USART_Buf_TypeDef* ptUartTx, UWORD ID, UBYTE Mode, UWORD Cmd, U
             SendData(ptUartTx, ID_MC_BC, MODE_REPORT, 0xBC20, (uint8_t *)&MC_UpcInfo.stWriteResistanceCalibInfo.MOSResA);
             break;
         }
- case 0x4B22:  //上位机设置骑行参数
+        case 0x4B22:  //上位机设置骑行参数
         {
             memcpy(&MC_UpcInfo.stRideParaInfo.uwSaveFlg, Data, DataLength);
             if (MC_UpcInfo.stRideParaInfo.uwSaveFlg == 1)
@@ -1145,7 +1155,7 @@ void DataProcess(USART_Buf_TypeDef* ptUartTx, UWORD ID, UBYTE Mode, UWORD Cmd, U
             SendData(ptUartTx,ID_MC_TO_CDL, MODE_REPORT, 0x5303, (uint8_t*)"ACK");
             break;
         }
-          case 0x4C00: 
+        case 0x4C00:
         {
             SendData(ptUartTx,ID_MC_BC, MODE_REPORT, 0xBD20, (UBYTE *)&MC_UpcInfo.stBikeInfo2.uwNoneOBCEnable);
             break;

Някои файлове не бяха показани, защото твърде много файлове са промени