Forum: Mikrocontroller und Digitale Elektronik QTouch von Atmel Sensitivität


von Frank (Gast)


Lesenswert?

Hallo zusammen,

ich habe mir einen Taster mit der QTouch Library von Atmel aufgebaut. 
Das funktioniert erst einmal auch soweit.

Ich habe jetzt nur ein Phänomen bemerkt, welches ich mir nicht erklären 
kann.

Die Sensorfläche/der Schalter funktioniert erst einmal einwandfrei. Wenn 
ich nun für einige Sekunden in schneller Abfolge auf die Sensorfläche 
tippe, wird das System immer sensitiver, d.h. nach einiger Zeit (einige 
Sekunden) pausenlosen, schnellen Tippens auf die Sensorfläche, reicht es 
dann schon aus, wenn man den Finger über die Sensorfläche bringt, damit 
der Sensor eine Betätigung erkennt. Wenn man dann mit dem Tippen 
aufhört, ein paar Sekunden wartet und ein, zwei mal auf die Sensorfläche 
tippt, "normalisiert" sich die Sensitivität wieder und es wird ein 
Fingerdruck wie gewünscht erkannt.

Hat jemand Erfahrungen mit der Library und hat eventuell eine Idee, 
warum das System sensitiver wird, wenn man eine Zeit lang schnell auf 
die Sensorfläche tippt?

Freue mich über Anregungen.

Grüße

von Peter (Gast)


Lesenswert?

Du mußt die Drift compensation etwas verlängern. Ist sie zu kurz 
eingestellt, dann geht das Referenzsignal Richtung der "neuen" 
Kapazität.
Das ist dafür gut wenn sich z.b. im Laufe der Zeit die Sensorfläche 
verdreckt (Kapazität ändert sich) und wenn der Drift compensation z.b. 
auf 10Sekunden eingestellt ist, dann wird jede 10Sekunden geprüft wie 
das neue Signal aussieht und dann geht die Referenz immer in 1Count 
Schritten entweder mit hoch oder runter.
Hast Du die Drift compensation auf viel kürzeren Abstand eingestellt, 
z.b. jede Sekunde, dann ist "im Schnitt" der Pegel viel höher und die 
Referenz geht dann solange du permanent drauf klopfst mit. Wenn Du dann 
loslässt, geht ja das Signal runter und das Referenzsignal folgt dem 
neuen Signal und dann ist wieder alles gut.

von Frank (Gast)


Lesenswert?

Hallo,

vielen Dank für die schnelle Antwort!

Wenn ich das richtig verstanden habe, wäre das der Wert "neg_drift_rate" 
und "pos_drift_rate"!?

Ich werde dann mal ein wenig damit rumspielen.

Das würde doch aber heißen, wenn ich den Wert z.B. auf 10s einstelle und 
dann 20s oder so schnell tippe, würde ich dann auch wieder das 
entsprechende Phänomen erhalten?

Sollte man diesen Wert dann also möglichst hoch einstellen!?

Vielen Dank!

Grüße

von Peter (Gast)


Lesenswert?

ja so kann mans betrachten, je schneller gedriftet werden soll desto 
öfter passt sich der Algorithmus an die Umgebung an. Du wirst ein wenig 
ausprobieren müssen welche Einstellungen für die Applikation Sinn machen

GGf. kannst Du auch versuchen die Abtastrate zu ändern, z.b. alle 250ms 
sampeln damit kriegt der Algorithmus nicht so häufig die Änderungen mit, 
das geht aber zu Lasten der Response Zeit.
Alternativ kannst Du auch den Parameter Detect Integration erhöhen, dann 
wird x-mal gesampelt und erst wenn alle Samples über dem Detect 
Threshold liegen, dann wird der Wert als Touch reported.
Mußt mal ein wenig ausprobieren, Touch ist Rocket Science :)

