0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

電容觸摸實驗

汽車電子技術 ? 來源:滑小稽筆記 ? 作者:電子技術園地 ? 2023-03-01 15:57 ? 次閱讀

8.1 電容觸摸簡介

8.1.1 電容觸摸概述

隨著科技的發(fā)展,傳統(tǒng)的機械按鍵正在逐步從設備上面消失,這個原因主要有機械按鍵由于是采用機械接觸的方式,壽命比較短,從用戶體驗上看,機械按鍵也顯得操作復雜,對比現(xiàn)在的電容按鍵,電容按鍵具有壽命長,因為不存在機械接觸,占用空間少,以前的機械按鍵在設計外殼的時候需要考慮尺寸,現(xiàn)在換成電容按鍵后這個問題不再需要考慮。

8.1.2 檢測原理

常規(guī)的檢測方式一般是通過計算電容放電時間來判斷是否有手指按下,這是因為手指會與線路板的銅箔接觸面上產(chǎn)生電容效應,當手指沒有放在銅箔上的時候,銅箔與PCB之間存在雜散電容,這兩個狀態(tài)的電容值差別很大,檢測原理如下圖所示。

圖片

在檢測之前首先用開關將電容Cs里面的電荷放盡,然后此時CPU開始計算Cs的充電時間,這一部分是采用捕捉信號來測量,盡管單片機屬于數(shù)字電路,但是數(shù)字電路的邏輯電平也是有電壓限制的,比如在3.3V供電環(huán)境下,當電壓大于2.4V則被認為是邏輯電平1,當電壓小于0.4V則被認為是邏輯電平0,單片機的輸入捕獲功能來判斷輸入信號的電平是否為邏輯電平1,如果檢測到邏輯電平1,則認為電容此時充電達到了2.4V以上,將這個時間記錄下來,當手指放在銅箔上的時候,相當于增加了Cs的容值,此時我們繼續(xù)進行輸入捕獲采樣,將這個捕獲的時間記錄下來,兩個時間求差值,這個差值高于某個閾值的時候就可以認為此時手指按下了電容按鍵,用這種方式就可以實現(xiàn)虛擬按鍵的使用了。這種檢測原理實際是采用了在電路分析中學習到的RC電路的零狀態(tài)響應來實現(xiàn)的。根據(jù)RC電路的零狀態(tài)響應可以得出電容的充電公式為

圖片

其中Vc表示電容的充電電壓,VDDRC電路的輸入電壓,R電阻的阻值,C為充電電容的容值,通過這個公式我們可以反推得到充點電容的容值。也就是說我們可以利用這個公式實現(xiàn)電容的測量。

8.1.3 預備知識

首先我們在進行電容觸摸檢測的時候需要用到STM32的輸入捕獲功能,從這一章開始,關于寄存器文件的添加,驅(qū)動文件的添加不再作為重點,重點開始轉(zhuǎn)為程序的編寫及小算法的編寫。

   輸入捕獲的工作原理如下圖所示。

圖片

首先設置定時器的輸入通道為上升沿捕獲,檢測到上升沿之后,將計數(shù)寄存器CNT中的數(shù)據(jù)存儲在CCRx1中并清空CNT的數(shù)據(jù),然后設置定時器的輸入通道為下降沿捕獲,檢測到下降沿后將計數(shù)寄存器CNT中的數(shù)據(jù)存儲在CCRx2中并清空CNT的數(shù)據(jù),此時將CCRx2的值與CCRx1的值做差值就可以得到1個波形中高電平的時間,由于這兩個數(shù)值獲取的過程中,會由于高電平時間過長導致定時器產(chǎn)生多次中斷,這個多次中斷的值記為N,此時高電平的時間計算公式如下所示:

圖片

其中M為定時器的計數(shù)周期,N為定時器的溢出次數(shù),ARR為自動重裝載計數(shù)器的值,CCRx2為捕獲到的數(shù)據(jù)。

8.2 常用寄存器

8.2.1 捕獲/比較寄存器1:TIMx_CCMR1

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
IC2F[3:0] IC2PSC[1:0] CC2S[1:0] IC1F[3:0] IC1PSC[1:0] CC1S[1:0]

