Capacitive Sense with Atmel QMatrix method
This scans capacitive switch matrix using Atmel QMatrix method.
My controller scans matrix with 16 drive lines and 8 sense lines. Sense lines are multiplexed by ADC MUX of AT90USB1286.
Row: Burst(X)*16 Col: Sense(Y)*8 0 1 2 3 4 5 6 7 R14 R15 R16 R17 R18 R19 R20 R21 0 R22 58 44 30 16 1 2 90A 110 1 R23 60 46 31 17 3 4 112 113 2 R24 47 33 32 18 19 5 - 114 3 R25 49 48 34 20 21 6 131 115 4 R26 50 35 36 22 7 0B 0A - 5 R27 61 51 37 23 8 9 117 116 6 R28 52 38 24 25 10 - 132 118 7 R29 54 53 39 26 11 - 133 119
8 R33 62 55 40 27 12 - 120 121 9 R34 57 56 41 28 13 - 122 123 A R35 64 42 43 - 15 14 90B - B R36 79 83 81 76 75 - - - C R37 84 89 - 86 85 80 - - D R38 99 93 92 91 90 - - - E R39 104 98 97 96 100 95 125 124 F R40 108 103 102 106 101 105 - 126
Meanwhile original Topre controller scans with 8 drive lines and 16 sense lines. Sense lines are multiplexed by two 74HC4051 analog multiplexers.
Row: Burst(X)*8 Col: Sense(Y)*16 R22 R23 R24 R25 R26 R27 R28 R29 R33 R34 R35 R36 R37 R38 R39 R40 R14 58 60 47 49 50 61 52 54 62 57 64 79 84 99 104 108 R15 44 46 33 48 35 51 38 53 55 56 42 83 89 93 98 103 R16 30 31 32 34 36 37 24 39 40 41 43 81 - 92 97 102 R17 16 17 18 20 22 23 25 26 27 28 - 76 86 91 96 106 R18 1 3 19 21 7 8 10 11 12 13 15 75 85 90 100 101 R19 2 4 5 6 0B 9 - - - - 14 - 80 - 95 105 R20 90A 112 - 131 0A 117 132 133 120 122 90B - - - 125 - R21 110 113 114 115 - 116 118 119 121 123 - - - - 124 126
Where Rxx means marking of resiter on PCB.
Burst length number of charge pulses in a burst measurement Increasing BL increases signal resolution and sensitivity. Sampling Resistor discharges Sampling Capacitor(Cs) and controls discharge slope. Increasing Rsmp increases sensitivity. X-Y X transmitter, burst, drive line Y receiver, sense line YA port: charge transfer control(top) YB port: ADC mux input(bottom) self/mutual capacitance sense self mutual ATMEL QTouch Library supports GCC tool chain works with AVR with 2K flash(QTouch only) QTouch self a button per two pins QMatrix mutual http://www.atmel.com/products/TouchSolutions/bsw/qmatrix.aspx QTouchADC QTouchADC only requires 1-series resistor and 1-pin per channel. No other external components are required. QTouchADC offers faster acquisition times with shorter burst lengths, resulting in lower power consumption. Also can be used promixity sensing. http://www.atmel.com/products/TouchSolutions/bsw/qtouchadc.aspx Charge transfer QTouch Composer extension for Atmel Studio 6
3.3 Tracking Base Capacitance Value http://www.ti.com/lit/an/slaa379/slaa379.pdf TI explains a patent expired method here. (not mutual sensing)
Calibrating compensate capacitance drift http://www.embedded.com/design/prototyping-and-development/4008781/Getting-in-touch-with-capacitance-sensor-algorithms
Voltage of Cs http://forum.atmel.com/showthread.php?t=2023 The terminal voltage that appears across the Cs capacitor has to be in the range of -50mV to -150mV. The terminal voltage should not exceed -250mV due to diode i/o conduction.
QTouch and QMatrix Sesitivity Tuning: http://www.atmel.com/images/qtan0062.pdf X-Y electrode design(capacitance) Bust length Sampling Capacitor Cs = 4.7-10nF Sampling Resistor Rsmp = 470K(220K-1M)Ohm Sensor Design Guide http://www.atmel.com/images/doc10752.pdf Promixity sensing http://www.atmel.com/Images/doc10760.pdf QTouch 180mm QTouchADC 250mm QMatrix 50mm
mTouch Theory http://ww1.microchip.com/downloads/en/DeviceDoc/93064A.pdf Capacitive sensing library for Arduino http://playground.arduino.cc/Main/CapacitiveSensor?from=Main.CapSense
How Oscilloscope Probes Affect Your Measurement Input capacitance of Probes really affect circuit of capacitive sensor. http://www.tek.com/dl/51W_30013_0_MR_Letter_0.pdf
Analog Devices CapTouch http://www.analog.com/media/en/technical-documentation/data-sheets/AD7147.pdf
IBM patent: Keyboard multiple switch assembly http://www.google.co.ug/patents/US4274752 http://deskthority.net/f-o-r-s-a-l-e-f58/xwhatsit-s-grand-unified-ibm-capsense-usb-controller-thread-t7993-120.html#p165846
qm_burst_length[]: retains burst length for all channels
measurement_period_ms
touch_qm_sensor_init()
touch_qm_sensor_config()
touch_qm_sensor_calibrate()
loop:
touch_qm_sensor_dispatcher(): dispatches measure_complete_callback()
touch_qm_sensor_start_aquisition()
... host app ...