《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 設計應用 > Linux下基于MCU的觸摸傳感系統設計
Linux下基于MCU的觸摸傳感系統設計
2015年微型機與應用第8期
常孟芝1,白雪飛1,方 毅2
(1.中國科學技術大學 電子科學與技術系,安徽 合肥230027;2.中國科學技術大學 信息科學實驗中心,安徽 合肥230027)
摘要: 給出一種在三星S5PV210處理器的Linux系統下基于PIC24F單片機實現的觸摸傳感系統的設計方案。利用PIC24F充電時間測量單元(CTMU)和ADC實現觸摸信息采集,S5PV210通過I2C總線與觸摸傳感器通信,讀取傳感器觸摸狀態信息;設計了PIC24F固件程序和其在主控S5PV210處理器Linux系統下的I2C設備驅動程序。測試結果表明,在主控Linux系統下可以精確獲得觸摸狀態信息。
Abstract:
Key words :

  摘  要: 給出一種在三星S5PV210處理器的Linux系統下基于PIC24F單片機實現的觸摸傳感系統的設計方案。利用PIC24F充電時間測量單元(CTMU)和ADC實現觸摸信息采集,S5PV210通過I2C總線與觸摸傳感器通信,讀取傳感器觸摸狀態信息;設計了PIC24F固件程序和其在主控S5PV210處理器Linux系統下的I2C設備驅動程序。測試結果表明,在主控Linux系統下可以精確獲得觸摸狀態信息。
  關鍵詞: 觸摸傳感;CTMU;I2C;Linux驅動
0 引言
  隨著科技的進步,各種形式的觸摸傳感器被應用于機器人、家電、便攜式消費電子等領域。
  常用觸摸傳感器主要有電阻式和電容式兩種,電容式以靈敏度高、抗損性好的特點得到廣泛應用。一般電容傳感器由專用ASIC實現,本文基于PIC24F MCU(微控制器)實現電容觸摸傳感器,由于傳感器只是MCU外接的金屬片,具有成本低、形狀靈活、外圍電路簡單的特點,主控端可在嵌入式Linux下通過I2C總線獲得多個傳感器狀態。
1 系統組成
  如圖1所示,觸摸傳感系統由多個電容觸摸傳感器端(由PIC24F MCU實現)和S5PV210主控端(運行Linux系統)兩部分組成。電容傳感器端處理觸摸信息,主控端通過I2C總線與傳感器通信,得到其處理好的傳感器數據(包含傳感器ID和是否觸摸狀態)。一片PIC24F最多可實現16個觸摸傳感器。

Image 001.png

2 功能實現
  2.1 基于PIC24F CTMU方式實現觸摸檢測
  圖2為PIC24F CTMU框圖。

Image 002.png

  PIC24F的CTMU是由一個可調節恒流源和邏輯控制塊構成的可配置模擬單元。觸摸檢測采用CTMU恒流源與A/D轉換器的連接[1]如圖3所示。

Image 003.png

  通過CTMU在傳感器上施加恒流源實現觸摸檢測。
  I×T=C×V(1)
  其中,I是CTMU恒流源電流,T是CTMU充電的固定周期,C是觸摸電路的電容,V是充電完成后經A/D轉換器讀取的電壓值。
  由于CTMU恒流源I是恒定的,設置充電周期T保持恒定,則電路中電容C的變化將表現為電壓V的變化,當人手指接觸到傳感器時,總電容將增加,A/D轉換器讀取的電壓減小。
  圖4為傳感器電壓采集子程序,它由CTMU單元和ADC單元配合完成[2]。傳感器電容與ADC的保持電容并聯,每次測量電壓前使兩個電容接地放電至0 V,隨后控制CTMU的恒流源對兩個電容注入一定量的電荷,再通過ADC讀取電壓。可以計算觸摸前后電壓差值ST5I`A3_Y%$7}L@UX(~F@%D.jpg為:V@KOM8JOG~S5L)V8P`JKQ_P.png

  其中,CF是手指電容,CB是金屬片基礎電容,CA/D是ADC保持電容,I是CTMU恒流源的電流,t是充電時間。

