Explorar el Código

feat(sim): 增加骑行模型,模拟力矩,踏频,车速,以及档位

CN\zhangkai71 hace 1 año
padre
commit
196ba7f44d

+ 1 - 22
User project/1.FrameLayer/Source/TimeTask_Event.c

@@ -250,32 +250,11 @@ void  Event_1ms(void) /* parasoft-suppress METRICS-28 "本项目圈复杂度无
 
 }
 
-UWORD testcapset=0;
 void Event_5ms(void)
 {
     /* Upper Computer Info Update */
     Can_voMC_Run_5ms();  
-    if(testcapset==1)
-    {
-        iCap_SetEdgeType(0, CAP_CH(2), ApiCap_FallingEdge);
-    }
-    else if (testcapset==2)  
-    {
-        iCap_SetEdgeType(0, CAP_CH(2), ApiCap_RisingEdge);
-    }
-    else if(testcapset==3)
-    {
-        iCap_SetEdgeType(0, CAP_CH(3), ApiCap_FallingEdge);
-    }
-    else if (testcapset==4)  
-    {
-        iCap_SetEdgeType(0, CAP_CH(3), ApiCap_RisingEdge);
-    }
-    else
-    {
-    
-    }
-      
+     
    
 }
 

+ 10 - 1
User project/1.FrameLayer/Source/tbc.c

@@ -34,6 +34,8 @@ Revising History (ECL of this file):
 #include "alarm.h"
 #include "STLmain.h"
 #include "api.h"
+
+#include "torquesensor.h"
 /*************************************************************************
  Exported Functions (N/A)
 *************************************************************************/
@@ -70,9 +72,13 @@ void tbc_voUpIsr(void)
 
 #ifdef RUN_ARCH_SIM
     SWORD elecOmega = 0;
+    UWORD gearstate = 0;
     INJ_PT(INT16, uart_slSpdRefRpm, 4);
     INJ_PT(INT16, spi_stResolverOut.uwSpiThetaPu, 0);
     INJ_PT(INT16, elecOmega, 1);
+    INJ_PT(INT16, gearstate, 5);
+    MC_ControlCode.GearSt =gearstate;
+
 
     spi_stResolverOut.swSpdFbkPu = ((SLONG)elecOmega << 15) / cof_uwWebRadps * 10;
     
@@ -90,7 +96,10 @@ void tbc_voUpIsr(void)
     TEST_PT(INT, adc_stDownOut.swIaPu, 9);
     TEST_PT(INT, adc_stUpOut.swCalibIaPu, 10);
     TEST_PT(INT, crd_stCurParkOut.swQPu, 11);
-    
+    TEST_PT(INT, cadence_stFreGetOut.uwFrequencyPu, 12);
+    TEST_PT(INT, bikespeed_stFreGetOut.uwFrequencyPu, 13);  
+    TEST_PT(INT, torsensor_stTorSensorOut.uwTorquePu, 14); 
+    TEST_PT(INT, cp_stBikeRunInfoPara.uwBikeGear, 15); 
 
 #endif
 }

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

@@ -8,6 +8,7 @@
  * @copyright Copyright (c) 2023
  *
  */
+#include "typedefine.h"
 
 #ifndef _INPUTCAPTURE_H_
 #define _INPUTCAPTURE_H_

+ 18 - 2
User project/3.BasicFunction/Source/AssistCurve.c

@@ -156,10 +156,26 @@ static void ass_voAssistModeSelect(void) // 上电运行一次or助力参数更
     {
         TempAssit = ASSISTMOD_SELECT_DEFAULT;
     }
