内容介绍
内容介绍
EV41C56A 触摸输入与无级调光 LED 控制系统设计报告
一、 项目介绍
触摸输入与LED控制
功能要求:
- 通过 PWM 控制 LED 亮度
- 短按:LED 开 / 关
- 长按:连续调节亮度,并按照【亮度从“灭 → 最亮”线性变化;当到达最亮后,保持长按可实现“最亮 → 灭”反向变化】的逻辑循环
- 亮度变化过程应平滑(无明显闪烁或跳变)
系统需精确区分用户的“短按”与“长按”操作:
- 短按控制:实现板载 LED 的状态翻转(即单次触摸开启,再次触摸关闭)。
- 长按调光:在长按状态下,通过脉宽调制(PWM)技术对 LED 进行无级调光,亮度按照“灭 → 最亮 → 灭”的逻辑线性循环变化;用户在任意亮度松手,系统需锁定并记忆当前亮度,以便下一次开启时恢复。
本报告将详细阐述该系统的硬件基础、非阻塞式软件架构设计、状态机逻辑以及在开发过程中遇到的技术难点与解决方案。
二、 使用到的硬件介绍
本项目的硬件架构较为精简,主要依托 EV41C56A 开发板的板载资源,无需额外搭建外围电路,核心硬件模块如下:
- 主控 MCU (Microchip 32-bit MCU): EV41C56A 搭载了支持 TrustZone 技术的 32 位微控制器。该芯片具备高效的指令集与丰富的外设资源,能够在极低功耗下维持系统的实时性。其内核性能足以支撑高频的定时器中断(用于软件 PWM 生成)以及底层的触摸扫描算法。
- 外设触摸控制器(PTC - Peripheral Touch Controller): PTC 是 Microchip 芯片内置的专用硬件模块,用于执行高精度的电容触摸测量。与传统的软件轮询充放电方案不同,PTC 能够在硬件层面自动完成自电容/互电容的采集、基线跟踪以及环境噪声抑制,极大降低了 CPU 的开销。本项目使用了板载的 Sensor 0 通道作为输入捕获端。
- 板载 LED 与 GPIO 输出(PA15): 系统通过主控引脚(PA15)直接驱动板载 LED。由于该引脚在硬件上未直接映射至 MCU 的硬件 PWM 外设,因此本项目采用通用定时器(TC0)结合 GPIO 翻转的方式,通过软件实现 PWM 波形的输出,以达到调节平均电流、控制亮度的目的。

三、 方案框图和项目设计思路介绍
1. 系统软硬件总体方案框图
系统采用分层与模块化的设计思想,数据流向清晰,主要分为三个核心模块:
- 数据采集层(输入):PTC 模块按照设定的周期扫描 Sensor 0 触摸按键。当一次完整的测量周期结束后,PTC 会向应用层抛出
measurement_done_touch标志位。 - 业务逻辑层(处理):主循环捕获到测量完成标志后,进入状态机逻辑
touch_logic_process()。该层利用时间累加器(press_duration)对按键时长进行量化,判定当前操作属于“消抖/短按”还是“长按”,并据此更新系统状态变量(如 LED 使能标志led_enabled与 占空比变量pwmDuty)。 - 驱动执行层(输出):TC0 定时器产生高频中断,在中断服务函数内部,根据业务层下发的
pwmDuty实时调整 PA15 引脚的电平状态,生成驱动 LED 的软件 PWM 波。

