AnsweredAssumed Answered

MPR121 sensitivity

Question asked by patrick krekelberg on Feb 4, 2014
Latest reply on Mar 7, 2014 by Jose Alberto Reyes Morales

I guys,


I have an MPR121 with two electrodes set up as small finger-size touch pads on a device. Vcc is 3.3V. The pads work perfectly when out of the enclosure, but when assembled into the enclosure I haven't yet been able to configure the MPR121 to trigger touch recognition for one or both of the pads. Out of the enclosure, the readings are around 210 at baseline steady state, then down to 50 or so when a finger is in direct contact with a pad.


Inside the enclosure, the pads are (for example) 208 at baseline then down to about 202, which never is recognized as a touch no matter what I use as a touch threshold.


It seems like the touch needs to be in direct contact with the pad in order for it to be recognized.


Has anyone ever experienced such a drastic decrease in sensitivity and effectiveness in an enclosure? I have been adjusting the thresholds as well as the auto configuration bytes, to no avail so far.


Configuration is something like this, with touch/release thresholds anywhere from 0x03/0x01 to 0x0F/0x0C:

// Section A
// This group controls filtering when data is > baseline.
mpr121Write(MHD_R, 0x01);
mpr121Write(NHD_R, 0x01);
mpr121Write(NCL_R, 0x00);
mpr121Write(FDL_R, 0x00);



// Section B
// This group controls filtering when data is < baseline.
mpr121Write(MHD_F, 0x01);
mpr121Write(NHD_F, 0x01);
mpr121Write(NCL_F, 0xFF);
mpr121Write(FDL_F, 0x02);



        // Proximity Detection

        mpr121Write(P_MHD_R, 0xFF);

        mpr121Write(P_NHD_R, 0xFF);

        mpr121Write(P_NCL_R, 0x00);

        mpr121Write(P_FDL_R, 0x00);

        mpr121Write(P_MHD_F, 0x01);

        mpr121Write(P_NHD_F, 0x01);

        mpr121Write(P_NCL_F, 0xFF);

        mpr121Write(P_FDL_F, 0xFF);

        mpr121Write(P_NHD_T, 0x00);

        mpr121Write(P_NCL_T, 0x00);

        mpr121Write(P_FDL_T, 0x00);





// Section C
// This group sets touch and release thresholds for each electrode
mpr121Write(ELE0_T, TOU_THRESH);
mpr121Write(ELE0_R, REL_THRESH);
mpr121Write(ELE1_T, TOU_THRESH);
mpr121Write(ELE1_R, REL_THRESH);

        mpr121Write(ELEP_T, PROX_H);

        mpr121Write(ELEP_R, PROX_L);



        // Section C2

        // Set the debounce for Touch and Release

        // D7 = 0, D6-D4 = Release, D3 = 0, D2-D0 = Touch

        mpr121Write(DEB_CFG, 0x33);



        // AFE config

        mpr121Write(ELE_CFG, 0x00); // Stop the touch momentarily

        //uint8_t afeConfig = mpr121Read(AFE_CFG);

        mpr121Write(AFE_CFG, 0b00111111);  // 0x10 is the default CDC (16uA)

        mpr121Write(ELE_CFG, 0x0C); // Stop the touch momentarily

        //afeConfig = mpr121Read(AFE_CFG);



// Section D
// Set the Filter Configuration
// Set ESI2
mpr121Write(FIL_CFG, 0b10000100);  // 0x04 is the default



// Section E
// Electrode Configuration
// Enable 6 Electrodes and set to run mode
// Set ELE_CFG to 0x00 to return to standby mode
// mpr121Write(ELE_CFG, 0x0C);// Enables all 12 Electrodes

        #define ELE_RUN 0b10010010

        mpr121Write(ELE_CFG, ELE_RUN);

//mpr121Write(ELE_CFG, 0x02);// Enable first 2 electrodes




          // charge to 70% of Vdd , high sensitivity


// Section F

        mpr121Write(ELE_CFG, 0x00); // Stop the touch momentarily

// Enable Auto Config and auto Reconfig
mpr121Write(ATO_CFG0, 0x0B);    // Auto-Config, and try twice.
mpr121Write(ATO_CFGU, 0xC9);// USL = (Vdd-0.7)/vdd*256 = 0xC9 @3.3V   0xC9 = 201
mpr121Write(ATO_CFGL, 0x72);// LSL = 0.65*USL = 0x82 @3.3V            0x82 = 130
mpr121Write(ATO_CFGT, 0xB5);// Target = 0.9*USL = 0xB5 @3.3V          0xB5 = 181



        mpr121Write(ELE_CFG, ELE_RUN);  // Start Touch again