Für mein erstes Cortex-Projekt mit einem STM32F042K6T6 habe ich ein
kleines Board entworfen mit 4 Touchkeys (Runde Elektroden mit 10mm
Durchmesser) und 2 lineare Sensoren. Für diese hab ich das 3 channel / 4
half-ended electrodes interlaced sensor Design aus Application notes
AN4312 (Bild 1).
Auf der Softwareseite benutze ich den HAL und STMCube32MX, würde es
soweit es geht auch gerne dabei belassen, weil ich mich einfach noch
nicht gut genug auskenne um alles zu Fuß zu programmieren.
Soweit, sogut, trotz einiger Problemchen auf meinem selbstbestückten
Board, die aber gut an zu alter Lötpaste und damit verbundenen Problemen
liegen könnten, macht das Board schon halbwegs was es sollte.
Touchkeys scheinen nach kurzem Test quasi out-of-the-box zu
funktionieren. Ich rufe in meiner main Schleife die autogenerierte state
machine auf:
1 | while (tsl_user_Exec()==TSL_USER_STATUS_BUSY)
|
2 | {};
|
und kann anschließend über die ebenfalls autogenerierten
meine Daten auslesen. Hier interessiert mich bei TouchKeys eigentlich
nur
1 | MyTKeys[Index].p_Data->StateId
|
und die liefert mir brauchbares, zb release -> proximity debounce ->
proximity -> detect. Die Grenzwerte und Empfindlichkeit muss noch
eingestellt werden aber rudimentär funktioniert's schon ohne
Codeänderungen, was ja überraschend erfreulich ist..
Bei den linearen Sensoren sieht es derzeit leider nicht so rosig aus.
StateId scheint soweit ok zu sein und auf den ersten Anblick auch die
Direction, bei RawPos sind jedoch alle Werte in etwa zwischen 120 und
150. Hierbei springen die Werte halbwegs wild herum, was jedoch auch
diesem interlaced Design geschuldet sein könnte und dem Namen nach
sollte man wohl eh nicht darauf zugreifen im App Layer. Der Wert
1 | MyLinRots_Data[Index].Position
|
bewegt sich allerdings zwischen den Werten 7 und 9 und das leider zu
unzuverlässig - habe auch schon bei halbwegs kontinuierlicher
Abwärtsbewegung auch schon 9->8->7->8 gesehen.
Gut, damit kann man nichts anfangen. Hatte ursprünglich auf mehr
Auflösung gehofft, bevor ich mich damit beschäftigt habe. Offenbar sind
die Position Variablen in MyTKeys[].pData bzw MyLinRots_Data[] als
uint8_t deklariert.
Die LinRot Methode CalcPosition() beschreibt diese Position und gibt
einen Status zurück - verändert nix an der Position, wird also wohl
schon irgendwo in der state machine aufgerufen und macht soweit schon
aus der sehr sprunghaften RawPos eine definitiv weniger sprunghafte
Position.
Ansonsten habe ich noch den DeltaCoeff , position offset (
(TSL_tsignPosition_T *)TSL_POSOFF_3CH_LIN_H aus dem Hal ) und position
correcture ( TSL_POSCORR_3CH_LIN_H ) gesehen. All das is leider so
schlecht dokumentiert, zB zu letzteren beiden habe ich auch nach
längerer Suche genau nichts gefunden, was das beschreibt.
Ich hab die ganzen App Notes und bla gelesen und es fing schon beim
Hardwaredesign an, alles verteilt auf 5 oder 6 Dokumente, C0G/NP0
Kondensatoren mit halbwegs vernünftigen (empfohlenen) Werten, die Slider
eigentlich genau nach deren Design und trotzdem war mir am Ende einiges
unklar :
- hatched Shield auch unter den Slider Elektroden? (habe mich für ja
entschieden, ka ob es dann das is ..)
- sollen die Traces zwischen Elektroden und MCU jetzt am selben Layer
sein wie die Elektroden oder nicht? Ich fand leider alles so schwammig
beschrieben, dass ich darauf keine zufriedenstellende bzw teils
widersprüchlich erscheinende Antworten drauf gefunden hab..)
Nachdem das alles doch ein bisschen mühsam ist, so im blinden zu tappen,
hat hier eventuell jemand schon mal einen brauchbaren Linearsensor mit
der Touch Library implementiert - wenn ja, wie bzw. was mache ich hier
falsch?
(Anmerkung zu Bild 2 : TSLPRIM_LINROT_RESOLUTION war bereits auf 8
umgestellt)