<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 通過ADS7846在PDA上實(shí)現(xiàn)個(gè)性化書法輸入

          通過ADS7846在PDA上實(shí)現(xiàn)個(gè)性化書法輸入

          作者: 時(shí)間:2012-10-22 來源:網(wǎng)絡(luò) 收藏

          觸摸壓力測(cè)量是指對(duì)指尖或筆尖觸及觸摸屏?xí)r產(chǎn)生的壓力值進(jìn)行測(cè)量。觸摸壓力不是直接測(cè)出來的,而是轉(zhuǎn)換為測(cè)量觸點(diǎn)處X工作面和Y工作面之間的接觸電阻的大小來完成的。Rtouch的公式如下:

          式中,Rtouch表示接觸電阻;Rx是X+與X-兩電極間的總電阻;Z1和Z2是觸摸屏的內(nèi)部參數(shù),反映觸點(diǎn)與X工作面和Y工作面間的關(guān)系。Z1和Z2兩個(gè)參數(shù)及X的值可通過提供的指令采樣得到。而Rx并不需要去測(cè)量,因?yàn)楦鱾€(gè)觸摸屏的這個(gè)參數(shù)并不一樣,但在同一個(gè)觸摸屏上它卻是個(gè)定值,每個(gè)點(diǎn)的Rtouch都要乘以這個(gè)定值Rx,所以這個(gè)參數(shù)可以不考慮。所得到的Rtouch值的大小反應(yīng)了測(cè)量觸點(diǎn)壓力的大小。Rtouch越大,壓力越小,可以通過實(shí)驗(yàn)測(cè)出不同壓力的Rtouch值。如果發(fā)現(xiàn)壓力值分布范圍太寬,可以給Rtouch除以一個(gè)合適的參數(shù);如果發(fā)現(xiàn)壓力值分布太窄,可以給Rtouch乘以一個(gè)合適的參數(shù)。筆者針對(duì)自己的觸摸屏,通過試驗(yàn)發(fā)現(xiàn)用

          比較合適,不同的壓力與Rtouch的比值分布在80~170之間,這樣就有足夠的間隔來把壓力劃分為不同的等級(jí)。

          2 設(shè)計(jì)原理與具體實(shí)現(xiàn)

          2.1 設(shè)計(jì)思路

          微處理器首先利用SPI總線通過采樣到筆尖在觸摸屏上的觸點(diǎn)坐標(biāo)值及Z1值和Z2值;然后通過式(1)和式(2)計(jì)算出映射到LCD屏上的坐標(biāo)值,用式(4)計(jì)算出Rtouch值;再利用GUI提供的API函數(shù)在LCD上畫一條線段把前一個(gè)觸點(diǎn)和當(dāng)前觸點(diǎn)連起來;最后在這條線段的兩邊擴(kuò)展平行線,平行線的數(shù)量越多,這條線段越粗。平行線的數(shù)量由當(dāng)前觸點(diǎn)Rtouch的大小決定,即壓力越大,線段越粗。這樣就模擬出了用毛筆或鋼筆書寫時(shí)筆鋒游轉(zhuǎn)的效果。

          2.2 電路設(shè)計(jì)

          筆者以MOTOROLA公司的DRAGONBALL(龍珠)系列(ARM92T)作為硬件平臺(tái)[2],利用提供的SPI總線對(duì)進(jìn)行控制和數(shù)據(jù)傳輸。接口示意圖如圖1所示。

          由圖1可以看出,ADS7846與其前代產(chǎn)品ADS7843的接口電路完全相同。如果需要在原來使用ADS7843的設(shè)備上增加片內(nèi)溫度測(cè)量、觸摸壓力測(cè)量、外模擬量測(cè)量和電池電壓測(cè)量四個(gè)功能,只需將板上的ADS7843替換為ADS7846,然后改寫驅(qū)動(dòng)程序即可。因?yàn)锳DS7846與ADS7843的引腳封裝完全一致,所以不用改動(dòng)電路,這使更換工作非常方便。

          2.3 驅(qū)動(dòng)程序

          在應(yīng)用中,采用差動(dòng)參考電壓方式測(cè)量坐標(biāo)模擬量,測(cè)量命令字的設(shè)置和模擬量選擇參見表1和表2。

          表1 ADS7846的測(cè)量命令字

          Bit7(MSB)BIt6Bit5Bit4Bit3Bit2Bit1Bit0
          SA2A1A0MODESER/DFRPD1PD0

          表2 差動(dòng)參考電壓方式下的模擬量選擇

          A[2:0]參考電壓(+REF,-REF)模擬量輸入所測(cè)參數(shù)
          001Y+,Y-X+Y
          011Y+,X-X-Z1
          100Y+,X-Y-Z2
          101X+,X-Y+X

          有關(guān)ADS7843驅(qū)動(dòng)程序的資料很多,源代碼也能很容易地找到。具有觸摸壓力測(cè)量功能的ADS7846的驅(qū)動(dòng)程序,只需在原ADS7834驅(qū)動(dòng)程序的合適位置加入采樣Z1參數(shù)和Z2參數(shù)的代碼就行了[4] .這部分的代碼很簡(jiǎn)單,添加也很容易。筆者在上實(shí)現(xiàn)的源代碼如下:

          spi_tx_data(0xB0); //輸入采樣Z1值的命令//

          zl_upper = REG_SPI_RXDATA;

          spi_tx_data(0x00);

          zl_upper = REG_SPI_RXDATA;

          spi_tx_data(0xc0); //輸人采樣Z2值的命令//

          zl_lower = REG_SPI_RXDATA;

          spi_tx_data(0x00);

          z2_upper = REG_SPI_RXDATA;

          spi_tx_data(0x00);

          z2_lower = REG_SPI_RXDATA;

          spi_tx_data(0x00); //輸入采樣Y值的命令//

          x_upper = REG_SPI_RXDATA;

          spi_tx_data(0x00);

          x_upper = REG_SPI_RXDATA;

          spi_tx_data(0x90); //輸入采樣X值的命令//

          x_lower = RE G_SPI_RXDATA;

          spi_tx_data(0x00);

          y_upper = REG_SPI_RXDATA;

          spi_tx_data(0x00);

          y_upper = REG_SPI_RXDATA;

          然后,計(jì)算出X,Y,Z1和Z2的值:

          X=(((x_upper5)0xFE0) ((x_lower>>3) 0x1F));

          Y=(((y_upper5)0xFE0) ((y_lower>>3) 0x1F));

          Z1=(((z1_upper5)0xFE0) ((z1_lower>>3) 0x1F));

          Z2=(((z2_upper5)0xFE0) ((z2_lower>>3) 0x1F));

          此外,還應(yīng)注意觸摸抖動(dòng)和連擊問題??梢圆捎醚舆t測(cè)量法來解決,即在接收到觸摸屏筆中斷時(shí)延遲一段時(shí)間(抖動(dòng)時(shí)30ms)后再測(cè)量,可消除抖動(dòng);測(cè)量完后再次延遲一段時(shí)間(連擊延時(shí)300ms)后打開筆中斷,可避免連擊現(xiàn)象的出現(xiàn)。驅(qū)動(dòng)程序主要包括初始化SPI寄存器、可編程定時(shí)器中斷和筆中斷。在筆中斷中主要完成關(guān)筆中斷、設(shè)置筆中斷標(biāo)志和將定時(shí)計(jì)數(shù)值設(shè)置為抖動(dòng)延時(shí),在定時(shí)器中斷程序中主要實(shí)現(xiàn)坐標(biāo)值的測(cè)量、延時(shí)功能。

          電能表相關(guān)文章:電能表原理


          關(guān)鍵詞: ADS7846 書法 MC9328MX1 PDA

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();