MCU's AD och Touchscreen -Hur får precission med ett finger
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.
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.
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å.
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å.
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
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
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!
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!
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.
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.
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
Kan det vara så att du menade att du subtraherade 1024 från summan av Xn ? Det verkar mer rimligt

Ja precis , du måste kolla min och max i varje led och *sen* invertera... typ något sånt här:
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
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;

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

Senast redigerad av Kraco 20 augusti 2007, 16:18:41, redigerad totalt 1 gång.
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!
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!
