Funpack5-2 - 用Microchip PIC32实现触摸按键控制LED灯
该项目使用了Microchip PIC32微控制器,实现了控制板载LED灯亮灭和呼吸效果的设计,它的主要功能为:通过触摸按键和PWM控制板载LED灯。
标签
嵌入式系统
Funpack活动
Microchip
PIC32
触摸按键
枫雪天
更新2026-06-17
7

任务介绍

本项目实现了Funpack活动PIC32CM LS00 Curiosity Nano + Touch Evaluation Kit板卡的自命题任务,基于PIC32CM LS00开发板的板载PTC触摸按键,结合TCC0定时器的PWM输出功能,实现了对板载LED灯的开关控制与亮度调节。用户可通过短按触摸键切换LED开关状态,长按触摸键则触发亮度自动渐变调节,串口同步输出当前操作日志。

硬件平台

本次使用Microchip推出的PIC32CM LS00 Curiosity Nano + Touch Evaluation Kit开发板,是一款面向低功耗安全嵌入式开发的综合评估平台。该开发板搭载了基于ARM Cortex-M23内核的PIC32CM LS00系列MCU,具备TrustZone安全隔离特性,片上集成PTC(外设触摸控制器)、TCC定时器/计数器、RTC实时时钟、SERCOM多功能串行接口等丰富外设,非常适合用于触摸交互与低功耗控制场景的原型开发。开发板集成了板载调试器(PKOB Nano)、USB接口、用户可编程LED与PTC触摸电极,便于快速验证触摸感应与PWM驱动功能。

在软件方面,本项目基于MPLAB Harmony v3框架进行开发,使用MCC(MPLAB Code Configurator)完成外设图形化配置,并在裸机(Bare-metal)环境下实现主循环驱动的触摸检测与PWM亮度控制。

g387.png

主控设备:Microchip PIC32CM LS00 Curiosity Nano开发板

  • 搭载PIC32CM LS00 MCU(ARM Cortex-M23,支持TrustZone)
  • 集成板载PKOB Nano调试器与USB接口
  • 板载用户可编程LED(PA15,由TCC0 WO5驱动)
  • 板载PTC触摸电极(PA22,Y16信号)
  • 支持Harmony v3 + MCC图形化外设配置

核心外设资源

  • TCC0:PWM模式,驱动LED亮度控制,PWM频率2500 Hz
  • PTC:外设触摸控制器,采集触摸按键状态
  • RTC:为Touch Library提供定时基准
  • SERCOM3:UART模式,用于串口调试输出

任务分析与实现

本系统实现了基于PTC触摸感应与TCC0 PWM输出的LED调光控制平台,主要功能包括:

