RC电容接触感应按键
1:RC感应原理
RC采样原理便是通过丈量感应极电容的细小改动,来感知人体对电容式感应器(按键、轮键或许滑条)的感应。电极电容(C)通过一个固定的电阻(R)周期性地充放电。
固定电压施加在VIN,VOUT的电压跟着电容值的改动而相应添加或许下降。
通过核算VOUT的电压抵达阀值VTH所需求的充电时刻(tC),来得到电容值(C)。
在接触感应运用中,电容值(C)由两部分组成:固定电容(电极电容,CX)和当人手接触或许接近电极时,由人手带来的电容(感应电容,CT)。电极电容应该尽或许的小,以确保检测到人手接触。因为一般人手接触与否,带来的电容改动一般便是几个pF(一般5pF)。
运用该原理,就能够检测到手指是否接触了电极。
2:硬件完结
3:充放电时刻丈量原理
为了确保强健的电容接触感应的运用,充电时刻的丈量需求满足的准确。一般有两种办法来丈量充电时刻:
1.榜首种办法是选用输入捕获(IC)守时器,当电压抵达阀值时,触发守时器开端作业。该计划中时刻丈量的准确度直接取决于守时器计数器的频率。可是,因为每个电极都需求一个输入捕获通道,一般的MCU就不合适这种类型的电容感应运用了。
2.第二种办法选用一个简略的守时器(无需IC功用)和一系列简略的软件操作,即守时地查看感应I/O端口上的电压是否抵达阀值。这样的话,时刻丈量的准确度就取决于履行一次完好软件查询需求的CPU周期数。这种丈量办法会因为屡次丈量带来一些颤动,可是因为没有硬件约束,这种办法适用于需求许多电极的场合。
第二种办法修正一下,运用自适应的软件序列,就能够在丈量时刻时取得和CPU频率(fCPU)相同的精度。
现在ST接触感应选用第二种办法。
运用一般守时器进行充电时刻的丈量。对电容充电开端之前,守时器的计数器数值被记载下来。当采样I/O端口上的电压抵达某个阀值(VTH)时,再次记载守时器计数器的值。二者之差便是充电或许放电的时刻。
为了进步在电压和温度变化状况下的稳定性,对电极会进行接连两次的丈量:榜首次丈量对电容的充电时刻,直到输入电压升至VIH。第2次丈量电容的放电时刻,直到输入电压降至VIL。下图以及以下的表格具体阐明晰对感应电极(感应I/O)和负载I/O引脚上的操作流程。
4:电容充放电测量进程
因为是丈量整个充电和放电为一个进程,因而在电容充电开端时分计时器开端计数,在电容放电完结时分才中止计数,一起保存计数值
以上文字根本摘抄至ST文献
5:数据处理
a:采样
因为咱们在判别的时分是要花3个周期(while(PIND_X);),可是咱们的计数器是1个周期的,这样判别采样值就会有差错。
举例说,在充电进程中比方在T=49点上好是VIH抵达点。会呈现以下三种状况:
1:在前一个判别点在46时刻点上,刚好能够在49时刻点判别采样到VIH
2:在前一个判别点在47时刻点上,只能在50时刻点判别采样到VIH,相差1个字
3:在前一个判别点在48时刻点上,只能在51时刻点判别采样到VIH,相差2个字
咱们当然期望每次都是状况1呈现,可是不或许啊!
选用软件办法丈量3次,在3次中咱们假定49,50,51点各呈现一次。
第1次49 第2次 50 第3次 51
第1次49 第2次 50-1=49 第3次 51-2=49
可是咱们怎样知道哪次丈量是49或许50或许51呢?很简略咱们每次丈量比前一次延时1个周期,接连丈量3次,这样就根本理论上跨过了3种或许呈现的状况。可是假设三次都是相同的值,那就只需抱怨老天怨天了。
咱们丈量的是整个充放电进程,所以理论上要跨过3*3=9个推迟周期,一起咱们还顺便把跨过的这9次丈量作为1组多点丈量的均匀数据。
B手指同步
咱们的程序一般都是采样多点,然后求均匀。问题就出在这儿,比方程序判别9个点,在前6个点手指没有接触,后3个点手指按接触,这样求出的均匀值就偏小,和手指远离按键的效果相同了。特别是均匀点越多越是会呈现这样的问题。
因而要求判别和手指接触同步。比方程序判别9个点,在前3个点手指没有接触,后三个点手指接触,咱们判别到第4个点有手指,从4-13扫描9个点。这样就包含了手指的同步状况。当然有人说要是我在第7个点把手移开了不就变成后边几点没有按键吗?恶作剧的,CPU的速度那么快,或许CPU扫描完结9个点然后再出去散步一圈回来,你的手指状况还没有来的及改动呢。
当然然咱们也能够选用接连扫描两次9个点,假设两次值相差在必定范围内,阐明手指状况相同。笔者仍是选用该种办法,虽然CPU速度快,但我怕他出去散步的时分给什么大姨妈缠住不回来就惨了。
C:按键判别
通过以上处理假设咱们得到接触值为80,没有接触时分的值是60,取一个按键敞开值70,只需按键值大于70就表明有接触。可是不是只需接触值小于70就表明没有按键呢?当然不是,手指毕竟是颤动的,一会大于70,一瞬间小于70。按键就颤动了。
咱们选用一个按键开释值63,这样当接触值大于70按键敞开,一直到接触值小于63才表明按键开释,就消除了按键颤动。
当然咱们实践没有必要知道每次按键的扫描值,只需给每个通道设置一个差值,让CPU自己去做接触值和根本值之间的差值比较就能够了。如差值大于10按键敞开,差值小于3按键开释。
D:按键按捺和校准
按键按捺:咱们把没有接触时分的电容充放电值扫描纪录下来保存为根本按键值。然后把今后扫描道的接触电容充放电值和根本值比较,在所有通道中差值最大那一组才敞开。起到相邻按键按捺效果。不过笔者以为该功用真的效果不大,有时分还会起反效果。
按键校准:该进程很重要,因为环境温度,电压等形成根本电容变大,这样假设不从头校准根本值的话,差值很小,会形成灵敏度下降,乃至检测不到按键。校准其实很简略,选用1个守时器,在2秒钟内假设没有检测到接触状况就从头扫描保存根本值。
好了就这样根本上RC电容按键就完结了。
写在这儿,不得不说一下,笔者用AT2313编译过6键的RC接触按键,稳定性仍是不错的,不过在实验室,为什么不在恶劣的环境下实验呢?
下面说一下RC电容感应的缺陷,不谈长处,笔者以为根本没有。
1) 要求CPU速度要快,一般8M以上
2) 简单受搅扰,输入检测是高阻态嘛
3) 该办法检测的手指电容改换不大(灵敏度和搅扰相克,一起电容的穿透感应最强是在充放电的瞬间,而不是整个进程,RC原理恰恰是运用的整个进程)
4) 软件处理费事
主张玩玩,或许用在搞死人不偿命的设备上仍是能够的,比方小玩具,手机等。禁止用在工业产品上啊。
笔者用2313做过RC电容感应按键6个,仿照ST的
PD1作为公共脚
PA1PA0PD2PD3PD4PD5做K0-K5 6个按键
PB4PB3PB2PB1PB0PD6接发光二极管来反映状况
原本还留有I2C口的,因为感觉该计划真实不能用于工业,所以就到此为止。