-    
+    SLONG slTorqGainSum =0;
+
+    for(UWORD i = 0; i < 4; i++)
+    {
+        slTorqGainSum += flash_stPara.slTorqAssGain[0][i];
+    }
+    if(slTorqGainSum == 0)
+    {
+        SLONG slTorqAssGain[15][4] = TORQUE_ASSIST_DEFAULT;
+        SLONG slCadAssGain[5][4] = CADENCE_ASSIST_DEFAULT;
+        UWORD a ;
+        a =sizeof( slTorqAssGain);
+        memcpy(&flash_stPara.slTorqAssGain[0], &slTorqAssGain[0], sizeof(slTorqAssGain));
+        memcpy(&flash_stPara.slCadAssGain[0], &slCadAssGain[0], sizeof(slCadAssGain));
+    }
+
     for (gear = 0; gear < 5; gear++)
     {
         TempGear = gear * 3 + ((TempAssit >> (UWORD)(gear << 1)) & 0x0003);
+
         memcpy(&ass_stCalCoef.uwTorqueAssGain[(gear + 1)], &flash_stPara.slTorqAssGain[TempGear], sizeof(POLY_COEF));
     }
     memcpy(&ass_stCalCoef.uwCadencAsseGain[1], &flash_stPara.slCadAssGain[0], sizeof(flash_stPara.slCadAssGain));