两路交互通道:

  • 触摸输入采集
    • 触摸扫描周期:2ms轮询(主循环节拍)
    • 支持短按(开关)与长按(调光)两种操作模式
    • 长按判定阈值:500个扫描周期(约1秒)
  • LED PWM亮度控制
    • PWM频率:2500 Hz,周期值:2400(代码中PWM_PERIOD_VALUE = 2399u
    • 亮度调节步进:5%,调节间隔:20个扫描周期
    • 亮度范围:0%(熄灭)~100%(全亮),支持自动往返渐变

方案框图:

工程配置过程

本项目基于MPLAB Harmony v3框架,借助MCC(MPLAB Code Configurator)完成所有外设的图形化配置,以下详细描述关键配置流程与核心要点。

一、外设配置前的准备

1. 硬件环境

  • 主控芯片:Microchip PIC32CM LS00(ARM Cortex-M23,TrustZone)
  • 开发板:PIC32CM LS00 Curiosity Nano + Touch Evaluation Kit
  • 外设资源
    • TCC0 PWM通道(TCC0_WO5,PA15)用于驱动板载LED
    • PTC触摸控制器(PA22,Y16)采集触摸输入
    • SERCOM3 UART用于串口调试输出
    • RTC为Touch Library提供定时基准

2. 软件环境

  • 开发框架:MPLAB Harmony v3
  • 配置工具:MPLAB Code Configurator(MCC)
  • 编译工具链:XC32编译器
  • IDE:MPLAB X IDE




二、MCC外设图形化配置

1. Project Graph 总览

在MCC的Project Graph中完成所有外设模块的连接与配置。本项目使用的核心外设连接关系如下图所示:

  • SERCOM3 的UART接口连接至 Secure STDIO,实现串口调试输出
  • TCC0 配置为PWM模式,同时提供PWM与TMR两路输出,用于LED亮度控制
  • PTC(Acq_Engine)与 RTC(TMR)分别连接至 Touch Library(Peripheral Touch Controller),为触摸检测提供采集引擎和定时基准

上图为MCC Project Graph配置界面,清晰展示了SERCOM3→Secure STDIO、TCC0 PWM、PTC+RTC→Touch Library的外设连接拓扑。

2. TCC0 PWM参数配置

TCC0是驱动板载LED的核心定时器外设,在MCC中将其Operating Mode设置为PWM模式,关键参数配置如下:

  • Select PWM Type:DSTOP
  • Period Value:2,400(对应代码中PWM_PERIOD_VALUE = 2399u,即周期计数值)
  • PWM频率:由MCC自动计算显示为 2500 Hz
  • 预分频:No division(不分频,直接使用系统时钟)

上图为TCC0外设配置界面,PWM Type选择DSTOP,Period Value设为2400,MCC实时计算并提示PWM频率为2500 Hz,与代码中PWM_PERIOD_VALUE宏定义保持一致。

在代码中,PWM占空比的换算公式为:

uint32_t compare_value = ((uint32_t)PWM_PERIOD_VALUE * duty_percent) / 100u;
TCC0_PWM24bitDutySet(TCC0_CHANNEL1, compare_value);

通过将亮度百分比(0~100)线性映射至比较寄存器值,实现精确的亮度控制。

3. PTC 触摸按键配置

在MCC的Touch Configuration工具中完成PTC触摸传感器的配置。在Configure → Sensor Pins页面中,为Button 0分配Y信号引脚:

  • Sensor:Button 0
  • Y-Signals:Y16(PA22)

上图为Touch Configuration工具的Sensor Pins配置界面,Button 0对应的Y信号被分配至Y16(PA22),与开发板Touch Evaluation Kit扩展板的触摸电极物理连接一致。

4. 引脚复用配置(Pin Configuration)

在MCC的引脚配置表中完成关键引脚的功能复用分配:

  • PA15(第24号引脚):命名为LED1_PWM,功能复用为TCC0_WO5,作为PWM输出驱动板载LED
  • PA22(第31号引脚):功能复用为PTC_X16/Y16,配置为Analog模式,作为触摸感应输入

上图为引脚配置表,PA15被分配为TCC0_WO5的PWM输出引脚(标注为LED1_PWM),PA22被配置为PTC模拟输入引脚(PTC_X16/Y16),两处引脚复用配置是硬件功能正常运行的基础。




三、软件架构设计

1. 触摸按键有限状态机(touch_key.c)

触摸按键处理模块基于四状态FSM(有限状态机)实现,状态定义如下:

typedef enum {
KEY_IDLE, // 空闲,等待触摸
KEY_PRESSED, // 已按下,判断长短按
KEY_LONG_PRESSING, // 长按持续中,执行调光
KEY_WAIT_RELEASE // 等待释放
} KEY_FSM_STATE;

关键时序参数:

参数

宏定义

数值

长按判定阈值

LONG_PRESS_THRESHOLD

500个周期(≈1s)

调光步进间隔

BRIGHTNESS_STEP_INTERVAL

20个周期(≈40ms/步)

短按触发LED_PWM_Toggle(),切换LED开关状态;长按进入KEY_LONG_PRESSING状态,周期性调用LED_PWM_AdjustBrightness(),实现亮度自动往返渐变。

触摸状态通过读取get_sensor_state(0)返回值的最高位(KEY_TOUCHED_MASK = 0x80)判断是否被触摸:

static uint8_t Touch_Key_IsTouched(void)
{
uint8_t state = get_sensor_state(0);
return (state & KEY_TOUCHED_MASK) ? 1u : 0u;
}

2. LED PWM控制模块(led_pwm.c)

LED状态通过结构体LED_STATE集中管理:

typedef struct {
LED_POWER_STATE power; // LED开关状态(LED_ON / LED_OFF)
uint8_t brightness; // 当前亮度百分比(0~100)
BRIGHTNESS_DIR direction; // 调光方向(DIR_UP / DIR_DOWN)
} LED_STATE;

亮度渐变逻辑(LED_PWM_AdjustBrightness())实现了自动往返效果:当亮度递增至BRIGHTNESS_MAX(100%)时,方向切换为DIR_DOWN;递减至BRIGHTNESS_MIN(0%)时,方向切换回DIR_UP,步进幅度为BRIGHTNESS_STEP = 5%

3. 主循环(main.c)

系统主循环以2ms为节拍,依次执行触摸数据采集与按键状态处理:

while (true)
{
SYSTICK_DelayMs(2);
touch_process(); // PTC触摸数据采集与处理
Touch_Key_Process(); // 触摸按键FSM处理与LED控制
}

系统启动后串口输出操作提示:

================================
PIC32CM LS00 Touch Dimmer
Short press : LED ON/OFF
Long press : Adjust brightness
================================

4. 软件流程图

效果展示

系统上电后,串口终端显示初始化日志,LED默认熄灭。单次轻触板载PTC触摸电极,LED以满亮度(100%)点亮,再次短按则熄灭;持续按压触摸电极超过约1秒后,LED亮度开始以5%为步进自动往返渐变,松开手指后亮度保持在当前值,串口同步打印每次操作的状态信息。

串口输出

遇到的难题与解决办法

问题:PTC触摸检测抖动,短按偶尔被误判为长按

解法

在触摸检测与按键处理过程中,需重点关注以下几点:

  • 主循环节拍与Touch Library扫描周期的匹配,本项目将SYSTICK_DelayMs(2)作为统一节拍,确保touch_process()调用频率稳定
  • LONG_PRESS_THRESHOLD(500)与BRIGHTNESS_STEP_INTERVAL(20)两个时序参数需根据实际扫描周期综合调整,避免触摸灵敏度与响应延迟之间的矛盾
  • TCC0 PWM的Period Value与代码中PWM_PERIOD_VALUE宏定义需保持严格一致(MCC配置2400,代码中2399u),两者差1是因为计数器从0开始,需特别注意

活动感想

通过本项目实践,深入掌握了Microchip PIC32CM LS00平台上PTC触摸控制器与TCC0 PWM外设的联合应用方法,熟悉了MPLAB Harmony v3框架下MCC图形化配置工具的完整使用流程,包括Project Graph外设连接、触摸传感器引脚分配、PWM参数计算以及引脚复用配置。PIC32CM LS00开发板集成的PTC触摸控制器免去了外部触摸IC的成本,配合Touch Library可以快速实现高可靠性的触摸交互功能,令人印象深刻。整个项目过程中,体会到嵌入式系统中硬件配置、底层驱动与应用逻辑需要紧密协作,每一个参数的精细调整都能显著影响用户的实际交互体验。

再次感谢硬禾学堂和得捷电子联合举办的Funpack活动,祝硬禾的活动越办越好!

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