Close
0%
0%

Increasing ADC resolution

Double GinTonic + some extra components = extra Bits
Includes working Arduino examples

Public Chat
Similar projects worth following
nBit unsigned to nBit signed with no impact on sampling rate. Also vertical increase in resolution. Never came across similar schematics & methods. What is it called if it exist? Do you have a link? Do I patent it? This is now expired and can be used https://patents.google.com/patent/US4333141 ? :D

Background https://en.wikipedia.org/wiki/Precision_rectifier and links

Proof of concept:

Tune the comparator for zero-crossing detection - this will give as a sign + or -
Rectify AC in to DC
Sign the ADC value depending on comparator output

This gives signed +10Bit and -10Bit values on arduino, so -1023...0...+1023 = 2048 = 10Bit + 1 = 11Bit Bipolar ADC! (haha, not quite 12Bit Uno(Due yes) & not quite x2 resolution as mentioned on GitHub :D)

The first op-amp is used as a comparator
The second amplifies the signal,
The last Two op-amps were used for rectifier: Figure 4  http://sound.whsites.net/appnotes/an001.htm (will upload pdf to files, just in case :D)

Binkin' pin #13 is the blue line on the scope(the sign), red is the rectified AC/DC Plotting float with added sign. See the Arduino sketch for more logic.

There must be a way to bias it out without the diodes :D Shout if you know ;)

--

ADDING VERTICAL RESOLUTION:

This time using PCF8591. Connect both inputs together, and internal 100kΩ resistors in series, then sum both results together. Sample rate decreases by 2 but, this doubles the numeric resolution from 256 to 512 and Bitwise resolution from 8 to 9Bit. Both ADCs should be synchronised and sample at the same time (in this example I did not bother)



FLASH ADC

Theoretical thoughts on Flash ADC and imaginary schematic
One could use any comparators, I selected linear LM3914 for simplicity
Not sure of LM3914 speed, also take into account logic propagation delays
Priority encoders don’t seem to mind the output of previous stages(see the truth table) and LM3914 has the capability of operating in DOT mode which might suggest power savings.
Lets asume two digits with a dot in between and a 10 Volt ref. 
7.4V on the input: the first flash would show 7 and produce binary representation of 7 on the output. We then increment 7 by 1 using 4Bit Binary Incrementer. Decode both values to analog and use it as a reference for the second flash stage to set the low and high Vref. The second flash should read 4, and display 7.4Volt. It would produce 4 & 4 bits, making it a nice 1 byte of data

The schematic is not tested, as I have no components, too poor and live in the kitchen on 24hour move out notice

The incrementer logic is made up of four half-adders http://letslearncomputing.blogspot.com/2013/03/digital-logic-4-bit-binary-incrementer.html

pcf8591Vertical9Bit.ino

Increasing vertical resolution

x-arduino - 572.00 bytes - 05/05/2018 at 01:54

Download

DoubleGinTonic.ino

Adding a sign

x-arduino - 705.00 bytes - 04/21/2018 at 22:46

Download

PrecisionRectifiers.pdf

Back up pdf where Figure 4 was used as Super Rectifier

Adobe Portable Document Format - 322.86 kB - 04/21/2018 at 22:26

Preview
Download

  • 1 × TL084 or faster Amplifier and Linear ICs / Operational Amplifiers
  • 3 × Fast diodes
  • 10 × 1 - 10k resistors
  • 1 × One or two 5v batteries
  • 2 × PCF8951 For vertical resolution 8 -> 9Bit or add 4 ADCs fot 10Bit

View project log

  • 1
    Arduino sketches

    Adding a sign

    float _raw;

    float _data;
    bool sign;
    float Volt;

    const int polarity = 7;

    void setup() {
      Serial.begin(115200);
      pinMode(polarity, INPUT);
      pinMode(LED_BUILTIN, OUTPUT);
    }

    //TODO two's compliment in asm

    void loop() {

      sign = digitalRead(polarity);
        _raw = (float) analogRead(A0);

      if(sign) {
        //_data = _raw * -1.0;
        Volt = _raw * (-5.0 / 1023.0);
        digitalWrite(LED_BUILTIN, HIGH);
      } else {
        //_data = _raw * 1.0;
        Volt = _raw * (5.0 / 1023.0);
        digitalWrite(LED_BUILTIN, LOW);
      }
      Serial.println(Volt);
    }

    --

    Increasing Vertical resolution:

    #include

    #define ADC1 (0x90 >> 1)
    #define ADC2 (0x92 >> 1)

    byte v0,v1;

    int adcSum;

    void setup() {
      Serial.begin(9600);
      Wire.begin();
     
      Wire.beginTransmission(ADC1);
      Wire.write(0x40);
      Wire.endTransmission(false);

      Wire.beginTransmission(ADC2);
      Wire.write(0x40);
      Wire.endTransmission(false);
    }

    void loop() {  
      Wire.requestFrom(ADC1, 1);
      v1 = Wire.read();
        Wire.requestFrom(ADC2, 1);
      v2 = Wire.read();

      adcSum = v1 + v2;
      Serial.print(v1);Serial.print(",");
      Serial.print(v2);Serial.print(",");
      Serial.println(adcSum);
    }

View all instructions

Enjoy this project?

Share

Discussions

Gintaras Valatka wrote 05/10/2018 at 13:14 point

Changing the world Bit by Bit :D https://hackaday.com/2018/05/07/double-the-resolution-from-an-arduino-adc/

Unfortunately, I have to go begging for food first, before I can continue. Be patient. 

To be continued...

  Are you sure? yes | no

Gintaras Valatka wrote 04/23/2018 at 10:52 point

Thanks for the shout, by n-bits I meant whatever your resolution is + 1Bit
This gives you a sign, allowing from -1023 to +1023 instead of 0 to +1023

  Are you sure? yes | no

Gabriel wrote 04/23/2018 at 17:03 point

In retrospect, You might actually be right. The full wave is not compressed into 1023 steps but 2x1023 step readings... seems legit.

Get more data!

  Are you sure? yes | no

Gabriel wrote 04/22/2018 at 16:06 point

Hmmm interesting, but I dont think you have achieved any more resolution than you originally had, maybe even lost a bit.

You have created a way to offset the voltage and sample everything on the positive side.

Cool for interfacing AC signals but no ADC resolution increase.

For to increase resolution by n-bits you should look at Oversampling and Decimation.

  Are you sure? yes | no

Similar Projects

Does this project spark your interest?

Become a member to follow this project and never miss any updates