在使用STM32定时器进行脉宽调制输出的过程中,当用示波器或逻辑分析仪观察波形时,我们有时会发现输出的第一个脉宽调制脉冲不同于后续的输出脉冲。例如,像下面的输出波形一样,第一个脉冲的高电平比所有其他后续脉冲都宽。
对于这种情况,有些应用程序不太在意,但有些应用程序可能不被接受。这个问题是怎么产生的?有什么解决办法吗?
这种现象的原因很简单,定时器比较输出模块相对独立于定时器计数单元。使能比较通道的输出功能的操作和使能计数器的操作之间存在时间差,其长度通常与用户的处理代码有关。
我们知道,STM32的高级定时器或通用定时器大致可以看作由四个模块组成,即主从控制模块、时基装置、输入捕获模块和输出比较模块。以下截图是STM32F4系列高级定时器TIM1功能框图的一部分。这里不截取定时器的主模块和从模块,只保留时基单元、输入捕获单元和输出比较单元。
这三个单位可以相互协调或独立工作。例如,输出比较单元的操作不需要时基单元的计数器来操作,换句话说,即使计数器没有被打开来计数,输出比较单元仍然可以根据默认配置或用户的相关输出配置来工作。
我们不妨举一个具体的例子来看看。假设定时器TIM1的计数模式选择向上计数模式,通道CH1根据脉宽调制模式的规则实现脉宽调制输出。配置arra和CCR1后,极性选择非常有效,即OC输出与OCRef参考信号保持同相。
对于计时器的初始化,我们通常会配置时基装置的相关参数,如时钟源、ARR、PSC等。然后配置并启用比较输出功能。当比较输出的配置和使能完成时,即使此时没有计数器使能时基装置,比较输出装置也将起作用,即它将结合比较输出配置和CNT与CCR的比较结果在OC端输出相应的电平。
根据上述配置,如果CCR大于计数器CNT的值,则OC输出高电平,否则输出低电平。如果用户没有专门为碳纳米管寄存器赋值,芯片复位后碳纳米管寄存器的默认值为0。显然,此时的碳碳比大于碳纳米管。自然,此时OC终端输出高电平。如果此时计数器尚未开启,该高电平将一直保持,直到计数器开启并扩展至以下脉宽调制输出动作。也就是说,该高电平将连接到第一脉宽调制脉冲的输出。如果第一脉宽调制脉冲首先输出高电平,这导致第一脉冲的高电平宽度比所有其它脉宽调制脉冲的宽。
下图中的第一个位置是通道的OC功能配置启用的时间,第二个位置是计数器启动的时间。
在与上述相同的模式和极性下,有没有办法消除第一个脉冲的多余宽度?
有很多方法。由于时钟通道的输出由时钟控制寄存器和时钟控制寄存器之间的比较结果以及使能后的脉宽调制模式决定,我们可以考虑手动修改时钟控制寄存器的值,使其等于ARR或0xffffffff(如果32位计数器使能,则为0xffffffff)。此时,碳纳米管的值不能小于用户配置的碳纳米管比值,因此改变碳纳米管与碳纳米管的比较结果可以达到改变碳纳米管终端输出电平的目的。
例如,如果您使用STM32标准库进行编写,您可以在下面红色圆圈中的位置添加一个句子:“arr对应于以时基单位表示的ARR寄存器的值”
参照[向上计数模式、PWM1模式、高效极性选择]上的相同定时器配置,以下是基于使用STM32F4的TIM1的通道2的立方体库的进一步验证测试。
使用CubeMx配置来完成初始化代码的生成需要相对简单的用户代码。如下图所示。盒子中的延迟功能代码用于模拟和比较输出使能和使能计数器两个操作之间的时间间隔,以观察效果。
基于上述代码,我们可以从示波器上看到,第一个脉冲明显比其他后续的脉宽调制脉冲宽。[如下图所示]
在上述代码的基础上,我们在启用CH2比较输出功能的代码之前添加一条语句来修改CNT寄存器,使其值等于ARR或计数器的满量程值。下图中椭圆形圆圈中的代码。[如果碳纳米管的值被改变为等于ARR的值,效果将是相同的]
然后再次测试,第一个脉冲不再异常。[如下图所示]
最后,总而言之,只有当使能定时器通道的比较输出操作和使能计数器的操作之间存在明显的时间差时,才能发现这种现象,并且这种现象还与所选择的脉宽调制模式有关。上述分析和共享仅针对向上计数模式和PWM1模式。当涉及其他应用模式时,可以具体分析具体问题,只要原因明确,灵活处理并不难。
防控疫情的需求激发之下,代替人类送药、送餐送菜、消毒巡逻的无人车成了疫情期间的特殊尖兵。疫情过后,无人车配送是否...
2020-03-23 17:12市场分调研机构Omdia的最新数据分析显示,全球智能城市人工智能(AI)软件市场将从6 738亿美元(2019年),在2025年将增长到4...
2020-04-07 17:55现代电测技术日趋成熟,由于具有精度高、便于微机相连实现自动实时处理等优点,已经广泛应用在电气量和非电气量的测量中。
2020-04-07 17:56微软经常在游戏领域开辟路径,扮演开拓者的角色,这一点体现在很多方面,包括微软的尖端技术(DX12终极版 DX光追),硬件(X...
2020-04-07 17:57去年 12 月,波音为美国宇航局发射了未载人的 Starliner 航天器。然而由于技术问题,任务并没有按计划进行。作为 NASA ...
2020-04-07 17:58