21
Keturlaidžio rezistyvinio jutiklinio ekrano valdiklis Mindaugas Staišiūnas Kaunas 2011

Telekomunikacijų ir elektronikos fakultetas MPKursinis2

Embed Size (px)

Citation preview

Page 1: Telekomunikacijų ir elektronikos fakultetas  MPKursinis2

Keturlaidžio rezistyvinio jutiklinio ekrano valdiklis

Mindaugas Staišiūnas

Kaunas 2011

Page 2: Telekomunikacijų ir elektronikos fakultetas  MPKursinis2

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

Page 3: Telekomunikacijų ir elektronikos fakultetas  MPKursinis2

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

Page 4: Telekomunikacijų ir elektronikos fakultetas  MPKursinis2

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

Page 5: Telekomunikacijų ir elektronikos fakultetas  MPKursinis2

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))

Page 6: Telekomunikacijų ir elektronikos fakultetas  MPKursinis2

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.

Page 7: Telekomunikacijų ir elektronikos fakultetas  MPKursinis2

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.

Page 8: Telekomunikacijų ir elektronikos fakultetas  MPKursinis2

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

Page 9: Telekomunikacijų ir elektronikos fakultetas  MPKursinis2

)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

_

_

Page 10: Telekomunikacijų ir elektronikos fakultetas  MPKursinis2

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.

Page 11: Telekomunikacijų ir elektronikos fakultetas  MPKursinis2

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

Page 12: Telekomunikacijų ir elektronikos fakultetas  MPKursinis2

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

Page 13: Telekomunikacijų ir elektronikos fakultetas  MPKursinis2

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();

Page 14: Telekomunikacijų ir elektronikos fakultetas  MPKursinis2

// 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)

Page 15: Telekomunikacijų ir elektronikos fakultetas  MPKursinis2

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

Page 16: Telekomunikacijų ir elektronikos fakultetas  MPKursinis2

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ą

Page 17: Telekomunikacijų ir elektronikos fakultetas  MPKursinis2

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į.

Page 18: Telekomunikacijų ir elektronikos fakultetas  MPKursinis2

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

Page 19: Telekomunikacijų ir elektronikos fakultetas  MPKursinis2

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++;

Page 20: Telekomunikacijų ir elektronikos fakultetas  MPKursinis2

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();

}

Page 21: Telekomunikacijų ir elektronikos fakultetas  MPKursinis2

// 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);

}