Schematics, Example Code and Q&A

The Rev1 and Rev0 versions of the ESP32 has a couple of issues with the ADC. There is a topic on noise pickup https://forum.ezsbc.com/viewtopic.php?f=12&t=8816 that describes that issue. In addition to that issue the ADC is not as linear as it should be but the non-linearity is repeatable and can be removed with some numerical manipulation. The code below corrects the raw readings from the ADC and returns a corrected, linearized reading. The code is not particularly fast because it uses floating point functions. If you care about speed you can put the function into a spreadsheet and generate a lookup table.

Code: Select all
`#define ADC_Ch 36void setup() {  Serial.begin(115200);}void loop() {  Serial.println( ReadVoltage( ADC_Ch ), 3 ) ;  Serial.println( analogRead( ADC_Ch ) ) ;  delay( 1000 ) ;}double ReadVoltage(byte  pin ){  double reading = analogRead( pin ) ; // Reference voltage is 3v3 so maximum reading is 3v3 = 4095 in range 0 to 4095  if( reading < 1 || reading > 4095) {    return 0 ;   }  // return -0.000000000009824 * pow( reading,3 )  +  0.000000016557283 * pow( reading, 2 ) + 0.000854596860691 * reading + 0.065440348345433 ;  return -0.000000000000016 * pow( reading, 4 ) + 0.000000000118171 * pow( reading, 3 )- 0.000000301211691 * pow( reading,2 )+ 0.001109019271794 * reading + 0.034143524634089 ;} // More complex, improved polynomial or simpler polynomial, use either/* ADC readings v voltage// Polynomial curve fit, based on this raw data: *   464     0.5 *  1088     1.0 *  1707     1.5 *  2331     2.0 *  2951     2.5  *  3775     3.0 */`
Daniel

Posts: 119
Joined: Tue Nov 13, 2012 5:10 pm 