任务介绍
本次任务基于 Microchip 的 SAME51J20A Curiosity Nano核心板进行的功能实现,核心任务是使用MPLAB开发,尝试让部分管脚实现触摸功能,可搭配触摸扩展面板,并通过按键和滑动实现呼吸灯速率切换,可自行设计触摸板。
任务分析
我们可以在任务介绍中可以分析出一下内容:
1、最终的目标是实现呼吸灯速率的切换,所以至少需要2种呼吸灯速率;
2、控制方法有两种,一个是按键控制,一个是滑动控制;
3、可以配合触摸板实现;
硬件介绍
SAME51J20A Curiosity Nano 评估套件(EV76S68A)是用于评估 SAME51J20A 微控制器(MCU)的硬件平台,由 MPLAB® X 集成开发环境(IDE)提供支持,支持MPLAB Harmony开发框架,集成低功耗与高性能特性,支持TrustZone安全技术和丰富外设。板载调试器支持数据可视化分析,适用于物联网终端、工业控制及人机交互场景。Curiosity Nano 评估平台提供了一组可访问大多数单片机I/O 的小型电路板。该平台包含一系列低引脚数单片机(MCU)电路板,相关的用户指南、应用笔记、数据手册和示例代码由MPLAB X IDE 提供。该平台配有一个用于与主机PC 进行串行通信的虚拟COM 端口(CDC)以及一个数据网关接口(Data Gateway Interface,DGI)GPIO。
特性:
• SAME51J20A 单片机
• 一个用户LED(黄色)
• 一个机械用户开关
• 板上调试器
软件平台介绍
MPLAB X IDE是Microchip Technology公司开发的集成开发环境,用于嵌入式系统设计。该软件支持多种操作系统,提供源代码级调试、项目管理及可视化工具,并与MPLAB生态系统协同工作。其高度可配置界面满足不同开发者需求,支持从仿真到硬件测试的开发流程。广泛应用于汽车电子、工业自动化等领域。支持多种单片机,从8位到32位都有。
原理分析与设计思虑
本次是通过开发板实现触摸控制呼吸灯速率,这里可以看出我们需要需要实现的内容:
板卡led的呼吸灯控,这里可以通过PWM去控制,一般属于高级定时器的扩展功能,注意这里设计到具体引脚的输出控制;
触摸控制的实现,触摸一般都是对电容量的采集,本次想要实现一个滑动的动作,至少需要3个引脚的配合,不过看到了本次使用的开发板后,实际上就不用外接滑条了,直接使用板子上外引出的接口就可以了;
速率的调节,我们再试下呼吸灯的时候就是在不断的调节占空比,这个时候我们就可以把调节的速度改变一下就是了。
软件流程图
流程图:
我们通过初始化阶段对定时器、按键对应引脚的外部中断进行初始化,然后就是进行按键和滑动动作的采集,来改变PWM占空比的控制,比如原本的呼吸灯频率是0.5Hz,也就是一呼一吸用2s,这个时候我们改变速率后变成1Hz,也就是一呼一吸1s完成。
关键功能模块介绍
1、定时器PWM的输出控制
呼吸灯效果的实现实际上就是PWM占空比的不断改变,这是一个规律性的变化,从而产生呼吸灯的效果,我们通过对SAME51J20A功能模块的了解,TCC模块是可以产生PWM的,注意配置完TCC模块后要打开对应的引脚,想要规律的变化就要在定时器中进行了,定时操作可以是PWM占空比的改变更加顺滑。
定时中断处理代码如下:
void TC0_TIMER_CALLBACK(TC_TIMER_STATUS status, uintptr_t context) {
if(LEDPWM_cnt < LED_speed/2)
{
LEDPWM_cnt++;
TCC1_PWM24bitDutySet(TCC1_CHANNEL2, 30000/LED_speed*LEDPWM_cnt*2);
}
else if(LEDPWM_cnt >= LED_speed/2 && LEDPWM_cnt < LED_speed)
{
LEDPWM_cnt++;
TCC1_PWM24bitDutySet(TCC1_CHANNEL2, 30000/LED_speed*(LED_speed-LEDPWM_cnt)*2);
}
else if(LEDPWM_cnt >= LED_speed)
{
LEDPWM_cnt = 0;
}
}
2、滑动控制的实现
添加 Touchbar 模块,其附带的几个模块都会自动摆放上。在 [Project Graph] -> [Plugins] -> [Touch Configuration] 内进行配置。先添加一个滑条,之后将传感器与 PIN 绑定。
我们需要结合一下核心板的引脚分布,必须对应的是支持ADC采集的引脚:
接下来配置滑块,最终选择的是PB7、PB6、PB5:
然后就可以在工程中直接使用使用一下代码进行滑条的检测:
touch_process();
if (measurement_done_touch == 1u)
{
measurement_done_touch = 0u;
if (SLIDER_CONTACTED_MASK == (get_scroller_state(0) & SLIDER_CONTACTED_MASK))
{
if ((qtm_scroller_data1[0].right_hyst & 0x08) == 0x08)
{
if(LED_Mode == 0)
{
LED_Mode = 1;
LED_speed = LED_speed_1;
}
else if(LED_Mode == 1)
{
LED_Mode = 2;
LED_speed = LED_speed_2;
}
else if(LED_Mode == 2)
{
LED_Mode = 0;
LED_speed = LED_speed_3;
}
}
}
}
3、按键采集
按键的采集这里使用的是EIT模块,也就是引脚外部中断,配置EIT模块实现下降沿触发中断,然后在外部中断处理程中实现和滑动一样的控制效果:
void EIC_KEY_Handler(uintptr_t context)
{
if(LED_Mode == 0)
{
LED_Mode = 1;
LED_speed = LED_speed_1;
}
else if(LED_Mode == 1)
{
LED_Mode = 2;
LED_speed = LED_speed_2;
}
else if(LED_Mode == 2)
{
LED_Mode = 0;
LED_speed = LED_speed_3;
}
}
效果展示
可以看到我们通过外接接口直接可以实现触摸滑动的效果,具体效果参见视频:
心得体会
非常感谢这次活动,尤其是对touch的应用让我最记忆犹新,不过在进行固件升级的时候有点慢,下载到本地就非常顺滑了,希望多出一点这种干可视化的应用配置,让开发更加便捷,MPLAB的多类型支持也是非常不错的选择,可以对Microchip的8位单片机到32位单片机进行全方位的支持。