一、簡介
電容式觸摸感應(yīng)技術(shù)已經(jīng)廣泛應(yīng)用于家用電器、消費(fèi)電子等領(lǐng)域,以此發(fā)展的觸摸按鍵產(chǎn)品與傳統(tǒng)按鍵相比按鍵有下面的優(yōu)點:
無機(jī)械裝置,不宜磨損老化,超長使用壽命。
表面無縫隙,無水分、雜質(zhì)滲透。
減少元件使用,BOM 成本降低。
面板不需開孔,工業(yè)設(shè)計成本降低。
產(chǎn)品外觀美觀,設(shè)計靈活。
電容式觸摸感應(yīng)技術(shù)通過測量面板(傳感器)和其環(huán)境之間的電容變化來檢測觸摸界面附近是否有觸摸事件發(fā)生。
下面一個典型的觸摸傳感器系統(tǒng)組成的示意圖。
保護(hù)覆蓋層
保護(hù)覆蓋層是指觸摸面板。觸摸面板必須是絕緣材質(zhì),作用是隔離觸摸電極與外部環(huán)境,起到保護(hù)作用。但保護(hù)覆蓋層會降低觸摸的靈敏度,需要根據(jù)應(yīng)用場景選擇合適厚度、材質(zhì)。觸摸電極
觸摸電極是觸摸傳感器的重要組成。手指觸摸時與觸摸電極形成平行板電容器,改變觸摸通道的電容量。觸摸電極必須是導(dǎo)電材質(zhì)。樣式多變,如 PCB 板上的銅箔、金屬板、觸摸彈簧等。絕緣基板
對觸摸電極起支撐作用,非導(dǎo)電材質(zhì)。走線
連接觸摸電極與芯片,包括 PCB 走線和連接器。走線是引入干擾和寄生電容的主要部分,需要謹(jǐn)慎分配走線的布局。
ESP-IDF 編程指南——觸控感應(yīng)器
1.1 FSM 描述
用戶可以實時讀取每個觸摸傳感器通道的脈沖計數(shù)值(OUT),根據(jù)脈沖計數(shù)值(OUT)的變化判斷是否有手值觸摸。這種輪循方式占用較大 CPU 資源。ESP32 也支持配置硬件寄存器實現(xiàn)檢測手指觸摸動作,硬件周期性檢測脈沖計數(shù)值,如果超過設(shè)置的閾值時會產(chǎn)生硬件中斷,通知應(yīng)用層某個觸摸傳感器通道可能被觸發(fā)了。
內(nèi)部的硬件邏輯包含有限狀態(tài)機(jī) (Finite-State Machine, FSM)。FSM 將執(zhí)行觸摸傳感器的內(nèi)部結(jié)構(gòu)描述的序列檢測。軟件可通過專用寄存器操作 FSM。
FSM 的內(nèi)部結(jié)構(gòu)可見下圖。
二、IO功能表
ESP32 提供了多達(dá) 10 個的支持電容式觸摸傳感的 IO,能夠檢測觸摸傳感器上因手指接觸或接近而產(chǎn)生的電容變化。芯片內(nèi)部的電容檢測電路具有低噪聲和高靈敏度的特性,支持用戶使用面積較小的觸摸墊來實現(xiàn)觸摸檢測功能,用戶也可使用觸摸板陣列以探測更大的區(qū)域或更多的測試點。下表列出了 ESP32 中 10 個具備觸摸傳感功能的 IO。
TOUCH_PAD_NUM0 = 0, /*!< Touch pad channel 0 is GPIO4(ESP32) */
TOUCH_PAD_NUM1, /*!< Touch pad channel 1 is GPIO0(ESP32) / GPIO1(ESP32-S2) */
TOUCH_PAD_NUM2, /*!< Touch pad channel 2 is GPIO2(ESP32) / GPIO2(ESP32-S2) */
TOUCH_PAD_NUM3, /*!< Touch pad channel 3 is GPIO15(ESP32) / GPIO3(ESP32-S2) */
TOUCH_PAD_NUM4, /*!< Touch pad channel 4 is GPIO13(ESP32) / GPIO4(ESP32-S2) */
TOUCH_PAD_NUM5, /*!< Touch pad channel 5 is GPIO12(ESP32) / GPIO5(ESP32-S2) */
TOUCH_PAD_NUM6, /*!< Touch pad channel 6 is GPIO14(ESP32) / GPIO6(ESP32-S2) */
TOUCH_PAD_NUM7, /*!< Touch pad channel 7 is GPIO27(ESP32) / GPIO7(ESP32-S2) */
TOUCH_PAD_NUM8, /*!< Touch pad channel 8 is GPIO33(ESP32) / GPIO8(ESP32-S2) */
TOUCH_PAD_NUM9, /*!< Touch pad channel 9 is GPIO32(ESP32) / GPIO9(ESP32-S2) */
三、功能概述
3.1 初始化觸摸板驅(qū)動程序
在使用觸摸板之前,您需要通過調(diào)用函數(shù)來初始化觸摸板驅(qū)動程序touch_pad_init()。此函數(shù)設(shè)置“ API參考”中“宏”.._DEFAULT下列出的幾個驅(qū)動程序參數(shù)。它還會刪除有關(guān)之前曾經(jīng)觸摸過哪些打擊墊的信息(如果有的話),并禁用中斷。
如果不再需要該驅(qū)動程序,請通過調(diào)用對其進(jìn)行初始化touch_pad_deinit()。
3.2 觸摸板GPIO引腳的配置
使用可以為特定的GPIO啟用觸摸傳感器功能touch_pad_config()。
使用該功能touch_pad_set_fsm_mode()選擇是否應(yīng)通過硬件計時器或軟件自動啟動觸摸板測量(由FSM操作)。如果選擇了軟件模式,請使用touch_pad_sw_start()來啟動FSM。
3.3 觸摸狀態(tài)測量
以下兩個功能可方便地從傳感器讀取原始或過濾后的測量值:
touch_pad_read_raw_data()
touch_pad_read_filtered()
它們還可以用于例如通過檢查觸摸或釋放觸摸板時傳感器讀數(shù)的范圍來評估特定的觸摸板設(shè)計。然后可以使用此信息來建立觸摸閾值。
3.4 調(diào)整測量參數(shù)
觸摸傳感器具有幾個可配置的參數(shù),以匹配特定觸摸板設(shè)計的特征。例如,為了感測較小的容量變化,可以縮小觸摸板被充電/放電的參考電壓范圍。高和低參考電壓是使用功能設(shè)置的touch_pad_set_voltage()。
除了能夠識別較小的容量變化之外,積極的副作用還在于降低了低功耗應(yīng)用的功耗??赡艿呢?fù)面影響是測量噪聲的增加。如果獲得的讀數(shù)的動態(tài)范圍仍然令人滿意,則可以通過減少測量時間來進(jìn)一步降低功耗touch_pad_set_meas_time()。
下表總結(jié)了可用的測量參數(shù)和相應(yīng)的“設(shè)置”功能:
觸摸板充放電參數(shù):
電壓范圍 touch_pad_set_voltage()
速度(坡度): touch_pad_set_cnt_mode()
測量時間: touch_pad_set_meas_time()
電壓范圍(高/低參考電壓),速度(斜率)和測量時間之間的關(guān)系如下圖所示。
3.5 過濾測量
如果測量結(jié)果比較嘈雜,則可以使用提供的API函數(shù)對其進(jìn)行過濾。在使用過濾器之前,請調(diào)用進(jìn)行啟動touch_pad_filter_start()。
濾波器類型為IIR(無限脈沖響應(yīng)),它具有可配置的周期,可以使用函數(shù)設(shè)置touch_pad_set_filter_period()。
您可以使用停止過濾器touch_pad_filter_stop()。如果不再需要,可以通過調(diào)用刪除過濾器touch_pad_filter_delete()。
3.6 觸摸偵測
ESP32的硬件基于用戶配置的閾值和FSM執(zhí)行的原始測量來實現(xiàn)觸摸檢測。使用功能touch_pad_get_status()檢查已觸摸了哪些打擊墊并touch_pad_clear_status()清除了觸摸狀態(tài)信息。
如果測量結(jié)果嘈雜且容量變化很小,則硬件觸摸檢測可能不可靠。要解決此問題,請在您自己的應(yīng)用程序中執(zhí)行測量過濾并執(zhí)行觸摸檢測,而不是使用硬件檢測/提供的中斷。有關(guān)這兩種觸摸檢測方法的示例實現(xiàn),請參閱外圍設(shè)備/ touch_pad_interrupt。
3.7 觸摸觸發(fā)的中斷
在啟用觸摸檢測中斷之前,應(yīng)建立觸摸檢測閾值。觸摸和釋放打擊墊時,請使用“觸摸狀態(tài)測量”中描述的功能來讀取和顯示傳感器測量值。如果測量結(jié)果嘈雜且相對容量變化較小,請應(yīng)用過濾器。根據(jù)您的應(yīng)用和環(huán)境條件,測試溫度和電源電壓變化對測量值的影響。
建立檢測閾值后,可以在初始化期間使用touch_pad_config()或在運(yùn)行時使用設(shè)置檢測閾值touch_pad_set_thresh()。
在下一步中,配置如何觸發(fā)中斷??梢栽陂撝狄韵禄蜷撝抵嫌|發(fā)這些閾值,該閾值是通過功能設(shè)置的touch_pad_set_trigger_mode()。
最后,使用以下功能配置和管理中斷調(diào)用:
touch_pad_isr_register() / touch_pad_isr_deregister()
touch_pad_intr_enable() / touch_pad_intr_disable()
當(dāng)中斷可操作時,您可以通過調(diào)用touch_pad_get_status()并從中清除中斷的狀態(tài)來獲取信息touch_pad_clear_status()。
3.8 從睡眠模式喚醒
如果使用觸摸板中斷將芯片從睡眠模式喚醒,則可以選擇應(yīng)觸摸的某些配置的觸摸板(SET1或SET1和SET2),以觸發(fā)中斷并引起隨后的喚醒。為此,請使用功能touch_pad_set_trigger_source()。
可以通過以下方式為每個“ SET”管理焊盤所需位模式的配置:
touch_pad_set_group_mask() / touch_pad_get_group_mask()
touch_pad_clear_group_mask()
四、API說明
以下 Touch Sensor 接口位于 driver/include/driver/touch_pad.h 和 driver/include/driver/touch_sensor_common.h。
4.1 touch_pad_init
4.2 touch_pad_set_voltage
4.3 touch_pad_config
4.4 touch_pad_filter_start
4.5 touch_pad_read_raw_data
4.6 touch_pad_read_filtered
4.7 touch_pad_set_fsm_mode
4.8 touch_pad_set_thresh
4.9 touch_pad_isr_register
4.10 touch_pad_get_status
4.11 touch_pad_clear_status
4.12 touch_pad_intr_enable
五、觸摸按鍵中斷
根據(jù) esp-idfexamplesperipheralstouch_pad_interrupt 中的例程修改
#include Read values sensed at all available touch pads. Use 2 / 3 of read value as the threshold to trigger interrupt when the pad is touched. Note: this routine demonstrates a simple way to configure activation threshold for the touch pads. Do not touch any pads when this routine is running (on application start). */static void tp_example_set_thresholds(void){ uint16_t touch_value; for (int i = 0; i < TOUCH_PAD_MAX; i++) { //read filtered value touch_pad_read_filtered(i, &touch_value); s_pad_init_val[i] = touch_value; ESP_LOGI(TAG, 'test init: touch pad [%d] val is %d', i, touch_value); //set interrupt threshold. ESP_ERROR_CHECK(touch_pad_set_thresh(i, touch_value * 2 / 3)); }}// 檢測觸摸中斷任務(wù)static void tp_example_read_task(void *pvParameter){ static int show_message; while (1) { //interrupt mode, enable touch interrupt touch_pad_intr_enable(); for (int i = 0; i < TOUCH_PAD_MAX; i++) { if (s_pad_activated[i] == true) { ESP_LOGI(TAG, 'T%d activated!', i); // Wait a while for the pad being released vTaskDelay(200 / portTICK_PERIOD_MS); // Clear information on pad activation s_pad_activated[i] = false; // Reset the counter triggering a message // that application is running show_message = 1; } } vTaskDelay(10 / portTICK_PERIOD_MS); // If no pad is touched, every couple of seconds, show a message // that application is running if (show_message++ % 500 == 0) { ESP_LOGI(TAG, 'Waiting for any pad being touched...'); } }}// 觸摸中斷處理函數(shù)。觸摸過的端口保存在s_pad_activated數(shù)組中static void tp_example_rtc_intr(void *arg){ uint32_t pad_intr = touch_pad_get_status(); //clear interrupt touch_pad_clear_status(); for (int i = 0; i < TOUCH_PAD_MAX; i++) { if ((pad_intr >> i) & 0x01) { s_pad_activated[i] = true; } }}/* * Before reading touch pad, we need to initialize the RTC IO. */static void tp_example_touch_pad_init(void){ for (int i = 0; i < TOUCH_PAD_MAX; i++) { //init RTC IO and mode for touch pad. touch_pad_config(i, TOUCH_THRESH_NO_USE); }}void app_main(void){ // Initialize touch pad peripheral, it will start a timer to run a filter ESP_LOGI(TAG, 'Initializing touch pad'); touch_pad_init(); // 如果使用中斷觸發(fā)模式,應(yīng)將觸摸傳感器FSM模式設(shè)置為“ TOUCH_FSM_MODE_TIMER” touch_pad_set_fsm_mode(TOUCH_FSM_MODE_TIMER); // 設(shè)定充放電參考電壓:高參考電壓,低參考電壓,高參考電壓衰減 // the high reference valtage will be 2.7V - 1V = 1.7V, The low reference voltage will be 0.5V. touch_pad_set_voltage(TOUCH_HVOLT_2V7, TOUCH_LVOLT_0V5, TOUCH_HVOLT_ATTEN_1V); // 配置觸摸端口 tp_example_touch_pad_init(); // 初始化并啟動軟件濾波器 touch_pad_filter_start(TOUCHPAD_FILTER_TOUCH_PERIOD); // 設(shè)定中斷限值,此時不要觸摸,2/3的讀取值做為限值 tp_example_set_thresholds(); // 注冊觸摸中斷ISR touch_pad_isr_register(tp_example_rtc_intr, NULL); // 開啟一個任務(wù)處理電容觸摸 xTaskCreate(&tp_example_read_task, 'touch_pad_read_task', 2048, NULL, 5, NULL);} 查看打印: 六、輪詢檢測按鍵 根據(jù) esp-idfexamplesperipheralstouch_pad_interrupt 中的例程修改 #include Read values sensed at all available touch pads. Use 2 / 3 of read value as the threshold to trigger interrupt when the pad is touched. Note: this routine demonstrates a simple way to configure activation threshold for the touch pads. Do not touch any pads when this routine
上一篇:ESP32學(xué)習(xí)筆記(17)——I2C接口使用
下一篇:ESP32學(xué)習(xí)筆記(15)——LEDC(PWM)接口使用
推薦閱讀最新更新時間:2025-06-21 23:07

