本篇评测实验是基于SDK例程开发了一个简单的触控滑条算法。
一、硬件准备
手头有一个以前用过的电容触控板,这块板上有5个按键和1个滑条。滑条由3个电极组成。
正好可以利用这个滑条,来基于ACM32F070开发滑条功能。
通过飞线焊接,把旧板上滑条的3个电极分别连接到ACM32F070开发板的PB3-PB5 3个管脚上。这3个管脚在ACM32F070开发板上没有用到,这里正好可以利用一下实现滑条功能。
对电容触控采集过程信号进行了示波器抓取:
单个通道单次扫描完整信号:
局部放大后信号:
二、滑条触控软件开发
SDK中提供了几个包括触控功能的例程。选择了LCD_TK sample来学习。这个例程同时提供了触控和LCD显示功能,方便进行效果展示。这个例程只提供了触控按键的功能。
TKey.h里,将滑条使用的3个通道使能。
#define TKEY_CHANNEL_12_ENABLE
#define TKEY_CHANNEL_13_ENABLE
#define TKEY_CHANNEL_14_ENABLE
滑条使用的电极面积较大,需要调低sensitivity参数。根据调试情况,这里设置为20。
#define TKEY_12_SENSITIVITY 20
#define TKEY_13_SENSITIVITY 20
#define TKEY_14_SENSITIVITY 20
初始化过程中会对Touchkey进行初始校准。
当前算法比较简单,没有考虑基线校准。因此需要在例程中将动态校准功能停止。具体做法是,在App_Test()函数中,将实现中,将TKEY_Calibrate_Process()注释掉。
例程中使用timer定时进行touch key扫描。
uint16_t HAL_TKEY_Slider_Process()
{
int16_t middle_delta, left_delta, right_delta, middle_index,position;
uint32_t pos1, pos;
middle_delta = slider_delta[0];
left_delta = slider_delta[2];
right_delta = slider_delta[1];
middle_index = 0;
position = 1024;
if(middle_delta < 10){
return 0xFF;
}
if(slider_delta[1] > middle_delta){
middle_delta = slider_delta[1];
left_delta = slider_delta[0];
right_delta = slider_delta[2];
middle_index = 1;
position = 2048;
}
if(slider_delta[2] > middle_delta){
middle_delta = slider_delta[2];
left_delta = slider_delta[1];
right_delta = slider_delta[0];
middle_index = 2;
position = 3192;
}
if(left_delta > right_delta){
pos1 = (uint16_t)((middle_delta - right_delta) + (left_delta - right_delta));
pos = (left_delta - right_delta);
pos = pos << 10;
pos = pos /(pos1);
if(middle_index == 0){
position = 4096;
}
position -= pos;
}else{
pos1 = (uint16_t)((middle_delta - left_delta) + (right_delta - left_delta));
pos = (right_delta - left_delta);
pos = pos << 10;
pos = pos /(pos1);
position +=pos;
}
return position;
}
采用了滑动窗口法对检测结果进行滤波。
filtered_slider_cnt = sliding_wondow_filter(raw_slider_cnt);
三、Demo视频演示和优化方向
滑条反应比较迟滞,检测算法还需要进一步优化。另外,滑条使用3个电容电极的面积较大,因此硬件上采样电容需要将目前的10nF换成更大的电容,比如22nF,检测分辨率会更加好。