Forum: FPGA, VHDL & Co. FPGA Touch Screen


von Fabian S. (fubian) Flattr this


Lesenswert?

Hallo,
ich habe ein Alters Board mit einem Cyclone IV und einem 4Wire LCD Touch 
Screen (TPad).
Das Display ist bereits mit einem Touch-Controller (AD7843) 
ausgestattet. Der Chip benoetigt 8 Bits fuer das Steuerregister und 
schmeisst in den folgenden Takten 8 bzw 12 Bit Daten raus. Eine 
Konversation benoetigt 24 Takte. Im Datenblatt sind verschiedene Modi 
fuer den Betrieb beschrieben, die man ueber das Steuerregister 
adressieten kann.
Ich versuche nun die Position einer Beruehrung zu bestimmen, aber bin 
mir nicht sicher welchen Modus ich waehlen muss und wie ich die 
resultierenden Daten zu interpretieren habe.
Ich vermute, das es sinnvoll ist einen Modus x bzw y gegen die feste 
Referenz benutzen muss. Muess das Display noch kalibriert werden bevor 
man die Daten als Koordinaten lesen kann?
Vielen Dank Schonmal

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Fabian Schütte schrieb:
> Muess das Display noch kalibriert werden bevor
> man die Daten als Koordinaten lesen kann?
Was du einliest, sind irgendwelche AD-Wandlerwerte. Und die mußt /du 
selber/ noch in Koordinaten/Pixel umrechnen (im einfachsten Fall mit 4 
Punkten via Offset+Verstärkung). Denn der AD7843 weiß ja nicht, ob der 
Touch auf einem QVGA oder SVGA (oder wasauchimmer) Display liegt...

von Uwe N. (ex-aetzer)


Lesenswert?

Hallo,

zum Thema Kalibrierung fällt mir die AppNote "AVR341" von Atmel ein. 
Hier (ab Seite 16) wird etwas genauer darauf eingegangen (die AppNote 
ist wie bereits erwähnt von Atmel, da aber die Kalibrierung von deinem 
FPGA durchgeführt werden muss, ist dies als Orientierung ok. denke ich).

Übrigens, von dem Ergebnis des AD7843 einfach einen bestimten Wert 
abziehen funktioniert aufgrund der Linearitätsfehler von Touch-Panels 
nicht wirklich zuverlässig ...

Gruss Uwe

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Uwe N. schrieb:
> Übrigens, von dem Ergebnis des AD7843 einfach einen bestimten Wert
> abziehen funktioniert aufgrund der Linearitätsfehler von Touch-Panels
> nicht wirklich zuverlässig ...
Das wäre dann ja nur eine "2-Punkt" Kalibrierung. Sowas scheint mir auch 
recht gewagt...

Aber besser eine etwas fehlerbehaftete (wegen Inter- und Extrapolation) 
4-Punkt Kalibrierung, als ein ultragenauer, aber aufwendiger und 
fehleranfälliger 7-oder-mehr-Punkt Abgleich... ;-)

von Fabian S. (fubian) Flattr this


Angehängte Dateien:

Lesenswert?

Das heißt also ich schaue mir die Ausgabewerte für zB die vier Ecken an, 
und kalibirere damit die x/y Koordinaten.
Jetzt hat der AD7843 verschiedene Betriebsmodi (siehe Abbidung). Bisher 
habe ich X+ gegen V_ref bzw Y+ gegen V_ref als sinnvoll erachtet. Würdet 
ihr mir da bezüglich der Kalibrierung soweit zustimmen?

von Uwe N. (ex-aetzer)


Lesenswert?

Fabian Schütte schrieb:
> Jetzt hat der AD7843 verschiedene Betriebsmodi (siehe Abbidung). Bisher
> habe ich X+ gegen V_ref bzw Y+ gegen V_ref als sinnvoll erachtet. Würdet
> ihr mir da bezüglich der Kalibrierung soweit zustimmen?

Naja, andere Möglichkeiten hast du ja nicht (mit der Kalibrierung hat 
das ja erstmal nix zu tun).
Du benötigst mind. 2 Messungen: X und Y. Später kannst du ja noch den 
Touchpressure auswerten (sinnvoll).
Im Sinne halbwegs brauchbarer Messergebnisse wirst du nicht 
drumherumkommen, mehrere Messungen pro Richtung (X/ Y) zu machen und 
daraus jeweils den (z.B.) Mittelwert zu bilden.

