1. 项目介绍
1.1 项目背景
随着智能家居和物联网设备的快速发展,人机交互方式也在不断演进。触摸按键作为一种非机械接触式的输入方式,相比传统机械按键具有寿命长、密封性好、反应灵敏等优势,被广泛应用于各种电子产品中。本项目基于Microchip EV41C56A开发板,利用其内置的PTC(Peripheral Touch Controller)外设实现电容式触摸按键检测,并通过触摸事件控制板载LED的亮灭状态。
1.2 项目目标
本项目实现了以下功能目标:
- 单次触摸点亮LED:用户触摸触摸按键一次,板载LED点亮
- 再次触摸关闭LED:用户再次触摸触摸按键,LED熄灭
- 稳定可靠的触摸检测:通过软件滤波和状态机设计,确保触摸检测的稳定性和抗干扰能力
- 完善的去抖机制:避免触摸过程中的抖动和误触发,实现"触摸一次,动作一次"的精确控制
1.3 项目意义
本项目作为嵌入式触摸技术的入门实践,具有以下意义:
- 掌握PTC触摸检测原理:通过实际项目深入理解电容式触摸检测的工作机制,包括电荷转移、自电容测量等技术细节
- 学习Microchip QTouch库的使用:掌握Microchip官方提供的QTouch库API和配置方法
- 实践状态机设计:通过四状态滤波状态机的设计,体会状态机在嵌入式系统中的应用价值
- 理解TrustZone安全架构:本项目运行在具有TrustZone特性的PIC32CM5164芯片上,学习安全世界与非安全世界的交互机制
2. 硬件介绍
本项目采用Microchip PIC32CM5164LS00048作为主控芯片,这是一款基于ARM Cortex-M23内核的32位微控制器。
板载触摸按键采用自电容(Self-Capacitance)检测方式,连接至PA22引脚(对应Y16通道)。自电容检测的原理是在触摸电极与地之间形成一个寄生电容,当手指接近时,人体电容叠加到寄生电容上,导致电容量增加,通过测量电容量变化即可检测触摸事件。
触摸通道配置:
- 触摸引脚:PA22
- Y通道:Y16
- 传感器类型:NODE_SELFCAP(自电容模式)
- 检测阈值:20
- 迟滞:HYST_25(25%迟滞)
板载LED连接至PA15引脚,采用低电平有效配置(LED阳极接电源,阴极接PA15,PA15输出低电平时LED点亮)。
LED配置:
- LED引脚:PA15
- 控制方式:高/低电平切换
- 初始状态:LED点亮(表示系统上电正常)
2.4 开发环境
组件 | 说明 |
IDE | MPLAB X IDE |
编译器 | XC32 Compiler |
配置工具 | MPLAB Code Configurator (MCC) |
调试器 | 板载EDBG调试器 |
开发板 | EV41C56A |
3. 方案设计与框图
3.1 系统架构

3.2 信号流程

3.3 项目设计思路
触摸检测原理
·本项目采用自电容检测模式(PTC Self-Capacitance Mode)。在自电容模式下,每个触摸电极独立测量其与地之间的电容量。测量过程采用电荷转移技术(Charge Transfer),通过一系列精确控制的开关将电荷从待测电容转移到采样电容,然后测量采样电容上的电压变化来推算待测电容的容值。
测量周期配置:
- 测量周期:20ms
- 校准模式:自动校准(CAL_AUTO_TUNE_NONE)
- 滤波器等级:FILTER_LEVEL_16(16次平均)
频谱跳变技术
为提高抗干扰能力,QTouch库采用了频谱跳变(Frequency Hopping)技术。系统会在多个频率点进行测量,然后通过中值滤波算法筛选出正确的测量值。本项目配置为3个频率点跳变。
4. 软件设计
软件流程图

