Voltage tolerance on ADC channels

I was curious if anyone knows if the ADC channels (p0_0 - p0_5) are tolerant of voltages up to 3.7vdc? I want to measure the voltage of a lipo battery that goes up to 3.7vdc since the VIN pin can’t be used to measure (unless I’ve missed something). I know I could use a voltage divider to bring it down to 3.3v, but if it’s not necessary, I’d rather not add any more bulk to the project.

Thanks in advance!


According to section 6.10 of the CC2511F32 microcontroller datasheet, the max input voltage for an ADC channel is VDD (2V to 3.6V). On the Wixel, VDD is supplied from the on-board 3.3V regulator. Since the voltage of an 1S LiPo battery significantly exceeds that when fully charged, I recommend using a voltage divider for measuring your battery’s voltage.

- Jeremy

Great, thanks! Voltage divider it is.

It may be irrelevant, but my wixel circuit is also powered by a LiPO cell, and I have a number of posts exploring various ways to protect my LiPO from undercharging. If that’s what you’re trying to do, I’ve had pretty good success by occasionally calling adcReadVddMillivolts(), and comparing the result to a number I store in a parameter (see example below). The normal reading will be 3.3 V, expressed as 3300. Through experimentation I’ve found that once the LiPO voltage gets too low to support the regulator, about 0.2V is lost across the regulator. So, if I set my “lowVoltageCutoff” to 2500, it means the LiPO has reached 2.7V, and I can choose to go into sleepMode (or take other action). Similarly, if I set my “lowVoltageWarn” to 3000, I can begin warning the user of eminent shutdown when the cell reaches about 3.2V. This has worked well and repeatably over many wixels, and may save you a few resistors. Plus, to be honest, I’m not even sure how accurately all the ADC functions work once the LiPO cell has insufficient voltage to offer the regulated 3.3V to the wixel, but the method I’m describing definitely works.

[code]uint16 vddMillivolts = adcReadVddMillivolts();
if (vddMillivolts < (uint16)param_lowVoltageCutoff) goToSleep();
if (vddMillivolts < (uint16)param_lowVoltageWarn) alertUser();