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

results matching ""

    No results matching ""