161 lines
4.1 KiB
YAML
161 lines
4.1 KiB
YAML
# Copyright (c) 2022 Espressif Systems (Shanghai) Co., Ltd.
|
|
# SPDX-License-Identifier: Apache-2.0
|
|
|
|
description: |
|
|
|
|
Espressif's Pulse Counter Mode (PCNT) controller Node
|
|
|
|
The pulse counter module is designed to count the number of
|
|
rising and/or falling edges of an input signal.
|
|
|
|
The ESP32's PCNT module has 8 independent counting “units” numbered from 0 to 7.
|
|
ESP32S2 and ESP32S3 have 4 independent counting “units” numbered from 0 to 3.
|
|
|
|
Each pulse counter unit has a 16-bit signed counter register.
|
|
|
|
Each unit has two independent channel: ch0 and ch1 that can be configured
|
|
to either increment or decrement the counter.
|
|
|
|
Each channel has two inputs: a signal input that accepts signal edges
|
|
to be detected, as well as a control input that can be used to enable
|
|
or disable the signal input.
|
|
|
|
Each pulse counter unit also features a filter on each of the four inputs,
|
|
adding the option to ignore short glitches in the signals.
|
|
|
|
By combining the usage of both signal and control inputs, a PCNT unit can
|
|
act as a quadrature decoder.
|
|
|
|
Example: Use PCNT to read a rotary-enconder
|
|
|
|
The mapping between signal and control input and the pin is done through pinctrl:
|
|
|
|
&pinctrl {
|
|
pcnt_default: pcnt_default {
|
|
group1 {
|
|
pinmux = <PCNT0_CH0SIG_GPIO14>,
|
|
<PCNT0_CH0CTRL_GPIO15>;
|
|
bias-pull-up;
|
|
};
|
|
};
|
|
};
|
|
|
|
Note: Check espressif,esp32-pinctrl.yaml for complete documentation regarding pinctrl.
|
|
|
|
Use the PCNT node to configure the module:
|
|
|
|
&pcnt {
|
|
pinctrl-0 = <&pcnt_default>;
|
|
pinctrl-names = "default";
|
|
status = "okay";
|
|
#address-cells = <1>;
|
|
#size-cells = <0>;
|
|
unit0@0 {
|
|
reg = <0>;
|
|
#address-cells = <1>;
|
|
#size-cells = <0>;
|
|
filter = <100>;
|
|
channelA@0 {
|
|
reg = <0>;
|
|
sig-pos-mode = <2>;
|
|
sig-neg-mode = <1>;
|
|
ctrl-h-mode = <0>;
|
|
ctrl-l-mode = <1>;
|
|
};
|
|
};
|
|
};
|
|
|
|
compatible: "espressif,esp32-pcnt"
|
|
|
|
include: [sensor-device.yaml, pinctrl-device.yaml]
|
|
|
|
child-binding:
|
|
description: PCNT Unit configuration.
|
|
|
|
properties:
|
|
reg:
|
|
type: int
|
|
required: true
|
|
enum:
|
|
- 0
|
|
- 1
|
|
- 2
|
|
- 3
|
|
- 4
|
|
- 5
|
|
- 6
|
|
- 7
|
|
|
|
description: |
|
|
The PCNT unit index.
|
|
The ESP32 has 8 PCNT units. ESP32S2/S3 have 4 PCNT units.
|
|
|
|
filter:
|
|
type: int
|
|
description: Pulse length (ns) to be ignored
|
|
|
|
child-binding:
|
|
description: PCNT Channel configuration.
|
|
|
|
properties:
|
|
reg:
|
|
type: int
|
|
required: true
|
|
enum:
|
|
- 0
|
|
- 1
|
|
|
|
description: The PCNT channel index.
|
|
|
|
sig-pos-mode:
|
|
type: int
|
|
enum:
|
|
- 0
|
|
- 1
|
|
- 2
|
|
|
|
description: |
|
|
Define what to do on the positive edge of pulse input.
|
|
0 (Default) - Inhibit counter (counter value will not change in this condition).
|
|
1 - Increase counter value.
|
|
2 - Decrease counter value.
|
|
|
|
sig-neg-mode:
|
|
type: int
|
|
enum:
|
|
- 0
|
|
- 1
|
|
- 2
|
|
|
|
description: |
|
|
Define what to do on the negative edge of pulse input.
|
|
0 (Default) - Inhibit counter (counter value will not change in this condition).
|
|
1 - Increase counter value.
|
|
2 - Decrease counter value.
|
|
|
|
ctrl-h-mode:
|
|
type: int
|
|
enum:
|
|
- 0
|
|
- 1
|
|
- 2
|
|
|
|
description: |
|
|
Define what to do when the control input is high.
|
|
0 (Default) - Don't change counter mode.
|
|
1 - Invert counter mode(increase -> decrease, decrease -> increase).
|
|
2 - Control mode: Inhibit counter (counter value will not change in this condition).
|
|
|
|
ctrl-l-mode:
|
|
type: int
|
|
enum:
|
|
- 0
|
|
- 1
|
|
- 2
|
|
|
|
description: |
|
|
Define what to do when the control input is low.
|
|
0 (Default) - Don't change counter mode.
|
|
1 - Invert counter mode(increase -> decrease, decrease -> increase).
|
|
2 - Control mode: Inhibit counter (counter value will not change in this condition).
|