Funpack 5-2 EV41C56A 开发板 触摸输入与led控制功能-进阶版
该项目使用了EV41C56A 开发板,实现了触摸输入检测与LED灯控制功能的设计,它的主要功能为:基于 EV41C56A 开发板板载触摸输入按键实现对板载LED灯的控制。
标签
嵌入式系统
Funpack活动
bigjiong
更新2026-06-22
29

一、项目介绍
本项目基于 EV41C56A 开发板完成触摸输入与 LED 控制功能开发,严格实现基础题目要求,并完成进阶题目拓展开发。项目核心利用开发板板载硬件触摸按键作为人机交互输入设备,通过单片机内部触摸检测算法识别触摸、长按等操作指令,结合 GPIO 电平控制与 PWM 脉冲宽度调制技术,实现 LED 的开关控制与亮度平滑调节功能。
项目基础功能为单次触摸点亮 LED,再次触摸关闭 LED;进阶功能在保留短按开关的基础上,实现长按循环调节 LED 亮度:长按状态下亮度从灭线性升至最亮,到达最亮后继续长按则从最亮线性降至灭,循环往复,且亮度变化无闪烁、无跳变,全程平滑过渡。本项目可应用于智能家居触控开关、便携式设备触控调光、工业控制面板等场景,具备低功耗、无机械磨损、交互便捷等优势,完美验证了 EV41C56A 开发板的触摸采集、PWM 输出、GPIO 控制等核心外设功能。
二、硬件介绍
本项目全部使用 EV41C56A 开发板板载硬件资源,无需外接额外元器件,硬件精简可靠,所有硬件模块介绍如下:

EV41C56A 主控芯片项目核心处理单元,是一款高集成度的 32 位单片机,内置专用触摸检测模块、PWM 生成模块、通用 GPIO 模块,具备高精度模数转换功能,可稳定实现触摸信号采集、指令解析、LED 控制等功能,工作功耗低、抗干扰能力强,满足触控类应用的核心需求。
板载触摸按键:开发板集成专用电容式触摸通道,无需物理机械按键,通过人体触摸改变电容值实现信号输入,具备无磨损、响应灵敏、使用寿命长等特点,本项目使用单通道触摸按键完成短按、长按两种操作识别。
板载 LED 指示灯:开发板自带高亮发光二极管,通过 GPIO 引脚高低电平控制亮灭,配合 PWM 模块可实现亮度调节,作为项目唯一输出设备,直观反馈触摸操作结果。

三、方案框图和项目设计思路
1. 方案框图
企业微信截图_17783987646254.png


2. 项目设计思路
本项目采用模块化设计思路,整体分为硬件初始化模块、触摸信号采集与识别模块、LED 控制模块三大核心部分,逻辑清晰、层次分明。

硬件初始化:首先完成系统时钟初始化,为所有外设提供基础时钟;其次初始化触摸通道,配置触摸检测阈值、采样参数,保证触摸识别的准确性;然后初始化 LED 对应的 GPIO 引脚为输出模式,同时初始化 PWM 模块,配置 PWM 频率、占空比控制参数,为亮度调节做准备。
触摸操作识别:程序主循环持续采集触摸通道的状态信号,通过计时判断操作类型:触摸持续时间小于设定阈值判定为短按,大于设定阈值判定为长按,同时添加防抖处理,避免误触发。
LED 控制逻辑
短按逻辑:维护 LED 状态标志位,每次短按切换标志位状态,控制 LED 在亮 / 灭之间切换;
长按逻辑:启动 PWM 占空比动态调节,正向递增占空比实现亮度从灭到最亮,达到最大值后反向递减占空比实现亮度从最亮到灭,循环执行,松手后停止调节并保持当前亮度;

主循环:程序持续运行,循环检测触摸状态,实时响应操作并控制 LED 输出,保证交互的实时性和平滑性。

四、调试软件介绍、软件流程图及关键代码介绍
1. 调试软件介绍
本项目使用MPLAB X IDE开发环境完成代码编写、编译、下载与在线调试,配合 EV41C56A 板载下载器实现程序烧录。


