通過(guò)ADS7846在PDA上實(shí)現(xiàn)個(gè)性化書(shū)法輸入
觸摸壓力測(cè)量是指對(duì)指尖或筆尖觸及觸摸屏?xí)r產(chǎn)生的壓力值進(jìn)行測(cè)量。觸摸壓力不是直接測(cè)出來(lái)的,而是轉(zhuǎn)換為測(cè)量觸點(diǎn)處X工作面和Y工作面之間的接觸電阻的大小來(lái)完成的。Rtouch的公式如下:
式中,Rtouch表示接觸電阻;Rx是X+與X-兩電極間的總電阻;Z1和Z2是觸摸屏的內(nèi)部參數(shù),反映觸點(diǎn)與X工作面和Y工作面間的關(guān)系。Z1和Z2兩個(gè)參數(shù)及X的值可通過(guò)ADS7846提供的指令采樣得到。而Rx并不需要去測(cè)量,因?yàn)楦鱾€(gè)觸摸屏的這個(gè)參數(shù)并不一樣,但在同一個(gè)觸摸屏上它卻是個(gè)定值,每個(gè)點(diǎn)的Rtouch都要乘以這個(gè)定值Rx,所以這個(gè)參數(shù)可以不考慮。所得到的Rtouch值的大小反應(yīng)了測(cè)量觸點(diǎn)壓力的大小。Rtouch越大,壓力越小,可以通過(guò)實(shí)驗(yàn)測(cè)出不同壓力的Rtouch值。如果發(fā)現(xiàn)壓力值分布范圍太寬,可以給Rtouch除以一個(gè)合適的參數(shù);如果發(fā)現(xiàn)壓力值分布太窄,可以給Rtouch乘以一個(gè)合適的參數(shù)。筆者針對(duì)自己的觸摸屏,通過(guò)試驗(yàn)發(fā)現(xiàn)用
比較合適,不同的壓力與Rtouch的比值分布在80~170之間,這樣就有足夠的間隔來(lái)把壓力劃分為不同的等級(jí)。
2 設(shè)計(jì)原理與具體實(shí)現(xiàn)
2.1 設(shè)計(jì)思路
微處理器首先利用SPI總線(xiàn)通過(guò)ADS7846采樣到筆尖在觸摸屏上的觸點(diǎn)坐標(biāo)值及Z1值和Z2值;然后通過(guò)式(1)和式(2)計(jì)算出映射到LCD屏上的坐標(biāo)值,用式(4)計(jì)算出Rtouch值;再利用GUI提供的API函數(shù)在LCD上畫(huà)一條線(xiàn)段把前一個(gè)觸點(diǎn)和當(dāng)前觸點(diǎn)連起來(lái);最后在這條線(xiàn)段的兩邊擴(kuò)展平行線(xiàn),平行線(xiàn)的數(shù)量越多,這條線(xiàn)段越粗。平行線(xiàn)的數(shù)量由當(dāng)前觸點(diǎn)Rtouch的大小決定,即壓力越大,線(xiàn)段越粗。這樣就模擬出了用毛筆或鋼筆書(shū)寫(xiě)時(shí)筆鋒游轉(zhuǎn)的效果。
2.2 電路設(shè)計(jì)
筆者以MOTOROLA公司的DRAGONBALL(龍珠)系列MC9328MX1(ARM92T)作為硬件平臺(tái)[2],利用MC9328MX1提供的SPI總線(xiàn)對(duì)ADS7846進(jìn)行控制和數(shù)據(jù)傳輸。接口示意圖如圖1所示。
由圖1可以看出,ADS7846與其前代產(chǎn)品ADS7843的接口電路完全相同。如果需要在原來(lái)使用ADS7843的設(shè)備上增加片內(nèi)溫度測(cè)量、觸摸壓力測(cè)量、外模擬量測(cè)量和電池電壓測(cè)量四個(gè)功能,只需將板上的ADS7843替換為ADS7846,然后改寫(xiě)驅(qū)動(dòng)程序即可。因?yàn)锳DS7846與ADS7843的引腳封裝完全一致,所以不用改動(dòng)電路,這使更換工作非常方便。
2.3 驅(qū)動(dòng)程序
在應(yīng)用中,采用差動(dòng)參考電壓方式測(cè)量坐標(biāo)模擬量,測(cè)量命令字的設(shè)置和模擬量選擇參見(jiàn)表1和表2。
表1 ADS7846的測(cè)量命令字
Bit7(MSB) | BIt6 | Bit5 | Bit4 | Bit3 | Bit2 | Bit1 | Bit0 |
S | A2 | A1 | A0 | MODE | SER/DFR | PD1 | PD0 |
表2 差動(dòng)參考電壓方式下的模擬量選擇
A[2:0] | 參考電壓(+REF,-REF) | 模擬量輸入 | 所測(cè)參數(shù) |
001 | Y+,Y- | X+ | Y |
011 | Y+,X- | X- | Z1 |
100 | Y+,X- | Y- | Z2 |
101 | X+,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)單,添加也很容易。筆者在MC9328MX1上實(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(jué)值的命令//
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)和連擊問(wèn)題??梢圆捎醚舆t測(cè)量法來(lái)解決,即在接收到觸摸屏筆中斷時(shí)延遲一段時(shí)間(抖動(dòng)時(shí)30ms)后再測(cè)量,可消除抖動(dòng);測(cè)量完后再次延遲一段時(shí)間(連擊延時(shí)300ms)后打開(kāi)筆中斷,可避免連擊現(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)文章:電能表原理
評(píng)論