TinyTouchLib - Touchbutton library für Attiny

OP #3199832
Lesenswert?

Hallo zusammen,

nach vielen Experimenten mit diversen Ansteuertechniken für kapazitive 
Touchbuttons habe ich eine kleine Library geschrieben, welche die 
Auswertung eines Touchbuttons auf ATtiny MCUs unterstützt. Dabei habe 
ich eine Methode implementiert,  welche einen Spannungsteiler mit dem 
internen S&H Kondensator zur Auswertung der Padkapazität nutzt und 
dadurch ohne externe Komponenten auskommt (Analog Qtouch ADC von Atmel). 
Im Gegensatz zur Lib von Atmel funktioniert diese Library auch auf den 
kleinen ATtinys wie ATtiny 5 und 10.

Vielleicht ist es ja für jemanden von Nutzen. Über Bugreports und 
Feedback würde ich mich freuen.

https://github.com/cpldcpu/TinyTouchLib
OP #3201526
Lesenswert?

> Sehr interessant, Danke!
> Sag mal siehst Du eine Möglichkeit an denselben Touch pin auch eine LED
> dranzuhängen so wie Semtech das macht? Ich hab keine Ahnung wie stabil
> Semtech's Lösung ist, aber ich hab das sonst bei keinem anderen
> Hersteller gesehen.

Das sollte eigentlich kein Problem sein. Allerdings muss die Kathode der 
LED dann auch an einen MCU-Pins angeschlossen werden, den man floaten 
lässt während das Touchpad ausgelesen wird.
#4611785
Lesenswert?

Tim  . schrieb:
> Vielleicht ist es ja für jemanden von Nutzen. Über Bugreports und
> Feedback würde ich mich freuen.

Ja, ist von Nutzen. Und hier auch gleich ein Bugreport:

1
uint8_t tinytouch_adc(void) {
2

3
    uint8_t dat1,dat2;
4
...
5
    return dat2 - dat1;
6
}

Bei der Subtraktion kann es zu einem Überlauf kommen. Dann spinnt die 
ganze Logik dahinter. Nicht gut :(

Im Detail:

Das Prinzip besteht darin, den S/H Kondenstaor im ADC einmal auf Vcc 
vorzuladen und die Touchfläche auf GND. Dann werden beide zusammen- 
geschaltet, die resultierende Spannung gemessen und in dat1 abgelegt.

Dann nochmal anders herum; Touchfläche auf Vcc, S/H auf GND und das 
Meßergebnis in dat2 ablegen.

Wäre die Kapazität der Sensorfläche 0 und gäbe es auch sonst keine 
parasitären Kapazitäten, dann würde die erste Messung 0xFF liefern und 
die zweite 0. Je größer die Kapazität der Sensorfläche, desto niedrigere 
Werte liefert die erste Messung und desto höhere die zweite. Wenn man 
nun eine recht große Sensorfläche hat, dann kann es sein, daß der erste 
Meßwert absolut kleiner wird als der zweite und die Subtraktion läuft 
über.

Die Abhilfe ist einfach: für die erste Messung ist (255-dat1) ein Maß 
für die Kapazität der Sensorfläche. Für die zweite ist dat2 direkt 
dieses Maß. Das Ergebnis muß also nicht (dat2-dat1) sein, sondern 
(255-dat1 + dat2). Genau so setzt mein angehängter Patch das um. Da 
tinytouch_adc() nun auch Werte über 255 zurückliefern kann, muß uint16_t 
verwendet werden. Und in tinytouch_sense() kann man nicht mehr mit um 8 
nach links geshifteten Meßwerten in bias & Co rechnen, sondern darf nur 
noch 7 Bits nach links schieben.

Die zweite Änderung betrifft die Wartezeit für das Vorladen der 
Sensorfläche. Die hast du fest mit 32µs in den Code geschrieben. Ich 
habe dafür ein neues #define in TinyTouchLib.h eingefügt.

Die derart geänderte Version von TinyTouchlib tut sehr gut in meinem 
jüngsten Projekt. Siehe Beitrag "Touchdimmer mit ATtiny13"
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren