标题 | 电荷转移感应按键设计说明书 |
范文 | 吴文勇 摘 要:本文主要讲述电容电荷转移理论,并根据此理论设计电荷转移电路,最终由电荷转移电路与倍压脉冲发生器实现电荷转移感应按键功能。此感应按键可应用于玻璃、塑料等作为面板的非接触式人机操作输入。 关键词:电荷转移;电容感应;容抗;倍压 中图分类号:TP21 文献标识码:B 概述 感应技术正在迅速地成为人机界面操作的媒介,人们在应用并享受这种全新的技术所带来的方便、美观、无机械寿命等好处。本文就个人研发的新型感应设计技术作详细说明。 一、电荷转移感应按键的组成 本文设计的感应按键模块有两部分组成,一部分是共用的倍压高频脉冲发生器模块,用于给另一部分电路提供高频的脉冲信号,另一部分是感应按键能量转移电路模块。每一路按键采用一个转移电路模块,例如产品设计两个按键,那么只要采用一个脉冲发器模块和两个感应按键能量转移电路模块,再结合带ADC转换功能的MCU即可。在目前电子产品中MCU是不可缺少的一部分,所以设计人员并不需要额外增加MCU,就可以完成他的设计。 二、电荷转移感应按键的原理 在说明原理之前我们先来了解一下电容,如图1所示:电压与IC的相量关系为: 其中:XC = 1/ωC,称为容抗,单位为 Ω(欧姆),容抗的倒数称为容纳BC = ωC,单位为 S。由(式-1)可见频率和容抗成反比, 也就是频率越高,容抗越小,如图2曲线所示。 ω→0 , |XC|→∞直流开路(隔直) ω→∞,|XC|→0高频短路(旁路作用) 我们知道电容器的公式: ε为极板与极板之间的介电常数 S 为极板面积 d 为极板与极板之间的间距 由此我们可以知道任何导体与导体之间都存在电容,如下图3、图4所示每个电极与电极之间都有一个很小的电容,同样的当手指与电极之间也存在电容。 手指越靠近电极,根据电容急 剧增大,当然再如何增大,电容值还是很小,约为十个PF。同时结合前面讲到的容抗与频率的关系,我们设计一个高频发生电路,使电极是一个相对手指高频变化的电压信号,根据 (式-1),手指与电 极之间产生电流。到此我的结论是:因为手指靠近电极,从而手指与电极之间产生一个耦合电容,因为电容的容抗作用使手指与电极之间产生电流,因为电流使得电极的电荷发生转移,根据电荷的转移理论,我们设计出感应按键能量转移电路模块。 三、倍压高频脉冲发生器 如图5所示,设刚开始PULSE电压为0V,则电源5V经过二极管D2向C4充电。经过 ( τ=RC)后,C4电压为5–VD2 (VD2为二极管D1或D2 PN结的正向压降,下同)。当PULSE由0V变为5V时,三极管Q2导通,三极管Q1截止,电压VA为5V+C4两端电压,得出VA=5+5–VD2。二极管D1截止,二极管D2导通,PULSE_OUT电压为10–2*VD2。当PULSE电压由5V变为0V时,三极管Q2截止,三极管Q1导通,PULSE_OUT电压变为0V。如此循环,可得PULSE_OUT脉冲电压为10–2*VD2,频率与PULSE相同。 四、电荷转移电路 电荷转移电路:如图6所示,在无手指情况下,当脉冲由低电平变高电平时,Ut经过C1,C2,D1,R1对C3进行充电;当脉冲由高电平变低电平时,C1,C2经过D2进行放电;放电后当脉冲又产生高电平时又经过C1,C2,D1,R1对C3进行充电,如此循环C3即可以得到稳定电压U0。当手指靠近电极时,如图7所示,此时人体与电极产生如图所示的电容Cx,电容容量在几PF到十几PF。此时当脉冲由低电平变高电平时,Ut除了通过C1,C2,D1,R1对C3充电外,还对Cx充电,所以Cx得到了一部分电荷。根据电路形式Ut提供给C3的电荷明显减小;当脉冲由高电平变为低电平时,Cx经过R3进行放电,所以脉冲电压Ut可以循环对Cx充电。也就是说每个脉冲周期都会转移一部分电荷到Cx,C3得到的电荷减少,电压U0降低。根据以上分析得出,当手指靠近电极时,U0电压将会降低。根据这个结论,MCU对U0进行AD采样并判断采样数据就可以知道是否有手指靠近,从而判断是否有按键按下,实现感应按键的目的。 五、软件设计 本软件设计采用AVR单片机ATmega16。AVR单片机的推出,彻底打破这种旧设计格局,废除了机器周期,抛弃复杂指令计算机(CISC)追求指令完备的做法;采用精简指令集,以字作为指令长度单位,将内容丰富的操作数与操作码安排在一字之中(指令集中占大多数的单周期指令都是如此),取指周期短,又可预取指令,实现流水作业,故可高速执行指令。 AVR单片机硬件结构采取8位机与16位机的折中策略,即采用局部寄存器 (32个寄存器文件)和单体高速输入/输出的方案(即输入捕获寄存器、输出比较匹配寄存器及相应控制逻辑)。提高了指令执行速度(1Mips/MHz),克服了瓶颈现象,增强了功能;同时又减少了对外设管理的开销,相对简化了硬件结构,降低了成本。故AVR单片机在软/硬件开销、速度、性能和成本诸多方面取得了优化平衡,是高性价比的单片机。 ATmega16有一个10位的逐次逼近型ADC。ADC与一个8通道的模拟多路复用器连接,能对来自端口A的8路单端输入电压进行采样。单端电压输入以0V(GND)为基准。器件还支持16路差分电压输入组合。两路差分输入(ADC1、ADC0与ADC3、ADC2)有可编程增益级,在A/D转换前给差分输入电压提供0dB(1x)、20dB(10x)或46dB(200x)的放大级。七路差分模拟输入通道共享一个通用负端(ADC1),而其他任何ADC输入可做为正输入端。如果使用1x或10x增益,可得到8位分辨率。如果使用200x增益,可得到7位分辨率。 本设计主要采用Atmega16的ADC功能,选用8位分辨率采用方式,启用ADC中断功能。部分程序如下: 主程序: void main(void) { // port initialization // Watchdog Timer initialization // Watchdog Timer Prescaler: OSC/128k #pragma optsize- //WDTCR=0x19; //WDTCR=0x09; #ifdef _OPTIMIZE_SIZE_ #pragma optsize+ #endif ADC_init(); // Global enable interrupts #asm("sei"); Get_sensor_standard();//大约需要1秒钟 while (1) { // Place your code here } ADC中断采样程序(采样多个感应按键): interrupt [ADC_INT] void AD_INT(void) { register static unsigned char num; //采用register static 可以减少入栈及出栈时间,提高运行速度 //设置CD4051通道 PORTC &= 0x3e; PORTC |= AD_CD4051_MUX1[Channel]; //感应按键采样 num = ADC_Sensor[Channel].ConvertNum; ADC_Sensor[Channel].CacheValue[num] = ADCH; if(++ADC_Sensor[Channel].ConvertNum >= DATA_NUM) { ADC_Sensor[Channel].ConvertNum = 0; for(num = 0; num < DATA_NUM; num++) ADC_Sensor[Channel].Value[num] = ADC_Sensor[Channel].CacheValue[num]; //完成一个通道采样 setbit(ADC_Sensor[Channel].State, AD_COMPLETE_BIT);//设置当前通道完成标志 } //ADC通道循环 if(++Channel >= CHANNEL) Channel = 0; // Start the AD conversion ADMUX = AD_MUX[Channel]; ADCSRA|=0x40; } 参考文献 [1]邱关源.电路[M].北京:高等教育出版社. [2]Bruce Eckel.C++编程思想[M].北京:机械工业出版社. [3]李火林,邓声南,甘筱青.数学模型及方法[M].江西:江西高校出版社. [4]宁建国.AVR单片机原理及应用[M].北京:北京航空航天大学出版社. 本设计主要采用Atmega16的ADC功能,选用8位分辨率采用方式,启用ADC中断功能。部分程序如下: 主程序: void main(void) { // port initialization // Watchdog Timer initialization // Watchdog Timer Prescaler: OSC/128k #pragma optsize- //WDTCR=0x19; //WDTCR=0x09; #ifdef _OPTIMIZE_SIZE_ #pragma optsize+ #endif ADC_init(); // Global enable interrupts #asm("sei"); Get_sensor_standard();//大约需要1秒钟 while (1) { // Place your code here } ADC中断采样程序(采样多个感应按键): interrupt [ADC_INT] void AD_INT(void) { register static unsigned char num; //采用register static 可以减少入栈及出栈时间,提高运行速度 //设置CD4051通道 PORTC &= 0x3e; PORTC |= AD_CD4051_MUX1[Channel]; //感应按键采样 num = ADC_Sensor[Channel].ConvertNum; ADC_Sensor[Channel].CacheValue[num] = ADCH; if(++ADC_Sensor[Channel].ConvertNum >= DATA_NUM) { ADC_Sensor[Channel].ConvertNum = 0; for(num = 0; num < DATA_NUM; num++) ADC_Sensor[Channel].Value[num] = ADC_Sensor[Channel].CacheValue[num]; //完成一个通道采样 setbit(ADC_Sensor[Channel].State, AD_COMPLETE_BIT);//设置当前通道完成标志 } //ADC通道循环 if(++Channel >= CHANNEL) Channel = 0; // Start the AD conversion ADMUX = AD_MUX[Channel]; ADCSRA|=0x40; } 参考文献 [1]邱关源.电路[M].北京:高等教育出版社. [2]Bruce Eckel.C++编程思想[M].北京:机械工业出版社. [3]李火林,邓声南,甘筱青.数学模型及方法[M].江西:江西高校出版社. [4]宁建国.AVR单片机原理及应用[M].北京:北京航空航天大学出版社. 本设计主要采用Atmega16的ADC功能,选用8位分辨率采用方式,启用ADC中断功能。部分程序如下: 主程序: void main(void) { // port initialization // Watchdog Timer initialization // Watchdog Timer Prescaler: OSC/128k #pragma optsize- //WDTCR=0x19; //WDTCR=0x09; #ifdef _OPTIMIZE_SIZE_ #pragma optsize+ #endif ADC_init(); // Global enable interrupts #asm("sei"); Get_sensor_standard();//大约需要1秒钟 while (1) { // Place your code here } ADC中断采样程序(采样多个感应按键): interrupt [ADC_INT] void AD_INT(void) { register static unsigned char num; //采用register static 可以减少入栈及出栈时间,提高运行速度 //设置CD4051通道 PORTC &= 0x3e; PORTC |= AD_CD4051_MUX1[Channel]; //感应按键采样 num = ADC_Sensor[Channel].ConvertNum; ADC_Sensor[Channel].CacheValue[num] = ADCH; if(++ADC_Sensor[Channel].ConvertNum >= DATA_NUM) { ADC_Sensor[Channel].ConvertNum = 0; for(num = 0; num < DATA_NUM; num++) ADC_Sensor[Channel].Value[num] = ADC_Sensor[Channel].CacheValue[num]; //完成一个通道采样 setbit(ADC_Sensor[Channel].State, AD_COMPLETE_BIT);//设置当前通道完成标志 } //ADC通道循环 if(++Channel >= CHANNEL) Channel = 0; // Start the AD conversion ADMUX = AD_MUX[Channel]; ADCSRA|=0x40; } 参考文献 [1]邱关源.电路[M].北京:高等教育出版社. [2]Bruce Eckel.C++编程思想[M].北京:机械工业出版社. [3]李火林,邓声南,甘筱青.数学模型及方法[M].江西:江西高校出版社. [4]宁建国.AVR单片机原理及应用[M].北京:北京航空航天大学出版社. |
随便看 |
|
科学优质学术资源、百科知识分享平台,免费提供知识科普、生活经验分享、中外学术论文、各类范文、学术文献、教学资料、学术期刊、会议、报纸、杂志、工具书等各类资源检索、在线阅读和软件app下载服务。