Image 004.png

  實際中由手指電容引起的電容增量為pF量級,為獲得較高的靈敏度,需增大ΔCTMU,由式(2)可知,減小基礎電容CB和適當增加注入電荷(It)為有效方式。傳感器面積會影響CB,形狀不是主要影響因素,本文設計的傳感器尺寸為15 mm×15 mm的正方形,配置CTMU恒流源為最大55 μA(CTMUICON=0x0300)以提高充電速度和電量。
  2.2 S5PV210與觸摸傳感器I2C通信
  I2C總線(Inter Integrated Circuit)是主從結構的兩線式(數據線SDA,時鐘線SCL)串行總線。它接口簡單、互聯成本低,數據的傳輸和時鐘頻率均由主機控制,因此各種傳感器芯片大都采用I2C通信。
  開始通信時,由主機端S5PV210發送S,接著發送Addr(從機地址7 bit)、R/W(讀寫位1 bit)給PIC24F,PIC24F收到8 bit(Addr+R/W)確認是本機后,將SDA線拉低作為ACK,主機在第9個SCL采集到低電平ACK后,確認連接到從機,接著主從將根據R/W位接收或者發送1 B傳感器數據。本文為2個傳感器(一片PIC24F最多可實現16個傳感器,多于16個時可通過I2C總線進行擴展),設置傳感器1被觸摸則發送0x01,傳感器2被觸摸發送0x02,沒有觸摸為0x00。單片機PORTE口接有LED將接收數據賦給PORTE做為接收測試(0-亮,1-滅)。圖5為總線時序圖。

Image 005.png  

       2.3 從機端電容觸摸傳感器固件設計
  PIC24F固件程序流程如圖6所示。

Image 006.png

  系統初始化使能Time1、ADC、CTMU和I2C(slave模式),Time1中斷用于觸發讀取傳感器1和傳感器2經CTMU和ADC處理的電壓值,并將有無觸摸(電壓降低)狀態保存到I2C的發送緩存里,隨后利用主機端發起通信引起的中斷發送觸摸狀態或接收數據。
  2.4 主機端Linux I2C設備驅動設計
  S5PV210 Linux下I2C驅動層次結構如圖7所示。

