From afa8a273ff4610355df467eda0d33be2cdcababa Mon Sep 17 00:00:00 2001 From: kai-morich Date: Thu, 13 Jan 2022 08:19:50 +0100 Subject: [PATCH] ADCtouch with 10 instead of 8 bit resolution example with drift compensation --- .../examples/Touch_read/Touch_read.ino | 20 ++++++++++++++++++- avr/libraries/ADCTouch/src/ADCTouch.cpp | 4 ++-- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/avr/libraries/ADCTouch/examples/Touch_read/Touch_read.ino b/avr/libraries/ADCTouch/examples/Touch_read/Touch_read.ino index ad5b3501..2ee9ca86 100755 --- a/avr/libraries/ADCTouch/examples/Touch_read/Touch_read.ino +++ b/avr/libraries/ADCTouch/examples/Touch_read/Touch_read.ino @@ -29,6 +29,7 @@ |***********************************************************************/ #include +#include // Sample each touch pin 32 times const uint16_t ADCTouch::samples = 32; @@ -39,11 +40,14 @@ int16_t ref_A3; // Touch threshold for turning on or off the LEDs // Lower is more sensitive -const uint8_t threshold = 20; +const uint8_t threshold = 50; void setup() { + uint8_t cal = EEPROM.read(0); + if (cal < 0x80) + OSCCAL = cal; Serial.begin(); // Reference values to account for the capacitance of the touch pad @@ -57,6 +61,16 @@ void loop() int16_t val_A2 = Touch.read(A2); int16_t val_A3 = Touch.read(A3); + // Drift compensation + if(val_A2 > ref_A2) + ref_A2++; + else + ref_A2 = (val_A2 + ref_A2)/2; + if(val_A3 > ref_A3) + ref_A3++; + else + ref_A3 = (val_A3 + ref_A3)/2; + // Remove offset val_A2 -= ref_A2; val_A3 -= ref_A3; @@ -65,11 +79,15 @@ void loop() Serial.print(val_A2 > threshold); // Send (boolean) pressed or not pressed Serial.print(F(", A2 touch value: ")); Serial.print(val_A2); + Serial.print(F(", A2 ref value: ")); + Serial.print(ref_A2); Serial.print(F("\tA3 touch bool: ")); Serial.print(val_A3 > threshold); // Send (boolean) pressed or not pressed Serial.print(F(", A3 touch value: ")); Serial.print(val_A3); + Serial.print(F(", A3 ref value: ")); + Serial.print(ref_A3); Serial.print('\n'); delay(100); } diff --git a/avr/libraries/ADCTouch/src/ADCTouch.cpp b/avr/libraries/ADCTouch/src/ADCTouch.cpp index 4ae246f9..906fa521 100755 --- a/avr/libraries/ADCTouch/src/ADCTouch.cpp +++ b/avr/libraries/ADCTouch/src/ADCTouch.cpp @@ -25,7 +25,7 @@ int16_t ADCTouch::read(const analog_pin_t adc_channel) uint8_t digitalPin = pgm_read_byte(analog_pin_to_digital_pin + adc_channel); do { - ADMUX = (1 << ADLAR) | adc_channel; // Select ADC channel + ADMUX = adc_channel; // Select ADC channel DDRB |= (1 << digitalPin); // Discharge touchpad ADCSRA |= (1 << ADEN); // Enable ADC & discharge S/H cap @@ -42,7 +42,7 @@ int16_t ADCTouch::read(const analog_pin_t adc_channel) ADCSRA |= (1 << ADSC); // Start ADC conversion while (bit_is_set(ADCSRA, ADSC)); // Wait for conversion to complete - level += ADCH; + level += ADCW; ADCSRA = 0; // ADC off } while(--samples_left);