68336016 发表于 2024-4-17 23:00:21

STM32F4的HAL库函数HAL_TIM_PWM_Stop可以让引脚空闲时固定电平?

本帖最后由 68336016 于 2024-4-17 23:44 编辑

stm32f401rct6, TIM3定时器的CH1和CH2两个通道配置为PWM。
我其实需要PWM暂停时候,引脚电平为低电平,现在用HAL_TIM_PWM_Stop函数暂停PWM,用逻辑分析仪反复抓取时序,PWM暂停时候引脚电平是低电平。
目前结果是我想要的,但是之前看过不少文章提到PWM空闲时候引脚电平不确定的问题,还有人说过STM32F407用HAL_TIM_PWM_Stop暂停PWM,引脚电平也不确定。

虽然我现在每次试,PWM暂停时候都是低电平,但是心里好像也不怎么完全确定了。{:lol:}

————————————————————————————————————
补充:电路后面还有光耦反相,我真正要的其实是PWM空闲时候,引脚输出要高电平才行

以下代码反复启停PWM。
    for(;;)
    {
      HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);
      __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 500);
   
      HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2);
      __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, 800);
      

      osDelay(100);
      HAL_TIM_PWM_Stop(&htim3, TIM_CHANNEL_1);
      HAL_TIM_PWM_Stop(&htim3, TIM_CHANNEL_2);

      osDelay(100);
    }



fcm32 发表于 2024-4-18 09:07:15

对于STM32 ,你的PWM CH Polarity设置的为High,PWM还有一个idle state,一般定义为极性的反,所以PWM停上的时候是相反的极性,不会随机。

68336016 发表于 2024-4-18 09:14:02

fcm32 发表于 2024-4-18 09:07
对于STM32 ,你的PWM CH Polarity设置的为High,PWM还有一个idle state,一般定义为极性的反,所以PWM停上 ...
(引用自2楼)

idle state只对TIM1有效,其它定时器无效,不管极性怎么设置,PWM停止后引脚都是低电平。

不过将占空比设置为0或者100,也能变通得将引脚固定电平输出

#define IS_TIM_BREAK_INSTANCE(INSTANCE)(((INSTANCE) == TIM1))

if (IS_TIM_BREAK_INSTANCE(TIMx))
{
    /* Check parameters */
    assert_param(IS_TIM_OCNIDLE_STATE(OC_Config->OCNIdleState));
    assert_param(IS_TIM_OCIDLE_STATE(OC_Config->OCIdleState));

    /* Reset the Output Compare and Output Compare N IDLE State */
    tmpcr2 &= ~TIM_CR2_OIS1;
    tmpcr2 &= ~TIM_CR2_OIS1N;
    /* Set the Output Idle state */
    tmpcr2 |= OC_Config->OCIdleState;
    /* Set the Output N Idle state */
    tmpcr2 |= OC_Config->OCNIdleState;
}

modbus 发表于 2024-4-18 14:10:58

PWM停止后设为强制为高电平模式
页: [1]
查看完整版本: STM32F4的HAL库函数HAL_TIM_PWM_Stop可以让引脚空闲时固定电平?