Bootstrap

Esp32使用pcnt模块与电磁编码器实例

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,每单元提供了两个通道

时序图

前进与后退时接收到的信号,一个是信号,一个是控制信号,结合上面的配置可以比较直观地推演出计数的变化情况

前进

后退

;