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
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...
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
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... ;-)
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?
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 ;)
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?
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
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?
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...
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.
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.
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!
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.
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.