此处将向大家介绍如何一步一步实现项目功能

首先下载并安装mplab x ide

下载地址:https://www.microchip.com/en-us/tools-resources/develop/mplab-x-ide#tabs

企业微信截图_17758755947173.png

下载好之后打开软件

并同事打开两个链接

https://github.com/microchip-pic-avr-examples/pic32cmjh-basic-ptc-mplab-harmony

此链接详细讲解了如何实现触摸按键控制

https://github.com/microchip-pic-avr-examples/pic32cmjh-blink-led-mplab-harmony

此链接详细讲解了如何实现板载LED闪烁的功能


笔者此前使用过stm32 cubeide,nxp mcuxpresso ide,ti ccs ide等不同厂家的ide;不过对于mplab x尚处于

小学生阶段,故考虑先从pic32cmjh-blink-led-mplab-harmony闪烁led相关功能开始入手,一来熟悉mplab操作流程

二来验证功能配置,增强自信心.

话不多说,开始吧.

首先使用mplab ide创建工程

企业微信截图_1778385815818.png

打开mcc确认时钟频率

企业微信截图_17758787608086.png

使能systic

企业微信截图_17783859831694.png

通过查看开发板使用手册https://ww1.microchip.com/downloads/aemDocuments/documents/MCU32/ProductDocuments/UserGuides/PIC32CM-LS00-Curiosity-Nano%2B-Touch-Evaluation-Kit-User-Guide-DS70005567.pdf

得知板载LED连接PA15引脚

企业微信截图_1775879571295.png

使用mcc的pin config功能对PA15进行配置

企业微信截图_17783860513436.png

使用mcc生成基础驱动代码

企业微信截图_1775879718131.png

修改secure工程main.c文件源代码,添加led闪烁控制相关内容,并正确编译

int main ( void )
{
uint32_t msp_ns = *((uint32_t *)(TZ_START_NS));
volatile funcptr_void NonSecure_ResetHandler;

/* Initialize all modules */
SYS_Initialize ( NULL );

SYSTICK_TimerStart();

if (msp_ns != 0xFFFFFFFF)
{
/* Set non-secure main stack (MSP_NS) */
__TZ_set_MSP_NS(msp_ns);

/* Get non-secure reset handler */
NonSecure_ResetHandler = (funcptr_void)(*((uint32_t *)((TZ_START_NS) + 4U)));

/* Start non-secure state software application */
NonSecure_ResetHandler();
}

while ( true )
{
LED_Toggle();
SYSTICK_DelayMs(100);
}

/* Execution should not come here during normal operation */
return ( EXIT_FAILURE );
}

软件流程图

exported_image.png

编译后效果

企业微信截图_17783864921329.png

下载后程序运行正常,符合预期

企业微信截图_17758799447443.png

至此可以说笔者已经对mplab软件有了一定的认识,并掌握了基本使用技巧;

可以进入触摸软件的开发步骤了,有关触摸功能如何配置可参考上述连接

灯亮照片

c62dd10f-1fde-4c36-b447-e34f113686e0.jpg

灯灭照片

20d4217b-0472-43ad-b611-d4ba2f69c740.jpg


https://github.com/microchip-pic-avr-examples/pic32cmjh-basic-ptc-mplab-harmony

下面根据链接中的指导说明,我们在LED闪烁工程的基础上实现触摸控制的功能

添加touch library

企业微信截图_17758860336265.png

好家伙,和教程上不一样,没找到

不要急,接着往下看

企业微信截图_17758861175816.png

按上图说明操作

企业微信截图_17758866491484.png

这次可以正常搜索到touch库了

企业微信截图_17758867882346.png

添加绿色方框Touch Library,这是添加完成后的效果

企业微信截图_17758869245622.png

查看用户手册,确认触控引脚为PA22

企业微信截图_17758871322826.png

使用mcc的pin config功能对PA22进行配置

企业微信截图_17783920413430.png

