Qtouch学习经验总结

首先,了解一下什么是Qtouch,关于这个网上的资料很少,大多都说的一些Qtouch的背景而不方便别人理解什么是Qtouch。这就是一个触摸方案,媒介是电容,核心是统计充电的次数差值。

Qtouch的原理图,其中电容Cs远大于Cx

1、S2闭合,CsCx开始充电,因为电容充电的期间电路是有电流的,经过CsCx的电流理论上是一样的,所以Cx上和Cs上积攒的电荷量也是一样的。

2、S2开,S1闭合,Cx放电至电荷量为0,而Cs上的电荷会保留下来。

3、S1开,S2闭合,再进行一个充电周期,Cs上的电荷量就是2倍的Cx,如此循环,知道Cs上的电压等于VDD,结束充电,统计充电次数。

那个圆的灰的就相当于按键,人手接触,相当于增大了Cx的容量,减小充电次数,即以前要1000次才充满,现在900次就充满了,检测到这个差值,MCU判断有按键按下,实现触摸按键的功能。

Atmel为这个Qtouch准备了专门的库函数供他人调用,实现其触摸按键功能,因为ICCAVR不支持做QTouch的芯片,所以改用AtmelStudio6,用这个开发环境就注意两点,一是要加载Qtouch的库,头文件等要用到的东西,还有就是要手动设定头文件的路径,就算复制到当前文件夹也要指定,不然会报错。

Qtouch实现流程

先把流程的代码贴出来再作详细解释

int main(void)