@@ -1039,7 +1055,7 @@ static void ass_voAssistCurLimBMS(UWORD uwSOCvalue)
 void ass_voAssist(void)
 {
     /* Start Assist Jduge */
-    if (((ass_stCalIn.uwtorquePer > ass_stCalCoef.uwAssThreshold && ass_stCalIn.uwcadancePer > 0) || ass_stCalIn.uwtorquePer > 3000) && (ass_stCalIn.uwGearSt > 0 && ass_stCalIn.uwGearSt != 0x22))
+    if ((ass_stCalIn.uwtorquePer > ass_stCalCoef.uwAssThreshold && ass_stCalIn.uwcadancePer > 0) && (ass_stCalIn.uwGearSt > 0 && ass_stCalIn.uwGearSt != 0x22))
     {
         ass_stCalCoef.blAssistflag = TRUE;
     }

+ 3 - 1
User project/3.BasicFunction/Source/Cadence.c

@@ -41,7 +41,9 @@ static ULONG cad_pvt_ulCapValErrLast = 0;
 ****************************************************************/
 void cadence_voCadenceCof(void)
 {
-    // cadence_stFreGetCof.uwNumbersPulses = CADENCE_NUMBERS_PULSES;
+#ifdef RUN_ARCH_SIM 
+    cadence_stFreGetCof.uwNumbersPulses = CADENCE_NUMBERS_PULSES;
+#endif
     cadence_stFreGetCof.uwSartIntervalTimeCnt = CADENCE_START_INTERVALTIME / CADENCE_TIM_TIMERUNIT;
     cadence_stFreGetCof.uwNumbersValidPulse2Start = CADENCE_NUMBERS_VALIDPULSE2START;
     cadence_stFreGetCof.uwLfRecordTimeCnt = CADENCE_LF_RECORDTIME / CADENCE_TIM_TIMERUNIT;

+ 3 - 1
User project/3.BasicFunction/Source/bikespeed.c

@@ -43,7 +43,9 @@ static ULONG bikespeed_pvt_FreqPu = 0;
 ****************************************************************/
 void bikespeed_voBikeSpeedCof(void)
 {
-    // bikespeed_stFreGetCof.uwNumbersPulses = BIKESPEED_NUMBERS_PULSES;
+#ifdef RUN_ARCH_SIM 
+    bikespeed_stFreGetCof.uwNumbersPulses = BIKESPEED_NUMBERS_PULSES;
+#endif
     bikespeed_stFreGetCof.uwSartIntervalTimeCnt = BIKESPEED_START_INTERVALTIME / BIKESPEED_TIM_TIMERUNIT;
     bikespeed_stFreGetCof.uwNumbersValidPulse2Start = BIKESPEED_NUMBERS_VALIDPULSE2START;
     bikespeed_stFreGetCof.uwHfMinTimeCnt = BIKESPEED_HF_MINTIME / BIKESPEED_TIM_TIMERUNIT;

+ 1 - 1
User project/3.BasicFunction/Source/can.c

@@ -496,7 +496,7 @@ void DataProcess(UWORD ID, UBYTE Mode, UWORD Cmd, UBYTE Data[]) /* parasoft-supp
         case 0x3900: //返回电机版本信息
         {
             SendData(ID_MC_BC, MODE_REPORT, 0x1240, (UBYTE *)MC_VerInfo.Mode);
-            SendData(ID_MC_BC, MODE_REPORT, 0x1720, (UBYTE*)Firmware_Special);
+            SendData(ID_MC_BC, MODE_REPORT, 0x1720, (UBYTE *)Firmware_Special);
             break;
         }
         case 0x3A02: //OBC按键状态

+ 3 - 0
User project/3.BasicFunction/Source/canAppl.c

@@ -805,6 +805,9 @@ void Can_GearSt_switch(void)
     {
         ulOBC_ComTimeOutCount = cp_ulSystickCnt;
     }
+#ifdef RUN_ARCH_SIM 
+    ulOBC_ComTimeOutCount = cp_ulSystickCnt;
+#endif
     if ((cp_ulSystickCnt - ulOBC_ComTimeOutCount) < 3000) // 控制器与仪表通信中断超过3s,关闭助力
     {
         if (MC_ControlCode.GearSt <= 0x05)

+ 13 - 0
User project/3.BasicFunction/Source/torquesensor.c

@@ -161,6 +161,19 @@ void torsensor_voTorSensorCof(void)
         torsensor_stTorSensorCof.uwTorqueOffsetConfirmFlg = TRUE;
     }
     
+
+#ifdef RUN_ARCH_SIM
+    torsensor_stTorSensorCof.uwTorqueOffset = 868;
+    torsensor_stTorSensorCof.uwBikeTorStep1ADC = 1427;
+    torsensor_stTorSensorCof.uwBikeTorStep1RealNm = 250;
+    torsensor_stTorSensorCof.uwBikeTorStep2ADC = 1985;
+    torsensor_stTorSensorCof.uwBikeTorStep2RealNm = 500;
+    torsensor_stTorSensorCof.uwBikeTorStep3ADC = 2544;
+    torsensor_stTorSensorCof.uwBikeTorStep3RealNm = 750;
+    torsensor_stTorSensorCof.uwBikeTorStep4ADC = 3103;
+    torsensor_stTorSensorCof.uwBikeTorStep4RealNm = 1000;
+#endif
+
     torsensor_stTorSensorCof.uwSensorVolPerTorqDefault = TORQUE_VOLTAGE_PER_NM;
 
     torsensor_stTorSensorCof.ulTorqueReg2PuDefault = (ULONG)((((UQWORD)33 << 24) / 10) / (1 << ADC_RESOLUTION_BIT) / TORQUE_VOLTAGE_SEN2MCUGAIN * 100 * 1000 /

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

@@ -42,11 +42,11 @@ void CodeParaInit(void)
 #if ((MOTOR_ID_SEL == MOTOR_WELLING_CITY_36V) || (MOTOR_ID_SEL == MOTOR_WELLING_CITY_48V))
 {
     cp_stFlg.RunModelSelect = ClZLOOP; //CityBIKE;//ClZLOOP; 
-    cp_stFlg.RotateDirectionSelect = BackwardRotate;
+    cp_stFlg.RotateDirectionSelect = ForwardRotate;
 }
 #elif ((MOTOR_ID_SEL == MOTOR_WELLING_MTB_36V) || (MOTOR_ID_SEL == MOTOR_WELLING_MTB_48V))
 {
-    cp_stFlg.RunModelSelect = ClZLOOP;//ClZLOOP; MountainBIKE
+    cp_stFlg.RunModelSelect = MountainBIKE;//ClZLOOP; MountainBIKE
     cp_stFlg.RotateDirectionSelect = ForwardRotate;
 }
 #endif     
@@ -54,7 +54,10 @@ void CodeParaInit(void)
     cp_stFlg.CurrentSampleModelSelect = COMBINATION;
   
     cp_stFlg.RunPermitFlg = TRUE;
-    cp_stFlg.ParaUseEEFlg = TRUE; //FALSE, TRUE;
+    cp_stFlg.ParaUseEEFlg = TRUE; 
+#ifdef RUN_ARCH_SIM 
+    cp_stFlg.ParaUseEEFlg = FALSE; //FALSE, TRUE;
+#endif
     cp_stFlg.ParaUseEEFinishFlg = FALSE;
     cp_stFlg.ParaSaveEEFlg = FALSE;
     cp_stFlg.ParaSaveEEFinishFlg = FALSE;

BIN
tests/sim/FanPlatformAuto.slx


+ 1 - 1
tests/sim/init_model.m

@@ -26,6 +26,6 @@ we=Freq*2*pi;
 MaxIphase = 140; % Code = 156
 MaxIdc = 95.24;
 MaxVdc = 60.5;
-
+MaxTorq = 145;
 load('injection_dtype.mat');
 

+ 40 - 28
tests/sim/sim_board/api_rt/api_rt_cap.c

@@ -3,42 +3,47 @@
 #include "api_rt_dbg.h"
 #include "board.h"
 
-ApiRtCap_Handle Caps[1];
+ApiRtCap_Handle Caps[2];
 
 void iRtCap_Init()
 {
-    Caps[0].CapBase                 = &inputCap;
-    Caps[0].CapBase->Base.Prescaler = 1;
+    Caps[0].CapBase                 = &cadenceCap;
+    Caps[0].CapBase->Base.Prescaler = 100;
+
+    Caps[1].CapBase                 = &bikeSpdCap;
+    Caps[1].CapBase->Base.Prescaler = 100;
+
 }
+      
 
 uint32_t iCap_GetClock(uint8_t devIndex)
 {
-    return HW_CAP_TIM_HZ;
+    return HW_TIM_CLOCK_HZ / 100;
 }
 
 void iCap_SetEdgeType(uint8_t devIndex, uint8_t channelIndex, ApiCap_EdgeType edge)
 {
 
-    switch (edge)
-    {
-    case ApiCap_NoneEdge:
-        Caps[devIndex].CapBase->Channel[channelIndex].Enable = 0;
-        break;
-    case ApiCap_RisingEdge:
-        Caps[devIndex].CapBase->Channel[channelIndex].Enable = 1;
-        Caps[devIndex].CapBase->Channel[channelIndex].Edge   = CaptureRisingEdge;
-        break;
-    case ApiCap_FallingEdge:
-        Caps[devIndex].CapBase->Channel[channelIndex].Enable = 1;
-        Caps[devIndex].CapBase->Channel[channelIndex].Edge   = CaptureFallingEdge;
-        break;
-    case ApiCap_BothEdge:
-        Caps[devIndex].CapBase->Channel[channelIndex].Enable = 1;
-        Caps[devIndex].CapBase->Channel[channelIndex].Edge   = CaptureRisingFallingEdge;
-        break;
-    default:
-        break;
-    }
+    // switch (edge)
+    // {
+    // case ApiCap_NoneEdge:
+    //     Caps[devIndex].CapBase->Channel[channelIndex].Enable = 0;
+    //     break;
+    // case ApiCap_RisingEdge:
+    //     Caps[devIndex].CapBase->Channel[channelIndex].Enable = 1;
+    //     Caps[devIndex].CapBase->Channel[channelIndex].Edge   = CaptureRisingEdge;
+    //     break;
+    // case ApiCap_FallingEdge:
+    //     Caps[devIndex].CapBase->Channel[channelIndex].Enable = 1;
+    //     Caps[devIndex].CapBase->Channel[channelIndex].Edge   = CaptureFallingEdge;
+    //     break;
+    // case ApiCap_BothEdge:
+    //     Caps[devIndex].CapBase->Channel[channelIndex].Enable = 1;
+    //     Caps[devIndex].CapBase->Channel[channelIndex].Edge   = CaptureRisingFallingEdge;
+    //     break;
+    // default:
+    //     break;
+    // }
 }
 
 void iCap_Enable(uint8_t devIndex)
@@ -53,17 +58,17 @@ void iCap_Disable(uint8_t devIndex)
 
 void iCap_SetPeriod(uint8_t devIndex, uint32_t prd)
 {
-    Caps[devIndex].CapBase->CountMax = TICK_TRANS2(prd, iCap_GetClock(devIndex));
+    Caps[devIndex].CapBase->CountMax = TICK_TRANS(prd);
 }
 
 uint32_t iCap_GetPeriod(uint8_t devIndex)
 {
-    return INV_TICK_TRANS2(Caps[devIndex].CapBase->CountMax, iCap_GetClock(devIndex));
+    return INV_TICK_TRANS(Caps[devIndex].CapBase->CountMax);
 }
 
 uint32_t iCap_GetCaptureValue(uint8_t devIndex, uint8_t channelIndex)
 {
-    return INV_TICK_TRANS2(Caps[devIndex].CapBase->Channel[channelIndex]._CapturedValue, iCap_GetClock(devIndex));
+    return INV_TICK_TRANS(Caps[devIndex].CapBase->Channel[channelIndex]._CapturedValue);
 }
 
 void iCap_EnableCaptureReset(uint8_t devIndex, uint8_t channelIndex)
@@ -105,5 +110,12 @@ void iCap_DisableChannelInterrupt(uint8_t devIndex, uint8_t channelIndex)
 
 void iCap_BindChannelInterrupt(uint8_t devIndex, uint8_t channelIndex, void (*action)())
 {
-    scheduler.InterruptBind(&scheduler, &Caps[devIndex].CapBase->Base, CaptureInterruptOut1 + channelIndex, action);
+    if(devIndex == 0 && channelIndex == 3)
+    {
+        scheduler.InterruptBind(&scheduler, &Caps[1].CapBase->Base, CaptureInterruptOut1 + channelIndex, action);
+    }
+    else 
+    {
+        scheduler.InterruptBind(&scheduler, &Caps[devIndex].CapBase->Base, CaptureInterruptOut1 + channelIndex, action);
+    }
 }

+ 3 - 1
tests/sim/sim_board/api_rt/api_rt_cap.h

@@ -12,9 +12,11 @@ extern "C" {
 typedef struct
 {
     struct Sim_Capture *CapBase;
+    ApiRt_Interrupt CountMaxISR;
+    ApiRt_Interrupt ChannelISR[4];
 } ApiRtCap_Handle;
 
-extern ApiRtCap_Handle Caps[1];
+extern ApiRtCap_Handle Caps[2];
 
 void iRtCap_Init();
 

+ 1 - 1
tests/sim/sim_board/api_rt/api_rt_gpio.c

@@ -14,7 +14,7 @@ void iRtGpioLow_Init()
     Gpios[3].GpioBase = &ledPin;
     Gpios[4].GpioBase = &ledPin;
     Gpios[5].GpioBase = &ledPin;
-    Gpios[6].GpioBase = &ledPin;
+    Gpios[6].GpioBase = &bikeBrakePin;
     Gpios[7].GpioBase = &ledPin;
     Gpios[8].GpioBase = &ledPin;
     Gpios[9].GpioBase = &ledPin;

+ 1 - 1
tests/sim/sim_board/include/board.h

@@ -1,7 +1,7 @@
 #pragma once
 
 #define TICK_TRANS(X)     ((X) / BoardSampleTimeFactor)
-#define INV_TICK_TRANS(X) ((X)*BoardSampleTimeFactor)
+#define INV_TICK_TRANS(X) ((X) * BoardSampleTimeFactor)
 
 #define TICK_TRANS2(X, CLOCK)     ((long)((X) / ((CLOCK) / BoardSampleRate)))
 #define INV_TICK_TRANS2(X, CLOCK) ((long)((X) * ((CLOCK) / BoardSampleRate)))

+ 3 - 1
tests/sim/sim_board/include/mcu_instance.h

@@ -9,6 +9,7 @@ extern struct Sim_Adc       adc3;
 extern struct Sim_Gpio      ledPin;
 extern struct Sim_Gpio      capPin;
 extern struct Sim_Gpio      breakPin;
+extern struct Sim_Gpio      bikeBrakePin;
 extern struct Sim_Timer     sysTick;
 extern struct Sim_Timer     tbsTick;
 extern struct Sim_Timer     tbcHalfUpdateTick;
@@ -16,4 +17,5 @@ extern struct Sim_Timer     event1MsTick;
 extern struct Sim_Timer     sampleTrigTimer;
 extern struct Sim_Timer     sampleTrigTimer2;
 extern struct Sim_DMA       pwmLoadDma;
-extern struct Sim_Capture   inputCap;
+extern struct Sim_Capture   cadenceCap;
+extern struct Sim_Capture   bikeSpdCap;

+ 1 - 1
tests/sim/sim_board/peripheral

@@ -1 +1 @@
-Subproject commit ea3b4bc25355340267fde8c7f9a5878a426f06b2
+Subproject commit 1f1c65651a75b403083175704ddc47e4b3fcef25

+ 21 - 11
tests/sim/sim_board/source/board.c

@@ -36,6 +36,7 @@ void BoardInit(double ts)
     Sim_GpioInit(&ledPin);
     Sim_GpioInit(&capPin);
     Sim_GpioInit(&breakPin);
+    Sim_GpioInit(&bikeBrakePin);
     Sim_TimerInit(&sysTick);
     Sim_TimerInit(&tbsTick);
     Sim_TimerInit(&tbcHalfUpdateTick);
@@ -43,7 +44,8 @@ void BoardInit(double ts)
     Sim_TimerInit(&sampleTrigTimer);
     Sim_TimerInit(&sampleTrigTimer2);
     Sim_DMAInit(&pwmLoadDma);
-    Sim_CaptureInit(&inputCap);
+    Sim_CaptureInit(&cadenceCap);
+    Sim_CaptureInit(&bikeSpdCap);
     /* 调度器外设注册 */
     scheduler.Register(&scheduler, &pwm.Base);
     scheduler.Register(&scheduler, &adc.Base);
@@ -52,6 +54,7 @@ void BoardInit(double ts)
     scheduler.Register(&scheduler, &ledPin.Base);
     scheduler.Register(&scheduler, &capPin.Base);
     scheduler.Register(&scheduler, &breakPin.Base);
+    scheduler.Register(&scheduler, &bikeBrakePin.Base);
     scheduler.Register(&scheduler, &sysTick.Base);
     scheduler.Register(&scheduler, &tbsTick.Base);
     scheduler.Register(&scheduler, &tbcHalfUpdateTick.Base);
@@ -59,7 +62,8 @@ void BoardInit(double ts)
     scheduler.Register(&scheduler, &sampleTrigTimer.Base);
     scheduler.Register(&scheduler, &sampleTrigTimer2.Base);
     scheduler.Register(&scheduler, &pwmLoadDma.Base);
-    scheduler.Register(&scheduler, &inputCap.Base);
+    scheduler.Register(&scheduler, &cadenceCap.Base);
+    scheduler.Register(&scheduler, &bikeSpdCap.Base);
     /* Pwm配置 */
     pwm.CntMode             = SIM_PWM_UP_DOWN;
     pwm.PwmMode             = SIM_PWM_PWMMODE2;
@@ -92,6 +96,9 @@ void BoardInit(double ts)
     breakPin.EdgeType = GpioRisingEdge;
     scheduler.TriggerBind(&scheduler, &breakPin.Base, GpioMainTrigger, &pwm.Base, PwmTriggerInBreak);
 
+    /* Bike Brake IO配置 */
+    bikeBrakePin.Mode     = GPIO_MODE_IN;
+
     /* 采样触发定时器配置 */
     sampleTrigTimer.CountMode            = TimerCenterAlignedMode1;
     sampleTrigTimer.CountDir             = TimerCountUp;
@@ -148,15 +155,18 @@ void BoardInit(double ts)
     //scheduler.InterruptBind(&scheduler, &sysTick.Base, TimerInterruptOutUIF, SystickIsr);
 
     /* Capture配置 */
-    inputCap.CountMax                   = TICK_TRANS(HW_TIM_CLOCK_HZ / 100 / HW_CAP_TIM_HZ);
-    inputCap.CounterInterruptEnable     = 1;
-    inputCap.Channel[2].Edge            = CaptureRisingFallingEdge;
-    inputCap.Channel[2].Enable          = 1;
-    inputCap.Channel[2].InterruptEnable = 1;
-    inputCap.Channel[3].Edge            = CaptureRisingEdge;
-    inputCap.Channel[3].Enable          = 1;
-    inputCap.Channel[3].InterruptEnable = 1;
-    //scheduler.InterruptBind(&scheduler, &inputCap.Base, CaptureInterruptOut1, CaptureIsr);
+    cadenceCap.CountMax                   = TICK_TRANS(HW_TIM_CLOCK_HZ / 100 / HW_CAP_TIM_HZ);
+    cadenceCap.CounterInterruptEnable     = 1;
+    cadenceCap.Channel[2].Edge            = CaptureRisingFallingEdge;
+    cadenceCap.Channel[2].Enable          = 1;
+    cadenceCap.Channel[2].InterruptEnable = 1;
+    
+    bikeSpdCap.CountMax                   = TICK_TRANS(HW_TIM_CLOCK_HZ / 100 / HW_CAP_TIM_HZ);
+    bikeSpdCap.CounterInterruptEnable     = 1;
+    bikeSpdCap.Channel[3].Edge            = CaptureRisingEdge;
+    bikeSpdCap.Channel[3].Enable          = 1;
+    bikeSpdCap.Channel[3].InterruptEnable = 1;
+    //scheduler.InterruptBind(&scheduler, &bikeSpdCap.Base, CaptureInterruptOut1, CaptureIsr);
 
     scheduler.AppTimeSlice.Add(&scheduler.AppTimeSlice, 1, 1, 0, BackgroundTask);
 

+ 3 - 1
tests/sim/sim_board/source/mcu_instance.c

@@ -8,6 +8,7 @@ struct Sim_Adc       adc3;
 struct Sim_Gpio      ledPin;
 struct Sim_Gpio      capPin;
 struct Sim_Gpio      breakPin;
+struct Sim_Gpio      bikeBrakePin;
 struct Sim_Timer     sysTick;
 struct Sim_Timer     tbsTick;
 struct Sim_Timer     tbcHalfUpdateTick;
@@ -15,4 +16,5 @@ struct Sim_Timer     event1MsTick;
 struct Sim_Timer     sampleTrigTimer;
 struct Sim_Timer     sampleTrigTimer2;
 struct Sim_DMA       pwmLoadDma;
-struct Sim_Capture   inputCap;
+struct Sim_Capture   cadenceCap;
+struct Sim_Capture   bikeSpdCap;

+ 8 - 4
tests/sim/sim_board/source/sfun_wrapper.c

@@ -16,9 +16,9 @@ void McuRun(const double *ain, const int32_t *din, const injection_dtype *ctrl,
     adc.ChannelInput[2] = 0;      // 5V
     adc.ChannelInput[3] = 1.5;    // PCB温度
     adc.ChannelInput[4] = 1.5;    // 电机温度
-    adc.ChannelInput[4] = 0;      // 12V
-    adc.ChannelInput[4] = 0;      // 转把
-    adc.ChannelInput[4] = 1.5;    // 力矩传感器
+    adc.ChannelInput[5] = 0;      // 12V
+    adc.ChannelInput[6] = 0;      // 转把
+    adc.ChannelInput[7] = ain[9];    // 力矩传感器
 
     adc2.ChannelInput[0] = ain[4];              // A相电流
     adc2.ChannelInput[1] = ain[3];              // B相电流
@@ -37,8 +37,12 @@ void McuRun(const double *ain, const int32_t *din, const injection_dtype *ctrl,
 
     /* Cap 输入 */
     capPin.IOIn = din[1];
-    inputCap.PWMIn = din[1];
+    cadenceCap.PWMIn = din[2];
+    bikeSpdCap.PWMIn = din[3];
 
+    /* BikeBrake 输入 */
+    bikeBrakePin.IOIn = din[4];
+    
     /* 注入变量 */
     for (int i = 0; i < 8; i++)
     {