打开Project Graph>Plugins>Touch Configuration配置界面

添加按钮

企业微信截图_17758873327521.png

绑定到PA22引脚

企业微信截图_17758873721141.png


软件代码

 int main ( void )
{
uint32_t msp_ns = *((uint32_t *)(TZ_START_NS));
volatile funcptr_void NonSecure_ResetHandler;

uint8_t last_key_status = 0;

/* Initialize all modules */
SYS_Initialize ( NULL );
SYSTICK_TimerStart();

if (msp_ns != 0xFFFFFFFF)
{
/* Set non-secure main stack (MSP_NS) */

__TZ_set_MSP_NS(msp_ns);

/* Get non-secure reset handler */
NonSecure_ResetHandler = (funcptr_void)(*((uint32_t *)((TZ_START_NS) + 4U)));

/* Start non-secure state software application */
NonSecure_ResetHandler();
}

while ( true )
{
//LED_Toggle();
//SYSTICK_DelayMs(2000);

/* call touch process function */
touch_process();

if(measurement_done_touch == 1u)
{
measurement_done_touch = 0u;
// process touch data

uint8_t key_status = 0u;
key_status = get_sensor_state(0) & KEY_TOUCHED_MASK;
if (0u != key_status && 0u == last_key_status) {
//Touch detect
LED_Toggle();
}

last_key_status = key_status;
}
}

/* Execution should not come here during normal operation */
return ( EXIT_FAILURE );
}

软件流程图

image.png

触摸亮灯图片

bf2903d4-a46a-4b5a-98fc-4882d3240803.jpg

再次触摸灭灯图片

ce30c789-2f8e-465d-b6a0-c3c51303fbfd.jpg

至此已完成基础任务


接下来研究进阶任务实现PWM调光

要想完成pwm调光,需要添加TCC0模块

企业微信截图_17784034931352.png

更新led引脚配置

企业微信截图_17784054925589.png

上代码

#include <stddef.h>                     // Defines NULL
#include <stdbool.h> // Defines true
#include <stdlib.h> // Defines EXIT_FAILURE
#include "definitions.h" // SYS function prototypes

/* typedef for non-secure callback functions */
typedef void (*funcptr_void) (void) __attribute__((cmse_nonsecure_call));

/* Duty cycle increment value */
#define DUTY_INCREMENT 10U // 亮度每次增加的值
#define LONG_PRESS_COUNT 10U // 长按判定阈值(越大需要按越久)

/* 全局变量 */
static uint32_t period;
static uint32_t dutyValue = 0U;
static uint16_t touchPressCount = 0;
static uint8_t led_output_control = 0; // 0=关闭 1=打开

static uint8_t dutyDir = 1;

void led_value_process(void)
{
if (dutyDir)
{
/* Increment duty cycle values */
dutyValue += DUTY_INCREMENT;

if (dutyValue > period)
dutyDir = 0U;
}
else
{
/* Decrement duty cycle values */
dutyValue -= DUTY_INCREMENT;

if (dutyValue <= 0)
dutyDir = 1U;
}
}

// *****************************************************************************
// *****************************************************************************
// Section: Main Entry Point
// *****************************************************************************
// *****************************************************************************