{

uint16_t status_flag = 0u;

uint16_t burst_flag = 0u;

uint8_t sense_state = 0u;

stay_on();

#ifdef QTOUCH_STUDIO_MASKS  //

key_connect();   //按键关联

#endif

enable_key();    //使能按键

qt_init_sensing();     //初始化传感器

qt_set_parameters();     //设置传感器参数

time_init();     //定时器初始化

    while(1)

    {

if(inter_flag)   

{

inter_flag = 0;

status_flag = qt_measure_sensors( current_time_ms_touch );   //获取传感器值

burst_flag = status_flag & QTLIB_RESOLVE_DI;    //是否处于按键检测

sense_state = qt_measure_data.qt_touch_status.sensor_states[0];  //按键位置}

}

1、单片机引脚跟库函数关联

因为现在要调用库函数来操作单片机了,所以需要将两者关联起来,相当于单片机引脚在库函数中产生一个映射,关联函数的代码,用AVR Qtouch stdio软件对照单片机引脚配置好后自动生成的代码复制到函数主体中就可以了,根据代码定义一下缺少的数组就OK了。

uint8_t SNS_array[2][2];

uint8_t SNSK_array[2][2];

void key_connect(void)

{

SNS_array[0][0]= 0x55;

SNS_array[0][1]= 0x0;

SNS_array[1][0]= 0x0;

SNS_array[1][1]= 0x0;

SNSK_array[0][0]= 0xAA;

SNSK_array[0][1]= 0x0;

SNSK_array[1][0]= 0x0;

SNSK_array[1][1]= 0x0;

}

2、使能按键

按键关联了,下一步当然是使能这些按键了。

函数:qt_enable_key(通道号,所在组,阀值,指定传感器滞后)

void enable_key(void)

{

qt_enable_key(CHANNEL_0,NO_AKS_GROUP,10u,HYST_6_25);  

qt_enable_key(CHANNEL_1,AKS_GROUP_2,10u,HYST_6_25);

qt_enable_key(CHANNEL_2,AKS_GROUP_3,10u,HYST_6_25);

qt_enable_key(CHANNEL_3,AKS_GROUP_4,10u,HYST_6_25);

}

通道号:从channel_0开始,mega168支持最多到channel_64。一个按键在单片机上由两个端口SNSSNSK,这2个算一个按键,占用一个通道。

组:如果2个按键在一个组里,都满足触摸的条件,这时候会比较哪个的差值更大,小的那个就忽略不触发。不在一个组里就不会进行这种比较。

阀值:就是前面提到的充电次数差值。

指定传感器滞后:暂不清楚,不作描述

3、传感器初始化

这是一个很有难度的东西,虽然这个部分只需要执行一条语句:qt_init_sensing();但是执行之前,要做很多的准备工作。

首先要把AS6安装目录下的touch_api.h包含进头文件,然后把qt_asm_avr.hqt_asm_tiny_mega.S添加进工程,还需要手动创建一个touch_config.h文件,里面要定义这些常量:

#define _QTOUCH_   //表明用Qtouch这个函数库

#define _POWER_OPTIMIZATION_ 0   //能源优化

#define QT_NUM_CHANNELS 4  //最多按键数,也就是通道数

#define QT_DELAY_CYCLES 3   //跟单片机功率有关

#define QTOUCH_STUDIO_MASKS   //按键关联用到的,但是对这个函数也有影响

看起来有些常量跟这函数调用没有任何关系,但是我亲身经验告诉你,少一个都不行!

4、传感器参数设置

这个没什么难度,一些参数自己考虑着配置了,使用推荐配置也是不错的选择,然后将这些赋值给结构体qt_config_data

void qt_set_parameters(void)

{

qt_config_data.qt_recal_threshold = RECAL_50; //自动校准阀值标准50%

qt_config_data.qt_di              = 4u;       //按键重复检测次数

qt_config_data.qt_drift_hold_time = 20;       //漂移保持时间,200ms*20 = 4s

qt_config_data.qt_max_on_duration = 0;        //失能(最长触摸时间后功能恢复)

qt_config_data.qt_neg_drift_rate  = 20;       //传感器负漂移率4s

qt_config_data.qt_pos_drift_rate  = 5;        //传感器正漂移率1s

qt_config_data.qt_pos_recal_delay = 3u;       //传感器调整延迟

}

5、定时检测,中断处理

这个步骤其实在整体Qtouch的实现中来说是可有可无的,写上来是因为在这边遇到了两个挺有价值的问题,对以后程序的编写也算一个前车之鉴

我用定时器的初衷是想实现一个定时检测,而不是无限循环得检测,所有设置一个标志位,定时触发中断将标志位置1,只有当标志位为1时才会进行按键检测。

ISR(TIMER0_COMPA_vect)

{

current_time_ms_touch += qt_measurement_period_msec;

inter_flag = 1u;

}

这就是一个中断处理函数,这里的ISR相当于#pragma interrupt_handler。还要注意TIMER0_COMPA_vect是中断向量而不是中断向量号,所以写一个具体的数字7啊之类的是会报错的。

第一个问题是我中断函数确实执行了,将标志位置1后发现到主函数中却进不了按键检测的部分,就是说那个标志位还是0,两者十分矛盾。后来发现这个标志位被编译器给自动优化掉了!以后用全局变量时,最好加volatile修饰,以防万一。

定时器函数照常写

void time_init(void)

{

SREG = 0x80;

TCCR0A |= (1 << COM0A1)|(1 << WGM01);

TCNT0 = 0x00;

OCR0A = 0x10;  //16*0.078125 = 1.25us;

TIMSK0 |= (1 << OCIE0A);

TCCR0B |= (1 << CS00);

}

这边就有第二个问题,注意代码中红色的部分,就是比较匹配时OC0A清零,就因为这位置1,导致了2个问题。第一个是因为我写完之后发现按键可以检测和区分,但是按下,松开都有个1S的延时没有合理解释,采用排除法查到这边发现这个原因,因为这个引脚跟按键key4所需要的引脚是共用的,两者的共同操作带来冲突导致了延时。因为查到这个,顺带还发现了这个冲突还会导致按键无法检测,之前还以为是芯片没有焊接好而导致的。算是意外收获了。正确代码把红色部分去掉,不操作引脚电平就行。

 

6、获取传感器状态和区分按键

这部分就是理解问题了,一共需要用到三个函数

status_flag = qt_measure_sensors( current_time_ms_touch );   //获取传感器值

burst_flag = status_flag & QTLIB_RESOLVE_DI;    //是否处于按键检测

sense_state = qt_measure_data.qt_touch_status.sensor_states[0];  //获取按键位置

第一个函数中的参数current_time_ms_touch,数据手册的描述是当前时间,以ms为单位,乍一看这数字怎么得啊,还要精确到ms,名字唬人,其实只要是变化的数字就行。

第二个函数QTLIB_RESOLVE_DI就是按键检测标志位了。看看传感器是不是在按键检测,不是必须,调试过程中用的。能获取按键位置的话这一步根本不需要。

第三个函数就是区别哪个按键检测到了,这边的sensor_states[0]需要注意的是,sense_state得到的是一个8位的数据,也就是能检测channel_0~channel_7的按键状态,而不仅仅是检测channel_0的状态,由此sensor_states[1]就是8~15的按键状态了。

PS我做这个模块因为触摸按键包括MCUPSU之间都是用的导线连接的,所以实验过程中导线的干扰也是必须要注意的,如果你导线多的话,没检测到按键按下也有可能是导线干扰,理分开一点,交叉的话很容易导致无法检测的。

总结:

整个Qtouch的实现流程讲完了,做完了之后觉得很简单,因为就那么几步,函数还不要自己实现,代码量少得很。但是在做的时候还是挺难的,尤其是刚开始的时候,开发环境不熟悉,要用的函数又不是自己写的,不知道什么用。从开始看到理清思绪搭好框架花了1周多的时间,不管怎么说,有收获就行。至于sliderwheel的功能,暂时还没研究,以后有机会再学习。

Qtouch这个功能使用方面来看的话,检测非常灵敏,也没遇到过误判之类的问题,实验过程中最大的缺点就是导线干扰,但是如果是投入使用的话那肯定可以通过PCB布线解决这个问题,而且这个按键的外设部分就一个铁片,成本极低而且不易损坏。如果说还有局限性的话,就是如果按键多的话,那那些按键所占用的引脚就不可以用以电平变化,这样就减少了单片机一些变化的余地,还有atmel产的芯片并不是都支持Qtouch的,如果主芯片恰巧不支持,那就必须采用一个单独的芯片用作按键。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
QTouch组态软件概述   1 概述   QTouch跨平台自动化软件是采用跨平台类库设计,集成了:设备通信、图形显示、数据转换、逻辑处理等功能,提供二次开发的自动化平台软件。其功能强大,协议丰富,简单易用,跨平台支持等特点,在国内的自动化平台软件上属于首创,并具有国际领先水平。   1.1 跨平台支持   QTouch跨平台自动化软件,支持众多的操作系统,从而实现多平台的运行和协作,具有多平台支持,统一开发平台,多平台协作运行,实现智慧及物联,其支持的操作系统如下所示:   1   除上述常见的OS以外,完整的OS支持列表如下:   2   备注中描述的下载安装,可以到官方网站:www.sitcsys.com下载试用。   1.2 智能处理器支持   QTouch尤其在智能终端上的支持性能良好,除支持通用的intel处理器外,更多的支持基于ARM构架的RISC处理器,便于用户采用QTouch软件快速的组件自己的智能化产品。   3   1.3 运行方式   QTouch运行方式分为设计开发环境和运行环境,设计开发环境可以在台式机或笔记本上进行,而运行环境则可以在多种设备上运行,只需要通过usb或RJ45网络进行下载即可。运行方式如下图所示:   4   1.4 功能列表   QTouch软件集成了设备通信、图形界面、数据转换、逻辑处理等四大自动化应用,并提供统一的二次开发环境,在应用上支持:智能设备运行,web访问接口,移动APP应用,本地计算机运行等四种运行方式。功能列表说明如下:   5   应用支持说明如下:   6   1.5 典型应用方向   QTouch具有4个自动化相关的功能和4个应用模式,基本涵盖了工业自动化相关的所有应用,特别在工业设备联网应用上具有多维度的实现方式,因而既具有自动化控制和管理的基础性平台,又具有多系统,多维度的接入方案,是智能化发展潮流中最先进的平台软件。其典型应用如下:   7   8   9   2 QTouch技术详解   2.1 QTouch下载及安装   用户可以从武汉舜通智能科技有限公司的官方网站下载QTouch软件,地址为:www.sitcsys.com,下载页面包含如下版本及内容:   10   2.2 QTouch工程管理器   用户安装完QTouch之后,在桌面上有2个图标,一个是QTouch工程管理器,一个是QTouch运行,QTouch工程管理器即为项目的二次设计平台,QTouch运行则是在计算机上运行设计好的项目工程。显示如下:   11   工程管理器具有如下设计功能:   12   2.3 画面设计   用户通过工程管理器建立好工程之后,通过建立画面,双击启动画面的编辑环境,用户可以在绘图工具上进行画面的设计和运行的数据关联,显示如下:   13   绘图系统具有如下设计功能:   14   JS开发环境如下图所示:   15   2.4 设备通信管理   通过QTouch的工程管理器进行对通信设备的设置和变量的配置,便于用户快速的组建设备通信网络,实现对数据的接入和管理,系统界面如下:   16   设备建立完成之后,在数据库配置工具上,进行设备通信点表的配置,只有完成了点表的配置,QTouch系统才能通过通信线,实现从设备中获取数据,进入QTouch的数据库系统,显示如下:   17   2.5 逻辑编程   QTouch具有丰富的逻辑编程能力,提供2种逻辑处理手段,一个是基于IEC61131-3标准的softPLC,一个是基于c语言的编辑编译系统,通过提供的2种逻辑编程方式,能够实现任意的逻辑处理算法。梯形图编程环境如下所示:   18   C语言编程环境如下所示,用户可以将自己的c语言嵌入进来,也可以自行开发,通过API调用QTouch内存数据或SQL数据。   19   3 应用案例   QTouch跨平台自动化软件最近几年取得了广泛的应用,获得用户的肯定,在跨平台技术创新上处于国内领先水平,具有长足的发展空间,同时也是填补了国内在工业自动化软件平台上的短板。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值