ICxF[3:0]:輸入捕獲x濾波器(定義輸入采樣頻率及數(shù)字濾波器長度)

圖片

ICxPSC[1:0]:輸入/捕獲x預分頻器(一旦CCxE=0,則預分頻器復位)

00:每1個事件觸發(fā)一次捕獲

   01:每2個事件觸發(fā)一次捕獲

   10:每4個事件觸發(fā)一次捕獲

   11:每8個事件觸發(fā)一次捕獲

CCxS[1:0]:捕獲/比較x選擇(用于定義通道x輸入還是輸出)

00:輸出模式

   01:輸入模式,映射在TI110:輸入模式,映射在TI211:輸入模式,映射在TRC上,此模式引用于內(nèi)部觸發(fā)器輸入被選中時

8.2.2 捕獲/比較使能寄存器:TIMx_CCER

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
- CC4P CC4E - CC3P CC3E - CC2P CC2E - CC1P CC1E

CCxP:輸入/捕獲x輸入/輸出極性

通道在輸出模式下

0:高電平有效

   1:低電平有效

通道在輸入模式下

0:不反相,上升沿觸發(fā)

   1:反相,下降沿觸發(fā)

CCxE:輸入/捕獲x輸入/輸出使能

通道在輸出模式下

0:關閉輸出

   1:開啟輸出

通道在輸入模式下

0:禁止捕獲

   1:使能捕獲

8.3 電容觸摸例程

現(xiàn)在PA1端口接一個觸摸按鍵(一塊銅箔),利用PA1的觸摸按鍵控制PA0端口的LED狀態(tài),按下時LED點亮,抬起時LED熄滅。

(1)新建基礎工程,并創(chuàng)建tpad.c,tpad.h,led.c和led.h文件,并導入工程,如下圖所示。

圖片

(2)在tpad.h文件內(nèi)添加以下代碼。

圖片

(3)在led.h文件內(nèi)添加以下代碼

圖片

(4)在led.c文件中添加以下代碼

圖片

(5)在tpad.c文件內(nèi)添加以下代碼

#include "tpad.h"
#include "delay.h"
/***************************************************
Name    :TPAD_Get_Value
Function  :觸摸按鍵值獲取
Paramater  :None
Return    :獲取的充電時間
***************************************************/
u16 TPAD_Get_Value()
{
  //電容放電
  GPIOA->CRL &= 0xFFFFFF0F ;          //PA1輸入
  GPIOA->CRL |= 0x00000030 ;          //推挽輸出
  GPIOA->ODR &= ~( 1<<1 ) ;          //輸出低電平放電
  delay_ms( 5 ) ;
  TIM5->SR = 0 ;                //清除標記
  TIM5->CNT = 0 ;                //歸零
  GPIOA->CRL &= 0xFFFFFF0F ;          //PA1輸入
  GPIOA->CRL |= 0x00000040 ;          //浮空輸入
  //等待捕獲上升沿
  while( ( TIM5->SR&0x04 )==0 )
  {
    if( TIM5->CNT>( 65535-500 ) )
      return TIM5->CNT ;
  }
  return TIM5->CCMR2 ;
}
/***************************************************
Name    :TPAD_Get_MaxVal
Function  :觸摸按鍵最大值獲取
Paramater  :None
Return    :獲取的最大充電時間
***************************************************/
u16 TPAD_Get_MaxVal( u8 n )
{
  u16 temp=0;
  u16 res=0;
  while( n-- )
  {
    temp = TPAD_Get_Value() ;
    if( temp>res )
      res = temp ;
  }
  return res ;
}
/***************************************************
Name    :TPAD_Init
Function  :觸摸按鍵初始化
Paramater  :None
Return    :None
***************************************************/
TPADData TPAD_Data ;
void TPAD_Init()
{
  u16 buff[ 10 ], temp ;
  u8 i, j ;
  RCC->APB2ENR |= 1<<2 ;
  GPIOA->CRL &= 0xFFFFFF0F ;            //PA1 輸入
  GPIOA->CRL |= 0x00000040 ;            //浮空輸入
  RCC->APB1ENR |= 1<<3 ;              //TIM5時鐘開啟
  TIM5->ARR = 65535 ;
  TIM5->PSC = 5 ;
  TIM5->CCMR1 |= 1<<8 ;              //選擇輸入端IC2映射到TI2上
  TIM5->CCMR1 &= ~( 1<<12 ) ;            //采樣頻率8分頻
  TIM1->CCMR1 &= ~( 1<<10 ) ;            //配置輸入不分頻
  TIM5->CCER &= ~( 1<<5 ) ;            //上升沿捕獲
  TIM5->CCER |= 1<<4 ;                //允許捕獲功能
  TIM5->CR1 |= 1<<0 ;                //開啟定時器5
  //連續(xù)采樣10次
  for( i=0; i<10; i++ )
  {
    buff[ i ] = TPAD_Get_Value() ;
    delay_ms( 10 ) ;
  }
  //排序
  for( i=0; i<9; i++ )
  {
    for( j=i+1; j<10; j++ )
    {
      //升序排列
      if( buff[ i ]>buff[ j ] )
      {
        temp= buff[ i ] ;
        buff[ i ] = buff[ j ] ;
        buff[ j ] = temp ;
      }
    }
  }
  temp = 0 ;
  //獲取中間數(shù)據(jù)的均值
  for( i=2; i<8; i++ )
    temp += buff[ i ] ;
  TPAD_Data.value = temp/6 ;
}
/***************************************************
Name    :TPAD_Scan
Function  :觸摸按鍵掃描
Paramater  :None
Return    :None
***************************************************/
void TPAD_Scan()
{
  u16 rval ;
  rval = TPAD_Get_MaxVal( 3 ) ;
  if( rval>( TPAD_Data.value+100 ) )
    TPAD_Data.State = 1 ;              //手指按下
}

