mirror of
https://github.com/espressif/esp-idf.git
synced 2025-12-07 17:08:49 +00:00
Refactor the touch sensor driver
This commit is contained in:
@@ -1,4 +1,7 @@
|
||||
# Touch Pad Interrupt Example
|
||||
|
||||
## ESP32 platform
|
||||
|
||||
Demonstrates how to set up ESP32's capacitive touch pad peripheral to trigger interrupt when a pad is touched. It also shows how to detect the touch event by the software for sensor designs when greater touch detection sensitivity is required.
|
||||
|
||||
ESP32 supports touch detection by configuring hardware registers. The hardware periodically detects the pulse counts. If the number of pulse counts exceeds the set threshold, a hardware interrupt will be generated to notify the application layer that a certain touch sensor channel may be triggered.
|
||||
@@ -29,8 +32,34 @@ I (22903) Touch pad: Waiting for any pad being touched...
|
||||
|
||||
Note: Sensing threshold is set up automatically at start up by performing simple calibration. Application is reading current value for each pad and assuming two thirds of this value as the sensing threshold. Do not touch pads on application start up, otherwise sensing may not work correctly.
|
||||
|
||||
## ESP32-S2 platform
|
||||
|
||||
Demonstrates how to set up ESP32-S2's capacitive touch pad peripheral to trigger interrupt when a pad is touched. It also shows how to detect the touch event by the software for sensor designs when greater touch detection sensitivity is required.
|
||||
|
||||
ESP32-S2 supports touch detection by configuring hardware registers. The hardware periodically detects the pulse counts. If the number of pulse counts exceeds the set threshold, a hardware interrupt will be generated to notify the application layer that a certain touch sensor channel may be triggered.
|
||||
|
||||
The application is cycling between the interrupt mode and the pooling mode with a filter, to compare performance of the touch sensor system in both scenarios:
|
||||
|
||||
```
|
||||
I (304) Touch pad: Initializing touch pad
|
||||
I (304) Touch pad: Denoise function init
|
||||
I (304) Touch pad: touch pad waterproof init
|
||||
I (304) Touch pad: touch pad filter init 2
|
||||
I (414) Touch pad: test init: touch pad [7] base 7382, thresh 1476
|
||||
I (414) Touch pad: test init: touch pad [9] base 7349, thresh 1469
|
||||
I (414) Touch pad: test init: touch pad [11] base 8047, thresh 1609
|
||||
I (414) Touch pad: test init: touch pad [13] base 8104, thresh 810
|
||||
I (5954) Touch pad: TouchSensor [9] be actived, status mask 0x200
|
||||
W (6034) Touch pad: TouchSensor [13] be actived, enter guard mode
|
||||
W (6034) Touch pad: In guard mode. No response
|
||||
W (6174) Touch pad: TouchSensor [13] be actived, exit guard mode
|
||||
I (6194) Touch pad: TouchSensor [9] be inactived, status mask 0x0
|
||||
```
|
||||
|
||||
## Reference Information
|
||||
|
||||
For a simpler example how to configure and read capacitive touch pads, please refer to [touch_pad_read](../touch_pad_read).
|
||||
|
||||
Design and implementation of the touch sensor system is a complex process. The [Touch Sensor Application Note](https://github.com/espressif/esp-iot-solution/blob/master/documents/touch_pad_solution/touch_sensor_design_en.md) contains several ESP32 specific notes and comments to optimize the design and get the best out of the application with sensors controlled with the ESP32.
|
||||
|
||||
See the README.md file in the upper level 'examples' directory for more information about examples.
|
||||
See the README.md file in the upper level 'examples' directory for more information about examples.
|
||||
@@ -60,12 +60,12 @@ static void touchsensor_interrupt_cb(void *arg)
|
||||
int task_awoken = pdFALSE;
|
||||
touch_event_t evt;
|
||||
|
||||
evt.intr_mask = touch_pad_intr_status_get_mask();
|
||||
evt.intr_mask = touch_pad_read_intr_status_mask();
|
||||
evt.pad_status = touch_pad_get_status();
|
||||
evt.pad_num = touch_pad_get_scan_curr();
|
||||
evt.pad_num = touch_pad_get_current_meas_channel();
|
||||
|
||||
if (evt.intr_mask & TOUCH_PAD_INTR_MASK_DONE) {
|
||||
touch_pad_filter_baseline_read(evt.pad_num, &evt.pad_val);
|
||||
touch_pad_filter_read_baseline(evt.pad_num, &evt.pad_val);
|
||||
}
|
||||
xQueueSendFromISR(que_touch, &evt, &task_awoken);
|
||||
if (task_awoken == pdTRUE) {
|
||||
@@ -78,7 +78,7 @@ static void tp_example_set_thresholds(void)
|
||||
uint32_t touch_value;
|
||||
for (int i = 0; i < TOUCH_BUTTON_NUM; i++) {
|
||||
//read baseline value
|
||||
touch_pad_read_raw_data(button[i], &touch_value);
|
||||
touch_pad_filter_read_baseline(button[i], &touch_value);
|
||||
//set interrupt threshold.
|
||||
touch_pad_set_thresh(button[i], touch_value * button_threshold[i]);
|
||||
ESP_LOGI(TAG, "test init: touch pad [%d] base %d, thresh %d", \
|
||||
@@ -92,16 +92,16 @@ static void touchsensor_filter_set(touch_filter_mode_t mode)
|
||||
touch_filter_config_t filter_info = {
|
||||
.mode = mode, // Test jitter and filter 1/4.
|
||||
.debounce_cnt = 1, // 1 time count.
|
||||
.hysteresis_thr = 1, // 9.4%
|
||||
.noise_thr = 1, // 37.5%
|
||||
.noise_neg_thr = 1, // 37.5%
|
||||
.hysteresis_thr = 3, // 3%
|
||||
.noise_thr = 0, // 50%
|
||||
.noise_neg_thr = 0, // 50%
|
||||
.neg_noise_limit = 10, // 10 time count.
|
||||
.jitter_step = 4, // use for jitter mode.
|
||||
};
|
||||
touch_pad_filter_set_config(&filter_info);
|
||||
touch_pad_filter_enable();
|
||||
touch_pad_filter_baseline_reset(TOUCH_PAD_MAX);
|
||||
ESP_LOGI(TAG, "touch pad filter init %d", mode);
|
||||
touch_pad_filter_reset_baseline(TOUCH_PAD_MAX);
|
||||
ESP_LOGI(TAG, "touch pad filter init");
|
||||
}
|
||||
|
||||
static void tp_example_read_task(void *pvParameter)
|
||||
@@ -158,9 +158,16 @@ void app_main(void)
|
||||
touch_pad_init();
|
||||
for (int i = 0; i < TOUCH_BUTTON_NUM; i++) {
|
||||
touch_pad_config(button[i]);
|
||||
touch_pad_set_thresh(button[i], TOUCH_PAD_THRESHOLD_MAX);
|
||||
}
|
||||
|
||||
#if 0
|
||||
/* If you want change the touch sensor default setting, please write here(after initialize). There are examples: */
|
||||
touch_pad_set_meas_time(TOUCH_PAD_SLEEP_CYCLE_DEFAULT, TOUCH_PAD_SLEEP_CYCLE_DEFAULT);
|
||||
touch_pad_set_voltage(TOUCH_PAD_HIGH_VOLTAGE_THRESHOLD, TOUCH_PAD_LOW_VOLTAGE_THRESHOLD, TOUCH_PAD_ATTEN_VOLTAGE_THRESHOLD);
|
||||
touch_pad_set_inactive_connect(TOUCH_PAD_INACTIVE_CONNECT_DEFAULT);
|
||||
for (int i = 0; i < TOUCH_BUTTON_NUM; i++) {
|
||||
touch_pad_set_cnt_mode(i, TOUCH_PAD_SLOPE_DEFAULT, TOUCH_PAD_TIE_OPT_DEFAULT);
|
||||
}
|
||||
#endif
|
||||
#if TOUCH_BUTTON_DENOISE_ENABLE
|
||||
/* Denoise setting at TouchSensor 0. */
|
||||
touch_pad_denoise_t denoise = {
|
||||
@@ -168,7 +175,7 @@ void app_main(void)
|
||||
.grade = TOUCH_PAD_DENOISE_BIT4,
|
||||
.cap_level = TOUCH_PAD_DENOISE_CAP_L7,
|
||||
};
|
||||
touch_pad_denoise_set_config(denoise);
|
||||
touch_pad_denoise_set_config(&denoise);
|
||||
touch_pad_denoise_enable();
|
||||
ESP_LOGI(TAG, "Denoise function init");
|
||||
#endif
|
||||
@@ -180,7 +187,7 @@ void app_main(void)
|
||||
/* It depends on the number of the parasitic capacitance of the shield pad. */
|
||||
.shield_driver = TOUCH_PAD_SHIELD_DRV_L0, //40pf
|
||||
};
|
||||
touch_pad_waterproof_set_config(waterproof);
|
||||
touch_pad_waterproof_set_config(&waterproof);
|
||||
touch_pad_waterproof_enable();
|
||||
ESP_LOGI(TAG, "touch pad waterproof init");
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user