From ba42c46cb3634066247683616ca1306f899a3b41 Mon Sep 17 00:00:00 2001 From: krzychb Date: Fri, 1 Sep 2017 23:39:27 +0200 Subject: [PATCH 1/3] Touch Pad driver overview --- components/driver/include/driver/touch_pad.h | 33 +++-- .../touch_pad-measurement-parameters.jpg | Bin 0 -> 29098 bytes docs/api-reference/peripherals/index.rst | 2 +- docs/api-reference/peripherals/touch_pad.rst | 130 +++++++++++++++++- 4 files changed, 146 insertions(+), 19 deletions(-) create mode 100644 docs/_static/touch_pad-measurement-parameters.jpg diff --git a/components/driver/include/driver/touch_pad.h b/components/driver/include/driver/touch_pad.h index 548edbcf52..cc8f85204e 100644 --- a/components/driver/include/driver/touch_pad.h +++ b/components/driver/include/driver/touch_pad.h @@ -101,11 +101,11 @@ typedef enum { typedef intr_handle_t touch_isr_handle_t; -#define TOUCH_PAD_SLEEP_CYCLE_DEFAULT (0x1000) /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 JOrHP$CII^XLBs$6 literal 0 HcmV?d00001 diff --git a/docs/api-reference/peripherals/index.rst b/docs/api-reference/peripherals/index.rst index 51a46febd4..001b1173d3 100644 --- a/docs/api-reference/peripherals/index.rst +++ b/docs/api-reference/peripherals/index.rst @@ -18,7 +18,7 @@ Peripherals API SPI Master SPI Slave Timer - Touch pad + Touch Sensor UART Example code for this API section is provided in :example:`peripherals` directory of ESP-IDF examples. diff --git a/docs/api-reference/peripherals/touch_pad.rst b/docs/api-reference/peripherals/touch_pad.rst index a4ee4950e5..ae459e1f97 100644 --- a/docs/api-reference/peripherals/touch_pad.rst +++ b/docs/api-reference/peripherals/touch_pad.rst @@ -1,12 +1,133 @@ Touch Sensor ============ -Overview --------- +Introduction +------------ A touch-sensor system is built on a substrate which carries electrodes and relevant connections under a protective flat surface. When a user touches the surface, the capacitance variation is triggered and a binary signal is generated to indicate whether the touch is valid. -ESP32 can provide up to 10 capacitive touch pads / GPIOs. The sensing pads can be arranged in different combinations, so that a larger area or more points can be detected. The touch pad sensing process is under the control of a hardware-implemented finite-state machine (FSM) which is initiated by software or a dedicated hardware timer. +ESP32 can provide up to 10 capacitive touch pads / GPIOs. The sensing pads can be arranged in different combinations (e.g. matrix, slider), so that a larger area or more points can be detected. The touch pad sensing process is under the control of a hardware-implemented finite-state machine (FSM) which is initiated by software or a dedicated hardware timer. + +Design, operation and control registers of touch sensor are discussed in `ESP32 Technical Reference Manual `_ (PDF). Please refer to it for additional details how this subsystem works. + + +Functionality Overview +---------------------- + +Description of API is broken down into groups of functions to provide quick overview of features like: + +- Initialization of touch pad driver +- Configuration of touch pad GPIO pins +- Taking measurements +- Adjusting parameters of measurements +- Filtering measurements +- Setting up interrupts to report touch detection +- Waking up from sleep mode on interrupt + +For detailed description of particular function please go to section :ref:`touch_pad-api-reference`. Practical implementation of this API is covered in section :ref:`touch_pad-api-examples`. + + +Initialization +^^^^^^^^^^^^^^ + +Touch pad driver should be initialized before use by calling function :cpp:func:`touch_pad_init`. This function sets several ``.._DEFAULT`` driver parameters listed in :ref:`touch_pad-api-reference` under "Macros". It also clears information what pads have been touched before (if any) and disables interrupts. + +If not required anymore, driver can be disabled by calling :cpp:func:`touch_pad_deinit`. + + +Configuration +^^^^^^^^^^^^^ + +Enabling of touch sensor functionality for particular GPIO is done with :cpp:func:`touch_pad_config`. + +The function :cpp:func:`touch_pad_set_fsm_mode` is used to select whether touch pad measurement (operated by FSM) is started automatically by hardware timer, or by software. If software mode is selected, then use :cpp:func:`touch_pad_sw_start` to start of the FSM. + + +Touch State Measurements +^^^^^^^^^^^^^^^^^^^^^^^^ + +The following two functions come handy to read raw or filtered measurements from the sensor: + +* :cpp:func:`touch_pad_read` +* :cpp:func:`touch_pad_read_filtered` + +They may be used to characterize particular touch pad design by checking the range of sensor readings when a pad is touched or released. This information is then used to establish the touch threshold. + +.. note:: + + Start and configure filter before using :cpp:func:`touch_pad_read_filtered` by calling specific filter functions described down below. + +To see how to use both read functions check :example:`peripherals/touch_pad_read` application example. + + +Optimization of Measurements +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Touch sensor has several configurable parameters to match characteristics of particular touch pad design. For instance, to sense smaller capacity changes, it is possible to narrow the reference voltage range within which the touch pads are charged / discharged. The high and low reference voltages are set using function :cpp:func:`touch_pad_set_voltage`. A positive side effect, besides ability to discern smaller capacity changes, will be reduction of power consumption for low power applications. A likely negative effect will be increase of measurement noise. If dynamic rage of obtained readings is still satisfactory, then further reduction of power consumption may be done by lowering the measurement time with :cpp:func:`touch_pad_set_meas_time`. + +The following summarizes available measurement parameters and corresponding 'set' functions: + +* Touch pad charge / discharge parameters: + + * voltage range: :cpp:func:`touch_pad_set_voltage` + * speed (slope): :cpp:func:`touch_pad_set_cnt_mode` + +* Measure time: :cpp:func:`touch_pad_set_meas_time` + +Relationship between voltage range (high / low reference voltages), speed (slope) and measure time is shown on figure below. + +.. figure:: ../../_static/touch_pad-measurement-parameters.jpg + :align: center + :alt: Touch Pad - relationship between measurement parameters + :figclass: align-center + + Touch Pad - relationship between measurement parameters + +The last chart "Output" represents the touch sensor reading, i.e. the count of pulses collected within measure time. + +All functions are provided in pairs to 'set' specific parameter and to 'get' the current parameter's value, e.g. :cpp:func:`touch_pad_set_voltage` and :cpp:func:`touch_pad_get_voltage`. + + +Filtering of Measurements +^^^^^^^^^^^^^^^^^^^^^^^^^ + +To avoid false touch detection you may filter noisy measurements. The filter should be started before first use by calling :cpp:func:`touch_pad_filter_start`. + +The filter type is IIR (Infinite Impulse Response) and it has configurable period that can be set with function :cpp:func:`touch_pad_set_filter_period`. + +You can stop the filter with :cpp:func:`touch_pad_filter_stop`. If not required anymore, the filter may be deleted by invoking :cpp:func:`touch_pad_filter_delete`. + + +Touch Triggered Interrupts +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Before enabling an interrupt on touch detection, user should establish touch detection threshold. Use functions described above to read and display sensor measurements when pad is touched and released. Apply a filter when measurements are noisy and relative changes are small. Depending on your application and environmental conditions, test the influence of temperature and power supply voltage changes on measured values. + +Once detection threshold is established, it may be set on initialization with :cpp:func:`touch_pad_config` or at the runtime with :cpp:func:`touch_pad_set_thresh`. + +In next step configure how interrupts are triggered. They may be triggered below or above threshold and this is set –with function :cpp:func:`touch_pad_set_trigger_mode`. + +Finally configure and manage interrupt calls using the following functions: + +* :cpp:func:`touch_pad_isr_handler_register` +* :cpp:func:`touch_pad_isr_register` / :cpp:func:`touch_pad_isr_deregister` +* :cpp:func:`touch_pad_intr_enable` / :cpp:func:`touch_pad_intr_disable` + +When interrupts are operational, you can obtain information what particular pad triggered interrupt by invoking :cpp:func:`touch_pad_get_status` and clear pad status with :cpp:func:`touch_pad_clear_status`. + + +Wakeup from Sleep Mode +^^^^^^^^^^^^^^^^^^^^^^ + +If touch pad interrupts are used to wakeup the chip from a sleep mode, then user can select certain configuration of pads (SET1 or both SET1 and SET2), that should be touched to trigger the interrupt and cause subsequent wakeup. To do so, use function :cpp:func:`touch_pad_set_trigger_source`. + +Configuration of required bit patterns of pads may be managed for each 'SET' with: + +* :cpp:func:`touch_pad_set_group_mask` / :cpp:func:`touch_pad_get_group_mask` +* :cpp:func:`touch_pad_clear_group_mask` + + +.. _touch_pad-api-examples: Application Examples -------------------- @@ -14,6 +135,9 @@ Application Examples - Touch sensor read example: :example:`peripherals/touch_pad_read`. - Touch sensor interrupt example: :example:`peripherals/touch_pad_interrupt`. + +.. _touch_pad-api-reference: + API Reference ------------- From 7c7d29dc4ae29078902435eed9a9d4ad54808080 Mon Sep 17 00:00:00 2001 From: krzychb Date: Tue, 5 Sep 2017 08:27:32 +0200 Subject: [PATCH 2/3] Implemented 2 of 3 review comments --- .../touch_pad-measurement-parameters.jpg | Bin 29098 -> 30737 bytes docs/api-reference/peripherals/touch_pad.rst | 1 - 2 files changed, 1 deletion(-) diff --git a/docs/_static/touch_pad-measurement-parameters.jpg b/docs/_static/touch_pad-measurement-parameters.jpg index 94529576ee204f6dc30193a4c3c2cb62f0d1cdb0..581410be14958159e66f03f56c52c408fa64c3f2 100644 GIT binary patch literal 30737 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 JOrHP$CII^XLBs$6 diff --git a/docs/api-reference/peripherals/touch_pad.rst b/docs/api-reference/peripherals/touch_pad.rst index ae459e1f97..b25aa12379 100644 --- a/docs/api-reference/peripherals/touch_pad.rst +++ b/docs/api-reference/peripherals/touch_pad.rst @@ -109,7 +109,6 @@ In next step configure how interrupts are triggered. They may be triggered below Finally configure and manage interrupt calls using the following functions: -* :cpp:func:`touch_pad_isr_handler_register` * :cpp:func:`touch_pad_isr_register` / :cpp:func:`touch_pad_isr_deregister` * :cpp:func:`touch_pad_intr_enable` / :cpp:func:`touch_pad_intr_disable` From 73297f1aa3a942f4f84550e3d3a4bd6eb7d29d92 Mon Sep 17 00:00:00 2001 From: krzychb Date: Tue, 5 Sep 2017 20:22:21 +0200 Subject: [PATCH 3/3] Separate section on touch detection --- docs/api-reference/peripherals/touch_pad.rst | 22 +++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/docs/api-reference/peripherals/touch_pad.rst b/docs/api-reference/peripherals/touch_pad.rst index b25aa12379..0b868f17e6 100644 --- a/docs/api-reference/peripherals/touch_pad.rst +++ b/docs/api-reference/peripherals/touch_pad.rst @@ -21,6 +21,7 @@ Description of API is broken down into groups of functions to provide quick over - Taking measurements - Adjusting parameters of measurements - Filtering measurements +- Touch detection methods - Setting up interrupts to report touch detection - Waking up from sleep mode on interrupt @@ -51,7 +52,7 @@ The following two functions come handy to read raw or filtered measurements from * :cpp:func:`touch_pad_read` * :cpp:func:`touch_pad_read_filtered` -They may be used to characterize particular touch pad design by checking the range of sensor readings when a pad is touched or released. This information is then used to establish the touch threshold. +They may be used to characterize particular touch pad design by checking the range of sensor readings when a pad is touched or released. This information can be then used to establish the touch threshold. .. note:: @@ -87,17 +88,28 @@ The last chart "Output" represents the touch sensor reading, i.e. the count of p All functions are provided in pairs to 'set' specific parameter and to 'get' the current parameter's value, e.g. :cpp:func:`touch_pad_set_voltage` and :cpp:func:`touch_pad_get_voltage`. +.. _touch_pad-api-filtering-of-measurements: Filtering of Measurements ^^^^^^^^^^^^^^^^^^^^^^^^^ -To avoid false touch detection you may filter noisy measurements. The filter should be started before first use by calling :cpp:func:`touch_pad_filter_start`. +If measurements are noisy, you may filter them with provided API. The filter should be started before first use by calling :cpp:func:`touch_pad_filter_start`. The filter type is IIR (Infinite Impulse Response) and it has configurable period that can be set with function :cpp:func:`touch_pad_set_filter_period`. You can stop the filter with :cpp:func:`touch_pad_filter_stop`. If not required anymore, the filter may be deleted by invoking :cpp:func:`touch_pad_filter_delete`. +Touch Detection +^^^^^^^^^^^^^^^ + +Touch detection is implemented in ESP32's hardware basing on user configured threshold and raw measurements executed by FSM. Use function :cpp:func:`touch_pad_get_status` to check what pads have been touched and :cpp:func:`touch_pad_clear_status` to clear the touch status information. + +Hardware touch detection may be also wired to interrupts and this is described in next section. + +If measurements are noisy and capacity changes small, then hardware touch detection may be not reliable. To resolve this issue, instead of using hardware detection / provided interrupts, implement measurement filtering and perform touch detection in your own application. See :example:`peripherals/touch_pad_interrupt` for sample implementation of both methods of touch detection. + + Touch Triggered Interrupts ^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -105,7 +117,7 @@ Before enabling an interrupt on touch detection, user should establish touch det Once detection threshold is established, it may be set on initialization with :cpp:func:`touch_pad_config` or at the runtime with :cpp:func:`touch_pad_set_thresh`. -In next step configure how interrupts are triggered. They may be triggered below or above threshold and this is set –with function :cpp:func:`touch_pad_set_trigger_mode`. +In next step configure how interrupts are triggered. They may be triggered below or above threshold and this is set with function :cpp:func:`touch_pad_set_trigger_mode`. Finally configure and manage interrupt calls using the following functions: @@ -114,6 +126,10 @@ Finally configure and manage interrupt calls using the following functions: When interrupts are operational, you can obtain information what particular pad triggered interrupt by invoking :cpp:func:`touch_pad_get_status` and clear pad status with :cpp:func:`touch_pad_clear_status`. +.. note:: + + Interrupts on touch detection operate on raw / unfiltered measurements checked against user established threshold and are implemented in hardware. Enabling software filtering API (see :ref:`touch_pad-api-filtering-of-measurements`) does not affect this process. + Wakeup from Sleep Mode ^^^^^^^^^^^^^^^^^^^^^^