Funpack4-2 - 基于SAME51J20A开发板实现触摸呼吸灯
该项目使用了MPLAB开发,实现了呼吸灯触摸控制的设计,它的主要功能为:通过触摸按键,控制LED呼吸闪烁。
标签
触摸
MPLAB
SAME51J20A
Funpack4-2
CX反C
更新2025-07-02
13

一、项目描述

使用SAME51芯片TC定时器生成PWM驱动板载LED呼吸闪烁,并配合TTP224触摸模块,通过SAME51芯片的EIC外部中断判断触摸引脚的触摸,来启动或关闭PWM输出和更改LED呼吸灯闪烁频率

二、硬件介绍

1.SAM E51 Curiosity Nano评估板

SAME51J20A Curiosity Nano 评估套件(EV76S68A)是用于评估 SAME51J20A 微控制器(MCU)的硬件平台,该板由 MPLAB 集成工具开发环境和 MPLAB Harmony 提供支持。该评估套件可轻松访问 SAME51J20A 的功能,以将器件集成到定制设计中。Curiosity Nano 系列评估套件包括一个板载 Nano 调试器,因此无需外部工具即可对 SAME51J20A 器件进行编程。


2.TTP224触摸模块

是一款使用电容式感应原理设计的触摸IC,其稳定的感应方式可以应用到各种不同电子类产品,面板介质可以是完全绝源的材料,专为取代传统的机械结构开关或普通按键而设计,提供4个触摸输入端口及4个直接输出端口。


三、软件流程图及主要代码片段

image.png

1.触摸滑动检测相关变量定义

// 滑动检测相关变量
uint8_t touch_numbers = 0; // 触摸数字
uint8_t OUT1_touch_sign = 0; // 开启标志
uint8_t slide_direction = 0; // 0-无滑动 1-左滑 2-右滑
//呼吸速率档位数量和定义
#define BREATH_SPEED 5
// 各档位对应的呼吸周期,每个周期包含渐亮和渐暗
const uint16_t breathSpeeds[BREATH_SPEED] = {50, 150, 250, 350, 450};
uint8_t BREATH_SPEED_GEAR = 2;//呼吸速度挡位,默认为中间档
uint8_t a = 0;//开启定时器后只启动一次PWM启动

2.Main函数

2.1定时器、系统定时器、外部中断 初始化

SYS_Initialize ( NULL );
TC3_CompareStart();//开启定时器,提供PWM输出
SYSTICK_TimerStart();//开启系统定时器,提供延时函数
//开启触摸外部中断
EIC_InterruptEnable(EIC_PIN_4);
EIC_InterruptEnable(EIC_PIN_5);
EIC_InterruptEnable(EIC_PIN_6);
EIC_CallbackRegister(EIC_PIN_4, EIC_OUT1, 0);
EIC_CallbackRegister(EIC_PIN_5, EIC_OUT2, 0);
EIC_CallbackRegister(EIC_PIN_6, EIC_OUT3, 0);

2.2while ( true )

2.2.1左滑处

if(slide_direction == 1) 
{
// 左滑处理
slide_direction = 0; //标准复位
if(BREATH_SPEED_GEAR < 5)
{
BREATH_SPEED_GEAR = BREATH_SPEED_GEAR + 1;
}
}

2.2.2右滑处理

if(slide_direction == 2) 
{
// 右滑处理
slide_direction = 0; //标准复位
if(BREATH_SPEED_GEAR > 0)
{
BREATH_SPEED_GEAR = BREATH_SPEED_GEAR - 1;
}
}

2.2.3呼吸灯闪烁

//呼吸灯闪烁
if(OUT1_touch_sign == 1)
{
if(a == 0)
{
TC3_CompareStart();
a = a + 1;
}
TC3_Compare16bitPeriodSet(breathSpeeds[BREATH_SPEED_GEAR]);//周期函数
for (int i = 0; i < breathSpeeds[BREATH_SPEED_GEAR] ; i++)
{
TC3_Compare16bitMatch0Set(i);//比较值
SYSTICK_DelayMs(5);//延时,防止过快
}

for (int i = breathSpeeds[BREATH_SPEED_GEAR]-1; i >= 0 ; i--)
{
TC3_Compare16bitMatch0Set(i);
SYSTICK_DelayMs(5);
}
}

2.2.4PWM开启关闭处理

if(OUT1_touch_sign == 0)
{
TC3_Compare16bitPeriodSet(0);
TC3_CompareStop();
a = 0;
}

3.外部中断

3.1外部中断触摸通道一处理

//外部中断一,判断是否按下通道一
void EIC_OUT1 (uintptr_t context)
{
if(OUT1_touch_sign == 1)
{
OUT1_touch_sign = 0;
}else
{
OUT1_touch_sign = 1;
}
}

3.2外部中断触摸通道二处理

void EIC_OUT2 (uintptr_t context)
{
touch_numbers = touch_numbers + 1;
//当数字为3时,说明已经触摸通道3
if(touch_numbers == 3)
{
touch_numbers = 0;
slide_direction = 1;//左滑
}else if(touch_numbers>3)
{
//用于排除其他操作导致的触摸数字跑飞
touch_numbers = 0;
}
}

3.2外部中断触摸通道三处理

void EIC_OUT3 (uintptr_t context)
{
touch_numbers = touch_numbers + 2;
//当数字为3时,说明已经触摸通道3
if(touch_numbers == 3)
{
touch_numbers = 0;
slide_direction = 2;//右滑
}else if(touch_numbers>3)
{
touch_numbers = 0;
}
}

四、功能展示图片及说明

触摸通道一 LED灯PWM开启关闭

触摸左滑--增加呼吸周期

触摸右滑--减少呼吸周期

五、项目中遇到的难题和解决方法

对于MCC的教材少,导致一直卡在系统配置

通过浏览官方的中文论坛和询问AI软件得到解决

六、对本活动的心得体会

对于电容触摸的学习跟进一步,之前只是对按键简单的赋值,当类似滑动电阻器用,这次使用触摸数字的写法,实现了左滑和右滑。

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