电容式触摸屏结构控制器为什么不能集成到mcu

捷配欢迎您!
微信扫一扫关注我们
当前位置:&>>&&>>&&>>&在中颖8位MCU的基础上实现触摸按键功能
&&& 在需要用户界面的应用方案中,传统的机电正在被式触摸感应控制所替代。
&&& Sino wealth已经开发了一套触摸感应软件,使得任意一款8位的中颖都可以作为一个电容式触摸按键控制器使用。通过对由一个和触摸电极电容组成的RC充放电时间的控制,该触摸感应软件可以检测到人手的触摸。由于电极电容的改变,导致的RC充放电时间的改变,能够被检测出来,然后经过滤波等,最终通过专用的I/O端口。
&&& 在BIOS设置中有关于是否更新微代码
&&& code Updation [Enabled] : Disabled/Enabled
&&& MCU(Micro
Unit)中文名称为微控制单元,又称单片微型计算机( Chip Microcomputer)或者,是指随着大规模的出现及其发展,将计算机的CPU、RAM、ROM、定时计数器和多种I/O接口集成在一片芯片上,形成芯片级的计算机,为不同的应用场合做不同组合控制。
&&& 1 RC感应原理
&&& RC采样原理就是通过测量触摸电极电容的微小变化,来感知人体对电容式触摸(按键、滚轮或者滑条)的触摸。
&&& 电极电容(C)通过一个固定的电阻(R)周期性地充放电。 电容值取决于以下几个参数:电极面积(A),绝缘体相对介电常数,空气相对湿度,以及两个电极之间的距离(d)。电容值可由下列公式得出:
  图1:RC电压检测。
  固定电压施加在 , 的电压随着电容值的变化而相应增加或者降低, 如图2所示。
  图2:测量充电时间。
&&& 通过计算VOUT的电压达到阀值VTH所需要的充电时间(TC),来得到电容值(C)。 在触摸感应应用中,电容值(C)由两部分组成:固定电容(电极电容,CX)和当人手接触或者靠近电极时,由人手带来的电容(感应电容,CT)。电极电容应该尽可能的小,以保证检测到人手触摸。利用该原理,就可以检测到手指是否触摸了电极。
  图3:触摸感应。
&&& 2 硬件实现
&&& 图4由R1,R2以及电容电极(CX)和手指电容(CT)并联的电容(大约5pF) 形成一个RC网络,通过对该RC网络充放电时间的测量,可以检测到人手的触摸。 所有电极共享一个“负载I/O”引脚。电阻R1和R2尽量靠近MCU放置。电容R1(阻值在几百欧到几兆欧之间)是主要电容,用于调节触摸检测的灵敏度。
  图4:电容触摸感应实现实例。
