ESP32硬件计数器 arduino 专测各种电机码盘,脉冲
硬件计数器可以由硬件来完成对应引脚脉冲的计数。它在物理上与CPU并行运转,是运行在loop主循环外的。但是主循环可以读取和清零计数器捕获到的脉冲值。
如图所示,只有标有TOUCH的引脚才有此功能。
#include <stdio.h>
#include "driver/pcnt.h"
pcnt_config_t pcnt_config_l;
static void pcnt_example_init(void){
pcnt_config_l.pulse_gpio_num = 13;// 脉冲脚
pcnt_config_l.ctrl_gpio_num = 15; //方向脚
pcnt_config_l.channel = PCNT_CHANNEL_0;//计数器频道
pcnt_config_l.unit = PCNT_UNIT_0;//计数器单元
pcnt_config_l.pos_mode = PCNT_COUNT_INC;
pcnt_config_l.neg_mode = PCNT_COUNT_DIS;
pcnt_config_l.lctrl_mode = PCNT_MODE_REVERSE;
pcnt_config_l.hctrl_mode = PCNT_MODE_KEEP;
pcnt_config_l.counter_h_lim = 32767;//最大计数值
pcnt_config_l.counter_l_lim = -32767;//最小计数值
pcnt_unit_config(&pcnt_config_l);
pcnt_set_filter_value(PCNT_UNIT_0, 1023);//设定检测阈值
pcnt_filter_enable(PCNT_UNIT_0);
pcnt_counter_pause(PCNT_UNIT_0);
pcnt_counter_clear(PCNT_UNIT_0);
pcnt_counter_resume(PCNT_UNIT_0);
}
void setup() {
pcnt_example_init();
Serial.begin(115200);
}
int16_t count = 0;
void loop() {
pcnt_counter_clear(PCNT_UNIT_0);//计数器清零
delay(5000);//为了证明是异步并行的
pcnt_get_counter_value(PCNT_UNIT_0, &count);//取0单元的数据
Serial.print("count:");
Serial.println(count);
}
此处是一个简单的硬件计数器示例代码其中13号引脚接收脉冲,15号引脚作为计数方向脚,如果15号引脚拉高,就正向计数,否则就反向计数。如果pcnt_config_l.ctrl_gpio_num = 15; //方向脚 赋值为负整数,就不需要额外的控制引脚。计数会默认为反向。
具体API请查阅官方文档 https://esp-idf.readthedocs.io/en/latest/api-reference/peripherals/pcnt.html