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