Am besten wenn Du das QDebug Interface nutzt und mit Hilfe von Atmel 
Studio / QTouch Analyser kannst Du Dir dann anschauen wie sich der 
Verlauf des Signals und des REferenzsignals ändert. Dann siehst Du genau 
wie das Verhalten ist. Du kannst Dir ggf. auch ein günstiges SAMD20 
Xplain Pro kit zum Experimentieren nehmen dort ist der EDBG Chip verbaut 
der auch als Gateway zum QTouch Analyser dient. Um das Prinzip zu 
verstehen und mal alle Parameter zu testen hilft das auch schon weil Du 
dann direkt im Analyser siehst was vor sich geht.

von Frank (Gast)


Lesenswert?

Hallo,

vielen Dank!

Ich werde mal ein wenig mit den Werten rumexperimentieren und mal 
schauen, was sich für Änderungen ergeben.

Das mit dem QDebug Interface und dem Analyser werde ich mir einmal 
anschauen.

Wenn ich etwas weiter gekommen bin, werde ich hier nochmal berichten. 
Hilft dann vielleicht auch anderen weiter.

Besten  Dank!!

Grüße

von Thomas W. (Gast)


Lesenswert?

Frank schrieb:
> Das würde doch aber heißen, wenn ich den Wert z.B. auf 10s einstelle und
> dann 20s oder so schnell tippe, würde ich dann auch wieder das
> entsprechende Phänomen erhalten?

Stell den Wert einfach so ein, dass der Schwellwert nicht nennenswert 
wegdriftet, bevor dein Finger lahm ist ;-)

von Kurt D. (Gast)


Lesenswert?

Hat eigentlich schonmal jemand probiert, die Touch-Fläche eines 
"self-capacitance Buttons" möglichst groß zu machen? Funktioniert das 
Prinzip dann auch noch oder ist es gar nicht mehr zu gebrauchen wegen zu 
schlechter Sensitivität bzw. wo in etwa liegt die Grenze?

von Peter (Gast)


Lesenswert?

@Kurt

klar geht das, je größer desto mehr Sensitivität = Proximity.
Mit ca. 5x5cm Fläche hatte ich ungefähr 10cm Proximity

Wenn man einfach nur einen großen Button haben will und keine Proximity,
muß dann der Detect Threshold einfach groß genug gewählt werden so dass 
man immer noch die Elektrode berühren muß bevor ein Touch entsteht.
Man muß sich das so vorstellen. Man hat einen Sampling Kondensator im nF 
Bereich, die Elektrode ist beinahe egal wie groß man sie macht im pF 
Bereich. Beim Charge Transfer wird ja nun die Ladung von der Elektrode 
in den Cs transferiert und gezählt bis Cs ansetzt. Vergrößerst Du die 
Elektrode dann werden halt weniger Ladungen fällig. Ob so eine Fläche 
auch riesig werden kann hab ich auch nicht probiert

von Bernd K. (prof7bit)


Lesenswert?

Für nur einen simplen Touchbutton brauchts keine library, da reichen 10 
Zeilen code:

1
uint8_t touch_measure_CC() {
2
    uint8_t count_iterations = 0;
3
4
    // discharge everything before we begin
5
    SET_LOW(TOUCH);
6
    SET_LOW(SAMPL);
7
    SET_AS_OUTPUT(TOUCH);
8
    SET_AS_OUTPUT(SAMPL);
9
10
    // Now run our charge pump until C_Sample
11
    // is charged high enough so its voltage is
12
    // read as logical 1 on the port pin.
13
    do {
14
        // Disconnect negative side of C_Sample
15
        SET_AS_INPUT(SAMPL);
16
17
        // Load touch electrode by connecting to Vcc.
18
        // It is important to set the PORT bit first
19
        // so it will not pull the pin low for one clock
20
        // cycle because that would provoke a negative spike
21
        // on the negative side of C_Sample and immediately
22
        // discharge C_Sample again via the body diode.
23
        SET_HIGH(TOUCH);
24
        SET_AS_OUTPUT(TOUCH);
25
26
        // Disconnect touch electrode from Vcc
27
        SET_AS_INPUT(TOUCH);
28
        SET_LOW(TOUCH);
29
30
        // Transfer charge from touch electrode to C_Sample by
31
        // connecting negative side of C_Sample to ground.
32
        SET_AS_OUTPUT(SAMPL);
33
34
        // allow one clock cycle before we read the TOUCH pin,
35
        // so this is the best place to put the counter increment.
36
        ++count_iterations;
37
38
        // if charge in C_Sample is enough we will read 1.
39
     } while (!IS_HIGH(TOUCH));
40
41
    return count_iterations;
42
}