&&& 3 软件实现
&&& 充电时间测量原理
&&& 为了保证健壮的电容触摸感应的应用,充电时间的测量需要足够的精确。
&&& 采用一个简单的定时器(无需IC功能)和一系列简单的软件操作,即定时地检查感应I/O端口上的电压是否达到阀值。
&&& 基本测量
&&& 使用普通定时器进行充电时间的测量。对电容充电开始之前,定时器的计数器数值被记录下来。当采样I/O端口上的电压达到某个阀值(VTH)时,再次记录定时器计数器的值。二者之差就是 充电或者放电的时间。
  图5:定时器计数器值。
  过采样
  过采样的目的是以CPU时钟的精度,对输入电压达到高电平和低电平(VIH和VIL)的时间测量。 为了跨越所有的取值范围,每次测量都比上一次测量延迟一个CPU时钟周期的时间。 为了跨越所有的取值范围,测量的次数是和MCU核相关的。图6说明了这个概念的应用情况。
  图6:输入电压测量。
  输入电压测量的原理
  为了提高在电压和温度变动情况下的稳定性,对电极会进行连续两次的测量:第一次测量对电容的充电时间,直到输入电压升至VIH。第二次测量电容的放电时间,直到输入电压降至VIL。下图以及以下的表格详细说明了对感应电极(感应I/O)和负载I/O引脚上的操作流程。
  图7:电容充放电时间测量。 
  表2 电容充放电测量步骤
  触摸的效果
  电极的电容值(CX)取决于以下几个主要因素:电极的形状、大小,触摸感应控制器到电极之间的 布线(尤其是地耦合),以及介电面板的材料和厚度。因此,RC充放电时间直接和CX有关。图8说明了这种“触摸的效果”。 时间(即达到了VIH电平的时刻)比长;同样对于降至VIL电平的时间也比长。
  图8:触摸效果实例。
  多次测量以及高频噪声的去除
  为了提高测量的精确度,并去除高频噪声,有必要对VIH和VIL进行多次的测量,然后再决定是否有按键被有效“触摸”。
  图9:测量的种类。
  注意:下图说明了去除噪声的实例。如果测量次数(N)设置为4,那么对一个电极的完整测量将包括4次正确的“连续组测量”(BGs)。
  图10:实例1。
  图11 显示了有一些噪声使得某些测量无效的情况(即r1和r2)。 在这个例子中,连续组测量BG3重复了好几次,直到其中的所有测量都有效,该次组测量才算通过。这样就需要较多的时间来完成一次完整的测量。
  图11:实例2。
  图12显示了有很多噪声,使得无效的组测量次数达到了最大限制(比如20)。这样的话,整个电极测量都无效。这个例子中,达到了无效的组测量次数的最大限制,因此停止对该电极的测量。
  图12:实例3。&&来源:
技术资料出处:shanglu
该文章仅供学习参考使用,版权归作者所有。
因本网站内容较多,未能及时联系上的作者,请按本网站显示的方式与我们联系。
【】【】【】【】
上一篇:下一篇:
本文已有(0)篇评论
发表技术资料评论,请使用文明用语
字符数不能超过255
暂且没有评论!
12345678910
12345678910
12345678910
一、嵌入式系统设计方法变化的背景
  嵌入式系统设计方法的演化总的来说是因为应用需求的牵引和IT技术的推动。
