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

问题描述 投票:0回答:1

我正在使用下面的代码尝试在打开灯时实现强度过渡效果:

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 秒(

osDelay(100)
有意义),然后输出 100% 占空比 PWM,没有过渡效果。

我记得在没有 RTOS 环境的情况下使用这段代码效果很好。我考虑过优先级问题,但是当我将

DutyCycle
更改为任何
int
并省略
DutyCycle
时,它会立即输出相应的 PWM。

我还调试了

DutyCycle
,它在运行时的增量也是正确的。 是HAL问题吗?

stm32 freertos rtos pwm cmsis
1个回答
0
投票

对啊,毕竟是选角问题。

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

__HAL_TIM_SET_COMPARE(htim, Channel, (uint32_t)(COUNTER_PERIOD * (float)intensity_percentage/100));
© www.soinside.com 2019 - 2024. All rights reserved.