Image 007.png

  Linux系統分為用戶層和內核層,系統下應用程序訪問硬件設備需要位于內核層的設備驅動提供的接口支持[3]。
  整個I2C驅動程序由I2C設備驅動和總線驅動兩部分組成,Linux下對S5PV210 I2C控制器驅動即總線驅動已經支持,要做的是針對觸摸傳感器設計I2C設備驅動。I2C設備驅動在Linux中屬于字符設備,字符設備可以以設備文件形式存在,由應用程序打開并進行讀寫操作,從而實現控制硬件的目的。
  S5PV210有3個I2C主控制器,觸摸傳感器驅動采用第一個主控制器。Linux下設備驅動可以直接編譯到內核,也可以在外部編譯好生成.ko文件,然后使用insmod命令動態加載到運行的內核中,為了方便開發采用動態加載方式。
  I2C設備驅動程序可分為兩部分[4]:首先定義和注冊I2C設備即i2c_client;然后定義和注冊I2C設備驅動即i2c_driver。i2c_client即是PIC24F模塊,所以要在i2c_client中設置PIC24F的設備名和地址信息,i2c_client里關鍵代碼及結構有:
  struct i2c_board_info pic_touch_info={
  i2c_board_info("pic_touch",0x40),
  //注意PIC實際地址0x80,這里要右移1位:0x80>>1=0x40
  };//設置i2c_board_info結構體保存設備名和設備地址
  structi2c_adapter*i2c_adap;
  i2c_adap=i2c_get_adapter(0);
  //使用S5PV210第一個控制器
  pic_touch_client=i2c_new_device(i2c_adap,&pic_touch_info);
  //調用i2c_new_device創建并注冊I2C
  //設備對應的i2c_client結構體
  第二部分定義和注冊I2C設備驅動,其中i2c_driver為核心結構體,設置驅動所能支持的設備列表pic_touch_id_table[],提供探測函數pic_touch_probe(),當總線驅動發現i2c_client設備名與id_table中相同時,會自動發出設備地址,如果收到ACK,則確定設備存在,總線驅動會把設備掛接到此驅動并調用pic_touch_probe(),在此函數中注冊字符設備創建設備訪問節點,構造file_openration結構體,在此結構體中編寫實際操作硬件的讀寫函數。
  i2c_driver關鍵代碼及結構:
  struct i2c_device_id pic_touch_id_table
  []={{"pic_touch",0},{}};//填充與i2c_client相同的
  //設備名pic_touch,使此驅動適用于傳感器設備
  //創建i2c_driver結構體對象
  struct i2c_driver pic_touch_driver={
  .driver={
  .name="pic_touchdrv",
  .owner=THIS_MODULE,
  },
  .probe=pic_touch_probe,//設置探測函數,此函數在驅動
  //與i2c_client匹配時調用,在此函數中完成字符設備的注冊
  .remove=__devexit_p(pic_touch_remove),
  //去除驅動時調用
  .id_table=pic_touch_id_table,
  //在此id_table中查找本驅動支持的設備
  };
  探測函數pic_touch_probe()中關鍵段:
  major=register_chrdev(0,"pic_touch",
  &pic_touch_fops);//注冊字符設備
  class=class_create(THIS_MODULE,"pic_touch");
  device_create(class,NULL,MKDEV(major,0),NULL,"pic_touch");
  //生成設備訪問節點/dev/pic_touch
  構造file_operations結構體填充讀寫函數
  file_operations pic_touch_fops={
  .owner=THIS_MODULE,
  .read=pic_touch_read,
  .write=pic_touch_write,
  };
  pic_touch_read()和pic_touch_write()是實際操作硬件的函數。需要根據從機端觸摸傳感器I2C固件需求的時序設計。
  本文采用Linux內核提供的SMBus讀寫函數實現,SMBus(System Management Bus)是I2C的子集。
  讀函數pic_touch_read()關鍵程序段:
  data=i2c_smbus_read_byte(pic_touch_client);
  //從傳感器讀數據存在內核緩沖data
  copy_to_user(buf,&data,1);
  //將讀取的傳感器數據data拷貝到用戶buf空間
  寫函數pic_touch_write()關鍵程序段:
  copy_from_user(&data,buf,1);
  //從用戶空間buf拷貝1 B數據到內核緩沖區data
  i2c_smbus_write_byte(pic_touch_client,data)
  //將數據發送給傳感器設備
