项目选题与思路:
本次活动选择的是 板卡三:SAME51J20A Curiosity Nano 任务1:使用MPLAB开发,尝试让部分管脚实现触摸功能,可搭配触摸扩展面板,并通过按键和滑动实现呼吸灯速率切换,可自行设计触摸板
项目实现思路:
首先呼吸灯的实现,最直接的方法就是使用硬件PWM外设,通过改变占空比来调节呼吸灯的亮度;比如占空比为0的时候,小灯熄灭;占空比为一个参数的时候,通过控制这个最大占空比的数值,就可以控制呼吸灯的亮度。
呼吸灯闪烁速率,这个可以理解为不同占空比直接的延迟间隔。比如占空比从0到Max_Duty_Cycle有10次占空比改变,通过增加/减少每次占空比改变的间隔,从而实现视觉上的呼吸灯速率变快或者变慢。
硬件介绍:
主控板卡是具有触摸功能的,CORTEX-M4内核的简易开发板:
要知道硬件上哪些引脚是具有触摸功能的,根据microchip的介绍,带有x/y标志的即为触摸功能引脚:
然后还要参考microchip官方文档来了解如何使用这个触摸外设。
QTouch® Modular Library Peripheral Touch Controller User's Guide https://onlinedocs.microchip.com/oxy/GUID-7EC2A1B7-D9CD-4812-9F14-AE4A958E4C2F-en-US-8/GUID-1B1234C6-25EC-4E48-84F2-06A99BE6A978.html
扩展板选择是430BOOST-SENSE1 - Capacitive Touch BoosterPack for the LaunchPad。在手里已经闲置10年了,之前还想着怎么把触摸板给用起来。刚好这次的Funpack推荐SAME51的触摸功能。
与触摸相关的引脚是P2.0 ~ P2.5.
这些引脚的排列是根据MSP430的引脚,具体如下:
系统硬件:
硬件上只有主控和一个触摸扩展板。其中PA21引脚连接触摸板中间的按键P2.5。主控板的PB4.5.6.7分别连接滚动滑条的上右下左。
软件流程:
主程序是非常简单的,完成初始化后进入呼吸灯子函数。注意这里使用了中断,在中断ISR里面检测触摸,这样可以提高灵敏度。
实现细节:
呼吸灯的实现:
void BlinkLED(int8_t MaxDutyCycle, int8_t PWM_Interval) {
static int8_t i, miniStep;
if (MaxDutyCycle == 0) {
TC3_Compare8bitMatch0Set(MaxDutyCycle);
TC3_CompareStart();
return;
}
miniStep = MaxDutyCycle / 6;
for (i = 0; i <= MaxDutyCycle; i += miniStep) {
TC3_Compare8bitMatch0Set(i);
TC3_CompareStart();
SYSTICK_DelayMs(PWM_Interval);
//printf("\r\n i = %d mX=%d",i, MaxDutyCycle);
}
for (i = MaxDutyCycle; i >= 0; i -= miniStep) {
TC3_Compare8bitMatch0Set(i);
TC3_CompareStart();
SYSTICK_DelayMs(PWM_Interval);
//printf("\r\n i = %d",i);
}
}
注意这里的参数1是控制呼吸灯最大占空比,也就是控制呼吸灯亮度;参数2用来控制呼吸灯的速率。
触摸功能的配置:
在MCC里面,打卡touch configuration,然后分别添加触摸按键与触摸圆环,其中圆环有4个子部分。
接着配置引脚:
触摸按键检测代码:
if ((0u == CenterTouchKey)&&(CenterTouchKey_old != CenterTouchKey)) {
printf("\r\nCenter Button Pressed");
MaxDutyCycle += 25;
if (MaxDutyCycle > 100)
MaxDutyCycle = 0;
//TC3_Compare8bitMatch0Set(MaxDutyCycle);
//TC3_CompareStart();
printf("\r\nNew Max DutyCycle: %d", MaxDutyCycle);
}
触摸滑动,可以区分逆时针还是顺时针:
else { //Process wheel
scroller_status_old = scroller_status;
scroller_status = get_scroller_state(0);
scroller_position = get_scroller_position(0);
scroller_rightHyst = get_scroller_rightHyst(0);
scroller_leftHyst = get_scroller_leftHyst(0);
if (2u == (scroller_status & 2)) {
sroll_wheel_or_not = true;
scroller_rightHyst = get_scroller_rightHyst(0);
scroller_leftHyst = get_scroller_leftHyst(0);
//printf("\r\nScroller Position: %d, Contact Moved rightHyst = %d, leftHyst = %d, scroller_status = %d, old = %d", scroller_position, scroller_rightHyst, scroller_leftHyst, scroller_status, scroller_status_old);
}//endif
if ((scroller_status_old & 0x01)&&(scroller_status == 0) && sroll_wheel_or_not) {
sroll_wheel_or_not = 0;
if (scroller_rightHyst & CLOCK_TOUCH_MASK) {
if (PWM_Interval >= 40)
PWM_Interval -= 40;
printf("\r\n****Anti clock wise***Scroller Position: %3d Increase delay: %3d\r\n", scroller_position, PWM_Interval);
}
if (scroller_leftHyst & CLOCK_TOUCH_MASK) {
if (PWM_Interval <= 80)
PWM_Interval += 40;
printf("\r\n****clock wise***Scroller Position: %3d Decrease delay: %3d\r\n", scroller_position, PWM_Interval);
}
}
scroller_status_old = scroller_status;
}
每个触摸板的最佳参数是不一样的,需要根据实际硬件进行调节。我经过调试后,发现参数40作为感应阈值还是效果可以的。
在MPLAB的触摸调试可以看到灵敏度不错:
实物展示:
刚开始是呼吸灯快速闪烁:
顺时针触摸后,速率变慢:
再次顺时针触摸,速率最慢。
总结:
非常感谢硬禾学堂和得捷提供的FUNPACK机会,让我尘封10年的触摸扩展板得以再次发光发热。也让我掌握了触摸知识,之前一直对触摸是非常好奇,但在网上却找不到除了TI板卡外对这个触摸扩展板的任何demo。对于MPLAB,虽然有点卡,但是功能的确强大。
最后希望FUNPACK越来越好!!