我开发嵌入式软件开关 15 年,
STM32 5 年。我对 WB55 微控制器上的计时器应用程序有一个非常简单的目标,过去 2 天我一直在努力,但收效甚微,所以我问社区是否缺少一些简单的东西。
我正在尝试在 STM32WB55 上使用定时器 16 和定时器 17,以便每个软件调用输出一个脉冲。这是一个非常典型的伺服 PWM 控制应用,其中每 20 毫秒需要一个 1.0 毫秒到 2.0 毫秒的正脉冲。我正在使用我自己的硬实时调度程序来驱动控制回路,当软件计算出所需的脉冲持续时间时,我想在计算完成后以最小延迟输出脉冲。这意味着我不想使用连续定时器 PWM 并动态调整脉冲宽度,因为如果我的软件调度漂移与 PWM 周期不同步,则在更新脉冲之前可能会有长达 20 毫秒的延迟持续时间传到伺服系统。相反,我只是希望我的软件在确定所需的脉冲持续时间后立即命令一个脉冲,
我正在使用 MXCube 和 HAL。如果需要,我会去找 LL 驱动程序,但这意味着在我的应用程序的其他地方重新编写工作代码,所以这是最后的手段。此外,还有什么比仅使用 HAL 输出一个正定时器脉冲更简单的呢?
我最直接的尝试是在单脉冲模式下使用 PWM 模式 1,将所需的脉冲持续时间设置为 1.5 毫秒,并将自动重载值设置为 4 毫秒,这超过了 3 毫秒的最大可能脉冲宽度。问题是定时器输出以 1.5 毫秒的脉冲开始时很好,但是当 ARR 到期时,输出再次变高。
然后信号保持高电平,直到我使用带有 HAL_
tiM_PWM_Stop 命令的软件进入。我一直无法找到任何防止信号在 ARR 周期结束时变高的寄存器设置。
如果我尝试在信号低但 ARR 到期之前发送 HAL_TIM_PWM_Stop 命令,那么出于某种原因,接下来的几次尝试重新启动定时器都没有效果。
我也尝试过使用输出比较模式选择一个脉冲,但出于某种原因,每次系统复位它只适用于一个脉冲。我深入研究了定时器寄存器以比较它们在初始成功脉冲和下一个失败脉冲命令之间的差异,并且在成功脉冲打开后的那一刻,当失败命令没有打开时,所有 Timer16 寄存器的寄存器值都是相同的. BDTR->MOE 对它们都打开,依此类推,但在第一种情况下,输出变高,而在所有后续情况下,输出保持平坦。我不知道如何解决这个问题。
我能够得到我想要的最接近的是使用 PWM 模式 2 并反转输出极性,这样定时器输出开始时为低电平,然后打开一个 ARR - CCR 持续时间的脉冲,CCR 为潜伏。要在每个软件周期更新脉冲,我需要每次都更改 ARR 和 CCR,并且在脉冲消失之前我将至少有一个不需要的延迟计时器计数。如果需要,我会回到这个,但它似乎不必要地低效。
我错过了什么?在此先感谢您的帮助。