Funpack5-2 用PIC32CM LS00 Curiosity Nano+ Touch Evaluation Ki 实现触摸输入与LED控制
该项目使用了PIC32CM LS00 Curiosity Nano+ Touch Evaluation Ki,实现了触摸输入与LED控制的设计,它的主要功能为:用PIC32CM LS00 Curiosity Nano+ Touch Evaluation Ki 实现触摸输入与LED控制。
标签
Funpack活动
PIC32CM LS00 Curiosity Nano+ Touch Evaluation Ki
触摸输入与LED控制
冲向天空的猪
更新2026-06-22
14

EV41C56A 触摸输入与无级调光 LED 控制系统设计报告

一、 项目介绍

触摸输入与LED控制

功能要求:

  1. 通过 PWM 控制 LED 亮度
  2. 短按:LED 开 / 关
  3. 长按:连续调节亮度,并按照【亮度从“灭 → 最亮”线性变化;当到达最亮后,保持长按可实现“最亮 → 灭”反向变化】的逻辑循环
  4. 亮度变化过程应平滑(无明显闪烁或跳变)

系统需精确区分用户的“短按”与“长按”操作:

  1. 短按控制:实现板载 LED 的状态翻转(即单次触摸开启,再次触摸关闭)。
  2. 长按调光:在长按状态下,通过脉宽调制(PWM)技术对 LED 进行无级调光,亮度按照“灭 → 最亮 → 灭”的逻辑线性循环变化;用户在任意亮度松手,系统需锁定并记忆当前亮度,以便下一次开启时恢复。

本报告将详细阐述该系统的硬件基础、非阻塞式软件架构设计、状态机逻辑以及在开发过程中遇到的技术难点与解决方案。

二、 使用到的硬件介绍

本项目的硬件架构较为精简,主要依托 EV41C56A 开发板的板载资源,无需额外搭建外围电路,核心硬件模块如下:

  1. 主控 MCU (Microchip 32-bit MCU): EV41C56A 搭载了支持 TrustZone 技术的 32 位微控制器。该芯片具备高效的指令集与丰富的外设资源,能够在极低功耗下维持系统的实时性。其内核性能足以支撑高频的定时器中断(用于软件 PWM 生成)以及底层的触摸扫描算法。
  2. 外设触摸控制器(PTC - Peripheral Touch Controller): PTC 是 Microchip 芯片内置的专用硬件模块,用于执行高精度的电容触摸测量。与传统的软件轮询充放电方案不同,PTC 能够在硬件层面自动完成自电容/互电容的采集、基线跟踪以及环境噪声抑制,极大降低了 CPU 的开销。本项目使用了板载的 Sensor 0 通道作为输入捕获端。
  3. 板载 LED 与 GPIO 输出(PA15): 系统通过主控引脚(PA15)直接驱动板载 LED。由于该引脚在硬件上未直接映射至 MCU 的硬件 PWM 外设,因此本项目采用通用定时器(TC0)结合 GPIO 翻转的方式,通过软件实现 PWM 波形的输出,以达到调节平均电流、控制亮度的目的。image.png

三、 方案框图和项目设计思路介绍

1. 系统软硬件总体方案框图

系统采用分层与模块化的设计思想,数据流向清晰,主要分为三个核心模块:

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

33e23707-e993-46ee-956b-8d22377e2e51.png

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. 软件运行流程图

整个系统的执行流程遵循以下时序:

  1. 系统初始化:调用 SYS_Initialize 完成硬件与外设的初始化;注册定时器回调函数 pwm_timer_callback 并启动 TC0 定时器;调用 touch_init() 初始化 PTC 模块。
  2. 主循环调度 (Super Loop)
    • 循环调用 touch_process() 维持 QTouch 库的底层状态更新。
    • 轮询判断标志位 if(measurement_done_touch == 1u)
    • 条件满足时,清零标志位,执行核心状态机 touch_logic_process()
  3. 状态机判定逻辑
    • 按下检测:累加 press_duration。若此时长超过阈值(20),则判定为长按,置位 is_long_pressing,同时按设定的步长(duty_step)递增或递减 pwmDuty。当占空比触及上下限时,对 duty_step 符号取反,实现乒乓调光。
    • 释放检测:当传感器状态变为未触摸,且 press_duration > 0 时,触发释放逻辑。如果此时 is_long_pressing 为假(即按下时间未达到长按阈值),则翻转 led_enabled 状态(短按开关);最后清零时长变量和长按标志位。
  4. 中断异步输出: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级)。通过实时比对 timerCounterpwmDuty,在无专用硬件 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 意外关闭的逻辑缺陷。

五、 功能展示图及说明

开灯状态

image.png

关灯状态

image.png

系统上电后,稳定运行并满足以下交互预期:

  1. 短按开关功能测试
    • 动作:手指轻触 Sensor 0 区域并迅速离开(触摸时间 < 400ms)。
    • 现象:系统精准捕获单次边缘信号。第一次短按,LED 以默认占空比点亮;第二次短按,LED 立即熄灭。多次高频点击,系统响应迅速,未出现状态机紊乱或误触发。
  2. 长按调光功能测试
    • 动作:手指接触 Sensor 0 区域并保持停留。
    • 现象:系统在判定为长按后,LED 亮度开始呈线性渐变。若初始状态为暗,则逐渐变亮至最高亮度;若手指持续不离开,亮度达到峰值后自动开始平滑变暗。
    • 状态记忆:在亮度渐变的任意时刻移开手指,LED 维持当前亮度不变。随后执行短按关闭,再重新短按开启,LED 依然恢复至上次锁定的亮度。
附件下载
LED_touch_secure.X.zip
团队介绍
个人
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号