(6)在1.c文件內(nèi)添加主函數(shù)

#include "sys.h"
#include "delay.h"
#include "usart1.h"
#include "led.h"
#include "tpad.h"
int main()
{
  STM32_Clock_Init( 9 ) ;                  //STM32時鐘初始化
  SysTick_Init( 72 ) ;                    //SysTick初始化
  USART1_Init( 72, 115200 ) ;                //初始化串口1波特率115200
  LED_Init() ;                      //LED初始化
  TPAD_Init() ;                      //觸摸按鍵初始化
  while( 1 )
  {
    TPAD_Scan() ;                    //觸摸按鍵掃描
    if( TPAD_Data.State==1 )
    {
      LED = 0 ;
      TPAD_Data.State = 0 ;
    }
    else
      LED = 1 ;
  }
}

——————————————分割線——————————————

8.4 STM32工程管理

這里的總結是針對與之前所學的所有嵌入式內(nèi)容進行總結,隨著后續(xù)代碼越來越多,對于工程的管理顯得格外重要,不僅僅是采用本章節(jié)介紹的方法管理工程代碼,對于后續(xù)的Linux開發(fā)和操作系統(tǒng)移植也最好是按照固定的工程格式進行管理。

   對于STM32的工程可以劃分為以下幾個部分:

(1)過程文件以及最終生成的hex文件:這些文件通通放置在工程1級目錄下的OBJECT文件中,文件中的內(nèi)容如下圖所示。

圖片

圖中標注部分就是最終生成的hex文件,其他的文件均屬于過程文件,集成開發(fā)系統(tǒng)IDE編譯的實質(zhì)其實就是采用gcc交叉編譯器將我們編寫的代碼轉(zhuǎn)換成對應的機器代碼的過程,具體的步驟會在Linux系統(tǒng)移植中描述,這里只需要知道利用交叉編譯器進行編譯的時候會產(chǎn)生大量的鏈接文件和過程文件,這些文件統(tǒng)統(tǒng)放置在OBJECT目錄下。將工程文件中的過程文件放置在該目錄下的設置方式如下圖所示。

圖片

圖片

(2)主函數(shù)文件及主工程文件:在Keil中創(chuàng)建的工程,以及包括main函數(shù)的c文件都位于這個目錄內(nèi)。

圖片

