WiPy ADC
-
Hi all,
I'm having some issues with the embedded ADC function, and was hoping to get some insight. I need to measure 0-10v, so I put together a simple voltage divider to scale that down to 0-1
-My ADC is not registering different values, when fed 0.2v and 0.7v I received the same value.
-Stability/Timing? I notice that my ADC values sporadically drop. I have tried with and without a 100ms pause, and with a 100nf capacitor, but this does not seem to help.def checkpin(): time.sleep_ms(10) adc = ADC() adc_c = adc.channel(pin= 'P13', attn=ADC.ATTN_11DB) for i in range(10): time.sleep_ms(100) b = adc_c.voltage() time.sleep_ms(100) v = 3.3*b/4096 print(b,", ",v) time.sleep_ms(100)
An example output: (this does not change with different voltage input)
348 , 0.2803711 3134 , 2.524951 3134 , 2.524951 142 , 0.1144043 142 , 0.1144043 3134 , 2.524951 142 , 0.1144043 3134 , 2.524951 3134 , 2.524951 3134 , 2.524951
Any thoughts/suggestions would be much appreciated. I have a ADS7818 which I can try uart with, but I'm just trying to determine the easiest way to measure 0-10v ±0.1
Thank you
-
@b_rubble Here is a sample script using the ADS7818 with SPI:
# Drive the ADS7818 ADC using SPI # Connections: # xxPy | ADS7818 # -----|------- # P10 | CLK # P11 | CONV # P14 | DATA # from machine import SPI, Pin from ubinascii import hexlify spi = SPI(0, SPI.MASTER, baudrate=4000000, polarity=1, phase=1, bits=16) buf = bytearray(2) vref = 2.493 # measured at the ADS7818 while True: # start a conversion and get the result back spi.write_readinto(b"\xe0\x00", buf) # extract the raw ADC value and derive Voltage value = ((buf[0] << 8) | buf[1]) & 0xfff volt = 2.0 * vref * value / 4096 print(hexlify(buf), value, volt) res= input("Next: ") if res == "q": break
The conversion and reading back is done within the single spi.write_readinto() call. It is then easy to embed that in a small class.
Note: Since the ADS7818 runs at 5V, insert a resistor of 3.3k to 10k into the data line back into the ESP32 to limit the current into the ESD diodes.
-
@b_rubble You can use the built-in ADC is the noise does not matter or if you can ignore the lower 4 bits.
I have used an ADS1115 with an ESP8266, attached with I2C. It has a SMD package, but you can get modules at any size, down to a DIL8 pin layout. But this is a rather slow device. The ADS7818 is faster, and it should be possible to read that with SPI. UART won't work.
So I do not know your application needs, speed or precision.
-
@robert-hh thank you very much for your insight. I have actually used some of your previous posts to help troubleshoot other issues, so I definitely appreciate you taking the time to answer. I modified my script to just output value, voltage and fed in a fairly consistent 420mv (measured as 419-421mv through my fluke). Unfortunately it seems that even with calibration there would be too much noise for my uses. I continue to get very odd behavior, so I think I will use an off the shelf ADC to accomplish this task.
Do you have experience or suggestions for off the shelf converters? I don't have SMT capabilities with my current setup, but I do have a ADS7818 which I will try to use with UART.
Thank you
-
@b_rubble The call to adc_c.voltage() returns a voltage scaled in mV, depending on the attenuation factor you have selected. That is 11db, so the range is about 0-3.3V. if you want to get the raw ADC values, you have to call adc_c.value() or simply adc_c(). That will return a raw value in the range of 0-4096.
The ADC of the ESP32 is not very good. You get the best linearity at 6 dB attenuation, and the low offset is at about 70 mV.
I cannot tell whether you see this much changing values. Besides high noise and non-linearity I did never observe such changes. It may be related to external factors like your circuitry, sockets, ....
If I repeat the here on a LoPy4, I get plausible (albeit poor) values with you script, feeding 2V into P13. Note that only the first column is fine.1993 , 1.605688 2034 , 1.638721 1969 , 1.586352 1968 , 1.585547 1881 , 1.515454 1917 , 1.544458 1971 , 1.587964 1948 , 1.569434 2007 , 1.616968 1974 , 1.590381