micoccd 发表于 2022-4-30 20:55

STM32L0 无高级定时器输出固定数脉冲方式之一

1. 引言
STM32 L0 系列作为一款低功耗芯片, 具有丰富的外设和高温下保持极低功耗的特性,
广泛应用于各种节能设备上和消费类电子产品中。

micoccd 发表于 2022-4-30 20:56

2. 问题描述
客户计划使用 STM32L051 作为移动电子产品的某功能主控芯片,控制步进马达。移动
产品要求运行和待机都要有较低的功耗,并且能输出一定数量的脉冲。 STM32L051 具有 4
个普通定时器,每个定时器具有数个输出通道,可以产生 PWM,但是不具有重复计数器。

micoccd 发表于 2022-4-30 20:57

3. 实现机制
通常,我们实现 PWM 信号往往利用定时器的比较输出功能,若要控制 PWM 输出个
数,如果使用 STM32 高级定时器就比较方便。因为它有个的重复计数器功能(TIMx_RCR
寄存器) ,结合单脉冲模式实现起来就简单方便。
但是问题来了, STM32L051 本身不具备这样的高级定时器,那么如何控制输出的脉冲
个数呢,就要考虑间接的方法。
我们从定时器章节的定时器外部触发与同步章节中可以看到,工作在门控从模式的定时
器的计数可以被触发控制信号的电平来控制。那我们是否可以基于这个机制来实现指定
PWM 脉冲个数的输出呢

根据这一原理,如果设定的这个使能计数的时间窗口恰好等于所有输出的脉冲时间总
和,理论上就可以将实现指定个数的 PWM 输出。



micoccd 发表于 2022-4-30 20:59

4. 实现方式
首先配置定时器 21 作为门控定时器,输出门控信号,控制输出脉冲个数(即计数时
长)。设置去触发定时器 22 的信号选择 OC1REF,即比较信号 1. 系统主频 32M, 输出控制
信号总长度为 270us。我们来看看相关实现过程。
图 1TIM21 的配置


其次配置定时器 22 为从定时器,也就是输出脉冲的定时器。定时器配置从模式的 GATED
MODE. 接收的控制触发信号来自于定时器 21 的 OC1REF。 输出脉冲单个周期 27us,如下图所

图 2 TIM22 从模式配置的触发源

图 3 TIM22 的配置

再次,由于只需要一次门控,也就是发出固定数量的脉冲(上例中为 10 个),相对于主控定
时器来说,只发出一次控制信号,即单脉冲模式。所以在启动代码前需要配置为单脉冲方式。

最后测试结果如下,所对应的时间刚刚好。通过为连续波形查看门控时间的准确度。由
PWM 的计数完成刚好和门控时间完成。
图 3 未采用单脉冲门控的波形

图 4 采用单脉冲门控的波形

sadicy 发表于 2022-5-1 17:21

这波形是怎么弄的?

Bblythe 发表于 2022-10-7 09:06


做多层板可将做好的两块双面板用特制的粘合剂“压合”起来

Pulitzer 发表于 2022-10-7 12:05


将整个表面铺上一层薄薄的铜箔,并且把多余的部份给消除

Uriah 发表于 2022-10-7 19:06


孔璧里头必须经过电镀

帛灿灿 发表于 2023-6-1 08:03


会以switch-case的方式出现

Bblythe 发表于 2023-6-1 09:06


代码量小的时候用来做条件判断

童雨竹 发表于 2023-6-1 11:02


不要根据不同的参数类型走不同的代码逻辑

Pulitzer 发表于 2023-6-1 12:05


这是个再正常不过的coding习惯

公羊子丹 发表于 2023-6-1 13:08


使用Optional简化if判空

公羊子丹 发表于 2023-6-1 14:01


对于没有else的场景,使用ifPresent即可

Wordsworth 发表于 2023-6-1 15:04


每个Strategy交由Spring管理,并在构造后注册

Clyde011 发表于 2023-6-1 16:07


通过对判断条件取反,代码在逻辑表达上会更加清晰

万图 发表于 2023-6-1 18:03


不同的代码逻辑就代表了不同的策略

Uriah 发表于 2023-6-1 19:06


对于优秀程序员来说,这不是好代码
页: [1]
查看完整版本: STM32L0 无高级定时器输出固定数脉冲方式之一