圖中標注的3個文件都是必不可少的文件,帶有Keil圖標的文件就是工程文件,里面包含了整個工程所需的頭文件,文件路徑以及編譯器位置,文本文件圖標的則是c文件,main函數(shù)就放在這個位置,.s后綴的為匯編啟動文件,用于幫助芯片創(chuàng)建C代碼運行環(huán)境,初始化堆棧等功能,為了達到最快效率,所以采用匯編語言來編寫這個文件。

(3)自定義系統(tǒng)文件:自定義的系統(tǒng)文件位于SYSTEM目錄中,目錄內(nèi)有3個子目錄,分別是sys,delay和usart1,如下圖所示。

圖片

delay目錄:是利用SysTick時鐘來實現(xiàn)的延時功能,主要有毫秒級延時和微秒級延時;

usart1目錄:則是利用串口1來實現(xiàn)printf打印輸出的功能,主要用于調(diào)試數(shù)據(jù)的輸出;

sys目錄:是最基礎的工程文件,這個目錄內(nèi)有1個c文件和2個h文件,c文件主要實現(xiàn)STM32時鐘樹的配置和中斷系統(tǒng)的設置功能,是C函數(shù)中最重要的一個文件,stmxx.h文件則是最底層的寄存器定義文件,里面定義了STM32芯片內(nèi)部所有寄存器的地址和結構,通過C語言來調(diào)用這里面的寄存器實現(xiàn)芯片的控制功能。

(4)驅(qū)動文件:驅(qū)動文件位于HEADERWARE目錄中,用于存放項目所用到的驅(qū)動,比如之前實驗所用到的LED,KEY,TIM這些外設都屬于驅(qū)動文件內(nèi)容。

至此整個工程的目錄結構如下圖所示。

圖片

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 機械
    +關注

    關注

    8

    文章

    1502

    瀏覽量

    40422
  • 按鍵
    +關注

    關注

    4

    文章

    223

    瀏覽量

    57549
  • 電容按鍵
    +關注

    關注

    0

    文章

    5

    瀏覽量

    1403