int main ( void )
{
uint32_t msp_ns = *((uint32_t *)(TZ_START_NS));
volatile funcptr_void NonSecure_ResetHandler;
uint8_t last_key_status = 0;

/* Initialize all modules */
SYS_Initialize ( NULL );
SYSTICK_TimerStart();

/* Read the period */
period = TCC0_PWM24bitPeriodGet();
/* Start PWM*/
TCC0_PWMStart();

if (msp_ns != 0xFFFFFFFF)
{
/* Set non-secure main stack (MSP_NS) */
__TZ_set_MSP_NS(msp_ns);

/* Get non-secure reset handler */
NonSecure_ResetHandler = (funcptr_void)(*((uint32_t *)((TZ_START_NS) + 4U)));

/* Start non-secure state software application */
NonSecure_ResetHandler();
}

while ( true )
{
//LED_Toggle();
SYSTICK_DelayMs(10);
/* call touch process function */
touch_process();

if(measurement_done_touch == 1u)
{
measurement_done_touch = 0u;
// process touch data

uint8_t key_status = 0u;
key_status = get_sensor_state(0) & KEY_TOUCHED_MASK;
if (0u != key_status) {
//Touch detect
if (0u == last_key_status)
{
// short touch
}
else
{
// long touch
touchPressCount ++;
if (touchPressCount > LONG_PRESS_COUNT)
{
touchPressCount = LONG_PRESS_COUNT;

led_value_process();
}
}
}
else
{
// 按键松开
if (last_key_status != 0U) {
if (touchPressCount < LONG_PRESS_COUNT) {
// 短按:切换LED开关
led_output_control ^= 1;
}
}
// 松开后清空计数
touchPressCount = 0;
}
last_key_status = key_status;
}

// led control
if (led_output_control)
{
TCC0_PWM24bitDutySet(TCC0_CHANNEL1, dutyValue);
}
else
{
TCC0_PWM24bitDutySet(TCC0_CHANNEL1, 0);
}
}

/* Execution should not come here during normal operation */
return ( EXIT_FAILURE );
}

软件流程图

image.png

关灯状态

ce30c789-2f8e-465d-b6a0-c3c51303fbfd.jpg

低亮度状态

3f52a50b-8508-4de9-9ce4-67bd074b5961.jpg

中亮度状态

e5a839aa-076f-4c05-b483-28d6155e93c4.jpg

高亮度状态

f20e1fa3-16d6-418f-b77c-87429be779d0.jpg


!!!~~~!!!项目中遇到的难题及解决方法!!!~~~!!!

软件ide生成的触摸代码无法直接使用,是没办法直接实现触摸功能的

企业微信截图_17783916005386.png

经过观看其他同仁的bilibili视频偶然发现问题根源

函数touch_init();需要放在RTC_Initialize();之后运行,这样才能保证触摸功能运作良好.

初步猜想可能与触摸模块依赖PTC模块有关,初始化必须讲究先后顺序.

最后正常的顺序应该是这样

企业微信截图_17783985247531.png


这一点还请留意,当然也期待mircrochip后续修复此问题.


补充说明: tcc0 channel1 输出我这里需要取反才能实现关灯效果

企业微信截图_17813371603864.png
心得体会


通过本次基于 EV41C56A 开发板的触摸输入与 LED 控制项目开发,我不仅熟练掌握了单片机外设的使用方法,更在工程实践、问题解决能力上得到了全面提升,收获颇丰。
在硬件学习方面,我深入了解了 EV41C56A 开发板的触摸按键、GPIO、PWM 等核心硬件的工作原理,明白了电容式触摸按键的检测机制、PWM 调节亮度的底层逻辑,打破了 “只会用软件、不懂硬件” 的局限,建立了软硬件结合的开发思维。
此外,本项目让我感受到了嵌入式技术的实用价值,触摸控制作为无机械磨损的交互方式,在智能家居、消费电子等领域应用广泛。这次项目实践为我后续学习更复杂的嵌入式开发、传感器应用、人机交互项目奠定了坚实的基础。
未来,我将继续深耕嵌入式技术,学习更多外设驱动、通信协议和算法优化,不断提升自己的开发能力,努力将所学知识应用到更多实际项目中。同时,我也会保持严谨认真的学习态度,在实践中积累经验,在解决问题中成长进步,为成为一名优秀的嵌入式开发工程师不懈努力。
本次项目的完成,不仅是对我学习成果的检验,更是我嵌入式学习道路上的重要里程碑。感谢电子森林平台提供的开发板和学习资源,让我能够在实践中快速成长,未来我将继续挑战更有难度的项目,不断突破自我。


另外,目前ai工具可以根据软件代码直接生成流程图,这样极大加快了流程图绘制时间.很是方便.

希望各位多多使用ai辅助软件开发工作.

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