关键代码分析
触摸状态机实现
/* 状态机类型定义 */
typedef enum {
TOUCH_IDLE, /* 等待触摸状态 */
TOUCH_DETECTED, /* 触摸检测到,等待确认 */
TOUCH_ACTIVE, /* 触摸已确认有效 */
TOUCH_RELEASE_PENDING /* 触摸释放,等待确认 */
} touch_state_t;
/* 状态机变量 */
static touch_state_t touch_state = TOUCH_IDLE;
static uint8_t touch_confirm_count = 0;
/* 滤波阈值定义 */
#define TOUCH_CONFIRM_THRESHOLD 3 /* 连续3次确认才认为有效触摸 */
#define RELEASE_CONFIRM_THRESHOLD 3 /* 连续3次确认才认为有效释放 */
触摸检测核心代码
/* 等待测量完成标志 */
if (measurement_done_touch == 1u)
{
measurement_done_touch = 0u; /* 清除标志 */
/* 获取按键0的状态并检测触摸 */
uint8_t key_status = get_sensor_state(0) & KEY_TOUCHED_MASK;
bool is_touched = (key_status != 0);
/* 状态机处理 */
switch (touch_state)
{
case TOUCH_IDLE:
if (is_touched)
{
touch_confirm_count = 1;
touch_state = TOUCH_DETECTED;
}
break;
case TOUCH_DETECTED:
if (is_touched)
{
touch_confirm_count++;
if (touch_confirm_count >= TOUCH_CONFIRM_THRESHOLD)
{
/* 确认有效触摸,切换LED状态 */
touch_state = TOUCH_ACTIVE;
led_state = !led_state;
if (led_state)
GPIO_PA15_Set(); /* LED亮 */
else
GPIO_PA15_Clear(); /* LED灭 */
}
}
else
{
/* 触摸中断,取消确认 */
touch_confirm_count = 0;
touch_state = TOUCH_IDLE;
}
break;
case TOUCH_ACTIVE:
if (!is_touched)
{
touch_confirm_count = 1;
touch_state = TOUCH_RELEASE_PENDING;
}
break;
case TOUCH_RELEASE_PENDING:
if (!is_touched)
{
touch_confirm_count++;
if (touch_confirm_count >= RELEASE_CONFIRM_THRESHOLD)
{
touch_confirm_count = 0;
touch_state = TOUCH_IDLE;
}
}
else
{
touch_confirm_count = 0;
touch_state = TOUCH_ACTIVE;
}
break;
}
}
触摸库初始化
触摸库的初始化在 touch_init() 函数中完成,主要包括:
void touch_init(void)
{
/* 配置RTC定时器,触发周期性触摸测量 */
touch_timer_config();
/* 配置触摸传感器 */
(void)touch_sensors_config();
}
QTouch库配置参数
参数名 | 配置值 | 说明 |
DEF_TOUCH_MEASUREMENT_PERIOD_MS | 20 | 测量周期20ms |
DEF_SENSOR_TYPE | NODE_SELFCAP | 自电容模式 |
DEF_PTC_CAL_OPTION | CAL_AUTO_TUNE_NONE | 自动校准关闭 |
DEF_NUM_CHANNELS | 1 | 单通道 |
DEF_NUM_SENSORS | 1 | 单按键 |
DEF_TOUCH_DET_INT | 4 | 触摸去抖计数器 |
DEF_ANTI_TCH_DET_INT | 5 | 释放去抖计数器 |
NUM_FREQ_STEPS | 3 | 3频率跳变 |
DEF_TOUCH_DET_INT | 4 | 触摸确认阈值 |
5. 功能展示
本项目实现了"触摸开关"功能,具体行为如下:
操作 | LED状态 | 说明 |
系统上电 | LED亮 | 表示系统初始化正常 |
首次触摸传感器 | LED灭 | 触摸确认后执行关闭操作 |
手指离开传感器 | 保持灭 | 等待下一次触摸 |
再次触摸传感器 | LED亮 | 触摸确认后执行点亮操作 |
手指离开传感器 | 保持亮 | 等待下一次触摸 |
效果展示:

6. 心得体会
通过本项目的实践,获得了以下技术层面的收获:
- 深入理解电容式触摸检测原理
- 理解了自电容与互电容两种检测模式的区别和适用场景
- 掌握了电荷转移技术的原理和实现方式
- 学习了频谱跳变技术的抗干扰原理
- 掌握QTouch库的使用方法
- 学会了如何配置触摸通道和参数
- 掌握了库提供的API函数及其使用方法
- 理解了测量周期、校准、去抖等核心概念
- 实践状态机设计思想
- 理解了状态机在嵌入式系统中的重要作用
- 学会了将复杂逻辑分解为有限状态的思路
- 掌握了使用枚举和switch-case实现状态机的方法
- 了解TrustZone安全架构
- 对ARM Cortex-M23的TrustZone特性有了初步认识
- 理解了安全世界与非安全世界的边界和交互方式