一、项目介绍
本次任务基于 Microchip 的 SAME51J20A开发板,使用MPLAB开发,尝试让部分管脚实现触摸功能,可搭配触摸扩展面板,并通过按键和滑动实现呼吸灯速率切换。重点有两个一个是呼吸灯效果以及不同的速率,一个是通过按键和滑动两种方式实现控制。
1、硬件介绍
本次的功能实现使用的就是基于SAME51J20A的Curiosity Nano开发板,本来还想外接个触摸板这,不过在实际的调试过程中发现直接使用这个开发板以及自带的排针就能实现滑动的效果,板载的按键和LED加上滑动的引脚就能以最小硬件资源实现目标效果。
SAME51J20A Curiosity Nano 评估套件(EV76S68A)是用于评估 SAME51J20A 微控制器(MCU)的硬件平台,由 MPLAB® X 集成开发环境(IDE)提供支持,支持MPLAB Harmony开发框架,集成低功耗与高性能特性,支持TrustZone安全技术和丰富外设。使用的单片机SAME51J20A是一个32位的单片机,板载有调试器,只要配置一下开发环境,连上线就OK了,注意是一个MicroUSB接口。
2、功能介绍
本次项目实现的功能总共分为两个:
第一个是不同模式的呼吸灯速率,实际上就是呼吸灯的周期;
第二个是控制模式,这里分为按键控制和滑动控制。
3、设计思路
根据硬件资源的分析,基本上仅仅使用这个开发板就可以实现基本目标,呼吸灯的控制实际上就是PWM的占空比的控制,我们通过不断调整占空比来线性调整亮度,这里到的PWM实际上就是定时器的高级功能之一。按键的采集实际上就是GPIO的输入检测,滑动采集就更加的方便了,用到的Touch Library工具。
二、功能实现
1、软件流程图
2、实现过程
2.1 可视化模块配置部分
2.1.1 关注时钟信号
在使用定时器之前,我们需要关注一下时钟信息,可以看到就出外设的是中是60M,这也是关系到后续定时器相关阐述的配置:
2.1.2 配置PWM输出
TCC模块是支持PWM输出,我们选择的是TCC1:
因为LED引脚PA14可以对应TCC1的WO2,这也是我们需要配置的,对应的如下图:
可以作为定时器也可以作为PWM输出,不过也是需要向定时器一样配置计数器参数:
我们已经知道了主频是60M,通过Select Prescaler进行分频操作后为30M,如果我们想要得到一个1000Hz的PWM,可以看到配置的Period Value的值为30000-1,注意这个30000的数值,后续的占空比实际上就是雨这个值的比值。
2.1.3 配置定时器
TC模块就是定时器模块,这里进行定时器的配置和PWM有点类似,不过我们要考虑到PWM输出的配置,PWM的输出为1000Hz,如果我们想要完美配合太,最好定时器配置的为1ms作为基准,如果配置为10ms就会拉的比较长,或者配置成1ms,但是每一次的变化值大一点也是可以的,这个前期考虑一下后期的软件编写就会方便一点,暂定配置为1ms:
定时器的配置非常方便,直接选择就可以了,TCC模块为什么不这样呢?
2.1.4 touch模块配置
touch library模块添加时会自动关联添加一下模块:
ADC0是模拟通道采集,RTC是计时,我们不会要考虑这些,touch library会自动调用它们,可以看到相关配置已经关联好了:
这里的配置是通过 [Project Graph] -> [Plugins] -> [Touch Configuration]打开的,添加我们目标的滑条:
然后修改对应的引脚配置,尽量找相邻的,因为我不准备外接模块了:
2.1.5 板载按键的配置
板载的按键连接的是PA15,将引脚配置为外部中断:
然后配置RIC模块的15通道,启用外部中断,下降沿触发模式,开启滤波器:
2.2 软件代码实现部分
2.2.1 PWM和定时器
我们通过定时器TC1和定时器TCC1来实现PWM输出的占空比的修改,实际上就是在定时器中断中不断的修改占空比,在考虑LED的余辉效应的前提下实际上PWM的频率越大效果越好。在定时器中断中进行处理的代码如下:
void TC1_TIMER_CALLBACK(TC_TIMER_STATUS status, uintptr_t context)
{
BreathingCnt++;
if(BreathingCnt < BreathingSpeedCnt/2)
{
BreathingFlag = 0;
PWMCnt = 30000/BreathingSpeedCnt*BreathingCnt*2;
}
else if(BreathingCnt >= BreathingSpeedCnt/2 && BreathingCnt < BreathingSpeedCnt)
{
BreathingFlag = 1;
PWMCnt = 30000/BreathingSpeedCnt*(BreathingSpeedCnt-BreathingCnt)*2;
}
else
{
BreathingCnt = 0;
}
TCC1_PWM24bitDutySet(TCC1_CHANNEL2, PWMCnt);
}
做一下简单的介绍,这里面一共设计了三个参数,一个是上升下降状态指示,一个是定时器的技术(也就是一次呼吸循环计数的个数,0-最大计数之间),一个是占空比数值(0-30000之间)。
2.2.2 按键外部中断的处理
为了让呼吸效果跟家便于观看,我们选择了4个模式进行状态展示,最大的呼吸周期是1hz,对应的最大计数是1000,一次类推最大计数分别为750/500/250,共计四挡,其中按键只能实现单方向的改变:
void EIC_CH15_Handler(uintptr_t context)
{
BreathingMode++;
if(BreathingMode >=4)
{
BreathingMode = 0;
}
BreathingSpeedCnt = 1000- 250*BreathingMode;
BreathingCnt = 0;
}
可以看到每次按一下,模块变一下,同时回到呼吸灯单次的初始位置
2.2.3 滑动识别控制
滑块可以实现方向的识别,所以也就可以实现双向的改变,代码如下:
while ( true )
{
/* Maintain state machines of all polled MPLAB Harmony modules. */
SYS_Tasks ( );
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)
{
BreathingMode++;
if(BreathingMode >=4)
{
BreathingMode = 0;
}
BreathingSpeedCnt = 1000- 250*BreathingMode;
BreathingCnt = 0;
}
else if ((qtm_scroller_data1[0].left_hyst & 0x08) == 0x08)
{
if(BreathingMode == 0)
{
BreathingMode = 3;
}
else
{
BreathingMode--;
}
BreathingSpeedCnt = 1000- 250*BreathingMode;
BreathingCnt = 0;
}
}
}
}
三、功能展示
这里先用动图简单展示一下,如果想要了解更多的可以观看视频的详细解说:
四、心得体会
第一次使用Microchip的单片机进行开发,前期找了不少资料,也详细的观看了教学视频,说实话网上资料并不多,只能在往期类似的开发中不断剥离想要的功能使用方法,不过和其他可视化配置还是有很多相似的内容,特色的touch工具属于之前有详细教程的,用起来还是听方便的,不过还是可以继续深究一下。上来一开始也是从点灯开始一点一点尝试功能配置,开发环境有一些工具的下载需要对网络有要求,最后通过不断的深入改错最终在快要到期的时候完成了既定目标的开发。感谢电子森林与得捷电子联合推出的 活动,对于我来说是个很好的学习机会,理论结合实践,经验的积累是实实在在的!