[][][][][][][][][][]
IC热门型号
IC现货型号
推荐电子百科搞研发 找元件
上世强元件电商
【选型】MCU选得好,电容触摸控制器寿命和精度才有保障
来源:世强
作者:万中波
电容式触摸控制技术目前已经在厨房设备中获得了广泛的应用,特别是在抽油烟机、电烤箱、电磁炉等常用设备,电容触摸屏已经逐渐替代了传统的机械按键。
抽油烟机触摸控制系统通常由电容触摸屏、触摸屏控制器和MCU组成,通过MCU进行I2C总线编程,通过相关通信协议从而控制触摸屏控制器然后再作用于触摸屏,使得其用手指触摸时可以检测并做出相应的应答。
图1:基于单片机控制的电容触摸屏控制器
电容触摸屏控制器的核心主要是触摸控制芯片和MCU,触摸控制芯片一般有专门的芯片,而MCU可有多种选择。MCU的可靠性、低功耗等因素会影响整个电容触摸屏的使用寿命、控制精度和使用体验,这里我们推荐Silicon Labs的EFM8BB系列MCU。
鉴于抽油烟机的工作环境,其电容触摸屏一般工作温度较高,所以选择的对应器件工作温度范围要求要宽,EFM8BB系列单片机的工作温度范围可以达到-40°C~125°C。
EFM8BB包含有片上上电复位、电源电压监控器、监视程序定时器和时钟振荡器,可以使得EFM8BB设备成为真正独立的系统单芯片解决方案,功能异常强大,支持电容触摸屏的各种功能设计。
EFM8BB的电源控制较为简单,其内部电路由VDD供电引脚供电。外部I/O引脚由VIO电源电压供电(或设备上无独立VIO连接的VDD),大多数内部电路由片上LDO 调节器供电。根据需要启用/禁用各个外围设备从而可以起到控制设备功耗的作用。每个模拟外围设备在不使用时都可以禁用,从而置于低功耗模式。在不使用数字外围设备(如定时器或串行总线)时,时钟将关闭且消耗较少电量。可以有效节省整机功耗。
EFM8BB自带通用异步接收器/发射器UART、串行外围接口SPI0和I2C接口多种外围接口,方便实现与各种电容触摸控制芯片的连接,非常实用。
看到这里您是否又有项目灵感需实现,点击下面开发软件帮你忙。电容式触摸屏设计三大主要问题:功耗、噪声控制与手势识_滤波器_中国百科网
电容式触摸屏设计三大主要问题:功耗、噪声控制与手势识
    
  11月27日消息,电容式触摸屏的设计人员面对三大主要问题:功耗、噪声控制与手势识别。本文后面部分将为你逐一讲解。
  今天的电池供电型如此之多,功耗是我们需要考虑的关键系统问题之一。诸如TI的TSC3060等器件,便是按照低功耗要求设计的。在标准工作条件下,它的功耗小于60mA。在对触摸行为进行检测时,它的功耗更可低至11在相同工作状态下,它比其竞争者至少低了一个数量级。
  市场上的许多解决方案一开始都是设计为微,然后再逐渐发展为电容式触摸屏。一开始就设计为电容式触摸屏控制器的器件,没有会消耗额外电流和时钟周期的多余硬件。大多数系统都已有一个主中央处理器,其可以是数字信号处理器、微处理器或者微控制器单元(MCU)。因此,为什么要给一个已经经过精密调整的系统再增加一个引擎呢?TSC3060为一种没有微控制器的专门设计。
  噪声控制
  如果控制器无法区分实际触摸和潜在干扰源,则更不用提实现超长的电池使用时间。触摸屏的主要噪声源通常来自LCD,其最终取决于质量和成本之间的折中权衡。AC公共接地LCD通常更便宜,但噪声水平更高。DC公共接地LCD拥有DC屏蔽,可以降低噪声,但会增加成本。
  可以帮助降低ITO传感器以及触摸屏控制器可感知噪声数量的一种典型方法是,在LCD和ITO之间保持一定的空气间隙。这样可在两者之间留出一定的间距,从而减少相互干扰。处理噪声的另一种方法是使用滤波器。例如,TSC3060包含了一套可编程混合信号滤波器,可用于降低噪声。这些滤波器通过一个集成MCU安装到硬件中。这意味着,它们就近完成任务的速度要比使用软件的滤波器快。对实际触摸坐标的快速响应,还可降低总系统资源消耗。
  手势识别
  最后一个设计问题是手势识别。手势不一定是大幅度、复杂的挥舞。手势可以是简单的一次手指滑动。系统主机MCU可以轻松地识别出一些简单的手势,例如:捏、拉、缩放、旋转以及双击和三连击等,并可进行“内部”处理。增加一个专用引擎,可能可以降低一点点系统MCU带宽处理负荷,但却会增加功耗。另外,专用引擎用于完成手势识别的专有算法,设计人员无法看到。
