ESP32 ADC Non-linear Issues - How do I fix / change Attenuation or width?

vseven
Posts: 21
Joined: Wed Aug 30, 2017 3:22 am

Re: ESP32 ADC Non-linear Issues - How do I fix / change Attenuation or width?

Postby vseven » Wed Mar 14, 2018 2:17 pm

hgptamn wrote:Getting an official answer from Espressif, they do plan on fixing the factory calibration in the near future
I'm assuming since you get a reply in January and you are posting in February that the fix date is June 1, 2018? Thats a long time to wait for something that should have worked on day one.
ESP_Dazz wrote:Hi everyone, the ADC calibration issue has actually been addressed in the esp-idf.
Can you comment if there will there be a revision number or indication printed on the chips that have this new factory calibration so if/when we order we can be assured to get the correct part? Right now it is almost impossible to mass produce anything with a ESP32 chip using the analog inputs. Manually calibrating each chip is not a viable option other then for testing or one-off situations.

ESP_Dazz
Posts: 308
Joined: Fri Jun 02, 2017 6:50 am

Re: ESP32 ADC Non-linear Issues - How do I fix / change Attenuation or width?

Postby ESP_Dazz » Mon Mar 19, 2018 3:46 am

vseven wrote:Can you comment if there will there be a revision number or indication printed on the chips that have this new factory calibration
Please contact the sales team at sales@espressif.com, they can help with this question

muthukumar
Posts: 1
Joined: Thu Apr 12, 2018 5:02 am

Re: ESP32 ADC Non-linear Issues - How do I fix / change Attenuation or width?

Postby muthukumar » Thu Apr 12, 2018 5:31 am

Hi,

Esp32's recent ADC non-linear fix in esp-idf works well only for the inputs in this region 0.13Vref to 0.93Vref approximately. For lower (<0.13Vref) and higher region(>0.93Vref), non-linearity still exist. We try to fix this by adding a offset value, but for direct battery operated application(unregulated supply), as the supply voltage changes, the offset also needs a further correction.

so my question is will the express-if fix this non-linearity in hardware instead of software in near future (in few months)? For our application, this issue gives worst results. we are now forced to drop esp32 and look for other low cost alternatives.
For many IoT applications, ADC is a must needed one. So please fix this at the earliest.

if hardware fix is in near future(< 2months) please intimate me, will wait for it ?

Jezza68
Posts: 1
Joined: Wed Jun 13, 2018 1:51 pm

Re: ESP32 ADC Non-linear Issues - How do I fix / change Attenuation or width?

Postby Jezza68 » Wed Jun 13, 2018 2:23 pm

As many on this thread, I have experienced the problematic Non-Linearity of the ESP32 ADCs. Because of this, using ESP-32 for production still appears out of the question. A shame really, as the prospect of being able to use a chip with a decent number of Analog inputs was great.

Like many, I have found that:
a. Analog readings are non linear in nature (channels 0, 3 and 6),
b. Readings are unstable and unpredictable (the same setup/code/circuit produces different readings over time),
c. Readings are noisy (but this is by far not the worst issue as this can be dealt with by using capacitors and or statistical sampling, etc.)
d. The role played by internal voltage reference (VREF) is still not totally known (to me at the very least).

So my question to this crew:

1. Has the ADC non linear issue been fixed as previously indicated by ESPRESSIF?
If this is the case, can someone with knowledge point me in the right direction (if the fix is code), or can someone let me know how to source a chip with the fix? (version number, etc..) if the chip has been produced yet.

2. Arduino is about to release the Arduino MKR 1010 with ESP-32.
Does anyone know if this board will address the issue of ADC non linearity?

Thanks a lot for the help provided.

plajjd
Posts: 54
Joined: Thu Jul 05, 2018 11:47 pm

Re: ESP32 ADC Non-linear Issues - How do I fix / change Attenuation or width?

Postby plajjd » Thu Aug 02, 2018 4:04 pm

I also am considering using the ESP32 for a production product and am very concerned about the ADC calibration and non-linearity issue.

Are there any updates on the following?

1. How can I be sure that the ESP32-WROOM-32 modules I purchase have been factory calibrated?

2. What exactly are the voltage input ranges that may be significantly non-linear?

3. Can I provide a high quality external voltage reference to solve the calibration & nonlinearity issues?

Thank you!

Archibald
Posts: 110
Joined: Mon Mar 05, 2018 12:44 am

Re: ESP32 ADC Non-linear Issues - How do I fix / change Attenuation or width?

Postby Archibald » Fri Aug 03, 2018 3:35 am

Non-linearity is bad with 11dB attenuation and input voltages greater than about 2.6V, as shown by the graph in the original post of this thread. Factory "two point" calibration will not remove that non-linearity. From my measurements, graphs with 6dB and 0dB attenuation appear to have good linearity.

As far as I am aware, you cannot provide an external reference voltage.

In my view 'noise' causing variation of digital values is more concerning than non-linearity, especially if measuring voltages that change fairly quickly.

For production I would use a separate ADC integrated circuit.

User avatar
HelWeb
Posts: 36
Joined: Sat Mar 23, 2019 8:39 am

Re: ESP32 ADC Non-linear Issues - How do I fix / change Attenuation or width?

Postby HelWeb » Fri Aug 09, 2019 7:54 pm

Original_Output.jpg
Original_Output.jpg (81.25 KiB) Viewed 29206 times
( for the images 10 bit values are used: DA>>2, AD<<2)


I got same strange results like vseven in his first post.
I wanted to put DA voltage (8bit) to pin 25 (DAC_CHANNEL_1) and then (pin 25 connected to pin 35) read back the voltage with adcStart(35),adcEnd(35); shifted from 12 bit to 8 bit.
Ideally it should give the same value but it does not: Original_Output.jpg

I think it should be possible to correct this behavior using a lookup-table: What value Corrected[x] do I have to put out to get the result x when reading back:

Code: Select all

dac_output_voltage(DAC_CHANNEL_1, Corrected[(int)out]); 

Code: Select all

should give the same as 
[code]
a0=adcEnd(35);
To get the table Corrected[256] I wrote this program:

Code: Select all

#include <driver/dac.h>

float Results[256];
int Corrected[256];

void Dotest(int j) {
unsigned int a1;
  //Serial.print("DoTest "); Serial.println(j);
  for (int i=0;i<256;i++) {  
      dac_output_voltage(DAC_CHANNEL_1, (i) & 0xff);
      delayMicroseconds(100);
      adcStart(35);
      delayMicroseconds(100);
      a1 = adcEnd(35);
      Results[i]=0.9*Results[i] + 0.1*a1;     // Implements a filter
  }
}