Schaltung (TOUCH und SAMPL sind normale port pins):
1
_____
2
     |
3
     |___________.______________O Cx  (Touch electrode)
4
     |TOUCH      |
5
     |           | 
6
     |         ===== Cs (2n...10n)
7
AVR  |           |
8
     |___________|
9
     |SAMPL
10
     |
11
     |
12
     |
13
_____|

: Bearbeitet durch User
von Mathias O. (m-obi)


Lesenswert?

@Bernd: Ist die Variante besser als die ADC-Variante? Wie siehts bei der 
aus mit 2-3mm Kunststoff dazwischen?

von Sascha W. (sascha-w)


Lesenswert?

Hallo,

also mit dem selben Algorithmus wie bei Bernd hab ich Tasten in einen 
Bilderrahmen eingebaut. 3mm Pressspan + 2mm Glas, als Elektrode eine 
2032, sind kein Problem. Noch 2mm PVC drauf geht immer noch.

Sascha

von Bernd K. (prof7bit)


Lesenswert?

Mathias O. schrieb:
> @Bernd: Ist die Variante besser als die ADC-Variante? Wie siehts bei der
> aus mit 2-3mm Kunststoff dazwischen?

Die ADC-Variante hab ich noch nicht ausprobiert aber ich denke mal die 
dürften beide ähnlich empfindlich sein. ADC verwendet ebenfalls 
Ladungstransfer, aber nur einen einzugen Zyklus und verwendet den 
internen Sample-Kondensator des ADC (der zum Glück in der selben 
Größenordnung liegt wie ein Finger auf dem Touch-Pad). Nur ein einziger 
Pumpvorgang und anschließende genaue Spannungsmessung geht dann 
natürlich schneller als Pumpen bis zum Triggerpunkt, sollte aber 
grundsätzlich in etwa die selben Eigenschaften haben.

*

Übrigens: eine hab ich noch: Die verwendet nur einen einzigen Port-Pin 
(keinen ADC!) und mißt die Kapazität direkt indem sie ein RC-Glied 
bildet und die Ladezeit misst wobei R der interne Pullup ist und Cx die 
Kapazität gegen Masse, allerdings ist die nicht so empfindlich und im 
Gegensatz zu den anderen Varianten mit Ladungstransfer ist sie 
wahrscheinlich auch störanfälliger, also wenn möglich würd ich lieber 
die Ladungspumpe nehmen anstatt die Ladezeit von Cx direkt zu messen:

1
uint8_t touch_measure_RC() {
2
    uint8_t cnt = 0;
3
4
    // discharge the electrode
5
    SET_LOW(TOUCH);
6
    SET_AS_OUTPUT(TOUCH);
7
    SET_AS_INPUT(TOUCH);
8
9
    // now we apply short pulses of current via
10
    // the internal pull-up until the electrode is
11
    // charged enough and the port pin reads high.
12
    // For best results the µC should run at the
13
    // highest possible clock frequency to make
14
    // the pulses as short as possible so we
15
    // need more pulses and increase resolution
16
    // and sensitivity.
17
    while (!IS_HIGH(TOUCH)) {
18
        SET_HIGH(TOUCH);  // pulse as short as possible
19
        SET_LOW(TOUCH);
20
        ++cnt;
21
    }
22
    return cnt;
23
}

Schaltung (TOUCH ist ein normaler Portpin):
1
_______
2
       |
3
       |
4
       |______________________O    Cx (Touch electrode)
5
       |TOUCH
6
       |
7
AVR    |
8
_______|

: Bearbeitet durch User
von Frank (Gast)


Lesenswert?

Hallo,

ich bins nochmal.