收藏 人收藏

    評論

    相關推薦

    瑞薩電容觸摸技術之低功耗應用—RX140實驗環(huán)節(jié)(1)

    接下來,我們將著眼于實際操作,依托幾個具體的實驗環(huán)節(jié),從基本的RX140觸摸應用工程創(chuàng)建、使用QE for Cap touch監(jiān)控觸摸數(shù)據(jù)和調(diào)試觸摸運行參數(shù)開始,循序漸進的增加并調(diào)試以
    的頭像 發(fā)表于 10-11 16:34 ?1455次閱讀
    瑞薩<b class='flag-5'>電容</b><b class='flag-5'>觸摸</b>技術之低功耗應用—RX140<b class='flag-5'>實驗</b>環(huán)節(jié)(1)

    迅為IMX6ULL開發(fā)板Linux下電容觸摸實驗程序編寫

    迅為IMX6ULL開發(fā)板Linux下電容觸摸實驗程序編寫
    發(fā)表于 12-28 07:00

    迅為IMX6ULL開發(fā)板SRTC 電容觸摸實驗編譯及運行

    切換回啟動模式,等待程序正常運行,我們可以看到 LCD 屏幕如圖 25.4.5 顯示:當我們按下觸摸屏的時候,就會在屏幕上顯示出當前的觸摸點個數(shù),以及每個觸摸點的坐標信息,如圖 25.4.6 所示:
    發(fā)表于 05-28 10:41

    什么是電容觸摸

    什么是電容觸摸電容觸摸屏圖片 電容觸摸屏的英文名稱the introduction
    發(fā)表于 04-30 08:54 ?2073次閱讀

    電容式觸摸屏參數(shù)_電容式觸摸屏分類

    電容式觸摸屏的類型分為表面式電容觸摸屏和投射式電容觸摸屏兩種。
    發(fā)表于 10-01 09:51 ?1.4w次閱讀

    電容觸摸屏和觸摸面板應用的意義

    隨著我們的科技,在不斷的發(fā)展,在不斷的改善,導致我們的產(chǎn)品,在行業(yè)之中的使用,也都還是比較可以的,電容觸摸屏也是一樣,那么電容觸摸屏、觸摸
    發(fā)表于 07-19 11:27 ?1404次閱讀

    ATK-7 TFT LCD電容觸摸屏模塊測試實驗的工程文件免費下載

    本文檔的主要內(nèi)容詳細介紹的是ATK-7 TFT LCD電容觸摸屏模塊測試實驗的工程文件免費下載。
    發(fā)表于 03-19 10:26 ?16次下載

    電容觸摸的工作原理及應用設計方式

    ME32F030系列芯片的電容觸摸功能,可以對多達 22 管腳的電容進行測量,利用一個 RC 震蕩電路頻率的改變來檢測手指觸摸引起的電容 C
    的頭像 發(fā)表于 05-01 16:15 ?6977次閱讀
    <b class='flag-5'>電容</b><b class='flag-5'>觸摸</b>的工作原理及應用設計方式

    電容觸摸按鍵實驗”實例解析

    目錄電容觸摸按鍵實驗電容觸摸按鍵的基本原理(原理圖層面)新電容的產(chǎn)生與作用充放電性能的變化脈沖如
    發(fā)表于 11-30 11:36 ?15次下載
    “<b class='flag-5'>電容</b><b class='flag-5'>觸摸</b>按鍵<b class='flag-5'>實驗</b>”實例解析

    STM32學習心得十九:電容觸摸按鍵實驗及相關代碼解讀

    記錄一下,方便以后翻閱~主要內(nèi)容:1) 電容觸摸按鍵原理;2)部分實驗代碼解讀。實驗內(nèi)容:手觸摸按鍵后,LED1燈翻轉(zhuǎn)。
    發(fā)表于 11-30 12:51 ?15次下載
    STM32學習心得十九:<b class='flag-5'>電容</b><b class='flag-5'>觸摸</b>按鍵<b class='flag-5'>實驗</b>及相關代碼解讀

    STM32入門(二十一)----電容觸摸

    電容觸摸電容觸摸原理硬件連接實驗程序程序思路電容觸摸
    發(fā)表于 01-17 11:25 ?4次下載
    STM32入門(二十一)----<b class='flag-5'>電容</b><b class='flag-5'>觸摸</b>

    STM32入門學習筆記之電容觸摸實驗(上)

    隨著科技的發(fā)展,傳統(tǒng)的機械按鍵正在逐步從設備上面消失,這個原因主要有機械按鍵由于是采用機械接觸的方式,壽命比較短,從用戶體驗上看,機械按鍵也顯得操作復雜,對比現(xiàn)在的電容按鍵,電容按鍵具有壽命長,因為
    的頭像 發(fā)表于 02-16 10:22 ?1253次閱讀
    STM32入門學習筆記之<b class='flag-5'>電容</b><b class='flag-5'>觸摸</b><b class='flag-5'>實驗</b>(上)

    STM32入門學習筆記之電容觸摸實驗(下)

    隨著科技的發(fā)展,傳統(tǒng)的機械按鍵正在逐步從設備上面消失,這個原因主要有機械按鍵由于是采用機械接觸的方式,壽命比較短,從用戶體驗上看,機械按鍵也顯得操作復雜,對比現(xiàn)在的電容按鍵,電容按鍵具有壽命長,因為
    的頭像 發(fā)表于 02-16 10:22 ?664次閱讀
    STM32入門學習筆記之<b class='flag-5'>電容</b><b class='flag-5'>觸摸</b><b class='flag-5'>實驗</b>(下)

    電容觸摸屏原理 電容觸摸屏和電阻觸摸屏有什么區(qū)別

    電容觸摸屏和電阻觸摸屏是兩種常見的觸摸屏技術,它們在原理、結構和應用方面都有很大的區(qū)別。下面將詳細介紹電容
    的頭像 發(fā)表于 01-22 16:13 ?3808次閱讀

    觸摸電容屏原理 觸摸電容屏劃線出現(xiàn)斷線怎么回事

    觸摸電容屏原理及觸摸電容屏劃線出現(xiàn)斷線的原因 一、觸摸電容屏原理
    的頭像 發(fā)表于 01-24 15:12 ?1052次閱讀