void setup() {
    dac_output_enable(DAC_CHANNEL_1);  // pin 25
    dac_output_voltage(DAC_CHANNEL_1, 0);
    adcAttachPin(35);
    adcStart(35);

    Serial.begin(921600);

   
}



void loop() {
float r;
int x, delta, deltaMin, deltaMinIndex;
    Serial.println("Test Liniarity ...");
    for (int i=0; i<500; i++) {
        if ((i%100)==0) Serial.println(i);
        Dotest(i);
    } 
    for (int i=0; i<256; i++) {
       r=Results[i]+0.5;
       x=(int)r;
       Serial.print(i); Serial.print(" "); Serial.print(Results[i]); 
       Serial.print(" "); Serial.println(x>>4);
    } 

    Serial.println("Calculate corrected values ..");
    for (int i=0; i<256; i++) {
       deltaMin=999;
       for (int j=0; j<256; j++) {
          delta=abs(i-((int)Results[j]>>4));
          if (delta<deltaMin) {
              deltaMin=delta;
              deltaMinIndex=j;
          }
       }
       Serial.print(i); Serial.print(" "); Serial.println(deltaMinIndex);
       Corrected[i]=deltaMinIndex;
    }

    for (int l=0; l<10;l++) {
      for (int i=0; i<256; i++) {
          dac_output_voltage(DAC_CHANNEL_1, Corrected[i]);
          adcStart(35);
          delayMicroseconds(100);
          x=adcEnd(35);
          Serial.print(i); Serial.print(" "); Serial.print((int)(Results[i])>>4); Serial.print(" "); Serial.println(x>>4);
      }
      
    }

    Serial.println();
    Serial.print("uint16_t Corrected[256 ]= { ");
    for (int l=0; l<256; l++) {
      if (l!=255) { Serial.print(Corrected[l]); Serial.print(", "); }
      else        { Serial.print(Corrected[l]); Serial.print(" }; "); }
    }
    while(1) {
      delay(1);
    }
   
}
just let it run a minute and it will write a line like this:

Code: Select all

uint16_t Corrected[256 ]= { 0, 6, 7, 8, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 21, 22, 23, 24, 25, 26, 27, 28, 30, 31, 32, 33, 34, 35, 36, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 64, 65, 66, 67, 68, 69, 70, 71, 71, 73, 74, 75, 76, 77, 78, 79, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 91, 93, 95, 96, 97, 98, 99, 100, 102, 103, 104, 105, 106, 107, 108, 109, 109, 111, 112, 113, 114, 115, 116, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 127, 128, 129, 130, 131, 132, 133, 134, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 151, 152, 153, 154, 155, 156, 157, 158, 159, 161, 162, 163, 164, 165, 166, 167, 168, 170, 171, 172, 173, 174, 175, 176, 177, 178, 178, 180, 181, 182, 183, 184, 185, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 210, 211, 212, 213, 214, 215, 216, 217, 218, 218, 219, 220, 221, 222, 223, 224, 224, 225, 226, 227, 228, 228, 229, 230, 231, 231, 232, 232, 233, 234, 234, 235, 235, 237, 237, 238, 238, 239, 240, 240, 241, 241, 242, 243, 243, 244, 245, 245, 246, 247, 247, 248, 248, 249, 249, 250, 250, 251, 252, 252, 253, 253, 254, 255 };
Using this lookup-table I get much better results:
Corrected_Output.jpg


Remember:
This does NOT mean that the outputs and readings now are as linear as it shows in the resulting image!

For that we should build 2 different lookup tables for DA and AD Converter but I do not have such precice instruments to build them.

But for my purposes Corrrected[256] helped a lot.

What I like to know:
1) Could you use the provided lookup-table or do you have to build your own? (Differences between different ESP32s)

2) Is the Arduino UNO ADC precise and capable to help to build the lookup-table for the ESP32-DAC ?
Has anybody done this?

3) When I look at the image of eseven it should be possible to use this technic to build a reverse LUT
for the 12 bit readings of the ESP32 ADC up to 3.1 V : (function must be monotone ascending)
value=ADC-Reading -> LUT[value] -> Real value
Maybe someone can test it ?
Attachments
Corrected_Output.jpg
Corrected_Output.jpg (67.43 KiB) Viewed 29206 times
Fast is not fast enough :D

User avatar
HelWeb
Posts: 36
Joined: Sat Mar 23, 2019 8:39 am

Re: ESP32 ADC Non-linear Issues - How do I fix / change Attenuation or width?

Postby HelWeb » Sat Aug 10, 2019 10:30 am

Is it possible to get precise results from ESP32-ADC ?
As told we need a LUT for that.

I could not resist to do it myself as a proof of concept :D

AND FOR ME IT WORKS VERY WELL.


This time I estimate the ESP32-DAC produces correct values.

====================== NOTE ===================================================

We know that is not true, but it is linear upto (about) output-value = 200)
To be more precise: measure the ouput voltage of 200 with a good external voltmeter
and calculate a slope factor. See: ESP32_DAC_WITH_MY_LUT.ino

With that I get good real world values up to 2.5 V !
===============================================================================



Then I want to build a LUT:
1) Send a value X to DAC
2) Read back value Y from ADC. (pins 25 and 35 are connected)
3) Value Y (0..4095) mostly is too low. We need a LUT (0..4095) to correct the measured value.
4) Correct the value: Y =LUT[Y]
5) Plot the value Y which should match X now. (Attention: Y should be > about 70 !)

Because the DAC uses 8 bit I have to interpolate to get the LookUpTable 0..4095.
But the errors caused by that are much less than the usual noise.


I am really surprised how good the results are. Look at the image.

