[MCU] 上海航芯 ACM32F070开发板+触控功能评估板评估 - 第二篇 电容触控滑条功能开发

oxygen_sh   2022-10-23 22:20 楼主

本篇评测实验是基于SDK例程开发了一个简单的触控滑条算法。

 

一、硬件准备

 

手头有一个以前用过的电容触控板,这块板上有5个按键和1个滑条。滑条由3个电极组成。

正好可以利用这个滑条,来基于ACM32F070开发滑条功能。

通过飞线焊接,把旧板上滑条的3个电极分别连接到ACM32F070开发板的PB3-PB5 3个管脚上。这3个管脚在ACM32F070开发板上没有用到,这里正好可以利用一下实现滑条功能。

image-20221023221333-1.png  

 

image-20221023221333-2.png  

对电容触控采集过程信号进行了示波器抓取:

单个通道单次扫描完整信号:

image-20221023221333-3.png  

局部放大后信号:

image-20221023221333-4.png  

 

二、滑条触控软件开发

 

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 初始化

初始化过程中会对Touchkey进行初始校准。

  • 停止动态校准

当前算法比较简单,没有考虑基线校准。因此需要在例程中将动态校准功能停止。具体做法是,在App_Test()函数中,将实现中,将TKEY_Calibrate_Process()注释掉。

  • Touch key定时扫描

例程中使用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,检测分辨率会更加好。

 

2-1

 

本帖最后由 oxygen_sh 于 2022-10-23 22:21 编辑

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复