Sida 2 av 3
Postat: 17 augusti 2007, 18:15:14
av speakman
Jag frågade efter en lämplig algoritm, inte efter tips hur man felsöker hårdvaran.
Det är inte jag som ritat ihop den förvisso, men den som gjort det har nog mer pejl än många på hur man bör applicera det på bästa vis. Det räcker för mig.
Min uppgift är att behandla signalen på bästa vis.
Postat: 17 augusti 2007, 18:25:13
av dangraf
godnatt
Postat: 17 augusti 2007, 18:27:57
av Icecap
Jag ville ju ha gjort en test:
1: Finger på.
2: Mäta X (eller Y) direkt (i tid), skriv ut.
3: Ge lite tid.
4: Mät igen, skriv ut.
5: Vänd polaritet, mät direkt, skriv ut.
6: Vänta en aning.
7: Mät igen, skriv ut.
Medan detta mätande pågår kollar du med oscillioskop om spänningen hoppar med polariteten, om den gör det har du ett offset som du ska kompensera i mjukvara, jag tror att det är problemet: ett offset i de digitala utgångar.
Postat: 17 augusti 2007, 20:29:36
av speakman
Hm, vilken spänning pratar du om? Eller ska jag nyttja två kanaler och mäta båda höga signalerna oavsett polaritet?
Och hur menar du att den ska hoppa? Förstår nog inte vad du menar med offset riktigt heller.
Gör ju givetvis kalibrering i mjukvaran efteråt, så det behövs inte skötas i uC:n om det var det du tänkte på.
Postat: 17 augusti 2007, 21:36:37
av Icecap
Om '0' inte är 0,00V men istället kanske 0,10V får du ett offset. Om inte '1' är 5V men kanske 4,90V.... osv.
Vilket värde får du om du trycker precis på kanten och vilket värde får du om du trycker exakt samma ställe och vändar polaritet osv.
Det finns så många obekanta enheter i detta att du inte kan få ett svar innan du har arbetsförhållanden klart för dig.
Ett exempel, talen används bara för att tydliggöra.
Trycker på ytterkant Y, utläst 1000 (antar 10 bit AD).
Polvändning, nytt värde: 60.
Andra ytterkant Y, utläst 980, polaritetsvändning, utläst 40.
Om du då lägger till ett offset om t.ex. 20 vid rätt polaritet (eller -10 på ena och +10 på andra polaritet) har du stabila värden
Postat: 19 augusti 2007, 19:02:31
av speakman
Ah, du menar så. Just nu så tar jag X1 (ena polariteten) + X2/1024 (Andra polariteten, värdet blir "inverterat", därav /1024, 10bitar), och delar summan med två för att få ett medelvärde som borde fungera.
Ett problem med att mäta sig fram till just en touchscreen är att det kan skilja väldigt mycket mellan enheter av samma modell.
Jag tycker ju att min beräkning borde fungera rent generellt, och sedan läggs ju kalibreringen på det där det tas hänsyn till offset osv.
Men jag kan ju alltid prova mäta denna offset per polaritet och se om det ger någon skillnad. Den kanske blir tillräckligt bra även på andra enheter!
Postat: 19 augusti 2007, 19:15:23
av v-g
Kan ju vara en anledning att kalibrering finns på de flesta otyg med touch-screen att det kanske inte fungerar bra utan som du säger.
Varför inte testa och se vad det gör?
Postat: 19 augusti 2007, 19:19:44
av speakman
Jag har också hört från en del som hållit på ett tag med liknande att alla inte är linjära, och att även det kan skilja på olika enheter.
Men då räcker inte ens kalibrering.

Postat: 19 augusti 2007, 19:22:03
av dangraf
X1 = tal mellan 1-1024 direkt från AD omvandlaren.
X2/1024 = flyttal mellan 0-1 där 1 är 1024/1024..
possition = (X1 + X2/1024 )/2
är det såhär du räknat? ifåfall förstår jag varför det blir fel.
i annat fall.
* SKRIV PSEVDOKOD VAD DU GJORT* svårt att sitta här o tolka dina räkningar, "tagit några värden", beräknar lite medelvärden" osv.
Postat: 20 augusti 2007, 12:27:38
av Kraco
Nu har jag inte läst hela tråden men
position = ((X1 + X2)/1024)/2 (obs, lite ändrat från ovan, det var ju helt fel) ger ju ett flyttal mellan 0.000 och 1.0000, och eftersom en atmega48 inte stöder flyttal och därför ger tillbaks 0 eller 1 eller ingenting alls här så fungerar det nog inget bra. Men vad jag har förstått så har du kommit längre än så.
Kan det vara så att du menade att du subtraherade 1024 från summan av Xn ? Det verkar mer rimligt

Postat: 20 augusti 2007, 12:44:10
av speakman
Men jösses, var lite *väl* snabb att skriva ser jag. Det ska givetvis vara
1024 - X2 eftersom X2 blir inverterat när man vänt polariteten!
Det är alltså
(X1 + (1024 - X2)) / 2 och inget annat.
dangraf: Ta det lugnt! En cola light kanske?

Postat: 20 augusti 2007, 13:21:13
av Icecap
Och du VET att du får 1024 som högsta bitvärde när du petar längst "åt det hållet"?
För då har du fel!
På en 10-bitars AD ärr 1023 högsta värdet!
Så jag är ganska säker på att du helt har glömt att kolla min- och max-värden och det är där dina problem börjar.
Postat: 20 augusti 2007, 13:43:02
av Kraco
Ja precis , du måste kolla min och max i varje led och *sen* invertera... typ något sånt här:
Kod: Markera allt
/* Kalibreringsvärdena */
xmin = 134;
xmax = 250;
/* Räkna ut medelvärdet för x och placera intervallet så att det börjar vid 0 (om allt stämmer) */
xavg = (int)((X1-xmin) + ((xmax - X2)-xmin))/2;
/* Kolla så att det inte blev negativt */
if(xavg<0)xavg=0;
Rätta mig om jag har fel, detta var en liten gissning
Edit: Detta går ju givetvis att göra både i hårdvara och mjukvara, det bästa är ju att kombinera båda sätten

Postat: 20 augusti 2007, 15:38:18
av speakman
Jo, givetvis används 1023. Jag jobbar inte med koden just nu, därför blir det lite yrsigt. Går dock och grundar på det här ibland, därav jag skrev tråden.
Men som ni säger, jag har inte tagit hänsyn till "offset" vid beräkningarna, och det kanske ökar precisionen en del. Men det fungerar bevisligen nu också. Om man använder ett spetsigt föremål så blir det *otroligt* exakt.
Använder man ett finger så felar det mer på nedre delen av displayen än den övre. Också rätt intressant.
Jag har ju en utmätt undre gräns som avgör om det är en tryckning, för man får ju inte direkt 0 när inget ligger på och trycker.
Denna skulle man ju kunna justera upp (vilket jag redan tror den är) till vänstra/övre kanten och dra bort som offset (det blir ju en per polarisering då).
Har dock en del annat som måste prioriteras, så jag återkommer lite senare när jag provat!
Tack för tipsen så långt btw!

Postat: 20 augusti 2007, 15:51:22
av Icecap
Räknar du "tryck/icke tryck" efter AD-värdet? Det låter ganska fel i mina öron, jag hade gjort båda X(/Y) ingångerna till ingång med ett stort motstånd till GND och sedan kastat ut en '1' på båda Y(/X). En '1' på X(/Y) ingångerna = tryck, '0' = inget tryck.