Anbei mal der komplette Sourcecode für QTouch mit dem ADC. Das Beispiel ist für die ATmega48..328[A/P/PA/PB]. Es läßt sich leicht auf andere AVRs und mehr Touchtasten anpassen. Benutzt werden PORTC4 und PORTC5. Über PORTB1 erfolgt die Ausgabe der ADC-Werte mit 9600 Baud. Getestet wurde es auf dem STK500. Als Sensorflächen wurden 2 der 2-poligen Kabel angeschlossen. Gesteuert wird mit den Tasten ein Lauflicht an PORTD. Funktion: Zwischen den Wandlungen wird die S&H-Stufe auf 0V entladen. Der Touchpin wird auf VCC geladen und vor der Wandlung hochohmig geschaltet. Die S&H-Stufe entlädt dann die Pinkapazität und es erfolgt die Wandlung. Bei Annäherung steigt die Ladung (Spannung). Zur Störunterdrückung erfolgt eine Mittelwertbildung. Der Wert bei losgelassener Taste wird automatisch gespeichert. Als Schwellwert für gedrückt wurde 10 festgelegt. Bei größeren Sensorflächen kann man den Wert erhöhen. Außer dem Schwellwert sind keine weiteren Einstellungen nötig. Die weitere Verarbeitung erfolgt dann in gewohnter Weise durch meine Entprell-Lib. Die 10ms werden durch einen Zähler im ADC-Interrupt erzeugt. Die Routine erfolgt über den ADC-Interrupt im Hintergrund. Die Mainloop wird also nicht ausgebremst. Hier der ADC-Code:
1 | ISR(ADC_vect) |
2 | {
|
3 | static uint8_t touch_no; |
4 | touch[touch_no].val += ADC - (touch[touch_no].val>>TOUCH_AVG); |
5 | switch (touch_no++) |
6 | {
|
7 | case 0: |
8 | TOUCH_PORT0 = 1; // charge next Touch Input |
9 | TOUCH_DDR0 = 1; |
10 | TOUCH_DDR1 = 0; |
11 | TOUCH_PORT1 = 0; // open Touch Input |
12 | ADMUX = 1<<REFS0 | TOUCHMUX1; // S&H |
13 | break; |
14 | default:
|
15 | touch_no = 0; |
16 | TOUCH_PORT1 = 1; // charge next Touch Input |
17 | TOUCH_DDR1 = 1; |
18 | TOUCH_DDR0 = 0; |
19 | TOUCH_PORT0 = 0; // open Touch Input |
20 | ADMUX = 1<<REFS0 | TOUCHMUX0; // S&H |
21 | break; |
22 | }
|
23 | ADCSRA = ADCSRA_START; |
24 | ADMUX = ADMUX_GND; // S&H GND after conversion complete |
Im Anhang das komplette Beispiel. Ich würde mich freuen, wenn jemand seine Erfahrungen damit berichten könnte.