59 static pcnt_unit_t next_pcnt_unit = PCNT_UNIT_0;
60 static pcnt_channel_t next_pcnt_channel = PCNT_CHANNEL_0;
65 next_pcnt_unit = pcnt_unit_t(
int(next_pcnt_unit) + 1);
66 if (
int(next_pcnt_unit) >= PCNT_UNIT_0 + PCNT_UNIT_MAX) {
67 next_pcnt_unit = PCNT_UNIT_0;
68 next_pcnt_channel = pcnt_channel_t(
int(next_pcnt_channel) + 1);
71 ESP_LOGCONFIG(TAG,
" PCNT Unit Number: %u", this->
pcnt_unit);
72 ESP_LOGCONFIG(TAG,
" PCNT Channel Number: %u", this->
pcnt_channel);
74 pcnt_count_mode_t rising = PCNT_COUNT_DIS, falling = PCNT_COUNT_DIS;
77 rising = PCNT_COUNT_DIS;
80 rising = PCNT_COUNT_INC;
83 rising = PCNT_COUNT_DEC;
88 falling = PCNT_COUNT_DIS;
91 falling = PCNT_COUNT_INC;
94 falling = PCNT_COUNT_DEC;
98 pcnt_config_t pcnt_config = {
99 .pulse_gpio_num = this->pin->
get_pin(),
100 .ctrl_gpio_num = PCNT_PIN_NOT_USED,
101 .lctrl_mode = PCNT_MODE_KEEP,
102 .hctrl_mode = PCNT_MODE_KEEP,
110 esp_err_t error = pcnt_unit_config(&pcnt_config);
111 if (error != ESP_OK) {
112 ESP_LOGE(TAG,
"Configuring Pulse Counter failed: %s", esp_err_to_name(error));
117 uint16_t filter_val = std::min(
static_cast<unsigned int>(this->
filter_us * 80u), 1023u);
118 ESP_LOGCONFIG(TAG,
" Filter Value: %" PRIu32
"us (val=%u)", this->
filter_us, filter_val);
119 error = pcnt_set_filter_value(this->
pcnt_unit, filter_val);
120 if (error != ESP_OK) {
121 ESP_LOGE(TAG,
"Setting filter value failed: %s", esp_err_to_name(error));
124 error = pcnt_filter_enable(this->
pcnt_unit);
125 if (error != ESP_OK) {
126 ESP_LOGE(TAG,
"Enabling filter failed: %s", esp_err_to_name(error));
131 error = pcnt_counter_pause(this->
pcnt_unit);
132 if (error != ESP_OK) {
133 ESP_LOGE(TAG,
"Pausing pulse counter failed: %s", esp_err_to_name(error));
136 error = pcnt_counter_clear(this->
pcnt_unit);
137 if (error != ESP_OK) {
138 ESP_LOGE(TAG,
"Clearing pulse counter failed: %s", esp_err_to_name(error));
141 error = pcnt_counter_resume(this->
pcnt_unit);
142 if (error != ESP_OK) {
143 ESP_LOGE(TAG,
"Resuming pulse counter failed: %s", esp_err_to_name(error));