输出比较和脉宽调制功能有什么区别



我正在使用STM32系列复习微控制器。(特别是使用STM32F072BDISCOVERY板(。

我在理解计时器及其各种模式的使用时遇到了一些麻烦。具体来说,"输出比较"(OC(模式有很多选项,"PWM"模式有很多选项。RM0091 参考手册的编写就好像它们是两种不同的交替操作模式。我也在使用新的 HAL 驱动程序,并且有不同的 API 可以使用 OC 与 PWM。

然而,在我看来,PWM基本上是输出比较功能的子集/用例,其中定时器通道配置为直接驱动硬件输出。

我缺少的OC和PWM模式之间是否有明确的区别?PWM波形生成在哪些方面不是输出比较功能?

这个问题很老,但我想知道同样的事情,并开始深入研究这个话题。

在STM32微型中,并非所有定时器都能实现所有功能。我的帖子基于 STM32F030 Timer 1,我相信这是功能最丰富的 4 通道实现(或者至少是几年前

(。

计时器基本上充当计数器,具有各种选项,包括计数器时钟的来源,重置内容,周期和计数器方向。这是它实现的所有额外功能的基础,HAL 驱动程序将其称为时基。计数器功能本身与定时器通道无关。

STM32定时器有1-6个通道。这些通道可以独立配置,也可以在某些情况下成对配置(用于正交编码器模式等功能(。通道可以配置为输入捕获或输出比较。输入捕获"侦听"某个事件,并将时基计数器保存在CCRx寄存器中。输出比较将计数器寄存器与CCRx寄存器中给出的设定值进行比较。

所有简单的 IC/OC 模式和额外的功能,如 PWM 输入、输出、霍尔效应传感器接口,都建立在这两种模式之上,它们各自的选项位作用于各种输入/输出多路复用器,关于 OC 模式,基本上根据比较器输出(CNT = CCRx, CNT> CCRx(。在这种情况下,PWM模式允许输出模式控制器在计数器寄存器复位(更具体地说,更新事件(时返回到CNT <= CCRx状态,而与其他OC模式一样,输出模式控制器忽略此信号,可以通过手动或外部信号复位。输出信号是OCxREF信号,然后通过更多的硬件,然后到达输出引脚。如果它得到输出,因为您不能将定时器连接到输出引脚。

STM32定时器很复杂。它们有许多逻辑块和大量的配置寄存器/位,所以我可能错过了一些东西或完全误读了某些东西。请随时纠正我。

>输出比较只能产生50%的占空比(如果在切换模式下( PWM可以产生不同的占空比,因为它是定时器中断和输出比较的组合

PWM是输出比较函数的一个函数。

AVR微控制器中,可以从每个定时器/计数器的操作模式描述中推断出区别:

操作模式,即定时器/计数器的行为和 输出比较引脚,由波形的组合定义 生成模式(WGMn3:0)和比较输出模式(COMnx1:0)位。

比较输出模式位不会影响计数序列,而 波形生成模式位可以。COMnx1:0位控件 生成的PWM输出是否应反相(反相 或非反相 PWM(。对于非PWM模式,COMnx1:0位控制 是否应设置、清除或在比较时切换输出 火柴

前面的输出比较单位说明中:

比较器连续TCNTn与输出进行比较 比较寄存器 ( OCRnx (。如果TCNT等于比较器信号OCRnx 一场比赛。匹配项将在下一个时设置输出比较标志(OCFnx) 定时器时钟周期。... 波形发生器使用匹配信号生成 根据波形生成模式设置的操作模式输出 (WGMn3:0)位和比较输出模式(COMnx1:0)位。

这是同一部分中指出的另一个差异:

当使用十二种脉宽调制(PWM(模式中的任何一种时,OCRnx寄存器都是双缓冲的。对于正常和清除比较计时器 (CTC( 操作模式,双缓冲处于禁用状态。双缓冲同步OCRnx比较寄存器的更新,防止出现奇数长度、非对称PWM脉冲,从而使输出无毛刺。

PWM模式:输出根据计数器值和比较寄存器的比较不断变化。
-PWM 模式 1:(110( 如果输出为低TIMx_CNT
电平-PWM 模式 2:(111( 如果输出TIMx_CNT <TIMx_CCR1则为高电平,否则为低电平>

对于一个更新事件,输出引脚状态更改两次,第一次是在 CNT == CCR 时,第二次是在 ARR 溢出(更新事件(并设置为后零(向上计数(时。设置 ARR 控制周期,设置 CCR 控制占空比。

OC模式:仅当计数器等于比较寄存器
时,输出才会改变-切换匹配: (011(
-在匹配时设置活动(高(:(001(
-在匹配时设置非活动 (低(: (010(

输出引脚状态仅在 CNT == CCR 时更改。溢出事件不会更改引脚状态。


从技术上讲,您可以使用 OC 模式生成 PWM,但这非常不切实际。OC模式更适合产生PWM以外的各种形状的脉冲。
定时器只有一个"输出"块,可以配置为两种模式。您可以在参考手册中找到许多其他设置(极性、死区时间、输出断开(。

提示:让 Cube MX 和 HAL 完成配置计时器时钟树和引脚分配的繁琐工作(类似于 MX_TIM8_Init((( 的功能(。然后控制定时器,并通过直接在定时器控制寄存器中设置位来执行您想要的操作。通过阅读少量参考手册页来理解如何使用计时器比尝试理解多层 HAL 函数和 Cube MX 设置更容易、更快捷。此外,您可能需要在程序运行期间更改定时器的设置,例如从PWM重新配置为OC模式,或者有时仅产生一个脉冲。

我发现查看TIMx_CCMR寄存器以了解计时器各种模式的层次结构非常有帮助。

如@Buga所述,所有模式都基于输入捕获或输出比较。以 F091 为例,TIMx_CCMR寄存器中的 CCxS(捕获/比较 x 选择(位控制通道是输入还是输出。这里的措辞开始有点混乱,因为当计时器配置为使用 CCxS 的输出时,它被认为是在输出比较模式下运行。

当配置为输出时,OCxM(输出比较x模式(位用于选择特定的输出模式。正如@Michal所提到的,OCxM可以是例如:

  • 001:超频模式,匹配时将通道x设置为活动电平
  • 010:超频模式,匹配时将通道x设置为非活动电平
  • 011:超频模式,切换匹配通道 x
  • 110:PWM 模式 1
  • 111:PWM 模式 2

还有 100 和 101 的模式,其中级别被迫处于非活动状态或活动状态。模式 000 是不改变输出的地方。

所以总的来说,我们有:

  • 输入捕获模式
    • 不同的变体..
  • 输出比较模式
    • 冻结模式 000
    • 超频模式 001/010/011
    • 强制模式 100/101
    • PWM 模式 110/111

如您所见,OC 模式既用作父模式,也用作子模式。我认为这是很多混乱的根源。非常清楚的是,PWM模式(110/111(肯定不会在软件/HAL中作为OC模式(001/010/011(的子集/特例实现。它们是在硬件中实现的并行模式,它们都属于父输出比较模式。

最新更新