This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
因此、我有用于为电机创建2个 PWM 输出的代码、然后我有用于3个(将是7个) ADC 引脚的代码、这些引脚用于声纳传感器。 我已经为 ADC 设置了用于中断的比较器。 仅当我测试这些时、它们就能正常工作... PWM 可以通过按钮中断进行更改、然后运行电机。 ADC 引脚显示值并相应地通过 ISR 中断以点亮 LED。 现在我尝试将这两者结合起来、我希望 ADC ISR 能够更改 PWM 占空比并输出新值、 但是、当我测试代码时、ADC ISR 对 PWM 完全没有影响、它会更改我可以通过 CCS 界面上的"Expressions"看到的占空比值、 但物理输出不会改变、我想知道我为什么需要做什么。 以下是我的代码:
/* DriverLib 包括*/ #include /*标准包括*/ #include #include /* for usleep()*//#include //#include /* TI-RTOS 头文件*/ #include //#include /*电路板头文件*/ //#include "Board.h" //*静态*/ uint16_t resultsBuffer[3];//缓冲器以保存每个声纳传感器的 ADC 读数 // DLUG 部分:2.6.2.25 |注册 ADC 中断的中断处理程序。 // void ADC14_registerInterrupt (void (* ADC14_IRQHandler)(void)); void PWMConfigure (void);//设置 PWM void ADCConfigure (void);//设置 ADC void InitDCO (void);//更改 DCO Sonarive (void)的运行频率; SonarTwo (void); void (void (void );void (void);void (void);void (void);void (void (void);void (void) void SonarSix (void); void SonarSeven (void); void 应急停止(void); volatile uint32_t ii; /******** 右侧电机的 Timer_A PWM 配置参数***** *按住命令并单击 Timer_A_PWMConfig 以查看 pwmConfigR 是 typedef 结构_Timer_A_PWMConfig *S1用于右侧电机*/ Timer_A_PWMConfig pwmConfigR = { Timer_A_CLOCKSOURCE_SMCLK、// PWM 运行时钟源 Timer_A_CLOCKSOURCE_DEVIDER_1、//时钟源 SMCLK 的分频器 4800、//周期 Timer_A_CAPTURECOMPARE 寄存器3、 Timer_A_OUTPUTMODE_RESET_SET、 4200//启动时占空比为5[V](2.5[V])的50%、因此电机不会移动。 }; /******** 左侧电机的 Timer_A PWM 配置参数***** *S2用于左侧电机*/ Timer_A_PWMConfig pwmConfigL = { Timer_A_CLOCKSOURCE_SMCLK、 Timer_A_CLOCKSOURCE_divider _1、 4800、 Timer_A_CAPTURECOMPARE 寄存器_4、//使 P2.7正常工作是因为 TA0.4 Timer_A_OUTPUTMODE_RESET_SET、 4200 }; /********* 两个电机的结束定时器_A_PWMConfig *电机以方向和速度为一个输入。 51-100%占空比是正向速度(5[V]最大值、 *更高占空比是更快的正向速度)、0-49%占空比是反向速度(0[V]最大值、较低占空 比*周期是更快的反向速度)、50%是无运动(2.5[V])。 * *我们希望使用大约一半的每个方向占空比、因为我们不想快速运行。 每个方向 *具有2400级速度。 每种模式的一半是1、200级速度。 正向可以具有 * 2、401-4、800的占空比、而反向可以具有0 - 2、399的占空比。 我们将使用前向:2、401-3、600和 *后向:1、200 - 2、399 */ ********* 启动 main******** / int main (void) { /*停止 WDT */ MAP_WDT_A_HOLDTimer(); PWMConfigure();//设置 PWM ADCConfigure();//设置 ADC MAP_Interrupt_enableSlepOnIsrExit(); /*正在休眠*/ while (1) { //SonarThree();//当物体在1-2英尺之间时,右侧绿灯亮起。 MAP_PCM_gotoLPM0 ();//sleep while no interrupts are ocrupting. } }//end main /********* 结束 main******** / /********* 启动 sonars ******** / void SonarOne (void){//P5.2 & resultsBuffer[0] MAP_GPIO_setOutputHighOnPin (GPIO_PORT_P1、GPIO_PIN0);//LED1 (左侧)红色 MAP_GPIO_setOutputLowOnPin (GPIO_PORT_P2、GPIO_PIN1); MAP_GPIO_setOutputLowOnPin (GPIO_PORT_P2、GPIO_PIN0); pwmConfigL.dutyCycle = 0; pwmConfigR.dutyCycle = 0; } void SonarTwo (void){//P5.1 & resultsBuffer[1] MAP_GPIO_setOutputHighOnPin (GPIO_PORT_P2、GPIO_PIN0);//LED2 (右侧)红色 MAP_GPIO_setOutputLowOnPin (GPIO_PORT_P1、GPIO_PIN0); MAP_GPIO_setOutputLowOnPin (GPIO_PORT_P2、GPIO_PIN1); pwmConfigL.dutyCycle = 4800; pwmConfigR.dutyCycle = 4800; } void SonarThree (void){//P5.0 & resultsBuffer[2] MAP_GPIO_setOutputHighOnPin (GPIO_PORT_P2、GPIO_PIN1);//LED2 (右侧)绿色 MAP_GPIO_setOutputLowOnPin (GPIO_PORT_P1、GPIO_PIN0); MAP_GPIO_setOutputLowOnPin (GPIO_PORT_P2、GPIO_PIN0); // pwmConfigL.dutyCycle = 4800; // pwmConfigR.dutyCycle = 4800; // map_Timer_A_generatePWM (timer_A0_BASE、&pwmConfigL); // map_Timer_A generatePWM (timer_pwmConfigL) ;// map_r_generatePWM (timer_pw_r_pw_r_generateA0) void SonarFour (void){//P4.7 & FODSBuffer[3] } void SonarFive (void){//P4.0 & resultsBuffer[4] } void SonarSix (void){//P6.1 & resultsBuffer[5] } void SonarSeven (void){/P6.0 & resultsBuffer[6] } 结束语音音标 / /********* 启动 ADC 处理程序******** // //*只要 Sonar Reading 是比较器所说的内容并且 MAP_ADC14_enableInterrupt (X)所说的内容,就会触发此中断。 */ void ADC14_IRQHandler (void) { uint64_t status; STATUS = MAP_ADC14_getEncableInterruptStatus ();//获取中断状态以进行比较 MAP_ADC14_clearInterruptFlag (status);//清除中断标志以进行下一次中断检查 resultsBuffer[0]= MAP_ADC14_getResult (ADC_MEM0);//P5.0 resultsBuffer[1]= MAP_ADC14_getResult (ADC_MEM1);//P5.1 resultsBuffer[2]= MAP_ADC14_getResult (ADC_MEM2);//P4.7 如果((resultsBuffer[0]< 1000)){//LED 1 on when objects are close (红色)(对象关闭时亮起) SonarOne();//当物体接近1英尺 时,红色灯亮起。} 否则 if ((resultsBuffer[1]< 1000)){ SonarTwo ();//物体超过2英尺时,右侧红色灯亮起。 } 否则{ SonarThree();//当物体在1-2英尺之间时,右侧绿色灯亮起 。} MAP_Timer_A_generatePWM (TIMER_A0_BASE、&pwmConfigL); MAP_Timer_A_generatePWM (TIMER_A0_BASE、&pwmConfigR); }//结束 ADC14_IRQHandler /********* 结束 ADC 处理程序******** / /********* 启动端口1处理程序******** / /* Port1 ISR -此 ISR 将逐步升高 PWM 的占空比 *在按钮上按*/ void Port1_IRQHandler (void) { uint32_t status = MAP_GPIO_getenabledInterruptStatus (GPIO_PORT_P1);//P1.1 (S1) MAP_GPIO_clearInterruptFlag (GPIO_PORT_P1、状态); /* Imagine 状态获得所有端口1中断状态、因此如果引脚1有中断 *状态将为00000010、对于引脚4、它将为00010000、因此如果我们使用状态 *引脚1或引脚4、如果这些中断位为高电平、则该位将为 true、并且为 if *语句将运行。*/ IF (STATUS & GPIO_PIN1)//P1.1 (S1) {//将电机占空比向前移动(增加它) if (pwmConfigL.dutyCycle = 4800 && pwmConfigR.dutyCycle = 4800){ pwmConfigL.dutyCycle = 4800; pwmConfigR.dutyCycle = 4800;} 否则{ pwmConfigL.dutyCycle += 300; pwmConfigR.dutyCycle += 300;} MAP_Timer_A_generatePWM (TIMER_A0_BASE、&pwmConfigL); MAP_Timer_A_generatePWM (TIMER_A0_BASE、&pwmConfigR); } else //(status & GPIO_PIN4)//P1.4 (S2) {//向后移动电机占空比(减小它) if (pwmConfigL.dutyCycle = 2400 && pwmConfigR.dutyCycle = 2400){ pwmConfigL.dutyCycle = 2400; pwmConfigR.dutyCycle = 2400;} 否则{ pwmConfigL.dutyCycle -= 300; pwmConfigR.dutyCycle -= 300;} MAP_Timer_A_generatePWM (TIMER_A0_BASE、&pwmConfigL); MAP_Timer_A_generatePWM (TIMER_A0_BASE、&pwmConfigR); } }//end Port1_IRQHandler /***** 结束端口1处理程序******** / /********* 启动 PWM 配置'******** / void PWMConfigure(){ InitDCO ();//将时钟频率更改为48[MHz] /* DLUG 部分:6.6.2.18 |初始化 SMCLK 至 DCOCLK 频率除以1*/ MAP_CS_initClockSignal (CS_SMCLK、CS_DCOCLK_SELECT、CS_CLOCK_DIVIDER_1); /*将 GPIO2.7配置为右侧电机 PWM 的外设输出和 *为左侧电机配置 GPIO2.6作为 PWM 的外设输出、为按钮中断配置 P1.1 */ MAP_GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_P2、GPIO_PIN7、GPIO_PRIMARY_MODULE_Function);//P2.7 (右侧电机) MAP_GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_P2、GPIO_PIN6、GPIO_PRIMARY_MODULE_Function);//P2.6 (左侧电机) MAP_GPIO_setAsInputPinWithPullUpResistor (GPIO_PORT_P1、GPIO_PIN1);//设置端口1上的引脚1 MAP_GPIO_setAsInputPinWithPullUpResistor (GPIO_PORT_P1、GPIO_PIN4);//设置端口1上的引脚4 MAP_GPIO_clearInterruptFlag (GPIO_PORT_P1、GPIO_PIN1); MAP_GPIO_clearInterruptFlag (GPIO_PORT_P1、GPIO_PIN4); MAP_GPIO_enableInterrupt (GPIO_PORT_P1、GPIO_PIN1); MAP_GPIO_enableInterrupt (GPIO_PORT_P1、GPIO_PIN4); INTERRUPT_setPriority (INT_PORT1、0); /* DLUG 部分:12.4.2.4 |在端口1上为按钮启用中断*/ MAP_Interrupt_enableInterrupt (INT_Port1); /* DLUG 部分:24.2.11 |生成计时器在向上计数模式下运行的 PWM。 时钟设置为48[MHz]、 即0.0208333[us][微秒](2.08s*10^-8)。 每个计时器的设置周期为4、800 *周期、因此周期为0.0001[s]、频率为1/.0001 = 10[kHz]*/ MAP_Timer_A_generatePWM (TIMER_A0_BASE、&pwmConfigR); MAP_Timer_A_generatePWM (TIMER_A0_BASE、&pwmConfigL); }//结束 PWMConfigure /********* 结束 PWM 配置'******** / /********* 启动 ADC 配置******** / void ADCConfigure(){ /*设置时钟 * MCLK = MCLK = 3MHz * ACLK = REFO = 32kHz */ MAP_CS_initClockSignal (CS_ACLK、CS_REFOCLK_SELECT、CS_CLOCK_DELUGER_1); /*初始化 ADC (MCLK/1/1)*/ MAP_ADC14_enableModule(); MAP_ADC14_initModule (ADC_CLOCKSOURCE_MCLK、ADC_PREDIVIDER_1、ADC_DIVIDER_1、0); /*在端口4引脚0和7上配置 GPIO 以实现第三功能和输入、 *端口5引脚0、1和2以及端口6引脚0和1 * MAP_GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P5、GPIO_PIN0 | GPIO_PIN1、GPIO_TIVE_MODULE_Function); MAP_GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P4、GPIO_PIN7、GPIO_TIVE_MODULE_Function); /*将板载 LED1和 LED2设置为输出并将其初始化为低电平*/ MAP_GPIO_setAsOutputPin (GPIO_PORT_P1、GPIO_PIN0); MAP_GPIO_setOutputLowOnPin (GPIO_PORT_P1、GPIO_PIN0);//LED1 (左侧和红色) MAP_GPIO_setAsOutputPin (GPIO_PORT_P2、GPIO_PIN1); MAP_GPIO_setOutputLowOnPin (GPIO_PORT_P2、GPIO_PIN1);//LED2 (右侧和绿色) MAP_GPIO_setAsOutputPin (GPIO_PORT_P2、GPIO_PIN0); MAP_GPIO_setOutputLowOnPin (GPIO_PORT_P2、GPIO_PIN0);//LED2 (右侧和蓝色) MAP_GPIO_setAsOutputPin (GPIO_PORT_P2、GPIO_PIN2); MAP_GPIO_setOutputLowOnPin (GPIO_PORT_P2、GPIO_PIN2);//LED2 (右侧和红色) /* DLUG 部分:2.6.2.3 |配置 ADC 存储器(ADC_MEM0 - ADC_MEM6 (A6 - A12)、不再重复) *使用内部3.3[V]基准*/ MAP_ADC14_configureMultiSequenceMode (ADC_MEM0、ADC_MEM2、TRUE); /* DLUG 部分:2.6.2.2 |为每个 ADC 模块配置单独的存储器位置。 *(内存位置、电压基准类型、所使用的通道 * ADC 采样、非差分输入为 false)*/ //ADC_VREFPOS_INTBUF_VREFNEG_VSS (提供2.5[V]基准电压) MAP_ADC14_configureConversionMemory (ADC_MEM0、 ADC_VREFPOS_AVCC_VREFNEG_VSS、ADC_INPUT_A5、false);//ADC5 = P5.0 = MEM0 MAP_ADC14_configureConversionMemory (ADC_MEM1、 ADC_VREFPOS_AVCC_VREFNEG_VSS、ADC_INPUT_A4、false);//ADC4 = P5.1 = MEM1 MAP_ADC14_configureConversionMemory (ADC_MEM2、 ADC_VREFPOS_AVCC_VREFNEG_VSS、ADC_INPUT_A6、false);//ADC6 = P4.7 = MEM2 /* DLUG 部分:2.6.2.16 |将采样定时器设置为自动单步执行序列转换 *一个采样/转换完成后,ADC 模块将自动继续到下一个采样。*/ MAP_ADC14_enableSampleTimer (ADC_AUTOMATE_DIOTIVation); /*DLUG 部分:2.6.2.11 |启用指定的内存通道掩码以使用指定的比较器窗口。 。 ADCC 模块有两个不同的比较器窗口、可通过此功能进行设置。*/ ADC14_enableComparatorWindow (ADC_MEM0 | ADC_MEM2、 ADC_COMP_WINDOW0); ADC14_enableComparatorWindow (ADC_MEM1、 ADC_COMP_WINDOW1); /* DLUG 部分:2.6.2.26 |设置指定窗口比较器的下限和上限。 *(窗口0或窗口1、下限、上限)*/ ADC14_setComparatorWindowValue (ADC_COMP_WINDOW0、600、2000); /* DLUG 部分:2.6.2.13 |当通道降至比较器阈值以下时启用中断、 *如果使用 ADC_HI_INT 在通道高于比较器或的阈值时启用中断 *当通道处于超薄阈值时、ADC_IN_INT 启用中断通道* MAP_ADC14_enableInterrupt (ADC_LO_INT); ADC14_setComparatorWindowValue (ADC_COMP_WINDOW1、1500、2000); MAP_ADC14_enableInterrupt (ADC_LO_INT); /* DLUG 部分:12.4.2.4 - 12.4.2.5 |启用中断*/ MAP_Interrupt_enableInterrupt (INT_ADC14); INTERRUPT_setPriority (INT_ADC14、1); MAP_Interrupt_enableMaster(); /* DLUG 部分:2.6.2.12和2.6.2.32|启用 ADC 数据转换。 触发采样开始。 *通过切换触发软件位来切换 ADC 模块转换的触发器。*/ MAP_ADC14_enableConversion(); MAP_ADC14_toggleConversionTrigger (); }//end ADCConfigure /********* 结束 ADC 配置******** / /********* 启动 DCO 初始化******** /void InitDCO (){ /* DLUG 部分:9.3.2.4 |启用浮点单元。 * FPU_enableModule(); /* DLUG 部分:14.7.2.16 |设置内核电压电平(Vcore)。 函数将会 *注意在内核电压电平之间切换所需的所有电源状态转换。 *在开始之前、我们必须将 VCORE 更改为1以支持48MHz 频率*/ PCM_setCoreVoltageLevel (PCM_AM_LDO_VCORE1); /* DLUG 部分:8.4.2.22 |更改闪存使用的等待状态数 用于读取操作的*控制器。 当改变时钟的频率范围时、这就是 必须使用*函数才能支持可读闪存。*/ FlashCtl_setWaitState (FLASH_BANK0、1); FlashCtl_setWaitState (FLASH_BANK1、1); /* DLUG 部分:6.6.2.21 |将 DCO 工作的中心频率设置为[32MHz 至64MHz]。 * MAP_CS_setDCOCenteredFrequency (CS_DCO_FREQUENCY 48); /* DLUG 部分:9.3.2.1 |禁用浮点单元。 * FPU_disableModule (); }//end InitDCO /***** 结束 DCO 初始化代码 /
Chris、
谢谢。 我已经说过了,我想我没有评论,有一些原因。 现在发生的情况是、传感器将触发中断并相应地更改占空比、但物理 PWM 直到停止感应、才会发生变化。 例如、如果我将手放在第一个 ADC 前面、它将中断并更改占空比、但物理输出不会改变。 一旦我从传感器前面拔下手、它将更改物理 PWM 输出。 这是否也与频率有关、或者是否有我应该做的特定事情来确保 PWM 在中断内部重新配置?
谢谢
再次感谢 Bruce!
我能够找到一个使用 CaptureCompare 生成2个 PWM 的示例、我只需在 ADC 中断中插入 Timer_A_setCompareValue、它就会随着传感器读数的变化而改变占空比!
示例程序:TIMER_A_updown_COMPARE_MULTIL_PWM.c
我有最后一个问题、然后您可以将其标记为已解决!
在我以4800周期执行 PWM 之前、数字越高、PWM 在占空比的高电平部分上的时间就越长。
使用该 setCompareValue、我的数字似乎越高、我的 PWM 在占空比的低电平部分上的时间就越长。
例如、如果我执行以下操作:MAP_Timer_A_setCompareValue (timer_A0_BASE、timer_A_CAPTUREACMPARE 寄存器3、4800);
我的 PWM 输出为0[V]、如果我执行0而不是4800、那么我将接收到我的最大 PWM 输出(大约2.9[V])。
我是否有一种方法可以反转这些代码的工作方式、以帮助简化我对代码的看法。
/* DriverLib 包括*/ #include void InitDCO (void);//更改 DCO 的工作频率 //应用定义*/ #define TIMER_PERIOD 4800 #define Duty_Cycl1 4200 #define Duty_CYCLE2 4200 // Timer_A UpDown Configuration 参数*/ const Timer_A_UpDownModeConfig upDownConfig = { Timer_A_CLOCKSOURCE_SMCLK、 // SMCLK 时钟源 Timer_A_CLOCKSOURCE_divider _1、 // Timer_Period、 // Timer_A_TAIE_INTERRUPT_DISABLE、 //禁用计时器中断 Timer_A_CCIE_CCR0_INTERRUPT_DISABLE、//禁用 CCR0中断 Timer_A_do 清除 //清除值 }; // Timer_A 比较配置参数(PWM1)*/ const Timer_A_CompareModeConfig compareConfig_PWM1 = { Timer_A_CAPTURECOMPARE 寄存器3、 //使用 CCR1 Timer_A_CAPTURECMOLE_INTERRUPT_DISABLE、//禁用 CCR 中断 Timer_A_OUTPUTMODE_TOGGLE_SET、 //切换输出但是 Duty_Cyclle1 // }; // Timer_A 比较配置参数(PWM2)*/ const Timer_A_CompareModeConfig compareConfig_PWM2 = { Timer_A_CAPTURECOMPARE 寄存器4、 //使用 CCR2 Timer_A_CAPTURECMOLE_INTERRUPT_DISABLE、//禁用 CCR 中断 Timer_A_OUTPUTMODE_TOGGLE_SET、 //切换输出但是 Duty_CYCLE2 // }; int main (void) { /*停止 WDT */ MAP_WDT_A_HOLDTimer(); InitDCO ();//将时钟频率更改为48[MHz] /* DLUG 部分:6.6.2.18 |初始化 SMCLK 至 DCOCLK 频率除以1*/ MAP_CS_initClockSignal (CS_SMCLK、CS_DCOCLK_SELECT、CS_CLOCK_DIVIDER_1); /*将 GPIO2.7配置为右侧电机 PWM 的外设输出和 *为左侧电机配置 GPIO2.6作为 PWM 的外设输出、为按钮中断配置 P1.1 */ MAP_GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_P2、GPIO_PIN7、GPIO_PRIMARY_MODULE_Function);//P2.7 (右侧电机) MAP_GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_P2、GPIO_PIN6、GPIO_PRIMARY_MODULE_Function);//P2.6 (左侧电机) /*将 Timer_A1配置为上行模式并启动*/ MAP_Timer_A_configureUpDownMode (timer_A0_BASE、&upDownConfig); MAP_Timer_A_startCounter (TIMER_A0_BASE、TIMER_A_updown_MODE); /*初始化比较寄存器以生成 PWM1 */ MAP_Timer_A_initCompare (timer_A0_BASE、&compareConfig_PWM1); /*初始化比较寄存器以生成 PWM2 */ MAP_Timer_A_initCompare (timer_A0_BASE、&compareConfig_PWM2); /*不使用时睡眠*/ while (1) { MAP_Timer_A_setCompareValue (TIMER_A0_BASE、TIMER_A_CAPTURECOMPARE 寄存器_3、4800);//2.6 (S1) MAP_PCM_gotoLPM0 (); } } /********* 启动 DCO 初始化******** /void InitDCO (){ /* DLUG 部分:9.3.2.4 |启用浮点单元。 * FPU_enableModule(); /* DLUG 部分:14.7.2.16 |设置内核电压电平(Vcore)。 函数将会 *注意在内核电压电平之间切换所需的所有电源状态转换。 *在开始之前、我们必须将 VCORE 更改为1以支持48MHz 频率*/ PCM_setCoreVoltageLevel (PCM_AM_LDO_VCORE1); /* DLUG 部分:8.4.2.22 |更改闪存使用的等待状态数 用于读取操作的*控制器。 当改变时钟的频率范围时、这就是 必须使用*函数才能支持可读闪存。*/ FlashCtl_setWaitState (FLASH_BANK0、1); FlashCtl_setWaitState (FLASH_BANK1、1); /* DLUG 部分:6.6.2.21 |将 DCO 工作的中心频率设置为[32MHz 至64MHz]。 * MAP_CS_setDCOCenteredFrequency (CS_DCO_FREQUENCY 48); /* DLUG 部分:9.3.2.1 |禁用浮点单元。 * FPU_disableModule (); }//end InitDCO /***** 结束 DCO 初始化代码 /
嗯、似乎使用该方法仍然会导致"向后"占空比、并且还会将我的输出减少一半(我的最大输出为1.4[V]而不是2.8[V])。 我探讨了其他方案并发现了这一点
> TIMER_A_OUTPUTMODE_TOGGLE_RESET、
提供正确的占空比和振幅。 我注意到有一件事会与该捕获比较 PWM 相混淆。 我使用48[MHz]的时钟源并使用4、800个周期、我假设周期为之前的10[kHz]、但我的每个 PWM 都以5[kHz]的频率运行。 当我执行2、400个周期时、它们都以10[kHz]运行。 是否应该发生这种情况、因为我正在运行这两个计时器的同一个 Timer_A_UpDownModeConfig? 我是否应该通过自己的计时器设置来运行它们?
感谢您的快速回答!