Funpack5-2 -基于PIC32CM5164LS00048的触摸控制LED系统设计
该项目使用了PIC32CM,实现了触摸控制LED的设计,它的主要功能为:使用touch库实现触摸控制LED翻转。
标签
Funpack5-2
PIC32
触摸按键
戈壁滩上的辉煌
更新2026-06-16
10

1 项目背景与目标

1.1 项目背景

电容式触摸检测技术凭借其无需机械部件、密封性好、外观美观等优势,已广泛应用于各类消费电子和工业控制产品中。Microchip推出的PIC32CM5164LS00048是一款集成PTC外设的32位Cortex-M23微控制器,内置QTouch库支持自电容和互电容两种测量模式,适用于从简单按键到复杂触控界面的多种应用场景。

本项目源自Funpack 5-2任务一,要求使用EV41C56A(即PIC32CM5164LS00048评估板)实现触摸控制LED的功能设计。

1.2 项目目标

本项目需要实现以下具体目标:

  1. 配置PTC外设自电容测量模式,实现单键触摸传感器(Touch Key 0)的初始化与数据采集
  2. 通过RTC定时器每20ms触发一次触摸测量周期,完成连续触摸状态的实时跟踪
  3. 实现上升沿检测算法,在手指触摸瞬间(即从无触摸变为有触摸的瞬间)产生LED反转控制信号
  4. 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 触摸处理流程

触摸数据的采集和处理涉及多个软件模块的协作,整个流程如下:
0

测量触发阶段

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范围内,满足人机交互的舒适性要求。

附件下载
20260420Test.zip
团队介绍
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号