STM32 2 使用 TIM1 和 TIM2 生成具有相位差的 PWM。当我停止并重新启动时,TIM2 PWM 无法正常打开

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

我可以生成 2 个 PWM 信号,它们之间存在相位差,但是当我停止并重新启动时,TIM2 PWM 以 %100 占空比打开。

我使用内部触发系统来生成 PWM 之间的延迟。 1.PWM→TIM1 CH1 输出比较 无输出 → TIM1 CH2 2.PWM→TIM2 CH1

我使用 C# Windows 窗体应用程序通过 UART 与 STM32 进行通信。例如:如果我发送 0x50,则 PWM 打开,如果我发送 0x51,则 PWM 关闭。

起始代码:

HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
HAL_TIM_OC_Start(&htim1, TIM_CHANNEL_2);
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);

停止代码:

`HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_1);
HAL_TIM_OC_Stop(&htim1, TIM_CHANNEL_2);
HAL_TIM_PWM_Stop(&htim2, TIM_CHANNEL_1);`
  • 当我运行启动代码时,2个PWM正常打开
  • 当我运行停止代码时,2 个 PWM 正确关闭
  • 当我再次运行启动代码时,第一个 PWM(主)正确打开,第二个 PWM(从)以 %100 占空比打开
有谁可以帮忙吗?

timer stm32 delay pwm phase
1个回答
0
投票
当我想生成两个由可调延迟移位的 PWM 信号时,我遇到了同样的问题。我在STM32H723/733、STM32H725/735的参考手册“43.3.10输出比较模式”的这部分找到了答案。在这一部分,我看到了:

“输出引脚可以保持其电平 (OCXM=0000)、设置为活动 (OCxM=0001)、设置为非活动 (OCxM=0010) 或可以在匹配时切换 (OCxM=0011)。”

在我用 CubeMX 制作的项目中,我设置了“匹配时的活动级别”,但它必须是“匹配时切换”(sConfigOC.OCMode 代码中的 TIM_OCMODE_TOGGLE)。

我的假设是,在第一次捕获从定时器的 OC2REF 时,输出引脚始终保持高电平,因此当我们重新启动定时器时,我们无法触发,因为信号为高电平。我不确定这是否是正确的理解,但它对我有用!

为了生成这种类型的信号,我观看了 ST 的这段视频:

https://www.youtube.com/watch?v=QMAgD9SS5_E

但是,他们使用了“比赛中的活跃级别”模式。

我知道你已经解决了你的问题,但如果有人面临问题,我会在这里回答^^

Here a screen from my MX configuration

问候。

© www.soinside.com 2019 - 2024. All rights reserved.