项目介绍
项目功能介绍
本次任务基于 Microchip 的 SAME51J20A Curiosity Nano核心板实现通过按键和滑动实现呼吸灯速率切换的功能,这里主要是需要存在两个控制方式,来实现多种速率模式的实现,我们可以通过MPLAB X IDE进行 Microchip单片机的开发。
设计思路
该项目需要实现的主要有两部分:
1、呼吸灯的效果实现,并具有不同速率模式;
2、通过按键和滑动方式可以控制,可采集。
硬件框图
软件流程图
硬件介绍
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 中的电路板标识
– 一个绿色电源/状态LED
– 编程与调试
– 虚拟COM 端口(CDC)
– 一个逻辑分析器(DGI GPIO)
• USB 供电
• 可调目标电压
– MIC5353 LDO 稳压器,由板上调试器控制
– 1.8-3.6V 输出电压
– 500 mA 最大输出电流(受环境温度和输出电压限制)
主要代码片段和介绍
1、外设配置
2、呼吸灯效果控制
外部接口是PA14,可选择的PWM输出为TCC1的CH2:
呼吸灯效果的实现实际上就是PWM占空比的不断改变,从而产生呼吸灯的效果,想要规律的变化就要在定时器中进行了。
定时中断处理代码如下:
void TC1_TIMER_CALLBACK(TC_TIMER_STATUS status, uintptr_t context) {
if(LEDPWM_cnt < speed_cnt)
{
LEDPWM_cnt++;
if(UporDown == 0)
TCC1_PWM24bitDutySet(TCC1_CHANNEL2, 1000/speed_cnt*LEDPWM_cnt);
else
TCC1_PWM24bitDutySet(TCC1_CHANNEL2, 1000/speed_cnt*(speed_cnt-LEDPWM_cnt));
}
else
{
LEDPWM_cnt = 0;
if(UporDown == 0)
UporDown = 1;
else
UporDown = 0;
}
}
3、滑动控制的实现
添加 Touch模块,会自动添加ADC和定时模块,然后可以在 [Project Graph] -> [Plugins] -> [Touch Configuration] 内进行具体的配置。先添加一个滑条,,默认是4个引脚,我们需要添加一个连续的引脚,还必须是ADC的输入引脚,只有这些区域是连续的ADC:
之后将传感器与引脚绑定:
然后就可以在while中直接使用使用一下代码进行滑条的检测:
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(Mode_flag == 0)
{
Mode_flag = 1;
UporDown = 0;
speed_cnt = 500;
}
else if(Mode_flag == 1)
{
Mode_flag = 0;
UporDown = 0;
speed_cnt = 1000;
}
}
}
}
4、按键采集
按键的采集这里使用的是EIC模块,也就是引脚外部中断,配置EIC模块实现下降沿触发中断,回到函数代码如下:
void EIC_KEY_CALLBACK(uintptr_t context)
{
if(Mode_flag == 0)
{
Mode_flag = 1;
UporDown = 0;
speed_cnt = 500;
}
else if(Mode_flag == 1)
{
Mode_flag = 0;
UporDown = 0;
speed_cnt = 1000;
}
}
效果展示
可以看到我们通过外接接口直接可以实现触摸滑动的效果,具体效果参见视频:
心得体会
非常高兴可以参加本次的DIY学习活动,可以有机会基础全新的单片机和开发环境,真的是每一家都有自己的特点,学习过程中可以了解到新的方式还是非常开心的事情,同时在解决问题的同事也是对自己的提升,学习资料确实比较喜好,幸好论坛有教程也有之前相关的活动支持快速开发,希望可以继续坚持初心,继续前行!