Funpack4-2 - 基于SAME51与CAP1203触摸模块实现触摸控制呼吸灯
该项目使用了Microchip的SAME51J20A Curiosity Nano与Sparkfun的CAP1203触摸扩展板,实现了触摸点触与触摸滑动两种模式控制呼吸灯速率的的设计,它的主要功能为:触摸板上的3个按键分别对应“快”、“中”与“慢”三种呼吸灯速率。此外,通过左滑、右滑可以提高呼吸灯速率或者降低呼吸灯速率。
标签
呼吸灯
Funpack 4-2
Funpack S4 #2
Microchip SAME51
Sparkfun CAP1203
触摸控制
playlikework
更新2025-07-01
12

任务目标:

本次活动选择的题目是:任务1:使用MPLAB开发,尝试让部分管脚实现触摸功能,可搭配触摸扩展面板,并通过按键和滑动实现呼吸灯速率切换,可自行设计触摸板

推荐搭配模块:触摸扩展板

任务分解:

主控板卡具有SERCOM通信端口,可以在MPLABX IDE中配置成UART, SPI, I2C, CAN等多种模式,可以轻松应对不同接口的扩展模块。在本项目中,SERCOM2被配置成I2C Master,从而实现与扩展模块的通信。

扩展模块是来自SPARKFUN的触摸扩展模块,扩展板上的触摸方案同样来自MICROCHIP公司的CP1203!可以使用I2C接口与单片机进行通信。

image.png

https://www.sparkfun.com/sparkfun-capacitive-touch-slider-cap1203-qwiic.html

从官网说明得知,该I2C模块的通信地址是0x28。为了实现项目目标:

  1. 配置SERCOM2为I2C,从而可以与扩展板通信,获取滑动、触摸事件
  2. 配置TC定时器模块为PWM输出模式,从而驱动LED在不同占空比的PWM下呈现出“呼吸”的效果
  3. 通过读取不同的触摸事件,相应的改变PWM波不同占空比波形之间的延迟长短,从而实现“呼吸”速率调节的效果


项目的难点是:

  • 目前在MPLAB X IDE里面的扩展模块驱动资料很少,只能根据数据手册和Arduino下的相关开源驱动进行修改,适配,从而获取触摸板状态。
  • 触摸事件的处理与呼吸灯如何并行处理的问题,需要解决。


主控板卡介绍:

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


image.png


板卡特性

  • SAME51J20A 微控制器
  • 一个用户 LED(黄色)
  • 一个机械用户开关
  • 板载调试器
    • MPLAB X IDE 中的电路板识别
    • 一个绿色电源/状态 LED
    • 编程和调试
    • 虚拟 COM 端口(CDC)
    • 一个逻辑分析仪(DGI GPIO)
  • USB 供电
  • 可调目标电压
    • MIC5353 由板载调试器控制的 LDO 稳压器
    • 1.8-3.6v 输出电压
    • 500 mA 最大输出电流(受环境温度和输出电压限制)

系统框图:

image.png



软件流程图:

image.png

实现细节:

按键中断配置:

image.png

按键PA15,配置成EIC_EXTINT_15模式,首先添加EIC模块:

image.png


image.png

主函数中注册按键中断回调:

static void EIC_User_Handler(uintptr_t context) {

TouchMode++;
printf("\r\nButton Pressed EIC USER HANDLER. TouchMode = %s", ((TouchMode%2)? "Slide Mode" : "Touch Mode"));
}

EIC_CallbackRegister(EIC_PIN_15, EIC_User_Handler, 0);


TC3输出PWM波配置:

PA14连接LED等,具有模拟功能TC3/WO[0].


image.png

image.png

TC3的启动代码:

TC3_CompareStart();

PWM输出占空比调节可以使用如下代码:

TC3_Compare16bitMatch0Set(duty_Cycle_xxx);
TC3_CompareStart();

Sparkfun CP1203触摸模块驱动:

在MCC里面配置I2C接口:

image.png

CP1203触摸模块初始化:

uint8_t CAP1203_Begin(void) {
// Set device address and wire port to private variable
/**
if (isConnected() == false)
{
return false;
}*/
// Read PROD_ID register
uint8_t prodIDValue = CAP1203_ReadRegister(PROD_ID);

// PROD_ID should always be 0x6D
if (prodIDValue != PROD_ID_VALUE) {
return false;
} else {
printf("\r\nprodIDValue=0x%2X", prodIDValue);
}

CAP1203_SetSensitivity(SENSITIVITY_2X); // Set sensitivity to 2x on startup - value calibrated for SparkFun CAP1203 Cap Touch Slider Board
CAP1203_SetInterruptEnabled(); // Enable INT and LED as default
CAP1203_ClearInterrupt(); // Clear interrupt on startup
return true;
}


点触检测:

void CAP1203_CurrentTouchTest(void) {
if (CAP1203_IsLeftTouched() == true) {
while (CAP1203_IsLeftTouched() == true)
; // Wait until user removes finger
CurrentPos = 0;
Delay_Between_PWM = 1;
TouchHappened = true;
printf("\r\nLeft Delay_Between_PWM = %ld ms", Delay_Between_PWM);
}

if (CAP1203_IsMiddleTouched() == true) {

while (CAP1203_IsMiddleTouched() == true)
; // Wait until user removes finger

CurrentPos = 10;
Delay_Between_PWM = 5;
TouchHappened = true;

printf("\r\nMiddle Delay_Between_PWM = %ld ms", Delay_Between_PWM);
}

if (CAP1203_IsRightTouched() == true) {
while (CAP1203_IsRightTouched() == true)
; // Wait until user removes finger

CurrentPos = 25;
Delay_Between_PWM = 10;
TouchHappened = true;

printf("\r\nRight Delay_Between_PWM = %ld ms", Delay_Between_PWM);

}
}

滑动检测:

void CAP1203_SwipeTouchTest(void) {

if (CAP1203_IsRightSwipePulled() == true) {

TouchHappened = true;

if (Delay_Between_PWM <= 8)
Delay_Between_PWM += 2;

if(Delay_Between_PWM == 10)
Delay_Between_PWM = 10;
printf("\r\n>-->-->Right Swipe. Delay_Between_PWM = %ld ms", Delay_Between_PWM);
}

if (CAP1203_IsLeftSwipePulled() == true) {

TouchHappened = true;
if (Delay_Between_PWM >= 2)
Delay_Between_PWM -= 2;

if(Delay_Between_PWM == 0)
Delay_Between_PWM = 0;
printf("\r\n<--<--<Left Swipe. Delay_Between_PWM = %ld ms", Delay_Between_PWM);
}

}


项目硬件实物:

image.png


滑动调节led呼吸速率调节:右滑 呼吸速率变慢

滑动调节led呼吸速率调节:左滑 呼吸速率变快

触摸调节led呼吸速率调节:

心得体会:

感谢硬禾提供的活动平台,学习了microchip的SAME51芯片及其开发环境MPLAB 的使用,也学习了触摸模块的驱动以及PWM制作呼吸灯的基本原理。

整体完成了平台要求的任务,受益良多。期待funpack活动越来越好。



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