Esp32的PCNT简介
ESP32 PCNT (Pulse Counter) 是 ESP32 芯片中的一个硬件模块,用于计数外部信号的脉冲数量。它可以用于测量外部设备发送的脉冲信号,如旋转编码器、计数器、计时器等。ESP32 PCNT 模块拥有 8 个可编程的计数器通道,并且每个通道都可以独立地配置和管理。该模块具有硬件滤波器,能够过滤掉低于一定时间阈值的噪声和杂波。此外,ESP32 PCNT 还具有可编程阈值比较器,可以在计数器达到预设阈值时发出中断信号,从而方便地实现计数器中断处理。总体来说,ESP32 PCNT 模块是一种非常有用的硬件模块,可用于许多应用程序,特别是需要高精度计数的应用程序。
PCNT与电磁编码器
ESP32 PCNT模块可以用于基于电磁编码器的位置测量应用。电磁编码器(EMC)是将旋转运动转换为数字信号的装置。它通过电磁感应原理工作,使用磁场和探测元件(磁头或光电传感器)来检测旋转位置。ESP32 PCNT模块可以接收这些数字信号并将其转换为旋转位置信息,从而实现位置测量。此外,ESP32 PCNT模块还可以实现边缘计数和脉冲计数,使其在其他应用中也具有一定的灵活性。
电磁编码器
核心代码片段
pcnt_config_t dev_config = {
.pulse_gpio_num = (gpio_num_t)_pinA,
.ctrl_gpio_num = (gpio_num_t)_pinB,
.lctrl_mode = PCNT_MODE_REVERSE,
.hctrl_mode = PCNT_MODE_KEEP,
.pos_mode = PCNT_COUNT_DEC,
.neg_mode = PCNT_COUNT_INC,
.counter_h_lim = EC11_PCNT_DEFAULT_HIGH_LIMIT,
.counter_l_lim = EC11_PCNT_DEFAULT_LOW_LIMIT,
.unit = pcntUnit,
.channel = PCNT_CHANNEL_0,
};
pcnt_unit_config(&dev_config)
//使用两个通道是为了实现前进计数增加,后退计数减少
dev_config.pulse_gpio_num = (gpio_num_t)_pinB;
dev_config.ctrl_gpio_num = (gpio_num_t)_pinA;
dev_config.channel = PCNT_CHANNEL_1;
dev_config.pos_mode = PCNT_COUNT_INC;
dev_config.neg_mode = PCNT_COUNT_DEC;
pcnt_unit_config(&dev_config)
pulse_gpio_num:对应esp32的一个信号输入引脚
pulse_gpio_num:对应esp32的一个控制信号输入引脚
电磁编码器包含了两个霍尔传感器,目的是为了能够区分前进和后退状态,分别连接到Esp的两个输入引脚。
hctrl_mode:控制信号高电平时对计数的处理模式
hctrl_mode:控制信号低电平时对计数的处理模式
取值范围
PCNT_MODE_KEEP = 0
PCNT_MODE_REVERSE = 1
PCNT_MODE_DISABLE = 2
当hctrl_mode=PCNT_MODE_KEEP时,表示当控制信号处于高电平时,当出现上升沿或下降沿按pos_mode和neg_mode的设置处理计数加减,例如neg_mode=PCNT_COUNT_INC,期间出现下降沿计数加1。
注意:PCNT_MODE_REVERSE比较特别,例如neg_mode=PCNT_COUNT_INC,期间出现下降沿计数相反处理,反而是减1。
pos_mode:输入信号上升沿的计数处理方式
neg_mode:输入信号上升沿的计数处理方式
取值范围
PCNT_COUNT_DIS = 0 不变
PCNT_COUNT_INC = 1 加1
PCNT_COUNT_DEC = 2 减1
counter_h_lim:计数最大值,达到最大值触发中断
counter_l_lim:计数最小值,达到最小值触发中断
计数器位数有限,当达到设置的上下限触发中断做累计处理,然后计数器归0,重新计数,这样可以避免溢出
unit:0~8,芯片共提供了8组PCNT单元
channel:0或1,每单元提供了两个通道
时序图
前进与后退时接收到的信号,一个是信号,一个是控制信号,结合上面的配置可以比较直观地推演出计数的变化情况
前进
后退