3 測試
  無觸摸ADC取值穩定,觸摸后因每次觸摸面積不同使得讀取ADC值差別較大,本設計根據表1測試結果設置觸發閾值為0x0200,實際中需根據靈敏度要求和測試結果合理設置閾值,利用Time1中斷定時掃描讀取2個觸摸傳感器值,設置的中斷時間為480 OVM6}M)IBR%54@(X)_BM%19.jpg,CTMU充電時間為1.25OVM6}M)IBR%54@(X)_BM%19.jpg
  主控端Linux下讀取傳感器狀態,先insmod加載驅動,生成設備節點/dev/pic_touch:
  #insmod pic_touch_dev.ko
  #insmod pic_touch_drv.ko
  打印調試信息:
  pic_touch_pad is probed, make chdev node:/dev/pic_touch
  #ls/dev/pic_touch
  /dev/pic_touch
  無觸摸時,Linux下運行如下測試程序:
  #./pic_touch_testrw r
  readdata=0x00 touch state is:0x00
  成功返回無觸摸狀態0x00。
  分別觸摸傳感器1和傳感器2,運行測試程序:
  #./pic_touch_testrw r
  readdata=0x01 touch state is:0x01
  #./pic_touch_testrw r
  readdata=0x02 touch state is:0x02
  成功讀取傳感器1和2被觸摸狀態0x01,0x02。
  發送數據0xaa給傳感器接收測試LED:
  #./pic_touch_testrw w 0xaa
  cmmd=0xaa write success!,cmd=0xaa
  發送成功,LED狀態正確。
  為檢測傳感器性能,實測時傳感器表面蓋一層1 mm厚的透明塑料,LED同時指示傳感器狀態。測試結果表明,設置的觸摸傳感器掃描頻率和觸發閾值有很好的靈敏度和穩定性,在主控端Linux I2C速率為100 kb/s下可實時精確地獲取傳感器觸摸狀態信息,達到設計目標。本文在Linux下基于MCU實現觸摸傳感系統也便于后續利用MCU擴展傳感器功能。
  參考文獻
  [1] Microchip Technology Inc.PIC24FJ256GA110 Family Data Sheet[Z]. 2010.
  [2] Microchip Technology Inc.Microchip CTMU for Capacitive Touch Applications[Z]. 2009.
  [3] 宋寶華.Linux設備驅動開發詳解(第2版)[M].北京:人民郵電出版社,2010.
  [4] 韋東山.嵌入式Linux應用開發完全手冊[M].北京:人民郵電出版社,2008.

