ESP32 学习笔记(十三)Pulse Counter

Pulse Counter

介绍

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

功能概述

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

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

配置

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

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

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

然后通过调用上面的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中定义的五个计数器状态监视事件能够触发中断。 事件发生在脉冲计数器达到特定值:

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

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

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

应用示例

带控制信号和事件中断的脉冲计数器示例:peripherals/pcnt.

API Reference

Header File

猜你喜欢

转载自blog.csdn.net/qq_27114397/article/details/81637068