1 项目背景与目标
1.1 项目背景
电容式触摸检测技术凭借其无需机械部件、密封性好、外观美观等优势,已广泛应用于各类消费电子和工业控制产品中。Microchip推出的PIC32CM5164LS00048是一款集成PTC外设的32位Cortex-M23微控制器,内置QTouch库支持自电容和互电容两种测量模式,适用于从简单按键到复杂触控界面的多种应用场景。
本项目源自Funpack 5-2任务一,要求使用EV41C56A(即PIC32CM5164LS00048评估板)实现触摸控制LED的功能设计。
1.2 项目目标
本项目需要实现以下具体目标:
- 配置PTC外设自电容测量模式,实现单键触摸传感器(Touch Key 0)的初始化与数据采集
- 通过RTC定时器每20ms触发一次触摸测量周期,完成连续触摸状态的实时跟踪
- 实现上升沿检测算法,在手指触摸瞬间(即从无触摸变为有触摸的瞬间)产生LED反转控制信号
- LED指示灯采用低电平有效的驱动方式,初始状态为熄灭
2 硬件设计
微控制器介绍
系统核心采用PIC32CM5164LS00048微控制器,其主要参数如下:
- 内核:ARM Cortex-M23(ARMv8-M架构),支持TrustZone安全扩展
- 主频:最高48MHz
- Flash:512KB
- SRAM:64KB
- PTC通道:支持自电容(Self-cap)和互电容(Mutual-cap)两种测量模式
- 定时器:包含RTC、TC、TCC等多个定时器外设
- 工作电压:1.8V~3.6V
触摸传感器配置
触摸传感器采用PTC外设的自电容测量模式,具体硬件配置如下:
配置项 | 参数值 |
测量模式 | Self-cap(自电容) |
X电极 | 无(X_NONE) |
Y电极 | Y16引脚 |
充电延迟(CSD) | 0 |
分频器(PRSC) | PRSC_DIV_SEL_4(4分频) |
模拟增益 | GAIN_1 / GAIN_1 |
数字滤波器 | FILTER_LEVEL_16(16级滤波) |
传感器数量 | 1 |
自电容测量原理为测量单个感应电极对地的电容变化。当手指接近电极时,人体作为导体并联到地,相当于增加了感应电极对地的有效电容值。PTC通过测量充电时间的变化量来检测这一电容增量——充电时间增加表明电容增大,即发生了触摸事件。
触摸传感器的灵敏度主要由以下几个参数共同决定:
- 节点阈值(Threshold):设为20,是判断触摸是否成立的核心判定门限
- 迟滞(Hysteresis):HYST_25,提供25%的迟滞量以防止边界振荡
- 防抖计数器(DET_INT):4次连续测量确认,用于过滤偶发的电气噪声干扰
LED驱动电路
LED指示灯连接在PA15引脚,配置为通用输出模式(GPIO Mode)。电路采用直接驱动方式:GPIO输出高电平时LED点亮,输出低电平时LED熄灭。
3 软件架构设计
3.1 总体架构
系统软件基于Microchip Harmony 3框架开发,采用TrustZone安全技术将代码部署在两个隔离的运行世界中。安全项目和非安全项目之间的跳转通过ARM Cortex-M23提供的TrustZone接口实现。启动阶段,非安全项目完成系统初始化后,通过TZ_START_NS地址处存储的向量表信息获取安全项目的复位处理函数地址,随后将控制权转移至安全项目。安全项目负责用户交互逻辑(触摸检测与LED控制),负责底层的触摸数据采集与处理。
3.2 触摸处理流程
触摸数据的采集和处理涉及多个软件模块的协作,整个流程如下:
测量触发阶段
RTC定时器以20ms为周期产生中断,在中断处理函数rtc_cb()中调用touch_timer_handler()。后者设置内部标志位time_to_measure_touch_var = 1,通知触摸处理模块可以启动新一轮测量,同时通过qtm_update_qtlib_timer()更新QTouch库的内部时间计数。
数据采集阶段
主循环中每次迭代调用touch_process()函数。该函数首先检查time_to_measure_touch_var标志位,若为1则调用qtm_ptc_start_measurement_seq()启动PTC序列测量。PTC外设完成一次完整的充电-测量周期后,通过回调函数qtm_measure_complete_callback()设置touch_postprocess_request标志。
数据后处理阶段
紧接着在同一次touch_process()调用中,若检测到touch_postprocess_request == 1,则依次执行以下处理步骤:
调用qtm_acquisition_process()进行采集模块级别的后处理
调用qtm_freq_hop_autotune()执行频率跳频自动调谐,以提升抗噪声能力
调用qtm_key_sensors_process()进行按键传感器级别的处理,完成触摸状态判定
若传感器处于持续触发状态(QTM_KEY_REBURST标志置位),则立即设置time_to_measure_touch_var再次启动测量;否则设置measurement_done_touch = 1通知主循环测量已完成
应用层处理
主循环检测到measurement_done_touch == 1后,调用get_sensor_state(TOUCH_SENSOR_KEY_0)读取触摸传感器当前状态,通过KEY_TOUCHED_MASK判断传感器是否处于触摸状态。随后执行上升沿检测:若当前为触摸状态(touch_is_detected == true)且上一轮为非触摸状态(touch_was_detected == false),则说明发生了"手指按下"事件,此时调用LED_Toggle()反转LED状态。
3.3 LED控制模块
LED控制模块完全独立于触摸处理逻辑,采用枚举类型定义LED状态:
typedef enum {
LED_OFF,
LED_ON
} LedState;
模块提供两个函数:
- LED_Init():将PA15配置为输出模式,并设置初始状态为熄灭(低电平)
- LED_Toggle():将LED状态在ON和OFF之间反转,并同步更新s_ledState变量
这种将LED状态抽象为独立模块的设计有以下优点:LED相关变量(如s_ledState)不会暴露给其他模块,降低了命名冲突和意外修改的风险;驱动电路的物理电平逻辑(低电平点亮)与应用层的逻辑状态(LED_ON)通过模块接口进行了隔离。
4 关键代码实现
4.1 触摸初始化
触摸初始化在touch.c中实现,由安全世界代码调用:
void touch_init(void)
{
touch_timer_config();
(void)touch_sensors_config();
}
touch_timer_config()函数完成RTC定时器配置:以DEF_TOUCH_MEASUREMENT_PERIOD_MS(20ms)为周期设置比较匹配值,注册RTC回调函数rtc_cb(),启动32位定时器计数。
sensors_config()函数依次完成以下初始化操作:初始化PTC采集模块,分配原始信号内存,为每个传感器节点使能测量并触发首次校准,最后初始化按键传感器并分配对应的节点。
4.2 触摸处理主循环
while (true) {
touch_process();
if (measurement_done_touch == 1u) {
measurement_done_touch = 0u;
uint8_t key_status = get_sensor_state(TOUCH_SENSOR_KEY_0);
bool touch_is_detected = (bool)(key_status & KEY_TOUCHED_MASK);
if (touch_is_detected && !touch_was_detected) {
LED_Toggle();
}
touch_was_detected = touch_is_detected;
}
}
上述代码体现了系统设计的核心逻辑:以measurement_done_touch为同步信号,每次触摸测量完成后处理一次LED控制。上升沿检测算法(touch_is_detected && !touch_was_detected)确保LED状态翻转只在手指刚触碰传感器的瞬间发生,而非在手指持续按住期间重复触发。touch_was_detected变量在主循环内部声明为局部变量,避免了多任务环境下的竞争条件。
5 配置参数分析
5.1 时间参数
参数名 | 配置值 | 说明 |
DEF_TOUCH_MEASUREMENT_PERIOD_MS | 20ms | 两次触摸测量之间的间隔 |
DEF_TCH_DRIFT_RATE | 20(单位200ms) | 触摸释放后参考值向信号值靠近的速率 |
DEF_ANTI_TCH_DRIFT_RATE | 5(单位200ms) | 触摸按下时参考值向信号值靠近的速率 |
DEF_DRIFT_HOLD_TIME | 20(单位200ms) | 任一传感器被激活时抑制所有传感器漂移的时间 |
5.2 触摸检测参数
参数名 | 配置值 | 说明 |
DEF_TOUCH_DET_INT | 4 | 确认触摸所需的连续检测次数 |
DEF_ANTI_TCH_DET_INT | 5 | 确认释放所需的连续检测次数 |
DEF_ANTI_TCH_RECAL_THRSHLD | RECAL_100 | 触发自动校准的信号偏离阈值 |
DEF_MAX_ON_DURATION | 0 | 触摸最大持续时间(0表示不限制) |
5.3 频率跳频配置
参数名 | 配置值 | 说明 |
NUM_FREQ_STEPS | 3 | 频率跳频步数 |
FREQ_AUTOTUNE_MAX_VARIANCE | 25 | 自动调谐允许的最大方差 |
FREQ_AUTOTUNE_COUNT_IN | 6 | 自动调谐的采样计数 |
6 效果展示
触摸按键实现LED的翻转:

7 总结
本项目成功实现了一个基于PIC32CM5164LS00048微控制器的触摸控制LED系统,在TrustZone安全架构下完成了稳定可靠的触摸检测与LED驱动功能。系统以20ms为测量周期,通过上升沿检测算法在手指触摸瞬间精确触发LED状态反转,响应延迟控制在20~40ms范围内,满足人机交互的舒适性要求。