STM32在RTOS中动态更改PWM占空比

STM32 change PWM Duty Cycle dynamically in RTOS

提问人:Travis Su 提问时间:11/16/2023 更新时间:11/16/2023 访问量:24

问:

我在下面使用这段代码,试图在打开灯时实现强度过渡效果:

void output2ControlTask(void *argument)
{
  /* USER CODE BEGIN output2ControlTask */
  uint32_t DutyCycle = 0;
  /* Infinite loop */
  for(;;)
  {
    if(flag_EN_OUTPUT2 == ON){
      SteadyBurn_PWM_RTOS(&htim2, TIM_CHANNEL_3, DutyCycle);
      if(DutyCycle < 100){
        DutyCycle++;
      }
    }
    if(flag_EN_OUTPUT2 == OFF){
      SteadyBurn_PWM_RTOS(&htim2, TIM_CHANNEL_3, DutyCycle);
      if(DutyCycle > 0){
        DutyCycle--;
      }
    }
    osDelay(100);
  }
  /* USER CODE END output2ControlTask */
}
void SteadyBurn_PWM_RTOS(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t intensity_percentage){
    __HAL_TIM_SET_COMPARE(htim, Channel, (uint32_t)(COUNTER_PERIOD * (float)(intensity_percentage/100)));
}

不知何故,当使用示波器观察时,输出延迟了大约 10 秒(有意义),然后输出 100% 占空比 PWM,没有转换效应。osDelay(100)

我记得在没有 RTOS 环境中使用此代码工作正常。我考虑过优先级问题,但是当我更改为任何并省略它时,它会立即输出相应的PWM。DutyCycleintDutyCycle

我还调试了它,它在运行时也以正确的增量进行。 是 HAL 问题吗?DutyCycle

STM32 FreeRTOS 实时操作系统 PWM CMSIS

评论

0赞 pmacfarlane 11/16/2023
“changed DutyCycle to any int and left out the DutyCycle” 是什么意思?
0赞 pmacfarlane 11/16/2023
先更改变量,然后调用不是更有意义吗?你可以倒着做 - 你设置当前占空比,修改变量,然后延迟。DutyCycleSteadyBurn_PWM_RTOS()
0赞 Travis Su 11/16/2023
@pmacfarlane会起作用的。不涉及变量。我的意思是向后做是有道理的,但 HAL 函数仍然不会接受它SteadyBurn_PWM_RTOS(&htim2, TIM_CHANNEL_3, 100);DutyCycle

答:

0赞 Travis Su 11/16/2023 #1

是的,这毕竟是一个选角问题。

删除了数学函数上的一对括号,它可以工作。

__HAL_TIM_SET_COMPARE(htim, Channel, (uint32_t)(COUNTER_PERIOD * (float)intensity_percentage/100));