2. 非阻塞式架构与状态机设计思路
在嵌入式开发中,处理按键最忌讳使用死循环延时(如 delay())。若在长按调光期间阻塞 CPU,将导致 PTC 扫描停止,系统失去对触摸释放动作的响应能力。因此,本项目确立了完全非阻塞(Non-blocking)的设计原则:
- 时间切片(Time Slicing):依托 QTouch 库的固有扫描周期,将每一次
measurement_done_touch视为一个固定的时间滴答(Tick)。 - 状态机(State Machine):系统在“空闲”、“按下计时”、“长按调光”、“按键释放”四个状态之间平滑跃迁。通过设立独立的计数值和状态标志位,主程序每次进入逻辑函数只需执行极少量的条件判断即可退出,将 CPU 资源最高效地分配给底层测量与中断响应。
四、 调试软件介绍、软件流程图及关键代码介绍
1. 调试软件与工具链
本项目基于 Microchip 官方集成开发环境 MPLAB X IDE 进行编译与调试。为提高底层驱动的开发效率,使用了 MPLAB Harmony v3 (MCC) 代码配置器。通过 MCC 的图形化界面,完成了系统时钟树配置、PA15 引脚初始化、TC0 定时器周期设定,并一键集成了 QTouch 模块的底层驱动代码。这使得我能够将主要精力集中于上层应用逻辑的开发。
2. 软件运行流程图
整个系统的执行流程遵循以下时序:
- 系统初始化:调用
SYS_Initialize完成硬件与外设的初始化;注册定时器回调函数pwm_timer_callback并启动 TC0 定时器;调用touch_init()初始化 PTC 模块。 - 主循环调度 (Super Loop):
- 循环调用
touch_process()维持 QTouch 库的底层状态更新。 - 轮询判断标志位
if(measurement_done_touch == 1u)。 - 条件满足时,清零标志位,执行核心状态机
touch_logic_process()。
- 循环调用
- 状态机判定逻辑:
- 按下检测:累加
press_duration。若此时长超过阈值(20),则判定为长按,置位is_long_pressing,同时按设定的步长(duty_step)递增或递减pwmDuty。当占空比触及上下限时,对duty_step符号取反,实现乒乓调光。 - 释放检测:当传感器状态变为未触摸,且
press_duration > 0时,触发释放逻辑。如果此时is_long_pressing为假(即按下时间未达到长按阈值),则翻转led_enabled状态(短按开关);最后清零时长变量和长按标志位。
- 按下检测:累加
- 中断异步输出:TC0 定时器在后台高频运行,依据最新的
pwmDuty决定当前周期的 LED 引脚电平。
3. 关键代码说明
(1)基于定时器中断的软件 PWM 实现
void pwm_timer_callback(TC_TIMER_STATUS status, uintptr_t context)
{
// 定时器计数器自增,形成 0 到 PWM_PERIOD (200) 的周期循环
if (++timerCounter >= PWM_PERIOD) {
timerCounter = 0;
}
if (!led_enabled) {
LED_OFF; // 系统处于关闭状态时,强制输出低电平
} else {
// PWM 核心:计数值小于占空比阈值时输出有效电平
(timerCounter < pwmDuty) ? LED_ON : LED_OFF;
}
}
- 解析:此函数由定时器硬件触发,独立于主循环运行。
PWM_PERIOD定义了 PWM 的分辨率(200级)。通过实时比对timerCounter和pwmDuty,在无专用硬件 PWM 的情况下,实现了高度平滑且不占用 CPU 等待时间的占空比控制。
(2)触摸逻辑控制与状态解耦
void touch_logic_process(void)
{
uint8_t key_status = get_sensor_state(0) & KEY_TOUCHED_MASK;
bool is_touched = (key_status != 0u);
if (is_touched) {
press_duration++; // 触摸维持期间,累加时间
// 长按判定阈值
if (press_duration > LONG_PRESS_THRESHOLD) {
is_long_pressing = true; // 锁定状态为长按
led_enabled = true; // 调光时强制点亮
pwmDuty += duty_step; // 动态调整占空比
// 占空比边界限制与反向逻辑
if (pwmDuty >= PWM_MAX) {
pwmDuty = PWM_MAX;
duty_step = -1;
} else if (pwmDuty <= PWM_MIN) {
pwmDuty = PWM_MIN;
duty_step = 1;
}
}
} else {
// 传感器释放时的结算逻辑
if (press_duration > 0) {
// 仅在未触发长按的前提下,才执行短按状态翻转
if (!is_long_pressing) {
led_enabled = !led_enabled;
}
// 状态机复位
press_duration = 0;
is_long_pressing = false;
}
}
}
- 解析:本段代码解决了人机交互中的“竞争与冒险”问题。通过引入
is_long_pressing标志位,成功将“短按松手”与“长按松手”两种状态分离,避免了长按调光结束后松开手指导致 LED 意外关闭的逻辑缺陷。
五、 功能展示图及说明
开灯状态

关灯状态

系统上电后,稳定运行并满足以下交互预期:
- 短按开关功能测试:
- 动作:手指轻触 Sensor 0 区域并迅速离开(触摸时间 < 400ms)。
- 现象:系统精准捕获单次边缘信号。第一次短按,LED 以默认占空比点亮;第二次短按,LED 立即熄灭。多次高频点击,系统响应迅速,未出现状态机紊乱或误触发。
- 长按调光功能测试:
- 动作:手指接触 Sensor 0 区域并保持停留。
- 现象:系统在判定为长按后,LED 亮度开始呈线性渐变。若初始状态为暗,则逐渐变亮至最高亮度;若手指持续不离开,亮度达到峰值后自动开始平滑变暗。
- 状态记忆:在亮度渐变的任意时刻移开手指,LED 维持当前亮度不变。随后执行短按关闭,再重新短按开启,LED 依然恢复至上次锁定的亮度。
附件下载
LED_touch_secure.X.zip
团队介绍
个人
评论
0 / 100
查看更多
猜你喜欢
Funpack5-2 - 基于EV41C56A实现触摸输入与PWM控制LED该项目使用了Microchip的EV41C56A开发板,实现了触摸输入与PWM控制LED平滑调光的设计,它的主要功能为:触摸短按控制LED开/关;触摸长按,连续调节亮度,并按照【亮度从“灭 → 最亮→ 灭”线性变化】的逻辑循环。
子午鼠
31
Funpack5-2 - 基于Microchip EV41C56A实现触摸按键控制LED该项目使用了Microchip EV41C56A,实现了触摸按键控制LED的设计,它的主要功能为:触摸按键控制LED的亮灭。
波波l
18
Funpack5-2 - 基于PIC32CM LS00 Curiosity Nano+ Touch Evaluation Kit实现两路RGB LED PWM控制该项目使用了PIC32CM5164LS00048,实现了驱动两路RGB LED的设计,它的主要功能为:使用定时器产生PWM信号,控制两路RGB LED分别显示指定颜色。
贪吃蛇
13