Funpack5-2 - 基于EV41C56A实现触摸按键控制LED
该项目使用了EV41C56A,实现了触摸按键控制LED的设计,它的主要功能为:触摸按键控制LED。
标签
Funpack5-2
EV41C56A
触摸按键
BBBxue
更新2026-06-16
8

1. 项目介绍

1.1 项目背景

随着智能家居和物联网设备的快速发展,人机交互方式也在不断演进。触摸按键作为一种非机械接触式的输入方式,相比传统机械按键具有寿命长、密封性好、反应灵敏等优势,被广泛应用于各种电子产品中。本项目基于Microchip EV41C56A开发板,利用其内置的PTC(Peripheral Touch Controller)外设实现电容式触摸按键检测,并通过触摸事件控制板载LED的亮灭状态。

1.2 项目目标

本项目实现了以下功能目标:

  • 单次触摸点亮LED:用户触摸触摸按键一次,板载LED点亮
  • 再次触摸关闭LED:用户再次触摸触摸按键,LED熄灭
  • 稳定可靠的触摸检测:通过软件滤波和状态机设计,确保触摸检测的稳定性和抗干扰能力
  • 完善的去抖机制:避免触摸过程中的抖动和误触发,实现"触摸一次,动作一次"的精确控制

1.3 项目意义

本项目作为嵌入式触摸技术的入门实践,具有以下意义:

  1. 掌握PTC触摸检测原理:通过实际项目深入理解电容式触摸检测的工作机制,包括电荷转移、自电容测量等技术细节
  2. 学习Microchip QTouch库的使用:掌握Microchip官方提供的QTouch库API和配置方法
  3. 实践状态机设计:通过四状态滤波状态机的设计,体会状态机在嵌入式系统中的应用价值
  4. 理解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 系统架构
0

3.2 信号流程
0

3.3 项目设计思路

触摸检测原理

·本项目采用自电容检测模式(PTC Self-Capacitance Mode)。在自电容模式下,每个触摸电极独立测量其与地之间的电容量。测量过程采用电荷转移技术(Charge Transfer),通过一系列精确控制的开关将电荷从待测电容转移到采样电容,然后测量采样电容上的电压变化来推算待测电容的容值。

测量周期配置

  • 测量周期:20ms
  • 校准模式:自动校准(CAL_AUTO_TUNE_NONE)
  • 滤波器等级:FILTER_LEVEL_16(16次平均)

频谱跳变技术

为提高抗干扰能力,QTouch库采用了频谱跳变(Frequency Hopping)技术。系统会在多个频率点进行测量,然后通过中值滤波算法筛选出正确的测量值。本项目配置为3个频率点跳变。

4. 软件设计

软件流程图
0

关键代码分析

触摸状态机实现

/* 状态机类型定义 */
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. 心得体会

通过本项目的实践,获得了以下技术层面的收获:

  1. 深入理解电容式触摸检测原理
    • 理解了自电容与互电容两种检测模式的区别和适用场景
    • 掌握了电荷转移技术的原理和实现方式
    • 学习了频谱跳变技术的抗干扰原理
  1. 掌握QTouch库的使用方法
    • 学会了如何配置触摸通道和参数
    • 掌握了库提供的API函数及其使用方法
    • 理解了测量周期、校准、去抖等核心概念
  1. 实践状态机设计思想
    • 理解了状态机在嵌入式系统中的重要作用
    • 学会了将复杂逻辑分解为有限状态的思路
    • 掌握了使用枚举和switch-case实现状态机的方法
  1. 了解TrustZone安全架构
    • 对ARM Cortex-M23的TrustZone特性有了初步认识
    • 理解了安全世界与非安全世界的边界和交互方式
附件下载
Funpack-breath.zip
团队介绍
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号