Ich habe jetzt mal ein wenig mit der neg_drift_rate rumgespielt. Ich 
habe den Wert mal auf Maximum eingestellt. Es ist schon merklich besser 
geworden. Die Sensitivität steigt noch an, aber wesentlich langsamer 
habe ich das Gefühl. Ich werde jetzt noch ein wenig mit dem Parameter 
und dem Parameter Detect Integration herumspielen. Da werde ich noch ein 
wenig was zu tun haben. :-)


Ich habe dann aber noch eine Frage zu einer weiteren Überlegung. Ich 
würde den Taster später gerne in ein Metallgehäuse integrieren. Der 
Taster soll draußen zum Einsatz kommen. Ich dachte mir, ich nehme ein 
kleines Rohr, verschließe dieses an dem einen Ende mit einer 
Kunststoffscheibe, lege darunter die Sensorfläche und bringe darunter 
die restliche Schaltung unter und verschließe das andere Ende mit Kleber 
oder so und lasse nur die Kabel rausschauen. In einem Luftversuch 
funktioniert das schon mit dem Sensor unter der Plastikscheibe. Ich habe 
aber Bedenken bei dem gedachten Metallgehäuse. Das dürfte doch die ganze 
Kapazität durcheinander bringen?

Grüße

von Peter (Gast)


Lesenswert?

Im Atmel Touch Sensor Design Guide steht etwas drüber (suche nach 
floating conductive items). wenn ich das richtig deute sollte das 
Gehäuse somit geerdet werden.
Ich glaub das ist schon machbar, immerhin funktioniert das in Systemen 
wie settop boxen, Waschmaschienen ja auch...

von Frank (Gast)


Lesenswert?

Hallo,

alles klar, vielen Dank. Ich habe den Abschnitt schon gefunden. Ich 
werde es mal testen, wenn ich mal probeweise was verbauen kann!

Vielen Dank!

Grüße

von Bernd K. (prof7bit)


Lesenswert?

Frank schrieb:

> Ich habe
> aber Bedenken bei dem gedachten Metallgehäuse. Das dürfte doch die ganze
> Kapazität durcheinander bringen?

Stichworte zum Googlen: "driven shielding", "driven guarding", "aktive 
Schirmung". Du brauchst nen OP dazu.

So ungefähr:
1
        _______________
2
       |               |
3
       |    |\         |
4
       |____| \        |
5
            |- \       |
6
            |   \______|
7
            |   /      |
8
        ____|+ /       |
9
       |    | /        |
10
       |    |/         |shield
11
       |           ____|___________________
12
_______|_______________________________________O touch

Aber probiers erst mal ohne wenns so auch geht, in dem Falle legst Du 
das Gehäuse einfach auf Ground (jedoch nicht floaten lassen!). Erst wenn 
Du mehrere Meter bis zur touch-Fläche mit Koax-Kabel überbrücken musst 
wird ein getriebener Schirm wirklich notwendig werden.

