MM32F0160+SC12B Touch Application Evaluation
文章目录
- MM32F0160+SC12B Touch Application Evaluation
- Introduction & Requirement
- Hardware
- SC12B & SC12B Sample Demo board
- Mini-F0160 board
- Software
- MCU Software - MM32F0160
- PC Tool - FreeMASTER
- Summary
Introduction & Requirement
最近从产品经理收到一个需求,需要评估一家第三方的Touch芯片,考虑整合到我司(MCU原厂)提供给客户的技术方案中。从系统工程的角度上看,对Touch方案的评估,主要是基于我司MCU使用Touch芯片的可用性/易用性,以及Touch芯片对触摸感应的可靠性进行评估。关于易用性,有一些主观的因素,但总之从逻辑上走得通,软硬件开发方便即可。至于Touch的可靠性,也有一套组合拳,包含各种测试条件的用例都招呼上,看看Touch系统的反应如何,打分即可。当然,最终考验,还是要通过IEC 61000-4-6
电流注入测试,方可入选。
Hardware
首先要把搭载Touch芯片的电路板同我司的F0160开发板连起来,然后通过F0160微控制器读取Touch的采样值,把采样值通过串口、小LCD屏幕或者FreeMASTER等工具读出来数据即可。合作方提供的Touch电路板是裸铜感应电极,考虑到后续要做过水、过油等实验,还需要准备一块亚克力面板盖到电极上。
SC12B & SC12B Sample Demo board
合作方提供的Touch芯片,SC12B,来自于厦门晶尊微电子科技有限公司(简称:ICman)成立于2002年 - http://www.icman.cn/
官网对SC12B的介绍是:SC12B是带自校正的容性触摸感应器,可以检测 12 个感应盘是否被触摸。它可以通过任何非导电介质 (如玻璃和塑料)来感应电容变化。这种电容感应的开关可以应用在很多电子产品上,提高产品的附加值。
手册中提供了SC12B的应用电路,如图x所示。
功能特性 | 解析 |
---|---|
12 个完全独立的触摸感应按键 | 最多支持12个通道,其中CH4可以单独配置感应阈值,可作为接近感应。其余通道使用共享的感应阈值。这就意味着,12个(或11个)通道的触摸板必须大体相同(或者不用)。 |
保持自动校正,无需外部干预 | Touch芯片内部有一个小单片机,实现自动跟随阈值的算法,抑制环境变化对检测按键的影响。 |
按键输出经过完全消抖处理 | Touch芯片内部有一个小单片机,实现按键检测、消抖的算法。 |
多接口 – I2C 串行接口 / BCD 码输出 | BCD码的输出非常方便,用并口读就好,但功能比较少,不能调整配置,只能输出单按键。实际使用还是得用I2C,如果硬件I2C不好用,软件模拟也行。 |
多种灵敏度调节方式 – 共用灵敏度电容/寄存器配置 | 需要I2C配置内部寄存器才行。参见寄存器SenSet0和SenSetCOM。 |
空闲状态可以节省功耗 | 需要I2C配置内部寄存器才行。参见寄存器CTRL0。 |
2.5V ~ 6.0V 工作电压 | 能用3.3V和5V就好。 |
符合 RoHS 指令的环保 SSOP-24(0.635)封装 | SSOP-24的封装,焊接方便。 |
虽然BCD码简单方便,但考虑需要更充分地评估芯片功能:调整灵敏度和时间参数、查看多按键情况、查看原始感应值,最终还是选择使用I2C通信方式连通。
通过阅读手册,提取关于I2C从机设备的关键信息。
SC12B的I2C从机设备地址,在当前的评估板上为0x40(ASEL引脚悬空)。如图x所示。
SCB12B内部的功能寄存器简明扼要。如图x所示。
看下功耗情况。手册中有表格描述,如图x所示。
3.3V供电,在休眠模式下能做到20uA,也算是中规中矩了。作为比较,之前做过的案子,电池供电的门锁触摸面板,要求睁着一只眼睛休眠(可唤醒)的待机平均电流在20uA以下。
Mini-F0160 board
Mini-F0160电路板上的I2C总线上已经挂了一个24C02,再挂上SC12B也没有问题。Mini-F0160电路板上给I2C总线搭了上拉电阻4.7k,SC12B Demo电路板上也有上拉电阻10k,这么并联之后大约到3k。可能上拉的电路大一点,先试着用吧。
F0160微控制器同SC12B的信号连线如表x所示。
SC12B pin | Signal | F0160 pin |
---|---|---|
SDA | SDA | PB11(AF15), GPIO |
SCL | SCL | PB10(AF15), GPIO |
INT | INT | PB1(AF15), GPIO |
GND | GND | GND |
VDD | 3.3v | VDD |
注意,在实验过程中发现,Mini-F0160电路板上的Arduino插座上的I2C接口,同开发板专门引出的I2C插座不是一组信号,同开发板自带24C02芯片使用的I2C接口也不是一组信号。晕,这着实让我折腾了一番。最后,还是选定同板载24C02芯片相同的一组I2C引脚,可以直接用MindSDK样例工程中的引脚配置,改工程也省事。
最终连线实物图如图x所示。
Software
在本案中,需要软件实现的功能相对简单(需求):
- 通过I2C总线,配置SC12B的不同工作模式,试用各模式下的功能。
- 读SC12B校准、滤波、判定算法之后的
- 判决值,尤其是多点触控下的计算结果。这是SC12B中手册没写的,需要自己验证。
- 读SC12B对电极的原始采样值,看一下原始原始采样信号,进一步评估内部算法实现的鲁棒性。
- MCU对SC12B的计算结果进行采样,使用FreeMASTER工具在PC机上显示出来,录制数据并可视化。
MCU Software - MM32F0160
F0160的软件,使用MindSDK中的mini-f0160_softi2c_scan_mdk
工程作为基础,先不改任何代码,试着扫描一下I2C总线,看能不能找到SC12B设备。这里使用的是MindSDK中的softi2c组件,软件模拟I2C协议(吐槽一下我司的硬件I2C外设)。
从图x显示的log中可以看到,当前I2C总线上已经可以识别SC12B的从机地址0x40
了。同时扫描出来的0x50
是同在I2C总线上的24C02存储芯片的从机设备地址。
根据SC12B手册的说明,在F0160的软件工程中,把OUTPUT0和OUTPUT1寄存器中的数据(表示多个按键同时按下的判决状态)读出来,存入全局变量,供后续FreeMASTER对数据进行可视化时使用。
在main.c文件中编写应用程序框架如下:
int main(void)
{
BOARD_Init();
printf("touch app.\r\n");
/* setup softi2c. */
softi2c_init(&app_softi2c_obj, (softi2c_if_t*)&brd_softi2c_if, BOARD_SOFTI2C_BPS_DELAY, BOARD_SOFTI2C_TIMEOUT_DELAY);
while (1)
{
/* read the touch soc. */
touch_update_flags(touch_channel_flags);
touch_print_flags(touch_channel_flags);
}
}
其中,touch_update_flags()函数从SC12B中读OUTPUT1和OUTPUT2寄存器,并拆分成单独通道的标记值,便于后续显示和记录采样数据。有源程序如下:
uint32_t touch_channel_flags[TOUCH_CHANNEL_NUM];
uint8_t touch_xfer_buf[2] = {0};
void touch_update_flags(uint32_t * flags)
{
/* read register value from touch soc. */
touch_xfer_buf[0] = TOUCH_I2C_REG_OUTPUT1;
softi2c_write(&app_softi2c_obj, TOUCH_I2C_DEV_ADDR, touch_xfer_buf, 1, false);
softi2c_read(&app_softi2c_obj, TOUCH_I2C_DEV_ADDR, touch_xfer_buf, 2, true);
/* split the flags to each. */
uint32_t chn_idx = 0;
while (chn_idx < 8)
{
if (0u == ((1u << (7u - chn_idx)) & touch_xfer_buf[0]))
{
flags[chn_idx] = TOUCH_CHANNEL_VAL_NO_TOUCH;
}
else
{
flags[chn_idx] = chn_idx;
}
chn_idx++;
}
while (chn_idx < TOUCH_CHANNEL_NUM)
{
if (0u == ((1u << (7u - (chn_idx - 8u))) & touch_xfer_buf[1]))
{
flags[chn_idx] = TOUCH_CHANNEL_VAL_NO_TOUCH;
}
else
{
flags[chn_idx] = chn_idx;
}
chn_idx++;
}
}
这里更新的touch_channel_flags[]
数组,将会是FreeMASTER可视化的数据对象。
后续可以试着调整其他功能寄存器中的配置参数,就随心所欲啦。
PC Tool - FreeMASTER
FreeMASTER可以提供一个类似示波器的界面,通过SWD端口连接到微控制器的程序中,对存放于内容中的数据(全局变量)以时间顺序记录下来存于PC上,并绘制实时曲线供开发者观察采样值的变化情况,是调试传感器类程序的绝佳工具。FreeMASTER还提供图形化的人机交互界面的功能,此处暂且不表。
- 配置连接。使用JLink连接电路板上的微控制器芯片,导入F0160工程符号表。
- 创建FreeMASTER变量绑定到MCU的内存区。
- 创建示波器页面,并添加变量到示波器中。
- 运行FreeMASTER程序,Mini-F0160、JLink、FreeMASTER联调运行效果,如图x所示。
从图中可以看到监控波形同触摸感应事件的对应关系,我用手依次单独按下12个按键,然后同时按下3个一组按键并递增。由此可以验证本案Touch方案可以支持同时检测多按键。不出意外,这肯定是基于自感式实现的Touch。
FreeMASTER软件工具自带录制数据的功能,可以将录制数据保存在txt文件中,然后通过Excel的导入数据工程整理成表格,然后可以用Python进行进一步的分析。此处就不再赘述操作过程了,跟着感觉找彩蛋即可。之前的Touch项目中,我直接搞外设模块,滤波、消抖等算法也需要自己写,用保存下来的数据流分析模式,设计对应的滤波策略。这个案子里,SC12B自带算法,现在只要能够实时观察处理结果即可。安逸。
Summary
本文通过组装电路和编写软件,创建了一个验证Touch系统可靠性的基本环境,通过FreeMASTER工具,可以直观地看到Touch系统内部对触摸感应以及判定的实际情况。接下来在验证阶段,我使用几种典型的Touch应用场景,对本案Touch系统的性能进行评测。具体地,就是引入各种日常应用Touch的环境干扰,观察Touch系统在有干扰情况下能否正常工作。
(未完待续。。。)