收录时间:日 17:08:32 来源:国联资源网 作者:匿名
上一篇: &(&&)
创建分享人
喜欢此文章的还喜欢
Copyright by ;All rights reserved. 联系:QQ:13831人阅读
Linux内核(28)
***************************************************************************************************************************
作者:EasyWave & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & 时间:
类别:Linux&内核驱动源码分析&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&声明:转载,请保留链接
注意:如有错误,欢迎指正。这些是我学习的日志文章......
***************************************************************************************************************************
一:FT5X06电容触摸IC简介
&&&& FT5x06系列ICs是单芯片电容式触摸屏控制器IC,带有一个内置的8位微控制器单元(MCU)。采用互电容的方法,在配合的相互的电容式触摸面板,它支持真正的多点触摸功能。FT5x06具有用户友好的输入的功能,这可以应用在许多便携式设备,例如蜂窝式电话,移动互联网设备,上网本和笔记本个人电脑。FT5x06系列IC包括FT5206/FT5306/FT5406。具体的功能如下图所示:
二:硬件接口设计
从FT5X06的datasheet中,我们可以看到,FT5X06既可以工作的SPI的接口方式,也可以工作在I2C的接口方式,不管工作在SPI,还是工作在I2C,从硬件的接口设计上来说,这下面的几个控制口,都是需要要接的。如下图所示:
1):INT引脚,这个脚是一个中端信号,它用来通知HOST端FT5X06已经准备好,可以进行读操作了。
2):WAKE引脚:这个功能主要的作用是将FT5X06从睡眠状态转换到工作状态。
3):/RST引脚:FT5X06的芯片复位信号。
如何来设计硬件接口呢,这个我们可以从FT5X06的datasheet看出来,首先我们来看下FT5X06的上电时序,如下图所示:
FT5X06的上电时序
FT5X06的RESET时序
FT5X06的wakeup时序
各自的最小的时间限制如下所所示:
因此,从上面的图片和表格中,我们可以看出,在poweron中,必须确保在上电后,wakeup的电平为高电平,至于INT信号,只要确保无INT信号时,这个INT为高即可,这个可以从poweron的时序可以看出,它是一个低电平的动作,这个是驱动中来做的事情了。
接下来就是确定I2C的从地址,如下图所示:[以下引用自网络]
从地址高位必须为:3,低位必须根据i2ccon设定的值来确定。
根据FT5406数据手册上的指令,我们先了解下驱动如何实现电容屏的多点触摸,其实很简单,主要需要触摸屏IC FT5406 能够捕获多点数据,这点电容屏基本多能支持到捕获2点以上,而FT5406 可以捕获5个触摸点,编写驱动时,只要去获取这几个点的数据,然后上报就可以了。如下图所示:[以下引用自网络]
02H :捕获的触摸点个数&&&&&&&&&&&&& 03H- 1EH&:对应每个点的x,y坐标数值。
三:Linux驱动源码
&&&&&&& I2C的驱动需要根据具体的ARM芯片,一般来说,IC原厂,一般会将在linux的bsp中都会有I2C的驱动,这个部分不需要我们去写的,我们只需要将FT5X06和BSP包中的I2C驱动匹配起来就好了。而整个FT5X06也是这样做的。在linu内核中关于i2c的一般会有这个函数:i2c_board_info()i2c_board_info用于构建信息表来列出存在的I2C设备。这一信息用于增长新型I2C驱动的驱动模型树。对于主板,它使用i2c_register_board_info()来静态创建。对于子板,利用已知的适配器使用i2c_new_device()动态创建。
struct i2c_board_info {
char type[I2C_NAME_SIZE];
void *platform_
struct dev_archdata *
static struct i2c_board_info i2c_devs0[] __initdata = {
#ifdef CONFIG_TOUCHSCREEN_CDTLCD
I2C_BOARD_INFO(&ft5x0x_ts&, 0x3x),
.irq = IRQ_EINT1,
最后在内核初始化的部分调用int i2c_register_board_info(int busnum, struct i2c_board_info const *info, unsigned len);函数即可。如下详细的解释:
@busnum: 指定这些设备属于哪个总线
@info: I2C设备描述符向量
@len: 向量中描述符的数量;为了预留特定的总线号,可以是0。
i2c_register_board_info(0, i2c_devs0, ARRAY_SIZE(i2c_devs0));
下面贴出部分代码:[下面的代码是Android下的Linux驱动,如果要修改到通用的Linux内核中,需要修改代码的]
static int
ft5x0x_ts_probe(struct i2c_client *client, const struct i2c_device_id *id)
struct ft5x0x_ts_data *ft5x0x_
struct input_dev *input_
int err = 0;
unsigned char uc_reg_
#if CFG_SUPPORT_TOUCH_KEY
printk(&[FTS] ft5x0x_ts_probe, driver version is %s.\n&, CFG_FTS_CTP_DRIVER_VERSION);
if (!i2c_check_functionality(client-&adapter, I2C_FUNC_I2C)) {
err = -ENODEV;
goto exit_check_functionality_
ft5x0x_ts = kzalloc(sizeof(struct ft5x0x_ts_data), GFP_KERNEL);
//ft5x0x_ts = kmalloc(sizeof(struct ft5x0x_ts_data), GFP_KERNEL);
if (!ft5x0x_ts) {
err = -ENOMEM;
goto exit_alloc_data_
//memset(ft5x0x_ts, 0, sizeof(struct ft5x0x_ts_data));
this_client =
i2c_set_clientdata(client, ft5x0x_ts);
mutex_init(&ft5x0x_ts-&device_mode_mutex);
INIT_WORK(&ft5x0x_ts-&pen_event_work, ft5x0x_ts_pen_irq_work);
ft5x0x_ts-&ts_workqueue = create_singlethread_workqueue(dev_name(&client-&dev));
if (!ft5x0x_ts-&ts_workqueue) {
err = -ESRCH;
goto exit_create_
err = request_irq(IRQ_EINT(6), ft5x0x_ts_interrupt, IRQF_TRIGGER_FALLING, &ft5x0x_ts&, ft5x0x_ts);
if (err & 0) {
dev_err(&client-&dev, &ft5x0x_probe: request irq failed\n&);
goto exit_irq_request_
disable_irq(IRQ_EINT(6));
input_dev = input_allocate_device();
if (!input_dev) {
err = -ENOMEM;
dev_err(&client-&dev, &failed to allocate input device\n&);
goto exit_input_dev_alloc_
ft5x0x_ts-&input_dev = input_
set_bit(ABS_MT_TOUCH_MAJOR, input_dev-&absbit);
set_bit(ABS_MT_POSITION_X, input_dev-&absbit);
set_bit(ABS_MT_POSITION_Y, input_dev-&absbit);
set_bit(ABS_MT_WIDTH_MAJOR, input_dev-&absbit);
input_set_abs_params(input_dev,
ABS_MT_POSITION_X, 0, SCREEN_MAX_X, 0, 0);
input_set_abs_params(input_dev,
ABS_MT_POSITION_Y, 0, SCREEN_MAX_Y, 0, 0);
input_set_abs_params(input_dev,
ABS_MT_TOUCH_MAJOR, 0, PRESS_MAX, 0, 0);
input_set_abs_params(input_dev,
ABS_MT_WIDTH_MAJOR, 0, 200, 0, 0);
input_set_abs_params(input_dev,
ABS_MT_TRACKING_ID, 0, 5, 0, 0);
set_bit(EV_KEY, input_dev-&evbit);
set_bit(EV_ABS, input_dev-&evbit);
#if CFG_SUPPORT_TOUCH_KEY
//setup key code area
set_bit(EV_SYN, input_dev-&evbit);
set_bit(BTN_TOUCH, input_dev-&keybit);
input_dev-&keycode = tsp_
for(i = 0; i & CFG_NUMOFKEYS; i++)
input_set_capability(input_dev, EV_KEY, ((int*)input_dev-&keycode)[i]);
tsp_keystatus[i] = KEY_RELEASE;
input_dev-&name
= FT5X0X_NAME;
//dev_name(&client-&dev)
err = input_register_device(input_dev);
if (err) {
dev_err(&client-&dev,
&ft5x0x_ts_probe: failed to register input device: %s\n&,
dev_name(&client-&dev));
goto exit_input_register_device_
#ifdef CONFIG_HAS_EARLYSUSPEND
printk(&==register_early_suspend =\n&);
ft5x0x_ts-&early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 1;
ft5x0x_ts-&early_suspend.suspend = ft5x0x_ts_
ft5x0x_ts-&early_suspend.resume = ft5x0x_ts_
register_early_suspend(&ft5x0x_ts-&early_suspend);
msleep(150);
//make sure CTP already finish startup process
//get some register information
uc_reg_value = ft5x0x_read_fw_ver();
printk(&[FTS] Firmware version = 0x%x\n&, uc_reg_value);
ft5x0x_read_reg(FT5X0X_REG_PERIODACTIVE, &uc_reg_value);
printk(&[FTS] report rate is %dHz.\n&, uc_reg_value * 10);
ft5x0x_read_reg(FT5X0X_REG_THGROUP, &uc_reg_value);
printk(&[FTS] touch threshold is %d.\n&, uc_reg_value * 4);
#if CFG_SUPPORT_AUTO_UPG
fts_ctpm_auto_upg();
#if CFG_SUPPORT_UPDATE_PROJECT_SETTING
fts_ctpm_update_project_setting();
enable_irq(IRQ_EINT(6));
//create sysfs
err = sysfs_create_group(&client-&dev.kobj, &ft5x0x_attribute_group);
if (0 != err)
dev_err(&client-&dev, &%s() - ERROR: sysfs_create_group() failed: %d\n&, __FUNCTION__, err);
sysfs_remove_group(&client-&dev.kobj, &ft5x0x_attribute_group);
printk(&ft5x0x:%s() - sysfs_create_group() succeeded.\n&, __FUNCTION__);
printk(&[FTS] ==probe over =\n&);
exit_input_register_device_failed:
input_free_device(input_dev);
exit_input_dev_alloc_failed:
// free_irq(client-&irq, ft5x0x_ts);
free_irq(IRQ_EINT(6), ft5x0x_ts);
exit_irq_request_failed:
//exit_platform_data_null:
cancel_work_sync(&ft5x0x_ts-&pen_event_work);
destroy_workqueue(ft5x0x_ts-&ts_workqueue);
exit_create_singlethread:
printk(&==singlethread error =\n&);
i2c_set_clientdata(client, NULL);
kfree(ft5x0x_ts);
exit_alloc_data_failed:
exit_check_functionality_failed:
static int __devexit ft5x0x_ts_remove(struct i2c_client *client)
struct ft5x0x_ts_data *ft5x0x_
printk(&==ft5x0x_ts_remove=\n&);
ft5x0x_ts = i2c_get_clientdata(client);
unregister_early_suspend(&ft5x0x_ts-&early_suspend);
// free_irq(client-&irq, ft5x0x_ts);
mutex_destroy(&ft5x0x_ts-&device_mode_mutex);
free_irq(IRQ_EINT(6), ft5x0x_ts);
input_unregister_device(ft5x0x_ts-&input_dev);
kfree(ft5x0x_ts);
cancel_work_sync(&ft5x0x_ts-&pen_event_work);
destroy_workqueue(ft5x0x_ts-&ts_workqueue);
i2c_set_clientdata(client, NULL);
del_timer(&test_timer);
static const struct i2c_device_id ft5x0x_ts_id[] = {
{ FT5X0X_NAME, 0x3x },{ }
MODULE_DEVICE_TABLE(i2c, ft5x0x_ts_id);
static struct i2c_driver ft5x0x_ts_driver = {
= ft5x0x_ts_probe,
= __devexit_p(ft5x0x_ts_remove),
.id_table = ft5x0x_ts_id,
.driver = {
.name = FT5X0X_NAME,
.owner = THIS_MODULE,
static int __init ft5x0x_ts_init(void)
printk(&==ft5x0x_ts_init==\n&);
ret = i2c_add_driver(&ft5x0x_ts_driver);
printk(&ret=%d\n&,ret);
static void __exit ft5x0x_ts_exit(void)
printk(&==ft5x0x_ts_exit==\n&);
i2c_del_driver(&ft5x0x_ts_driver);
module_init(ft5x0x_ts_init);
module_exit(ft5x0x_ts_exit);
MODULE_AUTHOR(&&wenfs@&&);
MODULE_DESCRIPTION(&FocalTech ft5x0x TouchScreen driver&);
MODULE_LICENSE(&GPL&);
移植到通用的Linux的内核中,就不写出来了,自己去研究吧。
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:480874次
积分:5821
积分:5821
排名:第4004名
原创:109篇
转载:22篇
评论:96条
(1)(2)(8)(1)(6)(6)(2)(1)(4)(4)(2)(2)(1)(2)(2)(1)(4)(7)(10)(2)(1)(1)(13)(3)(1)(10)(6)(1)(4)(1)(1)(6)(1)(4)(2)(8)}

我要回帖

更多关于 电容式触摸屏工作原理 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信