: Bearbeitet durch User
von Frank (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich  bin ein wenig weiter gekommen. Mein Taster läuft jetz soweit recht 
gut. Ich habe nun mal erste Versuche gemacht, das Ding in ein Gehäuse 
einzubauen, ein Metallgehäuse.
Wie zu erwarten, gibt es da neue Probleme.

Wenn ich wieder schalte, bis mir der Finger bald abfällt, wird der 
Schalter wieder sensitiver, was jetzt nicht mehr so das Problem ist, 
aber ab einem gewissen Zeitpunkt, bleibt er immer geschaltet, egal ob 
ich den Finger weg nehme oder auf die Sensorfläche taste. Er bleibt also 
im getouchten Zustand hängen. Ich gehe mal davon aus, dass mir das 
Gehäuse da ein wenig ins Handwerk pfuscht!?

Dann habe ich nochmal eine Frage zur Drift Kompensation. Wenn ich das 
richtig verstanden habe, führt diese Funktion den Referenzlevel nach?

Ich habe mal eine Zeichnung aus der AppNote "QTouch und QMatrix 
Sensitivity Tuning" eingefügt.

D.h. das Delta zwichen Referenz und Level zum Detektieren wird immer 
kleiner!? Hab ich das so richtig verstanden?


Grüße

von Peter (Gast)


Lesenswert?

nein das soll eben nicht kleiner werden. Das Ziel von der Drift 
Compensation ist dass das Delta immer gleich bleibt sonst passiert es 
ja genau so wie du beschreibst dass der Delta Bereich immer kleiner wird 
(ohne Compensation) und irgendwann reicht der Delta Wert nicht mehr aus 
um Touch/No Touch zu erkennen.

Hast Du denn auch den Drift Hold time gesetzt?

von Mathias O. (m-obi)


Lesenswert?

@Bernd: Kann ich eigentlich einen gemeinsamen SAMPL nehmen für 6 Tasten 
oder braucht jeder einen eigenen. Den Abfrageablauf mach ich auch immer 
nur bei einem. Erst wenn der zu Ende ist, kommt die nächste Taste ran 
(for-Schleife).

von Bernd K. (prof7bit)


Lesenswert?

Mathias O. schrieb:
> @Bernd: Kann ich eigentlich einen gemeinsamen SAMPL nehmen für 6 Tasten
> oder braucht jeder einen eigenen.

Das ist leider nicht so einfach. Würdest Du die Sample-Kondensatoren 
einfach alle an einem Ende zusammenschalten dann wären alle 
Touch-Elektroden kapazitiv miteinander verbunden (es reagiert nämlich 
auch wenn Du den Finger auf SAMPL legst, dann wird Cs geladen wenn der 
TOUCH-Pin auf high geht).

Du müsstest einem Weg finden mit zusätzlicher externer Beschaltung die 
unbenutzten Elektroden komplett wegzuschalten. Zum Beispiel mit 
Analogschaltern oder Analogmultiplexern wie dem hier: 
http://www.nxp.com/documents/data_sheet/74HC_HCT4051.pdf dann bräuchtest 
Du nur einen einzigen Samplekondensator und würdest einfach die 
Touchflächen umschalten.

von Mathias O. (m-obi)


Lesenswert?

Ich hab nochmal geschaut, es sind 7 Tasten. 6 gleich große und eine die 
so groß ist wie alle 6 kleine hintereinander. Sollte man dann einen 
anderen Samplekondensator für die große nehmen oder muss man das nicht 
der Größe der Touchfläche angleichen?

von Frank (Gast)


Lesenswert?

@Peter

Hallo,


ok, das Delta soll gleich bleiben, wenn sich also der Signal-Level nach 
und nach ändert, wird die Referenz nachgeführt, damit das Delta etwa 
gleich bleibt, damit noch zwischen getoucht und nicht getoucht 
unterschieden werden kann, da sonst das Delta zu klein würde und nicht 
mehr zwischen betätigt und nicht betätigt unterschieden werden könnte. 
!?
Irgendwie fällt der Groschen nur langsam ;-)

Die Drift Hold time habe ich gesetzt. Die steht auf 10, also 2 Sekunden.

Grüße

von Bernd K. (prof7bit)


Lesenswert?

Mathias O. schrieb:
> Sollte man dann einen
> anderen Samplekondensator für die große nehmen oder muss man das nicht
> der Größe der Touchfläche angleichen?

Nimm einen mit dem auch die kleinste Taste noch funktioniert und 
ausreichend Auflösung und Empfindlichkeit bringt, dann kalibrier alle 
Tasten softwaremäßig individuell. Zum Beispiel beim Einschalten machst 
Du 64 Messungen mit jeder Taste (unter der Annahme daß die nicht 
gedrückt sind) und dann hat jede Taste ihren eigenen Nullwert (und 
vielleicht musst Du auch andere Schaltschwellen für die grosse Taste 
empirisch ermitteln).