Es gibt mittlerweile Touch ICs, die dies selbständig machen 
(z.B.MAX11800), aber das nutzt dir ja nix ;)

von Fabian S. (fubian) Flattr this


Lesenswert?

So ich habe jetzt Messwerte für alle vier Ecken von x und y aufgenommen 
und darüber entsprechende Mittelwerte gebildet. Jetzt habe ich versucht 
dazu eine lineare Funktion anzupassen, was allerdings so garnicht passt! 
Gut passt eher eine stückweise kubische Funktion. Ist es realistisch 
eine solche Funktion im FPGA zu implementieren?

von Uwe N. (ex-aetzer)


Lesenswert?

Fabian Schütte schrieb:
> So ich habe jetzt Messwerte für alle vier Ecken von x und y aufgenommen
> und darüber entsprechende Mittelwerte gebildet.

Zum Thema Kalibrierung: Hast du mal in "AVR341" geschaut ? Hier ist der 
mathematische Weg gezeigt, unabhängig von der Zielplattform.

Im Prinzip ermittelst du bei der (4 Punkt Kalib.) eigentlich "nur" 6 
Koeffizienten, die bei der eigentlichen Positionsauswertung 
berücksichtigt werden müssen.


Gruss Uwe

von Fabian S. (fubian) Flattr this


Lesenswert?

Ja das Display habe ich wie dort beschrieben ausgemessen, allerdings 
erhält man mit dem LGS Fließkommezahlen als Koeffizienten. Ist es dann 
sinniger die ampassung der Koordinaten in der Software zu implementieren 
als im FPGA?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Fabian Schütte schrieb:
> Ist es dann sinniger die ampassung der Koordinaten in der Software
> zu implementieren als im FPGA?
Es ist auf jeden Fall einfacher und (vor allem) idR. auch schnell 
genug. Etwas in Hardware zu gießen macht nur Sinn, wenn man die 
Geschwindigkeit auch tatsächlich braucht. Bei einem Touch kommt es aber 
kaum auf die us an...

von Fabian S. (fubian) Flattr this


Lesenswert?

So ich bin noch immer nicht fertig mit diesem Display!

Die Kommunikation zwischen FPGA und AD7843 sollte laufen. Ich habe den 
AD7843 mit 2Mhz getaktet, das CS dauerhaft auf aktiv gesetzt, den 
Interrupt aktiviert und permanent auf AN geschaltet. Die Messung sollte 
im Differential Mode durchgeführt werden.
Control Register Adressen: 10010010 und 11010010

Ich kann die Werte auch per Software auslesen und theoretisch auch in 
Pixel Werte umrechnen.

Das Problem ist nur, das nach der Kalibrierung zwar die Testpunkte 
einigermaßen stimmen, aber alles andere ganz und garnicht.

Zur Kalibrierung habe ich drei Punkte auf dem 800x600 Display definiert: 
P1(80/60), P2(720/300) und P3(400/540). Dannach habe ich diese in ein 
LGS mit drei unbekannten geschmissen und jeweils für X und für Y drei 
Parameter erhalten. Dann habe ich die Werte die der ADC liefert mit den 
Parametern verrechnet und sollte die Pixelwerte erhalten.

X_pixel = A * X_adc + B * Y_adc + C
Y_pixel = D * X_adc + E + Y_adc + F

Ich habe keine Idee mehr wo mein Fehler liegen kann, aber vielleicht hat 
jemand mehr Erfahrung mit Touch-Screens und kennt solche Problem.

von Fabian S. (fubian) Flattr this


Lesenswert?

Ideen?

von Sigi (Gast)


Lesenswert?

Modus: Aus deiner Tabelle Oben (aus dem Datenblatt) gibts
ja nur 4 Zeilen (mit X+,Y+), d.h. 2 Paare (SER- oder DFS-Modus).
Soweit ich mich ans Datenblatt erinnern kann: DFS ist etwas
unempfindlicher bzgl. Temp. und Position (auch meine Erfahrung
bei meinen Board). Für dein Board musst du also nur das eine
Bit im Cmd-Word ausprobieren und sehen, was für dich besser
funktioniert.

Auswertung: Schau dir AVR341 an. Funktioniert ohne längeres
Rumprobieren.

von Fabian S. (fubian) Flattr this