Here is the program.
How to use: (Arduino_IDE, ESP32)
1) Connect pin25 and pin 35
2) Start the program
3) Start the Serial Plotter
4) Wait some minutes - you will see garbage (from the printout of results)
5) See the corrected values as image (see below). The correction is made for YOUR ESP32.
6) Comment out #define GRAPH
7) Start the program again
8) Wait some minutes.
9) When the program stops you get 2 arrays to include in your sources:
float ADC_LUT[4096] = { .... with best precision
and
int ADC_LUT[4096] = { ... less precision, but with less memory footprint

In your source:
Y=readAnalog(); Y=ADC_LUT[Y]; (look at the program)

Code: Select all

// (C) 2019 Helmut Weber
//
// Build a LookUpTable for ESP32-ADC to get corrected values


// Uncomment to get Text for including in programm:
#define GRAPH


#include <driver/dac.h>

float Results[4096];
float Res2[4095*5];

void Dotest(int j) {
unsigned int a1;
  //Serial.print("DoTest "); Serial.println(j);
  for (int i=0;i<256;i++) {  
      dac_output_voltage(DAC_CHANNEL_1, (i) & 0xff);
      delayMicroseconds(100);
      adcStart(35);
      delayMicroseconds(100);
      a1 = adcEnd(35);
      Results[i*16]=0.9*Results[i*16] + 0.1*a1;
      //Results[i*16]=a1;
  }
}

void setup() {
    dac_output_enable(DAC_CHANNEL_1);  // pin 25
    dac_output_voltage(DAC_CHANNEL_1, 0);
    adcAttachPin(35);
    adcStart(35);

    Serial.begin(921600);

   
}



void loop() {
float r;
int x, delta, deltaMin, deltaMinIndex;
    Serial.println("Test Liniarity ...");
    for (int i=0; i<200; i++) {
        if ((i%100)==0) Serial.println(i);
        Dotest(i);
    } 
    for (int i=0; i<256; i++) {
       r=Results[i*16]+0.5;
       x=(int)r;
       Serial.print(i*16); Serial.print(" "); Serial.println(Results[i*16]); 
    } 
    
    Serial.println("Calculate interpolated values ..");

    for (int i=0; i<256; i++) {
       for (int j=1; j<16; j++) {
          Results[i*16+j] = Results[i*16] + (Results[(i+1)*16] - Results[(i)*16])*(float)j / (float)16.0;
       }
    }

    for (int i=0; i<4096; i++) {
        Serial.print(i); Serial.print(" "); Serial.println(Results[i]);
    }

    for (int i=0; i<4096; i++) {
        Results[i]=0.5 + Results[i];
    } 

    for (int i=0; i<4096; i++) {
        Serial.print(i); Serial.print(" "); Serial.println(Results[i],6);
    }

    for (int i=0; i<4096; i++) {
       for (int j=0; j<5; j++) {
          Res2[i*5+j] = Results[i] + (Results[(i+1)] - Results[i])*(float)j / (float)10.0;
       }
    } 

    for (int i=0; i<(5*4096); i++) {
        Serial.print(i); Serial.print(" "); Serial.println(Res2[i],6);
    }

    for (int i=1; i<4096; i++) {
        float diff, minDiff;
        int index;
        minDiff=99999;
        for (int j=0; j<(5*4096); j++) {
            diff=abs((float)(i) - Res2[j]);
            if(diff<minDiff) {
                minDiff=diff;
                index=j;
            }
        }

        Results[i]=index;
    }

    for (int i=0; i<(4096); i++) {
        Serial.print(i); Serial.print(" "); Serial.println(Results[i]/5,6);
        Results[i]/=5;
    }

#ifdef GRAPH   
    
    while(1) {
      int a1;
      for (int i=2; i<256;i++) {
        dac_output_voltage(DAC_CHANNEL_1, (i) & 0xff);
        delayMicroseconds(100);
        adcStart(35);
        delayMicroseconds(100);
        a1 = adcEnd(35);
        float r= Results[a1];
        Serial.print(i*16); Serial.print(" "); Serial.println(r);
      }
    }
    
#else
    for (int i=0; i<10; i++) Serial.println();
    Serial.println(" float ADC_LUT[4096] = { 0,");
    for (int i=1; i<4095; i++) {
      Serial.print(Results[i],4); Serial.print(",");
      if ((i%16)==0) Serial.println();
    }
    Serial.println(Results[4095]); Serial.println("} ;");


    for (int i=0; i<10; i++) Serial.println();
    Serial.println(" int ADC_LUT[4096] = { 0,");
    for (int i=1; i<4095; i++) {
      Serial.print((int)Results[i]); Serial.print(",");
      if ((i%16)==0) Serial.println();
    }
    Serial.println((int)Results[4095]); Serial.println("} ;");


    while(1);

#endif
    


}
Here is a second program which includes the LUT of MY Esp32.
Just let it run and start Serial Plotter.
It would be interesting if someone can run it WITHOUT modification and report the results.
Then we can see the differences between different ESP32.

Code: Select all

// (C) 2019 Helmut Weber

// use with Serial Plotter

// DO NOT FORGET TO WIRE PIN 25 WITH PIN 35 !!!

// Slope Factor: 
// dac_output_voltage(DAC_CHANNEL_1, 200);     200=8 bit, gives My200VoltV measured with external instrument
// 
float My200Volt = 2.44;  // measured with external instrument: adc(200)

#include <driver/dac.h>


 int ADC_LUT[4096] = { 0,
0,66,70,74,78,81,82,83,85,86,87,89,90,91,92,94,
95,96,97,98,99,100,101,102,103,104,105,106,106,107,108,109,
110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,
126,127,128,130,131,132,133,134,135,136,137,138,139,140,142,143,
144,145,146,148,149,151,152,153,155,156,158,159,160,161,162,163,
164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,
180,181,182,183,184,185,186,188,189,190,191,192,193,194,195,196,
198,199,200,201,202,203,204,205,207,208,209,210,211,212,213,214,
215,217,218,219,220,221,222,223,224,226,227,228,230,231,232,234,
235,236,237,239,240,241,242,243,244,245,246,247,248,249,250,251,
252,253,254,255,256,257,258,259,260,261,263,264,265,266,267,268,
270,271,272,273,274,275,277,278,279,280,281,282,283,284,286,287,
288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,302,
303,305,306,307,308,309,310,311,313,314,315,316,317,318,319,321,
322,323,324,324,325,326,327,328,329,330,331,332,333,334,335,336,
337,338,339,340,341,342,343,343,344,345,346,347,348,349,350,351,
351,352,354,355,357,358,359,361,362,363,365,366,367,369,370,372,
373,374,376,377,379,380,382,383,384,385,386,387,388,389,390,391,
392,393,394,395,396,397,398,398,399,400,402,403,404,405,407,408,
409,410,412,413,414,416,417,418,419,420,421,422,423,424,425,426,
427,428,428,429,430,431,433,434,435,436,437,439,440,441,442,443,
445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,
461,462,463,464,465,466,467,468,470,471,472,473,474,476,477,478,
479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,
495,497,499,501,503,506,508,510,512,514,515,516,517,518,520,521,
522,523,525,526,527,528,530,531,532,533,534,535,536,537,539,540,
541,542,543,544,545,546,547,548,550,551,552,553,554,555,556,557,
558,559,560,561,562,563,564,565,567,568,569,570,571,572,573,574,
575,576,577,578,579,581,582,583,584,585,586,587,588,589,590,591,
592,594,595,596,598,599,600,602,603,604,606,607,608,609,610,611,
612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,
628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,
644,644,645,646,647,648,649,650,650,651,652,653,654,655,656,657,
657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,671,
672,674,675,676,677,678,679,680,682,683,684,685,686,687,688,690,
691,692,693,694,696,697,698,699,701,702,703,704,705,706,708,709,
710,711,712,713,714,715,716,717,718,719,721,722,724,725,727,728,
730,731,733,734,736,737,738,738,739,740,741,742,743,744,744,745,
746,747,748,749,750,751,751,752,753,755,756,757,758,760,761,762,
763,764,766,767,768,769,770,771,772,773,774,776,777,778,779,780,
781,782,783,784,785,786,788,789,790,791,792,793,794,796,797,798,
799,800,801,802,803,805,806,807,808,809,810,811,812,813,814,815,
817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,
833,834,836,837,838,840,841,842,844,845,846,848,849,850,851,852,
853,854,855,856,857,858,859,860,861,863,864,865,866,867,869,870,
871,873,874,875,877,878,879,880,881,882,883,884,884,885,886,887,
888,889,889,890,891,892,893,893,894,895,896,897,898,899,901,902,
903,904,906,907,908,909,911,912,913,914,915,916,917,918,919,920,
921,922,923,924,925,926,927,928,929,930,931,933,934,935,936,937,
938,940,941,942,943,944,945,946,947,948,949,950,950,951,952,953,
954,955,956,957,957,958,959,960,961,963,964,965,966,968,969,970,
972,973,974,976,977,978,979,980,981,982,983,984,985,987,988,989,
990,991,992,993,994,996,997,998,999,1000,1001,1002,1004,1005,1006,1007,
1008,1009,1010,1011,1012,1013,1014,1015,1016,1017,1018,1019,1020,1020,1021,1022,
1023,1024,1026,1027,1028,1029,1030,1031,1032,1034,1035,1036,1037,1038,1039,1041,
1042,1043,1044,1045,1047,1048,1049,1050,1051,1052,1054,1055,1056,1057,1058,1059,
1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1076,
1077,1078,1079,1081,1082,1083,1084,1086,1087,1088,1089,1090,1091,1092,1093,1094,
1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1110,1111,
1112,1113,1114,1116,1117,1118,1119,1120,1122,1123,1124,1125,1126,1127,1129,1130,
1131,1132,1133,1134,1136,1137,1138,1139,1140,1141,1142,1143,1144,1145,1146,1147,
1148,1149,1150,1151,1152,1153,1154,1155,1156,1157,1158,1159,1160,1161,1162,1163,
1164,1165,1166,1167,1168,1169,1170,1171,1172,1173,1174,1176,1177,1178,1179,1180,
1181,1182,1184,1185,1185,1186,1187,1188,1188,1189,1190,1191,1191,1192,1193,1194,
1194,1195,1196,1197,1197,1198,1199,1200,1201,1202,1204,1205,1206,1208,1209,1211,
1212,1214,1215,1216,1217,1218,1219,1220,1221,1222,1223,1224,1225,1226,1226,1227,
1228,1229,1230,1231,1232,1233,1234,1236,1237,1238,1239,1240,1242,1243,1244,1245,
1246,1248,1249,1250,1251,1252,1252,1253,1254,1255,1256,1257,1258,1259,1260,1261,
1262,1263,1264,1265,1266,1267,1268,1269,1270,1271,1272,1273,1274,1275,1276,1277,
1278,1279,1280,1281,1282,1284,1285,1286,1287,1288,1289,1290,1291,1293,1294,1295,
1296,1297,1298,1299,1299,1300,1301,1302,1303,1304,1305,1306,1307,1308,1308,1309,
1310,1311,1312,1313,1315,1316,1317,1319,1320,1321,1323,1324,1325,1327,1328,1329,
1331,1332,1333,1334,1336,1337,1338,1339,1341,1342,1343,1344,1345,1346,1347,1348,
1349,1350,1351,1352,1353,1354,1355,1356,1357,1358,1359,1360,1361,1362,1363,1364,
1365,1366,1366,1367,1368,1369,1370,1371,1372,1373,1373,1374,1375,1376,1378,1379,
1381,1382,1384,1385,1387,1388,1390,1392,1393,1394,1395,1396,1397,1398,1399,1400,
1401,1402,1403,1404,1405,1406,1407,1408,1409,1410,1411,1413,1414,1415,1416,1417,
1419,1420,1421,1422,1423,1424,1426,1427,1428,1429,1430,1431,1432,1433,1434,1436,
1437,1438,1439,1440,1441,1442,1443,1444,1445,1446,1447,1448,1449,1450,1451,1452,
1453,1454,1455,1456,1457,1459,1460,1461,1462,1463,1464,1465,1466,1467,1468,1469,
1470,1471,1472,1474,1475,1476,1477,1479,1480,1481,1482,1483,1485,1486,1487,1488,
1489,1490,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,
1506,1507,1508,1509,1510,1510,1511,1512,1513,1514,1515,1516,1517,1518,1519,1520,
1522,1524,1527,1530,1532,1535,1537,1537,1538,1539,1540,1541,1542,1543,1544,1545,
1546,1547,1547,1548,1549,1550,1551,1552,1553,1554,1556,1557,1558,1560,1561,1562,
1563,1565,1566,1567,1568,1569,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,
1580,1581,1582,1583,1584,1585,1586,1588,1589,1590,1591,1592,1593,1594,1596,1597,
1598,1599,1600,1601,1602,1603,1605,1606,1607,1608,1609,1610,1611,1612,1613,1614,
1615,1616,1618,1619,1620,1621,1622,1623,1625,1626,1627,1628,1629,1630,1632,1633,
1634,1635,1636,1637,1638,1639,1640,1641,1641,1642,1643,1644,1645,1646,1647,1648,
1649,1650,1651,1652,1653,1654,1655,1656,1657,1658,1659,1660,1661,1662,1663,1665,
1666,1667,1668,1670,1671,1672,1673,1674,1676,1677,1678,1679,1680,1681,1682,1683,
1684,1685,1686,1687,1688,1688,1689,1690,1691,1692,1693,1694,1695,1696,1697,1698,
1700,1701,1703,1704,1706,1707,1709,1711,1712,1713,1714,1715,1716,1717,1718,1719,
1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1731,1732,1733,1734,1735,1736,
1738,1739,1740,1741,1742,1743,1745,1746,1748,1749,1751,1753,1754,1756,1757,1759,
1760,1761,1761,1762,1763,1763,1764,1765,1765,1766,1766,1767,1768,1768,1769,1770,
1770,1771,1772,1772,1773,1773,1774,1775,1775,1776,1777,1778,1779,1780,1781,1782,
1783,1784,1785,1786,1787,1788,1790,1791,1792,1793,1794,1795,1796,1797,1799,1800,
1801,1802,1803,1804,1806,1807,1808,1809,1810,1812,1813,1814,1815,1816,1817,1819,
1820,1821,1822,1823,1825,1826,1827,1828,1829,1830,1831,1832,1834,1835,1836,1837,
1838,1839,1840,1841,1842,1843,1844,1845,1846,1847,1848,1849,1850,1850,1851,1852,
1853,1854,1855,1856,1857,1858,1860,1861,1862,1863,1864,1865,1867,1868,1869,1870,
1871,1873,1874,1875,1876,1877,1878,1880,1881,1882,1883,1884,1885,1886,1888,1889,
1890,1891,1891,1892,1893,1894,1895,1896,1897,1898,1899,1900,1901,1902,1903,1904,
1905,1906,1907,1908,1909,1910,1911,1912,1913,1914,1915,1916,1917,1918,1919,1920,
1921,1922,1923,1924,1924,1925,1926,1927,1928,1929,1930,1931,1932,1933,1934,1935,
1936,1937,1938,1940,1941,1942,1943,1945,1946,1947,1948,1949,1951,1952,1953,1955,
1956,1957,1958,1960,1961,1962,1964,1965,1966,1968,1969,1970,1971,1972,1974,1975,
1976,1977,1978,1980,1981,1982,1983,1984,1985,1986,1987,1989,1990,1991,1992,1993,
1994,1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,
2010,2012,2013,2014,2015,2016,2017,2018,2019,2020,2021,2022,2023,2024,2025,2026,
2027,2028,2029,2030,2030,2031,2032,2033,2033,2034,2034,2034,2035,2035,2036,2036,
2036,2037,2037,2038,2038,2039,2039,2039,2040,2040,2041,2041,2042,2042,2042,2043,
2043,2044,2044,2045,2045,2045,2046,2046,2047,2047,2047,2048,2049,2050,2051,2052,
2053,2054,2055,2056,2057,2058,2059,2060,2061,2062,2063,2064,2065,2066,2068,2069,
2070,2071,2072,2074,2075,2076,2077,2079,2080,2081,2082,2083,2084,2085,2086,2087,
2088,2090,2091,2092,2093,2094,2095,2096,2097,2098,2099,2101,2102,2103,2104,2105,
2106,2107,2108,2109,2111,2112,2113,2114,2115,2116,2118,2119,2120,2121,2122,2123,
2125,2126,2127,2128,2129,2131,2132,2133,2134,2135,2136,2138,2139,2140,2141,2142,
2144,2145,2146,2146,2147,2148,2149,2150,2151,2152,2153,2154,2155,2156,2157,2158,
2159,2160,2161,2162,2163,2164,2165,2166,2167,2167,2168,2169,2170,2171,2172,2173,
2174,2175,2176,2178,2179,2180,2181,2183,2184,2185,2186,2188,2189,2190,2191,2193,
2194,2195,2196,2197,2198,2199,2200,2201,2202,2203,2204,2205,2206,2207,2208,2209,
2210,2212,2213,2214,2215,2216,2217,2218,2219,2220,2222,2223,2224,2225,2226,2227,
2228,2229,2230,2232,2233,2234,2235,2236,2237,2238,2239,2240,2242,2243,2244,2245,
2246,2247,2248,2249,2251,2252,2253,2254,2255,2256,2257,2258,2259,2260,2261,2262,
2263,2264,2265,2266,2267,2268,2269,2270,2271,2272,2273,2274,2275,2276,2277,2278,
2279,2280,2281,2282,2283,2284,2284,2285,2286,2287,2288,2289,2290,2291,2292,2293,
2294,2294,2295,2296,2297,2298,2299,2300,2301,2301,2302,2303,2304,2305,2306,2308,
2309,2310,2311,2312,2313,2315,2316,2317,2318,2319,2320,2322,2323,2324,2326,2327,
2328,2329,2331,2332,2333,2334,2336,2337,2338,2339,2340,2341,2342,2343,2344,2345,
2346,2347,2348,2349,2350,2351,2352,2353,2354,2356,2357,2359,2360,2362,2363,2364,
2366,2367,2369,2370,2370,2371,2372,2373,2374,2375,2376,2377,2378,2379,2380,2381,
2382,2383,2384,2385,2386,2387,2388,2389,2390,2391,2393,2394,2395,2396,2397,2398,
2399,2400,2401,2402,2404,2405,2406,2408,2409,2410,2412,2413,2414,2416,2417,2418,
2418,2419,2420,2421,2422,2423,2424,2425,2426,2427,2428,2429,2429,2430,2431,2432,
2433,2434,2435,2436,2438,2439,2440,2441,2442,2443,2444,2445,2446,2447,2448,2449,
2450,2452,2453,2454,2455,2456,2457,2458,2459,2461,2462,2463,2464,2465,2466,2467,
2468,2470,2471,2472,2473,2474,2475,2476,2478,2479,2480,2481,2482,2483,2484,2485,
2487,2488,2489,2490,2491,2492,2493,2495,2496,2497,2498,2499,2500,2501,2503,2504,
2505,2506,2507,2508,2510,2511,2512,2513,2514,2515,2516,2517,2518,2519,2520,2521,
2522,2523,2524,2525,2526,2527,2528,2529,2531,2532,2533,2535,2536,2538,2539,2541,
2542,2544,2545,2546,2548,2549,2550,2552,2553,2554,2556,2557,2558,2560,2561,2562,
2563,2563,2564,2565,2566,2567,2568,2569,2569,2570,2571,2572,2573,2574,2575,2576,
2577,2578,2580,2581,2583,2584,2586,2587,2589,2590,2592,2593,2594,2595,2596,2597,
2598,2599,2600,2601,2602,2602,2603,2604,2605,2606,2607,2608,2610,2611,2613,2614,
2616,2617,2619,2620,2622,2623,2624,2625,2626,2627,2628,2629,2630,2631,2632,2633,
2634,2635,2636,2637,2638,2639,2640,2641,2642,2643,2644,2646,2647,2648,2649,2651,
2652,2653,2654,2656,2657,2658,2659,2660,2661,2662,2663,2664,2665,2666,2667,2668,
2669,2670,2671,2672,2673,2674,2675,2677,2678,2679,2680,2681,2682,2683,2684,2685,
2686,2687,2688,2689,2691,2692,2693,2694,2695,2696,2697,2698,2700,2701,2702,2703,
2704,2705,2706,2707,2708,2709,2711,2712,2713,2714,2715,2716,2717,2718,2719,2720,
2721,2722,2723,2724,2725,2726,2728,2729,2730,2731,2732,2733,2734,2735,2736,2737,
2738,2739,2739,2740,2741,2742,2743,2744,2745,2746,2747,2748,2748,2749,2750,2751,
2752,2753,2755,2756,2757,2758,2760,2761,2762,2763,2764,2766,2767,2768,2770,2771,
2772,2774,2775,2777,2778,2779,2781,2782,2784,2785,2786,2787,2788,2789,2790,2791,
2792,2793,2794,2795,2796,2797,2798,2799,2800,2801,2802,2803,2804,2805,2805,2806,
2807,2808,2809,2810,2811,2812,2813,2814,2815,2816,2817,2818,2819,2820,2822,2823,
2824,2825,2827,2828,2829,2830,2831,2833,2835,2837,2840,2842,2844,2846,2848,2849,
2850,2850,2851,2852,2852,2853,2854,2854,2855,2856,2856,2857,2858,2859,2859,2860,
2861,2861,2862,2863,2863,2864,2865,2866,2867,2867,2868,2869,2870,2871,2872,2872,
2873,2874,2875,2876,2877,2877,2878,2879,2880,2881,2882,2883,2884,2885,2887,2888,
2889,2890,2891,2892,2893,2894,2895,2896,2897,2898,2899,2900,2901,2902,2903,2904,
2905,2906,2907,2908,2909,2910,2911,2912,2914,2915,2916,2918,2919,2920,2922,2923,
2924,2925,2927,2928,2929,2930,2931,2932,2934,2935,2936,2937,2938,2939,2940,2941,
2942,2944,2945,2945,2946,2947,2948,2949,2950,2950,2951,2952,2953,2954,2955,2956,
2956,2957,2958,2959,2960,2961,2962,2963,2964,2965,2966,2967,2968,2969,2971,2972,
2973,2974,2975,2976,2977,2978,2980,2981,2982,2984,2985,2986,2988,2989,2990,2992,
2993,2994,2995,2996,2997,2998,2999,3000,3000,3001,3002,3003,3004,3005,3006,3007,
3008,3009,3010,3011,3012,3013,3014,3015,3016,3017,3018,3019,3020,3020,3021,3022,
3023,3024,3025,3027,3028,3029,3030,3031,3032,3033,3035,3036,3037,3038,3039,3040,
3041,3042,3043,3044,3045,3046,3047,3048,3049,3050,3051,3052,3053,3054,3055,3057,
3058,3059,3061,3062,3064,3065,3066,3068,3069,3071,3072,3073,3074,3075,3075,3076,
3077,3078,3079,3080,3080,3081,3082,3083,3084,3085,3085,3086,3087,3088,3089,3090,
3092,3093,3095,3096,3097,3099,3100,3101,3103,3104,3105,3106,3107,3108,3110,3111,
3112,3113,3114,3115,3116,3117,3118,3120,3121,3122,3123,3124,3125,3126,3128,3129,
3130,3131,3132,3133,3134,3136,3137,3137,3138,3139,3140,3141,3142,3142,3143,3144,
3145,3146,3146,3147,3148,3149,3150,3151,3151,3152,3153,3155,3156,3157,3158,3159,
3160,3161,3162,3163,3164,3166,3167,3168,3169,3170,3171,3172,3173,3174,3175,3176,
3177,3178,3179,3180,3181,3182,3183,3184,3185,3186,3187,3188,3189,3190,3190,3191,
3192,3193,3194,3195,3196,3197,3198,3199,3200,3201,3202,3202,3203,3204,3205,3206,
3207,3208,3208,3209,3210,3211,3212,3213,3214,3215,3215,3216,3218,3219,3220,3222,
3223,3224,3225,3227,3228,3229,3231,3232,3233,3234,3235,3236,3236,3237,3238,3239,
3240,3241,3242,3243,3243,3244,3245,3246,3247,3248,3249,3250,3252,3253,3254,3255,
3257,3258,3259,3261,3262,3263,3264,3265,3266,3266,3267,3268,3269,3269,3270,3271,
3272,3272,3273,3274,3275,3275,3276,3277,3278,3278,3279,3280,3281,3282,3283,3284,
3285,3286,3287,3288,3289,3290,3291,3292,3293,3294,3295,3296,3297,3299,3300,3301,
3302,3303,3304,3306,3307,3308,3309,3310,3311,3312,3313,3314,3315,3316,3317,3318,
3318,3319,3320,3321,3322,3323,3324,3325,3325,3326,3327,3328,3329,3330,3331,3332,
3332,3333,3334,3335,3336,3337,3338,3339,3339,3340,3341,3342,3343,3344,3345,3346,
3348,3349,3350,3352,3353,3354,3356,3357,3358,3360,3361,3361,3362,3362,3363,3364,
3364,3365,3366,3366,3367,3367,3368,3369,3369,3370,3371,3371,3372,3373,3373,3374,
3374,3375,3376,3376,3377,3378,3379,3380,3381,3382,3383,3384,3385,3386,3387,3388,
3389,3390,3391,3392,3393,3393,3394,3395,3396,3397,3398,3398,3399,3400,3401,3402,
3403,3403,3404,3405,3406,3407,3408,3409,3410,3411,3412,3413,3414,3415,3416,3417,
3418,3419,3420,3421,3422,3423,3424,3425,3427,3428,3429,3431,3432,3434,3435,3437,
3438,3439,3440,3441,3442,3442,3443,3443,3444,3444,3445,3445,3446,3447,3447,3448,
3448,3449,3449,3450,3450,3451,3452,3452,3453,3453,3454,3454,3455,3455,3456,3457,
3458,3459,3460,3461,3462,3463,3464,3465,3466,3467,3468,3469,3470,3471,3472,3473,
3474,3474,3475,3476,3477,3478,3479,3480,3481,3482,3482,3483,3484,3485,3486,3487,
3488,3489,3490,3491,3492,3493,3494,3495,3496,3497,3498,3499,3500,3501,3502,3503,
3504,3505,3506,3506,3507,3508,3509,3510,3511,3511,3512,3513,3514,3515,3516,3516,
3517,3518,3519,3520,3520,3521,3522,3522,3523,3524,3524,3525,3526,3527,3527,3528,
3529,3529,3530,3531,3531,3532,3533,3533,3534,3535,3535,3536,3537,3538,3538,3539,
3540,3541,3541,3542,3543,3544,3545,3545,3546,3547,3548,3549,3549,3550,3551,3552,
3553,3553,3554,3555,3556,3557,3558,3558,3559,3560,3561,3562,3563,3564,3564,3565,
3566,3567,3568,3569,3570,3572,3573,3575,3576,3577,3579,3580,3582,3583,3584,3585,
3586,3587,3587,3588,3589,3590,3591,3591,3592,3593,3594,3595,3595,3596,3597,3598,
3598,3599,3600,3601,3602,3602,3603,3604,3604,3605,3606,3607,3607,3608,3609,3610,
3610,3611,3612,3613,3613,3614,3615,3616,3616,3617,3618,3619,3620,3621,3622,3623,
3624,3625,3626,3627,3628,3629,3630,3631,3632,3632,3633,3634,3635,3635,3636,3637,
3637,3638,3639,3639,3640,3641,3641,3642,3643,3643,3644,3645,3645,3646,3647,3647,
3648,3649,3649,3650,3651,3651,3652,3653,3653,3654,3655,3655,3656,3657,3657,3658,
3658,3659,3660,3660,3661,3662,3662,3663,3664,3664,3665,3666,3666,3667,3668,3669,
3669,3670,3671,3671,3672,3673,3674,3674,3675,3676,3676,3677,3678,3679,3679,3680,
3681,3682,3683,3683,3684,3685,3686,3687,3688,3688,3689,3690,3691,3692,3693,3694,
3694,3695,3696,3697,3697,3698,3699,3699,3700,3701,3701,3702,3703,3703,3704,3705,
3705,3706,3707,3707,3708,3709,3709,3710,3711,3711,3712,3713,3714,3714,3715,3716,
3717,3718,3719,3720,3720,3721,3722,3723,3724,3725,3726,3726,3727,3728,3729,3729,
3730,3731,3731,3732,3732,3733,3734,3734,3735,3736,3736,3737,3737,3738,3739,3739,
3740,3741,3741,3742,3742,3743,3744,3744,3745,3745,3746,3747,3747,3748,3748,3749,
3749,3750,3751,3751,3752,3752,3753,3753,3754,3755,3755,3756,3756,3757,3758,3758,
3759,3759,3760,3761,3762,3763,3764,3766,3767,3768,3769,3771,3772,3773,3774,3776,
3776,3777,3777,3778,3778,3779,3779,3779,3780,3780,3781,3781,3782,3782,3782,3783,
3783,3784,3784,3785,3785,3785,3786,3786,3787,3787,3788,3788,3789,3789,3789,3790,
3790,3791,3791,3792,3792,3793,3793,3794,3795,3795,3796,3797,3797,3798,3798,3799,
3800,3800,3801,3802,3802,3803,3804,3804,3805,3806,3806,3807,3808,3808,3809,3810,
3810,3811,3812,3812,3813,3814,3814,3815,3816,3816,3817,3818,3818,3819,3820,3820,
3821,3822,3822,3823,3824,3824,3825,3825,3826,3827,3827,3828,3828,3829,3830,3830,
3831,3831,3832,3832,3833,3834,3834,3835,3835,3836,3836,3837,3838,3838,3839,3839,
3840,3841,3841,3842,3842,3843,3843,3844,3845,3845,3846,3846,3847,3848,3848,3849,
3849,3850,3851,3851,3852,3852,3853,3853,3854,3855,3855,3856,3856,3857,3858,3859,
3859,3860,3861,3861,3862,3863,3863,3864,3865,3866,3866,3867,3868,3868,3869,3870,
3871,3871,3872,3873,3873,3874,3874,3875,3876,3876,3877,3878,3878,3879,3879,3880,
3881,3881,3882,3883,3883,3884,3884,3885,3886,3886,3887,3887,3888,3889,3889,3890,
3891,3892,3892,3893,3894,3894,3895,3896,3896,3897,3898,3898,3899,3900,3900,3901,
3902,3903,3903,3904,3905,3905,3906,3906,3907,3907,3908,3909,3909,3910,3910,3911,
3911,3912,3913,3913,3914,3914,3915,3916,3916,3917,3917,3918,3918,3919,3920,3920,
3921,3921,3922,3923,3923,3924,3924,3925,3926,3926,3927,3927,3928,3929,3929,3930,
3930,3931,3932,3932,3933,3933,3934,3935,3935,3936,3936,3937,3937,3938,3939,3939,
3940,3940,3941,3941,3942,3942,3943,3943,3944,3944,3945,3946,3946,3947,3947,3948,
3948,3949,3949,3950,3950,3951,3951,3952,3953,3953,3954,3954,3955,3955,3956,3956,
3957,3958,3958,3959,3959,3960,3960,3961,3962,3962,3963,3963,3964,3964,3965,3966,
3966,3967,3967,3968,3968,3969,3970,3970,3971,3971,3972,3972,3973,3974,3974,3975,
3975,3976,3976,3977,3978,3978,3979,3979,3980,3980,3981,3982,3982,3983,3983,3984,
3984,3985,3986,3986,3987,3987,3988,3989,3989,3990,3990,3991,3992,3992,3993,3993,
3994,3995,3995,3996,3996,3997,3998,3998,3999,3999,4000,4000,4001,4002,4002,4003,
4003,4004,4004,4005,4006,4006,4007,4007,4008,4008,4009,4010,4010,4011,4011,4012,
4012,4013,4014,4014,4015,4015,4016,4016,4017,4018,4018,4019,4019,4020,4020,4021,
4021,4022,4023,4023,4024,4024,4025,4025,4026,4027,4027,4028,4028,4029,4029,4030,
4031,4031,4032,4032,4033,4033,4034,4035,4035,4036,4036,4037,4037,4038,4038,4039,
4040,4040,4041,4041,4042,4042,4043,4043,4044,4045,4045,4046,4046,4047,4047,4048,
4049,4049,4050,4050,4051,4051,4052,4052,4053,4053,4054,4054,4055,4055,4056,4057,
4057,4058,4058,4059,4059,4060,4060,4061,4061,4062,4062,4063,4063,4064,4065,4066,
4067,4068,4069,4070,4070,4071,4072,4073,4074,4075,4076,4077,4078,4079,4080
} ;






int a1;

void setup() {
    Serial.begin(921600);
    adcAttachPin(35);
    
    dac_output_enable(DAC_CHANNEL_1);  // pin 25
    dac_output_voltage(DAC_CHANNEL_1, 0);
    

// After calibrating YOUR ESP32:
//     
// Measure   
//     dac_output_voltage(DAC_CHANNEL_1, 200);
// with an external voltmeter (pin 25-ground)
//
// Set your measurement as
//     float My200Volt = (2.44 = your measurement, should be near by);
// at the beginning of the program
//
// Enable the following outcommented lines
// Test YOUR work - with Serial monitor
// Mine is:
// Should be: 2.44V   measured:   2.44
// Should be: 1.22V   measured:   1.21
// Should be: 0.61V   measured:   0.61


//    Enable to test last results:       <<<<<<<<<<<<<<<
//
//    // output  My200Volt
//    
//    dac_output_voltage(DAC_CHANNEL_1, 200);
//    delay(1);
//    
//    Serial.println("Start");
//    delay(1);
//    adcStart(35);
//    delay(1);
//    int a1 = adcEnd(35);
//    a1 = (int)ADC_LUT[a1];  // Correct the value
//    Serial.print("Should be: My200Volt(2.44)   measured:   ");
//    Serial.println((float)(a1>>4)*My200Volt/200.0,2);
//
//    // output 1.22 V
//    
//    dac_output_voltage(DAC_CHANNEL_1, 100);
//    delay(1);
//    adcStart(35);
//    delay(1);
//    a1 = adcEnd(35);
//    a1 = (int)ADC_LUT[a1];  // Correct the value
//    Serial.print("Should be: My200Volt/2   measured:   ");
//    Serial.println((float)(a1>>4)*My200Volt/200.0,2);
//
//    // output 0.61 V
//    
//    dac_output_voltage(DAC_CHANNEL_1, 50);
//    delay(1);
//    adcStart(35);
//    delay(1);
//    a1 = adcEnd(35);
//    a1 = (int)ADC_LUT[a1];  // Correct the value
//    Serial.print("Should be: My200Volt/4   measured:   ");
//    Serial.println((float)(a1>>4)*My200Volt/200.0,2);
//    
//    Serial.println("\npress Reset Button to repeat\n");
//    
//    while(1);
  
}
    

 
void loop() {
  for (int i=5;i<256;i++) {  
      dac_output_voltage(DAC_CHANNEL_1, (i) & 0xff);
      adcStart(35);
      delayMicroseconds(200);
      a1 = adcEnd(35);
      a1 = (int)ADC_LUT[a1];  // Correct the value
      Serial.print(i*16); Serial.print(" "); Serial.println(a1);
  }

}
 
Attachments
Correct_with_LUT.jpg
Correct_with_LUT.jpg (49.7 KiB) Viewed 29182 times
Fast is not fast enough :D

Martin_Chicoine
Posts: 2
Joined: Mon Oct 21, 2019 7:15 pm

Re: ESP32 ADC Non-linear Issues - How do I fix / change Attenuation or width?

Postby Martin_Chicoine » Mon Oct 21, 2019 7:18 pm

Is there anyway to convert this code so it will only generate code for 9 bits reading, 12 bits array is very big and hard to keep in memory or in the flash?

idahowalker
Posts: 166
Joined: Wed Aug 01, 2018 12:06 pm

Re: ESP32 ADC Non-linear Issues - How do I fix / change Attenuation or width?

Postby idahowalker » Tue Oct 22, 2019 6:55 pm

I find the ESP32 A:D to be quite stable.
I declare

Code: Select all

#include <driver/adc.h>
In setup()

Code: Select all

 // https://dl.espressif.com/doc/esp-idf/latest/api-reference/peripherals/adc.html
  // set up A:D channels
  adc1_config_width(ADC_WIDTH_12Bit);
  adc1_config_channel_atten(ADC1_CHANNEL_6, ADC_ATTEN_DB_11);
I use it like this

Code: Select all

void TaskAnalogVoltRead_LIDAR( void *pvParameters )
{
  // String localBuffer;
  // localBuffer.reserve ( StringBufferSize300 );
  int iBit = 1;
  float ADbits = 4095.0f;
  float offSET = 1.0f;
  float r1 = 100800.0f; // R1 in ohm, 100k = 100,800.0 //
  float r2 = 38780.0f; // R2 in ohm, 38k = 38000.0 //actual 38780K
  float uPvolts = 3.3f;
  // ADC1 channel 0 is GPIO36
  // ADC1 channel 1 is GPIO37
  // ADC1 channel 6 is GPIO34
  // https://dl.espressif.com/doc/esp-idf/latest/api-reference/peripherals/adc.html
  // to get resistor R2 go to:
  // http://www.ohmslawcalculator.com/voltage-divider-calculator
  //   used 12 volts for the input voltage to calculate R2, used 100K for R1
  for (;;)
  {
    // group handle, WaitForBits, ClearOnExitBit, WaitForAllBits, TicksToWait
    xEventGroupWaitBits( eg, evtAnalogVoltReadTask_LIDAR, pdTRUE, pdTRUE, portMAX_DELAY );
    //    // read the input
    iBit = iBit << 1;
    //    //    Serial.println ( iBit );
    if ( iBit == 1073741824 )
    {
      if ( xSemaphoreTake( sema_AnalogVoltRead_LIDAR, xSemaphoreTicksToWait ) == pdTRUE )
      {
        ptrVbatt_LIDAR[0] += ( ((( uPvolts * adc1_get_raw(ADC1_CHANNEL_6)) / ADbits) / r2 * ( r1 + r2)) + offSET );
        ptrVbatt_LIDAR[0] = ptrVbatt_LIDAR[0] / 2; // average readings
         
        // Vbatt_LIDAR += ( ((( uPvolts * adc1_get_raw(ADC1_CHANNEL_6)) / ADbits) / r2 * ( r1 + r2)) + offSET );
        // Vbatt_LIDAR = Vbatt_LIDAR / 2; // average readings
        // xSemaphoreTake( sema_Time, xSemaphoreTicksToWait );
        // fMakeTimeStamp ( localBuffer );
        // xSemaphoreGive( sema_Time ); // give up semaphore
        // localBuffer.concat ( " LIDAR V: " + String(Vbatt_LIDAR) );
        //        xSemaphoreTake ( sema_SPIFF_Buffer, xSemaphoreTicksToWait );
        //        SPIFF_Buffer = localBuffer;
        //        xEventGroupSetBits( eg, evtOpenAppendSPIFF_FILE );
        //        xSemaphoreGive( sema_AnalogVoltRead_LIDAR );
      } // if ( xSemaphoreTake( sema_AnalogVoltRead_LIDAR, xSemaphoreTicksToWait ) == pdTRUE )
      //            Serial.print( "TaskAnalogVoltRead " );
      //    Serial.print(uxTaskGetStackHighWaterMark( NULL ));
      //        Serial.println();
      //        Serial.flush();
      // localBuffer = "";
      iBit = 1;
    } // if ( iBit == 1073741824 )
  }
  vTaskDelete( NULL );
}
You may find the links , in the code, useful.

Who is online

Users browsing this forum: No registered users and 44 guests