Keturlaidžio rezistyvinio jutiklinio ekrano valdiklis
Mindaugas Staišiūnas
Kaunas 2011
Turinys 1. Įvadas .................................................................................................................................................... 3
2. Užduotis ir reikalavimai ......................................................................................................................... 3
Kursinio darbo užduotis ............................................................................................................................ 3
Pagrindiniai reikalavimai keturlaidžio rezistyvinio jutiklinio ekrano valdikliui ........................................ 3
3. Naudojama technologija ....................................................................................................................... 4
Technologija .............................................................................................................................................. 4
Matavimai ir jų metodai ............................................................................................................................ 4
4. Nustatymai ir parametrų skaičiavimai .................................................................................................. 5
Specialios paskirties ir valdymo registrų pagrindiniai nustatymai .................................................... 5
a) Išvadų nustatymai ......................................................................................................................... 5
b) ADC nustatymai ............................................................................................................................. 6
c) Maitinimo ir miego režimo nustatymai ........................................................................................ 6
d) Laikmačio nustatymai ................................................................................................................... 7
Laikinės diagramos ............................................................................................................................ 8
a) Mikrovaldiklio laikinė diagrama .................................................................................................... 8
b) Laikmačio laikinė diagrama ............................................................................................................... 8
c) Laikinė ASK veikimo diagrama .......................................................................................................... 9
5. Principinė schema ............................................................................................................................... 10
6. Įrenginio programos algoritmas .......................................................................................................... 11
7. Įrenginio programa C programavimo kalba ........................................................................................ 13
Pagrindinė programa ...................................................................................................................... 13
Jutiklinio ekrano tvarkyklės fragmentas – koordinačių matavimas ................................................ 14
8. Praktiniai rezultatai ............................................................................................................................. 16
9. Išvados ................................................................................................................................................ 17
10. Literatūros sąrašas .............................................................................................................................. 18
11. Priedas ................................................................................................................................................. 19
a) Jutiklinio ekrano tvarkyklės fragmentas - inicializavimas .............................................................. 19
b) Jutiklinio ekrano tvarkyklės fragmentas – paspaudimo atpažinimas ............................................. 19
c) UART inicializavimas ....................................................................................................................... 21
1. Įvadas
Šiuo metu vis plačiau civilinėje ir karinėje pramonėje naudojami jutikliniai ekranai, kurie leidžia pasiekti intuityvesnę ir paprastesnę sąveika su grafika valdant elektronines sistemas. Pagrindinės jutiklinio ekrano technologijos: paviršinių akustinių bangų, infraraudonųjų bangų, rezistyvinė ir talpuminė, tačiau populiariausios yra pastarosios dvi dėl nesudėtingo realizavimo ir konstrukcijos paprastumo. Rezistyviniai jutikliniai ekranai yra plačiausiai naudojami, nes pasižymi maža kaina ir nesudėtinga elektronine sąsaja. Ši technologija yra skirstoma į kategorijas, kurios savo veikimo ir panaudojimo principu yra panašios į pagrindines dvi: keturlaidė, penkialaidė.
Savo projektui pasirinkau keturlaidžio rezistyvinio jutiklinio ekrano technologiją, dėl lengvo integravimo, plataus taikymo, didelio atsparumo aplinkos poveikiui bei esant mažai technologijos kainai. Daugelis elektronikos komponentų gamintojų siūlo valdiklius bei sprendimus kaip realizuoti lietimui jautraus ekrano valdymą. Kaip pavyzdys mažos reikalaujamos galios su skaitmeniniais filtrais bei su vidiniu laikmačiu „Analog Devices“ AD7879, arba „Texas instruments“ TSC2007 su keičiama ASK keitiklio raiška. Taip pat siūlomi sprendimai kaip mikrovaldikliu („Atmel“ Atmega88 arba „Texas instruments“ MSP430 ir kt.) realizuoti lietimui jautraus ekrano koordinačių išvedimą.
Pagrindinė projekto užduotis – keturlaidžio jutiklinio ekrano technologijos realizavimo supratimas, projektuojant lietimui jautraus ekrano koordinačių apdorojimą ir išvedimą, naudojant Atmega88 su vidiniu ASK kaip jutiklinio ekrano kontrolerį.
2. Užduotis ir reikalavimai
Kursinio darbo užduotis
Suprojektuoti keturlaidžio rezistyvinio jutiklinio ekrano koordinačių nuskaitymo (analoginio
signalo), apdorojimo ir išvedimo per UART sąsają į kompiuterį, įtaisą. Išvadų pakeitimas multiplekseriu
prieš ASK analoginio signalo keitimą. Pakeitus įtampos reikšmes (koordinates) į diskretinį signalą
apdorojus siųsti per UART sąsają ir taip išvestį rezultatus į personalinio kompiuterio ekraną. Pertraukčių
panaudojimas realizuojant analoginio signalo keitimą ASK keitikliu, energijos taupymo režimą bei
duomenų siuntimą UART sąsaja.
Pagrindiniai reikalavimai keturlaidžio rezistyvinio jutiklinio ekrano
valdikliui
Valdiklyje analogas – skaičius keitiklio (ASK) skiriamoji geba turi būti ne mažesnė kaip 10 bitų.
Privalu atsižvelgti į minimalų keitimo laiką. Jeigu analizuojami paspaudimai, tuomet reikalingas
minimalus 70 taškų fiksavimas per sekundę, o esant judesiui 200 taškų per sekundę apskaičiavimas,
įvertinant diskretizavimą ir skaitmeninį filtravimą.
Keturlaidžio jutiklinio ekrano valdikliui pakanka keturių išvadų, kadangi galima kontroliuojant
realizuoti kelias funkcijas per vieną išvadą. Šiam ir kitiems procesams valdyti padeda laikmatis. Taip pat
taikant veiklos aptikimo rėžimą (budėjimo, energijos taupymo), kai tam tikrą laiko tarpą nėra
detektuojama paspaudimų ant lietimui jautraus ekrano, valdiklis yra nustatomas į miego būseną. Tai
būtina, kai lietimui jautrus ekranas naudojamas nešiojamuose įrenginiuose *2+.
Realizuojant keturlaidžio lietimui jautraus ekrano sistemą galima panaudoti vidinį mikrovaldiklio ASK keitiklį, vidinį CPU, ir kitus reikalingus elementus, taip supaprastinant lietimui jautraus ekrano prijungimą ir sistemos realizavimą [3].
3. Naudojama technologija
Technologija
Keturlaidis rezistyvinis jutiklinis ekranas sudarytas iš vienos poros elektrodų kiekviename skaidriame IAO (Indžio alavo oksido) sluoksnyje. Keturlaidžiu lanksčiu kabeliu elektrodai sujungiami su jutiklinio ekrano kontroleriu. Keturi laidai nurodomi kaip: X+ (kairė), X- (dešinė), Y+ (viršus), Y- (apačia).
1 pav. Keturlaidžio rezistyvinio jutiklinio ekrano konstrukcija 2 pav. X koordinatės nustatymas
Slegiant paviršių tam tikrame taške, Y ir X sluoksniai kontaktuoja taip sudarydami varžinį daliklį.
Įtampa tame taške, kuris nusako paspaudimo poziciją X sluoksnyje, detektuojama per Y+ elektrodą, kaip tai parodyta 2 pav. Taip pat tai pakartojama nustatant Y koordinatę per X+ elektrodą *1+.
Keturlaidžio lietimui jautraus ekrano technologijos privalumas yra tai, jog galima nustatyti paspaudimo slėgį matuojant kontakto varžą (Rpaspaudimo) tarp dviejų laidžių IAO sluoksnių. Mažėjant Rpaspaudimo didėja paspaudimo slėgis arba lauko plotis, kurį veikia slėgis. Taip galima nustatyti ne tik paspaudimo koordinates bet ir paspaudimo tipą, kokia jėga ir koks plotas slegiamas *2+.
Matavimai ir jų metodai
Matuoti lietimui jautraus ekrano įėjimo signalą naudojami du pagrindiniai matavimo metodai.
Pirmu atveju maitinimo įtampą arba lietimui jautraus ekrano sužadintą įtampą naudoti kaip etaloninę,
antru atveju atliekamas diferencialinis matavimas. Pastarasis yra pagrindinis metodas naudojamas
lietimui jautraus ekrano valdikliuose, o kiti gamintojai siūlo abu pasirinktinai. Šie matavimai reikalingi
nustatant paspaudimo koordinates. Mano projekte naudojant Atmega88 mikrovaldiklį realizuojamas
„single-ended“(pirmasis) matavimo metodas, taip užtikrinant energijos taupymą.
4 pav. Jutiklinio ekrano įėjimo signalo matavimo metodai
4. Nustatymai ir parametrų skaičiavimai
Specialios paskirties ir valdymo registrų pagrindiniai nustatymai
a) Išvadų nustatymai
Išvadų nustatymui naudojami „pill-up“ bei aukšto impedanso būsenos. Šios būsenos
nustatomos DDR ir PORTC registruose. Taip pat pateikiami išvadų nustatymai kada reikia nustatyti
maitinimą ir „žemę“.
Pin_Pullup(Pin) (SetBit(TOUCHSCREEN_OUTPUT, (Pin)), ClearBit(TOUCHSCREEN_DDR, (Pin)))
Pin_Vcc(Pin) (SetBit(TOUCHSCREEN_OUTPUT, (Pin)), SetBit(TOUCHSCREEN_DDR, (Pin)))
Pin_Gnd(Pin) (ClearBit(TOUCHSCREEN_OUTPUT, (Pin)), SetBit(TOUCHSCREEN_DDR, (Pin)))
Pin_Hi_Z(Pin) (ClearBit(TOUCHSCREEN_DDR, (Pin)), ClearBit(TOUCHSCREEN_OUTPUT, (Pin)))
TOUCHSCREEN_INPUT PINC
TOUCHSCREEN_OUTPUT PORTC
TOUCHSCREEN_DDR DDRC
X+ 0 Kairė pusė
X- 1 Dešinė pusė
Y+ 2 Viršus
Y- 3 Apačia
ADC1 XN Y-koordinatės nuskaitymas
STANDBY_PIN YN Paspaudimo tikrinimo ir X koordinatės nustatymas
STANDBY_CONFIGURATION (Pin_Gnd(XP), Pin_Hi_Z(XN), Pin_Hi_Z(YP), Pin_Pullup(YN))
X_POS_CONFIGURATION (Pin_Gnd(XP), Pin_Vcc(XN), Pin_Hi_Z(YP), Pin_Hi_Z(YN))
Y_POS_CONFIGURATION (Pin_Hi_Z(XP), Pin_Hi_Z(XN), Pin_Gnd(YP), Pin_Vcc(YN))
Iš programinio modelio byloje esančių išvadų aprašymo matyti budėjimo režimo bei X ir Y
koordinačių matavimo metu išvadų nustatymus. Žemiau matome nustatymus pateiktus lentelėje.
X+ X- Y+ Y-
Budėjimo režimas Gnd Hi-Z Hi-Z Pull up/Int
X-koordinatė Gnd Vcc Hi-Z Hi-Z/ADC
Y-koordinatė Hi-Z Hi-Z Gnd Vcc 1. Lentelė. Jutiklinio ekrano skenavimo metu reikalingi išvadų nustatymai
b) ADC nustatymai
Žemiau pateiktame programos fragmente matomi visi reikalingi registrai ASK režimo, valdymo
nustatymams.
ADC_CONTROL_AND_STATUS_REGISTER_A ADCSRA - ASK valdymo registras
ADC_MULTIPLEXER_SELECTION_REGISTER ADMUX - ASK multiplekserio pasirinkimo registras
ADC_ENABLE ADEN - ASK įjungimo bitas (bit 7) ADCSRA registre
ADC_START_CONVERSION ADSC - Keitimo režimo nustatymo bitas (bit6) ADCSRA registre
ADC_PRESCALER_SELECT ADPS0 - tai vienas iš bitų nustatančių sistemos laikmačio dažnio ir
ASK laikmačio dalinimo faktorių (bit 0) ADCSRA registre.
ADC_REFERENCE_SELECTION REFS0 - vienas iš bitų parenkančių ASK atraminę įtampą (bit 6)
ADMUX registre.
Iš pradžių ADSC bitu nustatomas ASK keitimo režimas „Single Conversion“. Po to laikmačio
dažnis 124kHz ADCSRA registre į jauniausių trijų bitų vietas įrašius 110. Tai reiškia, jog esant tokiems
nustatymams išorinio dažnio generatoriaus dažnį daliname iš 64. Po to parenkama išorinė atraminė ASK
įtampa ADMUX registre įrašius vienetą į 6 poziciją. Priklausomai nuo paspaudimo patikrinimo ar veiklos
patikrinimo ant jutiklinio ekrano bei baigus keitimą ASK yra išjungiamas arba įjungiamas prieš keitimą
nustatant ADEN bitą. Taip ASK paruošiamas darbui.
c) Maitinimo ir miego režimo nustatymai
Kadangi įrenginys ateityje bus naudojamas neprijungus stacionaraus maitinimo šaltinio, todėl
būtinas energijos taupymas. Tai realizuojama panaudojus vieną iš Atmega88 energijos
taupymo(budėjimo) režimų (mano atveju „Power-Down“). Šiame režime sustabdomas išorinis
osciliatorius iki tol kol bus užfiksuota išorinė pertrauktis. Taip naudojama labai mažai energijos. Žemiau
pateiktas programos fragmentas kaip nustatomas šis režimas.
Budėjimo režimo nustatymas ir įjungimas: SMCR = (2<<SM0)|(1<<SE). Pirmoje SMRC registro pozicijoje
bitas nustatomas į 1 (taip įjungiamas budėjimo režimas), o i sekančias tris pozicijas įrašoma 010 bitų
kombinaciją („Power-Down“ režimo nustatymas)
Išjungiamas budėjimo režimas: SMCR = (0 << SE);. Užfiksavus paspaudimą nustatoma išorinė
pertrauktis ir išjungiamas budėjimo režimas, tik antru paspaudimu vykdomas koordinačių skaičiavimas,
nustatymas ir išvedimas.
d) Laikmačio nustatymai
Programoje naudojami laiko palyginimai, kada laikmatis pasiekia atitinkamą nustatytą reikšmę,
kurios yra OCR0A ir OCR0B registruose, tuomet jau sekantį laikmačio ciklą nustatoma pertraukties
vėliavėlė.
TIMER0_OUTPUT_COMPARE_REGISTER_A OCR0A – Registras, kuriame saugoma lyginimo su TCNT0
skaitikliu reikšmė.
TIMER0_OUTPUT_COMPARE_REGISTER_B OCR0B – Registras, kuriame saugoma lyginimo su TCNT0
skaitikliu reikšmė.
TIMER0_CONTROL_REGISTER_A TCCR0A – Laikmačio/skaitiklio valdymo registras A
TIMER0_CONTROL_REGISTER_B TCCR0B – Laikmačio/skaitiklio valdymo registras B
TIMER0_CLOCK_SELECT CS00 - (bit 0) vienas iš TCCR0B registro bitų nustatančių
laikmačio šaltinį bei perskaičiavimą.
TIMER0_WAVEFORM_GENERATION_MODE WGM00 – vienas iš bitų nustatančių laikmačio skaičiavimo
kryptį (seką).
CS02 CS01 CS00 Aprašymas
0 1 1 clkI/O/64
2. Lentelė. Laikmačio šaltinio nustatymas.
Režimas WGM02 WGM01 WGM00 Aprašymas TOP Atnaujinimas Persipildymas
2 0 1 1 CTC OCRA Skubus MAX
3. Lentelė. Laikmačio skaičiavimo krypties (sekos) ir signalo formos nustatymai.
Toks laikmačio panaudojimas leidžia laike išdėstyti paspaudimo patikrinimo, išvadų pakeitimo, ASK
veikimo operacijas.
Laikinės diagramos
Kadangi bandant suprojektuotą įtaisą buvo pasirinktas 8Mhz (rekomenduojamas) ir 16MHz
(sistemos spartai padidinti) kvarcinis osciliatorius, todėl skaičiavimai bus atlikti prie dviejų dažnių.
a) Mikrovaldiklio laikinė diagrama
Žemiau pateikta laikinė mikrovaldiklio veikimo diagrama. Iš lentelės matome, jog esant 16MHz
kvarcinio osciliatoriaus dažniui laikmačio ciklas yra du kartus trumpesnis. Taip užtikrinamas spartesnis
sistemos darbas, tačiau reikia parinkti dažnio dalinimą iš didesnio daliklio, kad ASK laikmačio ciklas
neviršytų 200kHz. Į tai neatsižvelgus keitimas vyks greičiau, tačiau rezultatas bus mažesnės skiriamosios
gebos. Taip pat didesnis išorinio osciliatoriaus dažnis įtakoja paspaudimo tikrinimo trukmę.
5 pav. Mikrovaldiklio veikimo laikinė diagrama (laikmačio signalas)
Simbolis Parametras Vcc=2,7-5,5V Vcc=4,5-5,5 Dimensija
1/tCLCL Dažnis 8 16 MHz
tCLCL Periodas 125 62,5 ns
tCHCX Aukštas lygis 50 25 ns
tCLCX Žemas lygis 50 25 ns
tCLCH Priekinis frontas 1,6 0,5 μs
tCHCL Galinis frontas 1,6 0,5 μs
4. Lentelė. Laikmačio signalo parametrai kai kvarcinio osciliatoriaus dažnis 8MHz ir 16MHz.
b) Laikmačio laikinė diagrama
Nustatant laikmačio šaltinį pasirinkau daliklį (64), kuris padalina esamą kvarcinio osciliatoriaus
dažnį, taip užtikrinant stabilesnį laikmačio veikimą. Pirmoje formulėje kintamasis OCR0A ir antroje
kintamasis OCR0B yra reikšmė kurią nustatome programinio modelio byloje ir saugoma OCR0A bei
OCR0B registruose. Laikmatis skaičiuoja iki nustatytų reikšmių, taip laike išdėstant paspaudimo
patikrinimo ir ASK matavimo operacijas.
)01(2
/_
0AOCRN
ff
OIclk
AOCR (1)
mst
Hzf
AOCR
AOCR
2
500
0
0
)01(2
/_
0BOCRN
ff
OIclk
BOC (2)
mst
Hzf
AOCR
AOCR
3.1
6.771
0
0
Aukščiau pateikti apskaičiuoti OCR0B ir OCR0A palyginimo laikai, kai kvarcinio generatoriaus dažnis
8MHz, esant 16MHz dažniui trukmės bus du kartus didesnės, tačiau keičiant OCR0B ir OCR0A registrų
turinius galime koreguoti šį laiką .
6 pav. Laikinė diagrama kai kvarcinio osciliatoriaus dažnis 8MHz.
7 pav. Laikinė diagrama kai kvarcinio osciliatoriaus dažnis 16MHz.
6-tame ir 7-tame paveikėliuose matome CTC (Clear Timer on Compare Match) laikmačio darbo režimo veikimą laike. Šiuo atvejų diagramos pavaizduotos kai daliklis yra lygus 8-niems (iš mikrovaldiklio aprašymo dokumento).
c) Laikinė ASK veikimo diagrama
Nustačius ADSC bitu ASK darbo režimą „Single Conversion“ galime paskaičiuoti keitimo laiką.
Mikrovaldiklio aprašymo dokumente nurodyta, jog esant pasirinktam režimui pirmo keitimo laikas yra 25
ASK laikmačio ciklų, o sekančių keitimų 13 ASK laikmačio ciklų. Kai kvarcinio generatoriaus dažnis 8MHz
ir dalikis 64, ASK laikmačio dažnis 125KHz, o esant 16MHz dažniui galime pasirinkti dvigubai didesnį
daliklį. Svarbu neviršyti 200KHz ribos kada sumažėja keitimo skiriamoji geba.
nst
ft
keitimopirmo
ASK
keitimopirmo
200
125
_
_
nst
ft
keitimo
ASK
keitimo
104
113
8 pav. Laikinė ASK veikimo diagrama.
5. Principinė schema
Principinėje schemoje kondensatoriumi C1 ir induktyvumu L1 suformuojama apsauga nuo EMI
(Electro Magnetic Interference) poveikio analoginio signalo matavimams. Išvedimui per UART sąsaja
pasirinktas MAX232 CMOS logikos lygių suderinimui su TIA/EIA-232-F lygiais. UART sąsaja pasirinkta
išmėginti technologiją, bandymu tikslams, kad vėliau suprojektuotą įrenginį būtų galima realizuoti kaip
portatyvinį įtaisą.
9 pav. Jutiklinio ekrano valdiklio principinė schema
Realizuojant įrenginį portatyviam naudojimui pasirinkau Ličio Jonų 3V 200mAh bateriją ir
LM2731Y DC-DC keitiklį, kuris atlieka 3V keitimą į 5V, taip užtikrinant maitinimą MAX232 mikroschemai
bei Atmega88 veikiant aukštu taktiniu dažniu.
10 pav. DC-DC keitiklio principinė schema
Suskaičiavus energijos poreikį suprojektuotam įtaisui su maksimaliomis panaudotų mikrosistemų ir jutiklinio ekrano charakteristikomis esant 5V maitinimui reikalaujama paspaudimo metu 51mA srovė, o budėjimo režime tik 9,8mA, kadangi srove neteka jutikliniu ekranu ir Atmega88 yra „miego“(budėjimo) režime. O tai reiškia, jog sistema pilnai aprūpinama energija bei yra galimybė eksploatuoti įrenginį ilgesnį laiką iki paros budėjimo režimu.
6. Įrenginio programos algoritmas
Kairėje pateiktas algoritmas, kuris realizuojama
koordinačių nuskaitymas ir išvedimas per UART sąsaja. Tačiau tai
pateikta tik bendrais bruožais. Parašyta programa taip pat atlieka
paspaudimo patikrinimo ir koordinačių analizę, kurios metu gauti
ASK matavimo duomenys yra vidurkinami bei nustatomas tikras
paspaudimas. Tai reiškia, kad paspaudimas gali būti tiesiog
nevalingas judesys ir jutiklinis ekranas liečiamas per trumpą laiką
kad būtų nustatoma koordinatė.
Sekančiame lape pateiktas jutiklinio ekrano tvarkyklės
algoritmas, kuris aiškiau parodo programos veikimą, kaip ir kada
įjungiamas ASK, kada pradedamas keitimas .
11 pav. Pagrindinės programos algoritmas
Jutiklinio ekrano tvarkyklės
inicializavimas
Detektavimas
Ar praėjo
nustatytas laikas?
Ar visi duomenys?
Tikro paspaudimo
tikrinimas
Ar tikras?
Įjungiamas ASK
Nuskaitomos ASK
reikšmės
Pradedamas matavimas
Nustatomi išvadai
Budėjimas
Ne
Ne
Ne
Ne
Ne
Taip
Rezultatų analizė
Ar nereikia
matuoti toliau?
ASK išjungiamas Taip
Taip
Taip
Taip
Išvadų pakeitimo pertrauktis
12 pav. Jutiklinio ekrano tvarkyklės algoritmas
7. Įrenginio programa C programavimo kalba
Pagrindinė programa
/****************************************************************************
Bibliotekos
****************************************************************************/
#include "Touchscreen.h"
/****************************************************************************
Globalios definicijos
****************************************************************************/
// Sąsajos nustatymas
#define UART_INTERFACE
// Vėliavų registro kaukė
#define FLAG_REGISTER_MASK 255
// Bufferio apimtis verčiant unsigned int tipą į ASCII
#define STRING_BUFFER_SIZE 5
/****************************************************************************
Funkcijų apibūdinimas
****************************************************************************/
unsigned char Recognize_Event(void);
void Send_over_UART(void);
/****************************************************************************
Globalūs kintamieji
****************************************************************************/
// Jutiklinio ekrano sąsaja
extern Interface Touchscreen_Data;
Interface Buffer_Touchscreen_Data;
/****************************************************************************
Pagrindinė programa
****************************************************************************/
__C_task void main( void )
{
// USART inicializavimas
USART_Init(MY_UBRR);
// Jutiklinio ekrano inicializacija
Touchscreen_Init();
// Įjungti globalias pertrauktis
__enable_interrupt();
// Infinite Loop (Begalinis programos ciklas)
for (;;)
{
if(Recognize_Event())
{
#if defined UART_INTERFACE
Send_over_UART();
#endif
}
}
}
unsigned char Recognize_Event(void)
{
__disable_interrupt();
// Skaityti duomenis
Buffer_Touchscreen_Data = Touchscreen_Data;
// Kaukė Flag_Register
Buffer_Touchscreen_Data.Flag_Register &= FLAG_REGISTER_MASK;
// Išvalyti darbo sąrašą
Touchscreen_Data.Flag_Register ^= Buffer_Touchscreen_Data.Flag_Register;
__enable_interrupt();
return Buffer_Touchscreen_Data.Flag_Register;
}
void Send_over_UART(void)
{
// Buffer'is verčiant unsigned int tipą į ASCII
char String_Buffer[STRING_BUFFER_SIZE];
{
if(TestBit(Buffer_Touchscreen_Data.Flag_Register, FLAG_REGISTER_SLEEP))
{
// Nieko nedaryti, budėjimo režimas
SMCR = (2<<SM0)|(1<<SE);
__sleep();
}
if(TestBit(Buffer_Touchscreen_Data.Flag_Register, FLAG_REGISTER_COORDINATES))
{
// X/Y-kordinačių pateikimas
uart_puts(utoa(String_Buffer,STRING_BUFFER_SIZE,Buffer_Touchscreen_Data.x_pos));
uart_putc(' ');
uart_puts(utoa(String_Buffer,STRING_BUFFER_SIZE,Buffer_Touchscreen_Data.y_pos));
uart_putc(' ');
}
}
}
Jutiklinio ekrano tvarkyklės fragmentas – koordinačių matavimas
void ADC_Measurement(void)
{
static short int Reading_Low_Level;
// Stop Power Supply for Touchscreen
HI_Z_CONFIGURATION;
if (TestBit(ADC_ISR_Switch,0))
{
// Available: Value for Reading_Low_Level
Reading_Low_Level = ADC;
if(Reading_Low_Level < MAXIMUM_LOW_LEVEL)
{ // Reading_Low_Level = TRUE
if(TestBit(ADC_ISR_Switch,7))
{ // ADC_ISR_Switch, Bit 7 = Flag for valid X/Y Coordinates available
Store_valid_Data();
}
// Set ADC_ISR_Switch
// Reset Reading_Low_Level
ClearBit(ADC_ISR_Switch,0);
// Next: X-Coordinate Measurement (I/O Set up in Timer0_Compare_Match_B_ISR)
SetBit(ADC_ISR_Switch,1);
// Flag for Reading_Low_Level = TRUE
SetBit(ADC_ISR_Switch,7);
}
else
{ // Reading_Low_Level = FALSE
// Increment Counter_Untouch_Condition
Counter_Untouch_Condition++;
if(Counter_Untouch_Condition == MAXIMUM_UNTOUCH_CONDITIONS)
{ // Terminating Condition
Stop_Measurement();
// Interface: New Event --> End of Touch detected
SetBit(Touchscreen_Data.Flag_Register, FLAG_REGISTER_END);
}
// Set ADC_ISR_Switch (Next: Reading_Low_Level)
// Reset Condition "valid X/Y Coordinates available"
ClearBit(ADC_ISR_Switch,7);
}
}
else if (TestBit(ADC_ISR_Switch,1))
{
// Available: Value for X-Coordinate
Readings_X_Pos[i_array] = ADC;
// Set ADC Input Channel for Y-Coordinate Measurement
ADC_MULTIPLEXER_SELECTION_REGISTER = ADC1 | (1 << ADC_REFERENCE_SELECTION);
// Set ADC_ISR_Switch
// Reset X-Coordinate Measurement
ClearBit(ADC_ISR_Switch,1);
// Next: Y-Coordinate Measurement (I/O Set up in Timer0_Compare_Match_B_ISR)
SetBit(ADC_ISR_Switch,2);
}
else if (TestBit(ADC_ISR_Switch,2))
{
// Available: Value for Y-Coordinate
Readings_Y_Pos[i_array] = ADC;
// Set ADC Input Channel for Check for Touch
ADC_MULTIPLEXER_SELECTION_REGISTER = STANDBY_PIN | (1 << ADC_REFERENCE_SELECTION);
// Set ADC_ISR_Switch
// Reset Y-Coordinate Measurement
ClearBit(ADC_ISR_Switch,2);
// Next: Reading_Low_Level (I/O Set up in Timer0_Compare_Match_B_ISR)
SetBit(ADC_ISR_Switch,0);
}
}
#endif
8. Praktiniai rezultatai
Išanalizavęs ir pakoregavęs Atmel laisvo kodo programą suprojektavau įrenginį keturlaidžio
rezistyvinio jutiklinio ekrano koordinačių nuskaitymo ir išvedimo per UART sąsają įrenginį. 9 – ame
paveikslėlyje pavaizduotas mano suprojektuotas jutiklinio ekrano valdiklio prototipas su išvadiniais
elementais.
13 pav. Jutiklinio ekrano valdiklio prototipas
Kitame projekto etape EAGLE programa suprojektuotas spausdintinio montažo brėžinys ir
pagaminta plokštė ir sulituoti paviršinio montažo elementai. Matyti, kad įtaisas buvo sumažintas du
kartus. Aukšto dažnio takeliai atitraukti kuo toliau nuo matuojamo analoginio signalo takelių, kad
neiškraipytų rezultatų. Taip realizuojamas tikslesnis koordinačių nustatymas.
14 pav. Jutiklinio ekrano valdiklio spausdintinio montažo plokštė
Žemiau pateiktas RS232 sąsaja gautos koordinatės ir būsenų žodžiai, taip galime matyti jutiklinio
ekrano veikimą. Pastebimas duomenų iškraipymas (klaidos), tai gali įtakoti pasirinktas aukštas taktinis
dažnis. Tačiau gautas sklandus mikrovaldiklio darbas ir koordinačių išvedimas.
15 pav. Jutiklinio ekrano koordinačių išvedimas per UART sąsają į stacionaraus kompiuterio ekraną
9. Išvados
Keturlaidžio jutiklinio ekrano technologijos paprastumas ir maža kaina tinka plačiam intuityvios
sąveikos su grafika pritaikymui. Elektronikos komponentų gamintojai siūlo valdiklius galinčius sklandžiai
ir mažomis energijos sąnaudomis realizuoti jutiklinio ekrano paspaudimo analoginio signalo, minimaliai
apkraunant pagrindinį procesorių, apdorojimą. Pagrindinės problemos su kuriomis susiduriama:
triukšmai atsirandantys komponuojant jutiklinį ekraną ant LCD, sistemos greitaveika, maitinimo šaltinio
stabilumas, energijos sąnaudų mažinimas.
Šiame projekte aptarta jutiklinio ekrano valdiklių realizavimas, veikimo principas, struktūra,
pagrindinės iškylančios problemos. Visą tai įvertinant ir aiškinantis technologijos veikimo principus,
suprojektavau jutiklinio ekrano koordinačių apdorojimo ir išvedimo įtaisą naudojant Atmega88
mikrovaldiklį.
Projekto tikslas realizuoti spartų koordinačių išvedimą mažomis energijos sąnaudomis. Projekte
naudojau „Atmel“ gamintojo Atmega88 mikrovaldiklį, kuriuo realizavau jutiklinio ekrano koordinačių
išvedimą per UART sąsają. Patarimai suprojektavus lietimui jautraus ekrano koordinačių išvedimo
sistemą: skaitmeninių filtrų panaudojimas, minimaliu atstumu nuo mikrovaldiklio jutiklinio ekrano
jungties komponavimas, takelius skirtus analoginio signalo nuskaitymui atitraukti kuo toliau nuo takelių,
kurie skirti aukšto dažnio signalams (kuo toliau nuo kvarcinio dažnio generatoriaus), taip padidinant
koordinačių gavimo tikslumą, pasiteisino didelio efektyvumo DC-DC keitiklio panaudojimas stabilizuojant
bei konvertuojant maitinimo šaltinio (ličio jonų baterijos) parametrus, kas tolimesniuose planuose leis
lietimui jautraus ekrano kontrolerį panaudoti nešiojamuose įrenginiuose.
Tolimesni projekto planai: jutiklinio ekrano komponavimas ant LCD, kalibravimas, valdiklių
reikalaujančių mažesnių energijos resursų panaudojimas, stabilus maitinimo šaltinis užtikrinantis
koordinačių ADC keitimo pastovumą, naudojant aukšto naudingumo koeficiento DC-DC keitiklį.
10. Literatūros sąrašas 1. Gareth Fin. New Touch-Screen Controllers Offer Robust Sensing for Portable Displays. Prieiga per
Internetą: < http://www.analog.com/library/analogDialogue/archives/44-02/touch_screen.pdf>. 2. Four and five-wire Touch Screen Controller. Prieiga per Internetą: <
http://www.atmel.com/dyn/resources/prod_documents/doc8091.pdf>. 3. 4-Wire and 8-Wire Resistive Touch-Screen Controller Using the MSP430™. Prieiga per Internetą:<
http://focus.ti.com/lit/an/slaa384a/slaa384a.pdf >. 4. Low Voltage Controller for Touch Screens AD7879/AD7889. Prieiga per Internetą: <
http://www.analog.com/static/imported-files/data_sheets/AD7879_7889.pdf >. 5. Bonnie C. Baker and Wendy Fang, Senior Applications Engineers, Texas Instruments. Powering
resistive touch screens efficiently. Prieiga per Internetą: < http://www.eetimes.com/design/analog-design/4009949/Powering-resistive-touch-screens-efficiently>.
6. Nanopower, 4-wire TOUCH SCREEN CONTROLER with I2C Interface. Prieiga per Internetą: < http://focus.ti.com/lit/ds/symlink/tsc2014.pdf>.
7. Low-Power, Ultra-Small Resistive Touch-Screen Controllers with I2C/SPI Interface. Prieiga per Internetą: < http://datasheets.maxim-ic.com/en/ds/MAX11800-MAX11803.pdf
11. Priedas
a) Jutiklinio ekrano tvarkyklės fragmentas - inicializavimas
void Touchscreen_Init(void)
{
// I/O State: Check for Touch
STANDBY_CONFIGURATION;
// Pin Change
// Set Pin Change Interrupt Source
SetBit(PIN_CHANGE_MASK_1_REGISTER, PIN_CHANGE_ENABLE_MASK);
// Enable Pin Change Interrupt
SetBit(PIN_CHANGE_INTERRUPT_CONTROL_REGISTER, PIN_CHANGE_INTERRUPT_ENABLE_1);
// Timer0 Initialization (CTC Mode)
// Set Clear Timer on Compare Match A
TIMER0_CONTROL_REGISTER_A = (2 << TIMER0_WAVEFORM_GENERATION_MODE);
// Set Output Compare Register A to a Defined Value
TIMER0_OUTPUT_COMPARE_REGISTER_A = TIMER0_INITIAL_VALUE_COMPARE_MATCH_A;
// Set Output Compare Register B to a Defined Value
TIMER0_OUTPUT_COMPARE_REGISTER_B = TIMER0_INITIAL_VALUE_COMPARE_MATCH_B;
// Enable Timer0 Compare Match A Interrupt
TIMER0_INTERRUPT_MASK_REGISTER = (1 << TIMER0_OUTPUT_COMPARE_A_INT_ENABLE);
// Start Timer Clock (CTC Mode)
TIMER0_CONTROL_REGISTER_B = (TIMER0_PRESCALER << TIMER0_CLOCK_SELECT);
// Interface: New Event --> Reset Condition
SetBit(Touchscreen_Data.Flag_Register, FLAG_REGISTER_START);
}
b) Jutiklinio ekrano tvarkyklės fragmentas – paspaudimo atpažinimas
#if defined R_TOUCH_MEASUREMENT
void ADC_Measurement(void)
{
static short int Reading_Low_Level;
static short int Reading_Z1;
static short int Reading_Z2;
static long int R_Touch;
// Stop Power Supply for Touchscreen
HI_Z_CONFIGURATION;
if (TestBit(ADC_ISR_Switch,0))
{
// Available: Value for Reading_Low_Level
Reading_Low_Level = ADC;
if(Reading_Low_Level < MAXIMUM_LOW_LEVEL)
{ // Reading_Low_Level = TRUE
// Set ADC_ISR_Switch
// Reset Reading_Low_Level
ClearBit(ADC_ISR_Switch,0);
// Next: X-Coordinate Measurement (I/O Set up in Timer0_Compare_Match_B_ISR)
SetBit(ADC_ISR_Switch,1);
}
else
{ // Reading_Low_Level = FALSE
// Increment Counter_Untouch_Condition
Counter_Untouch_Condition++;
if(Counter_Untouch_Condition == MAXIMUM_UNTOUCH_CONDITIONS)
{ // Terminating Condition
Stop_Measurement();
// Interface: New Event --> End of Touch detected
SetBit(Touchscreen_Data.Flag_Register, FLAG_REGISTER_END);
}
// Set ADC_ISR_Switch (Next: Reading_Low_Level)
SetBit(ADC_ISR_Switch,0);
}
}
else if (TestBit(ADC_ISR_Switch,1))
{
// Available: Value for X-Coordinate
Readings_X_Pos[i_array] = ADC;
// Set ADC Input Channel for Y-Coordinate Measurement
ADC_MULTIPLEXER_SELECTION_REGISTER = ADC1 | (1 << ADC_REFERENCE_SELECTION);
// Set ADC_ISR_Switch
// Reset X-Coordinate Measurement
ClearBit(ADC_ISR_Switch,1);
// Next: Y-Coordinate Measurement (I/O Set up in Timer0_Compare_Match_B_ISR)
SetBit(ADC_ISR_Switch,2);
}
else if (TestBit(ADC_ISR_Switch,2))
{
// Available: Value for Y-Coordinate
Readings_Y_Pos[i_array] = ADC;
// Set ADC_ISR_Switch
// Reset Y-Coordinate Measurement
ClearBit(ADC_ISR_Switch,2);
// Next: Z1 - Measurement (I/O Set up in Timer0_Compare_Match_B_ISR)
SetBit(ADC_ISR_Switch,3);
}
else if (TestBit(ADC_ISR_Switch,3))
{
// Available: Value for Z1-Coordinate
Reading_Z1 = ADC;
// Set ADC Input Channel for Z2 Measurement
ADC_MULTIPLEXER_SELECTION_REGISTER = ADC2 | (1 << ADC_REFERENCE_SELECTION);
// Set ADC_ISR_Switch
// Reset Z1 Measurement
ClearBit(ADC_ISR_Switch,3);
// Next: Z2 - Measurement (I/O Set up in Timer0_Compare_Match_B_ISR)
SetBit(ADC_ISR_Switch,4);
}
else if (TestBit(ADC_ISR_Switch,4))
{
// Available: Value for Z2-Coordinate
Reading_Z2 = ADC;
// Calculate Appraisal for R_Touch
R_Touch = ((float)Reading_Z2/Reading_Z1-1) * Readings_X_Pos[i_array];
if(R_Touch<=MAXIMUM_RTOUCH_LEVEL)
{
// Store valid Data in Array
Store_valid_Data();
}
// Set ADC Input Channel for Check for Touch
ADC_MULTIPLEXER_SELECTION_REGISTER = STANDBY_PIN | (1 << ADC_REFERENCE_SELECTION);
// Set ADC_ISR_Switch
// Reset Z2 - Measurement
ClearBit(ADC_ISR_Switch,4);
// Next: Reading_Low_Level (I/O Set up in Timer0_Compare_Match_B_ISR)
SetBit(ADC_ISR_Switch,0);
}
}
#endif
c) UART inicializavimas void USART_Init( unsigned int ubrr)
{
UART_TxHead = 0;
UART_TxTail = 0;
UART_RxHead = 0;
UART_RxTail = 0;
/*Set baud rate */
UBRR0H = (unsigned char)(ubrr>>8);
UBRR0L = (unsigned char)ubrr;
/*Enable receiver and transmitter plus corresponding interrupts*/
UCSR0B = (1<<RXCIE0)|(1<<RXEN0)|(1<<TXEN0);
/* Set frame format: 8data, 1stop bit */
UCSR0C = (1<<UCSZ00) | (1<<UCSZ01);
}