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
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