Lesenswert?

Also ich habe beiereits Single-Ended (SER) und Diferential (DFR) Modus 
getestet und beide funktionieren recht gut was die stabilität des 
Signals bezüglich Ort und Temperatur betrifft.

Das Problem liegt bei der Auswertung. Ich bin wie in AVR341 beschrieben 
vorgegangen und habe drei Kalibrierungspunkte gewählt ([10%|10%], 
[10%|50%], [50%|10%]). Dannach habe ich das in ein LGS gesteckt und die 
6 Parameter raus bekommen.

Wenn ich nun das Display an den Kalibrierungspunkten berühre stimmen 
auch die Pixel-Koordinaten. Nur wenn der Druckpunkt irgendwoanders ist, 
wird er falsch lokalisiert und zwar nicht ein paar Pixel daneben, 
sondern eher 200 Pixel daneben!

von Sigi (Gast)


Lesenswert?

Bei zwei neuen Touchpanels funktioniert's gut genug
(max 5% Abweichung), bei meinem gebrauchten Board (NEEK)
ist's in etwa wie von dir beschrieben: innerhalb der
beiden Schenkel der drei Punkte ist die Abweichung sehr
gering, Ausserhalb habe ich sehr grosse Abweichungen.

Ich habe deshalb mal mein Board mit einem einfachen
Prog ausgewertet: Zu einem Raster (10x10) habe alle
Punkte ausgewertet (geht schnell, einfach die Punkte
seriell eingeben lassen) und graph. als Kontour-Plot
ausgegeben. Das Ergebnis lässt sich sehr gut durch
eine sog. bilineare Funktion approximieren:
  p = p00*(1-x)*(1-y) + p10*x*(1-y) + p01*(1-x)*y + p11*x*y
(pij: Eckpunkte, 5% Abstand vom Rand).

Mittels Intervalhalbierung (8-10 Schritte) kriegt man
sehr einfach eine gute Approx. für X,Y und damit den
Bildpunkt. Hört sich vlt. ein wenig kompliziert an, aber
das Ganze lässt sich auch einfach in VHDL giessen.
Probiers aber erstmal in Software.

von Fabian S. (fubian) Flattr this


Lesenswert?

Ich verstehe deine Gleichung grade nicht. was ist jetzt das x und y? 
sind das die Werte die der ADC liefert oder die Pixelwerte denen die 
Messungen entsprechen sollen? Sind pIJ Tupel der Koordinaten in 
Pixelwerten oder nur eine Komponente einer Koordinate oder was? Und zu 
guter letzt was ist das p was als Ergebnis da raus kommen soll?

von Sigi (Gast)


Lesenswert?

Ich habe die Variablen ungünstig gewählt, setzte statt dessen
für (x,y) besser (r,s), dann ergibt sich folgender Weg:

0. Touch-ADC liefert P=(x,y), Q=(u,v) ist der zug. Pixel
1. (Für 3-Punkte-Verfahren) Wähle 3 Punkte Q0,Q1,Q2 (zeige
   sie auf dem Display an) und ermittle die Messpunkte
   P0,P1,P2
2. DP1=P1-P0 und DP2=P2-P0 (DQ1=Q1-Q0..) bilden implizites
   bzw. temp. Koord.System mit T=(r,s). Setze MP=(DP1,DP2)
   und MQ=(DQ1,DQ2) (2X2 Matrizen,jew. regular!).
3. Es gilt: (P-P0)=MP*T bzw. T=(MP^-1)*(P-P0) und
   (Q-Q0)=MQ*T. Mit M=MQ*(MP^-1) hat man (Q-Q0)=M*(P-P0)

Schritte 0-2 am besten im uC (wird nur einmal gebraucht),
Schritt 3 im FPGA.

Bei der bilinearen Version hat man die Punkte P0..P3,
Q0..Q3 und leider nicht mehr so einfach die Möglichkeit
der Umrechnung. Man kann aber einfach mittels Intervall-
Halbierung eine Näherung für T=(r,s) finden und erhält
damit Q=(u,v). (Funktioniert auch für Mehrpunkte-Verf.)

Hört sich jetzt sehr Umständlich an, man muss aber
bedenken, dass man ja 250ADC-KSamples hat und  nur
100 Punkte/Sec für die Auswertung braucht. Es bleiben
also >=1000 Samples Zeit für die Auswertung.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.