此內容為AET網站原創,未經授權禁止轉載。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
亚洲摸下面视频| 欧美日韩国产成人在线免费| 亚洲免费av电影| 久久精品视频播放| 欧美在线视频免费播放| 亚洲女同同性videoxma| 亚洲免费观看高清完整版在线观看熊| 在线观看国产欧美| 在线观看视频日韩| 在线观看精品| 亚洲电影网站| 亚洲国产天堂久久国产91| 尤妮丝一区二区裸体视频| 狠狠色伊人亚洲综合成人| 精久久久久久| 在线免费一区三区| 亚洲人成在线播放网站岛国| 亚洲精品国产精品国产自| 亚洲精品国产精品乱码不99按摩| 亚洲国产第一页| 亚洲激情网站| 亚洲美女诱惑| 在线视频日韩精品| 亚洲综合99| 欧美一区二区三区精品电影| 欧美一级专区免费大片| 久久爱另类一区二区小说| 久久精品国产一区二区三| 亚洲高清视频一区| 99国内精品久久| 亚洲视频在线观看网站| 午夜精品一区二区三区在线视| 欧美尤物巨大精品爽| 久久久久久久网站| 嫩草国产精品入口| 欧美日韩欧美一区二区| 国产精品欧美经典| 国产一区清纯| 亚洲国内精品| 亚洲一区国产精品| 欧美一区不卡| 亚洲精选视频在线| 亚洲在线免费观看| 久久精品二区亚洲w码| 美女黄网久久| 国产精品v欧美精品v日本精品动漫 | 日韩视频免费观看高清完整版| 一区二区三区免费网站| 午夜日本精品| 欧美成人小视频| 欧美三日本三级少妇三2023| 国产欧美一区二区精品仙草咪| 亚洲高清免费视频| 亚洲亚洲精品三区日韩精品在线视频| 久久黄色小说| 亚洲免费视频一区二区| 玖玖综合伊人| 国产精品免费网站| 亚洲国产综合在线看不卡| 亚洲一线二线三线久久久| 久久精品视频在线播放| 亚洲图色在线| 美脚丝袜一区二区三区在线观看 | 亚洲欧美资源在线| 亚洲日韩欧美视频| 亚洲欧美视频在线| 美女网站在线免费欧美精品| 国产精品theporn| 亚洲国产成人一区| 欧美在线观看一区| 亚洲专区一区| 欧美成人免费va影院高清| 国产嫩草一区二区三区在线观看| 亚洲人成人一区二区在线观看| 欧美一级久久久| 亚洲视频一区| 欧美高清在线一区二区| 国内激情久久| 亚洲在线一区| 亚洲素人一区二区| 久久久五月婷婷| 国产精品人成在线观看免费 | 欧美一区二区三区免费观看| 亚洲性感激情| 欧美金8天国| 在线播放亚洲| 久久精品色图| 久久精品国产一区二区三| 欧美三级特黄| 亚洲精品麻豆| 亚洲精品一区二区三区樱花| 久久精视频免费在线久久完整在线看| 国产精品va在线| 99国产精品99久久久久久粉嫩| 亚洲国产成人久久综合| 久久国产精品一区二区| 国产精品永久免费观看| 日韩系列欧美系列| 一本久道久久综合狠狠爱| 欧美成人精品h版在线观看| 国产一区二区三区在线观看精品 | 国产欧美精品日韩区二区麻豆天美| 日韩一级在线观看| 亚洲精品字幕| 欧美激情中文不卡| 1204国产成人精品视频| 久久精品一级爱片| 久久综合给合久久狠狠色| 国产嫩草一区二区三区在线观看| 亚洲图片自拍偷拍| 亚洲欧美视频一区二区三区| 欧美午夜无遮挡| 一本色道久久综合亚洲精品按摩| 一区二区国产精品| 欧美日韩免费一区二区三区| 亚洲精品永久免费精品| 一本色道久久综合亚洲精品不卡 | 欧美一级视频精品观看| 欧美一区日本一区韩国一区| 国产精品手机在线| 亚洲欧美一区二区三区在线| 欧美中在线观看| 国产亚洲综合精品| 亚洲国产高清视频| 欧美+亚洲+精品+三区| 在线精品国精品国产尤物884a| 亚洲激情成人在线| 欧美精品电影| 亚洲美女视频| 亚洲综合国产| 国产欧美 在线欧美| 欧美一区二视频| 美女尤物久久精品| 亚洲黄色在线观看| 亚洲深爱激情| 国产精品一区在线观看| 久久国产精品电影| 欧美成人国产| 99在线热播精品免费| 亚洲在线视频免费观看| 国产日韩免费| 91久久精品国产91性色| 欧美美女福利视频| 亚洲香蕉成视频在线观看| 欧美一区综合| 亚洲第一成人在线| 亚洲图片欧美午夜| 国产视频一区三区| 亚洲日本中文字幕区| 欧美日韩在线播放一区| 亚洲自拍高清| 免费成人高清在线视频| 99国产精品一区| 久久成人免费视频| 136国产福利精品导航| 中文精品99久久国产香蕉| 国产精品亚洲综合久久| 亚洲国产成人av好男人在线观看| 欧美裸体一区二区三区| 亚洲永久精品国产| 一本一道久久综合狠狠老精东影业| 亚洲淫性视频| 国产亚洲欧美日韩美女| 亚洲精品日韩久久| 国产精品分类| 久久精品夜色噜噜亚洲aⅴ| 欧美日韩精品久久| 亚洲欧洲99久久| 欧美电影美腿模特1979在线看| 一个色综合导航| 久久久亚洲成人| 99精品国产一区二区青青牛奶| 欧美伊久线香蕉线新在线| 亚洲国产高清高潮精品美女| 亚洲一区二区三区国产| 激情综合中文娱乐网| 亚洲你懂的在线视频| 在线精品一区| 欧美一区二区性| 亚洲免费av电影| 久久婷婷丁香| 亚洲私人影院| 免费黄网站欧美| 午夜久久黄色| 欧美色视频在线| 亚洲国产精品精华液网站| 国产精品扒开腿爽爽爽视频| 亚洲国产高清自拍| 国产日本欧洲亚洲| 亚洲一区二区三区视频| 一色屋精品视频免费看| 亚洲欧美日韩国产综合在线| 亚洲国产精品一区二区尤物区| 欧美一区二区高清在线观看| 亚洲精品永久免费| 免费欧美高清视频| 午夜视频久久久| 欧美吻胸吃奶大尺度电影| 亚洲免费成人| 在线精品视频免费观看|