設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦
- Microchip 升級數(shù)字信號控制器(DSC)產(chǎn)品線 推出PWM 分辨率和 ADC 速度業(yè)界領(lǐng)先的新器件
- 意法半導(dǎo)體STM32MP23x:突破成本限制的工業(yè)AI應(yīng)用核心
- 意法半導(dǎo)體推出用于匹配遠(yuǎn)距離無線微控制器STM32WL33的集成的匹配濾波芯片
- ESP32開發(fā)板連接TFT顯示屏ST7789跳坑記
- 如何讓ESP32支持analogWrite函數(shù)
- LGVL配合FreeType為可變字體設(shè)置字重-ESP32篇
- 使用樹莓派進(jìn)行 ESP32 Jtag 調(diào)試
- ESP32怎么在SPIFFS里面存儲html,css,js文件,以及網(wǎng)頁和arduino的通訊
- ESP32 freeRTOS使用測試
- 智能車原理圖111
- NCP59749MN2ADJTBGEVB,帶偏置軌評估板的超低壓差 LDO
- ardEEG:低成本腦機(jī)接口,支持8通道EEG,EMG和ECG生物信號測量
- STEVAL-GLA001V1,雙向可控硅和交流開關(guān)絕緣控制評估板
- Si5320-EVB,用于 SONET 的 622.08MHz 時鐘發(fā)生器的評估板
- AM1DR-2407SH30Z 7.2V 1 瓦 DC-DC 轉(zhuǎn)換器的典型應(yīng)用
- ADR291GRZ 2.5V便攜式設(shè)備穩(wěn)壓器典型應(yīng)用電路
- XCEL-NOIX0SE045KBG-GEVK:X-Celerator XGS 45000 彩色顯影劑套件
- Tda7265、25 +25W 立體聲放大器的分離電源中的典型應(yīng)用電路,帶靜音/待機(jī)
- 使用 Analog Devices 的 LT6204 的參考設(shè)計
- 南芯科技推出高集成度多口移動電源解決方案,助力充電寶市場穩(wěn)健發(fā)展
- 英飛凌推出具有超低導(dǎo)通電阻的CoolSiC? MOSFET 750 V G2,適用于汽車和工業(yè)功率電子應(yīng)用
- DigiKey 慶祝 B 站賬號粉絲突破 10 萬,贈送驚喜禮包
- 碳化硅企業(yè) Wolfspeed 啟動破產(chǎn)重組,預(yù)計 2025 年三季度末完成司法重整
- 蘋果被曝考慮放棄自研模型 轉(zhuǎn)而與Anthropic或OpenAI合作
- ?百度文心4.5來襲!英特爾Day0即支持端側(cè)部署
- 【廣瀨電機(jī)】關(guān)于中國發(fā)明專利侵權(quán)訴訟達(dá)成和解的公告
- 英飛凌BMS解決方案推動電動汽車創(chuàng)新
- 地平線的L3判斷與實踐路徑
- 汽車網(wǎng)絡(luò)升級攻略:CAN-CAN FD-車載以太網(wǎng)