Der Wert wird ja kleiner beim Annähern des Fingers, im obigen Beispiel 
hab ich einen uint8_t genommen, also sollte Cs so bemessen sein daß der 
Wert bei nicht gedrücktem Taster irgendwo bei 200 zu liegen kommt, so 
hast Du einigermaßen gute Auflösung und Empfindlichkeit. Natürlich 
kannst Du auch einen uint16_t nehmen und einen viel größeren Cs, dann 
kannst Du die Empfindlichkeit noch stark in die Höhe treiben aber dann 
dauert die Messung entsprechend (viel) länger.

Noch ein Tip: Nimm keinen billigen Keramikkondensator für Cs (die 
Temperaturdrift ist extrem, damit kannst Du ein Thermometer bauen), nimm 
einen der explizit als NP0 (oder C0G) spezifiziert ist (oder notfalls 
einen Folienkondensator aus der Bastelkiste, die sind zumindest nicht 
ganz so temperaturanfällig).

Das Problem des ursprünglichen Fragestellers im Thread mit der 
anscheinend fehlerhaften/halbherzig implementiuerten QTouch library 
(deshalb riet ich ja bereits zu Beginn die einzig benötigten 10 Zeilen 
Code lieber selbst hinzuschreiben und die 990 Fehlerhaften die sonst 
noch da drin stecken und nur der Featuritis geschuldet sind ganz 
wegzulassen), dass beim automatischen langsamen Nachkalibrieren der Wert 
wegläuft (noch dazu in die falsche Richtung) vermeidest Du indem Du:

* den Nullwert für jede Taste nur extrem langsam nachführst (wenn 
überhaupt!) wenn er kleiner wird
* den Nullwert schnell nachführst wenn er größer wird (weniger Finger 
auf der Taste als null Finger geht nicht, die Taste muss im 
Einschaltmoment bereits gedrückt gewesen sein und jetzt wurde sie 
losgelassen)
* den Wert nur nachführst wenn die Taste nicht als gedrückt erkannt 
worden ist
* einen NP0 Kondensator für Cs verwendest

: Bearbeitet durch User
von Mathias O. (m-obi)


Lesenswert?

Danke für die Tipps. Bei meinem Testkupferplättchen hab ich um die 106 
und gedrückt 90-100.

Nur was meinst du genau mit nachführen. Wie muss das aussehen? Die 
Schaltschwelle nachführen oder was?

von Peter (Gast)


Lesenswert?

@Bernd: Deine Lösung in aller Ehren und für private Zwecke vielleicht ok 
aber ich würde von der Verwendung dieser Algorithmen in kommerziellen 
Projekten abraten ohne sich mit Hilfe eines Patentanwalts abzusichern. 
Nur meine Meinung dazu. Du kannst gerne einen eigenen Thread aufmachen 
wenn Du Deine Lösung vorstellen willst dann stört es nicht den Lesefluss

Frank, 2Sekunden können zu wenig sein, erhöhe das mal. Zur Not kannst Du 
auch mal Atmels hotline befragen, die haben mir sogar beim PCB Review 
geholfen.

von Bernd K. (prof7bit)


Lesenswert?

Peter schrieb:
> ohne sich mit Hilfe eines Patentanwalts abzusichern.

Welches Patent?

: Bearbeitet durch User
von Mathias O. (m-obi)


Lesenswert?

Dazu fällt mir nur das ein: "GIF-Grafiken verwenden zur Kompression den 
patentierten Lempel-Ziv-Welch Algorithmus (LZW), um die Datenmengen zu 
verkleinern. Das letzte nationale LZW-Patent des Unternehmens Unisys ist 
am 7. Juli 2004 in Kanada ausgelaufen, jedoch hielt auch IBM bis zum 11. 
August 2006 ein Patent für die gleiche Technologie." Quelle: 
Wikipedia.org

Also einfach abwarten bis es ausläuft ;)

von Frank (Gast)


Lesenswert?

Peter schrieb:
> 2Sekunden können zu wenig sein, erhöhe das mal.

Ich habe das jetzt mal auf 4Sekunden erhöt, das brachte leider bisher 
noch keine Besserung. Ich werde da mal noch ein wenig mit rumspielen 
oder schaue wirklich mal, dass ich mich mal mit dem Support von ATMEL in 
Verbindung setze.

Grüße

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.