ESP32 脉冲计数器

介绍 PCNT(脉冲计数器)模块用于计算输入信号的上升沿和/或下降沿的数量。每个脉冲计数器单元都有一个 16 位有符号计数器寄存器和两个通道,可配置为递增或递减计数器。每个通道都有一个接...

介绍

PCNT(脉冲计数器)模块用于计算输入信号的上升沿和/或下降沿的数量。每个脉冲计数器单元都有一个 16 位有符号计数器寄存器和两个通道,可配置为递增或递减计数器。每个通道都有一个接收待检测信号边沿的信号输入,以及一个可用于启用或禁用信号输入的控制输入。输入具有可选滤波器,可用于丢弃信号中不需要的毛刺。

功能概述

此 API 的功能描述分为四个部分:

1、配置 - 描述计数器的配置参数以及如何设置计数器。
2、操作计数器 - 提供有关暂停,测量和清除计数器的控制功能相关信息。
3、滤波脉冲 - 介绍滤波脉冲和计数器控制信号的可选项。
4、使用中断 - 介绍如何在计数器的特定状态上触发中断。

配置

PCNT 模块有 8 个独立的计数“单元”,编号从 0 到 7. 在 API 中,它们使用 pcnt_unit_t 引用。每个单元有两个独立的通道,编号为 0 和 1,并用 pcnt_channel_t 指定。

使用 pcnt_config_t 为每个单元的通道单独提供配置,并涵盖:

1、此配置所指的单元和通道编号。
2、脉冲输入和脉冲门输入的GPIO编号。
3、两对参数:pcnt_ctrl_mode_t pcnt_count_mode_t,用于定义计数器如何响应,具体取决于控制信号的状态以及如何计算脉冲的正/负边沿。
4、当脉冲计数满足特定限制时,用于建立观察点和触发中断的两个极限值(最小值/最大值)。


然后通过调用上面的 pcnt_config_t 作为输入参数的函数 pcnt_unit_config() 来完成特定通道的设置。

要在配置中禁用脉冲或控制输入引脚,请提供 PCNT_PIN_NOT_USED 而不是 GPIO 编号。

操作计数器

使用 pcnt_unit_config() 进行设置后,计数器立即开始运行。可以通过调用 pcnt_get_counter_value() 获取累积的脉冲计数。

有几个函数可以控制计数器的操作:pcnt_counter_pause()pcnt_counter_resume() pcnt_counter_clear()

也可以通过调用 pcnt_set_mode() 使用 pcnt_unit_config() 动态更改计数器模式。

如果需要,可以使用 pcnt_set_pin() “动态”更改脉冲输入引脚和控制输入引脚。要禁用特定输入,请提供功能参数 PCNT_PIN_NOT_USED 而不是 GPIO 编号。

为了使计数器不会错过任何脉冲,脉冲持续时间应该长于一个 APB_CLK 周期(12.5 ns)。脉冲在 APB_CLK 时钟的边沿上采样,如果在边缘之间落下,则可能会丢失。这适用于对带或不带过滤器的操作。

滤波脉冲

PCNT 单元在每个脉冲和控制输入上都有滤波器,增加了忽略信号中短暂毛刺的选项。

通过调用 pcnt_set_filter_value() 在 APB_CLK 时钟周期中提供忽略脉冲的长度。可以使用 pcnt_get_filter_value() 检查当前过滤器设置。APB_CLK 时钟以 80 MHz运行。

通过调用 pcnt_filter_enable()/pcnt_filter_disable() 将过滤器投入运行/暂停。

使用中断

pcnt_evt_type_t 中定义的五个计数器状态监视事件能够触发中断。事件发生在脉冲计数器达到特定值:

1、最小或最大计数值:在配置中讨论的 pcnt_config_t 中提供的 counter_l_lim 或 counter_h_lim
2、使用函数 pcnt_set_event_value() 设置阈值 0 或阈值 1 值。
3、脉冲计数=0


要注册,启用或禁用中断以服务上述事件,请调用 pcnt_isr_register(),pcnt_intr_enable() 和 pcnt_intr_disable()。要在达到阈值时启用或禁用事件,还需要调用函数 pcnt_event_enable() 和 pcnt_event_disable()。

要检查当前设置的阈值,请使用函数 pcnt_get_event_value()。



  • 发表于 2020-09-17 16:07
  • 阅读 ( 438 )

0 条评论

请先 登录 后评论
淡若清风
淡若清风

35 篇文章

作家榜 »

  1. 淡若清风 35 文章
  2. 杨杨 2 文章
  3. cgisky 1 文章
  4. vvvans 0 文章
  5. meow_sir 0 文章
  6. Scott 0 文章
  7. ddd ddd 0 文章
  8. lx 0 文章