Skip to content

matthias-bs/MicroPython-ADC_Cal

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

96 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

formatting: lint GitHub release

MicroPython-ADC_Cal

MicroPython ESP32 library for calibrated on-chip ADC conversion

Please refer to ESP32 documentation for maximum ADC input voltage ratings!!!

The Espressif IDF API Reference describes the limitations of the ESP32's built-in analog-to-digital converter - and provides a (partial) solution in terms of providing a method for improving its accuracy by using a chip specific calibration value (or two calibration values, respectively) stored in the efuse. It also provides useful information regarding noise mitigation and the suggested range of input voltages in each mode.

This ADC calibration scheme is (in parts) provided by the ADC1Cal class.

The following restriction applies:

  • Only V_ref calibration mode is supported
    (This is due to the fact that the author does not have a proper ESP32 device to test two point calibration mode.)

ADC1Cal extends MicroPython's ESP32 machine.ADC class. Please refer to the MicroPython ESP32 ADC documentation for methods and attributes inherited from the ADC class.

Attributes:
    name (string):      instance name (for debugging)
    vref (int):         ADC reference voltage in mV (from efuse calibration data or supplied by programmer)

Methods:
    @property
    voltage()
        Get voltage measurement [mV]

        Returns:
            float: voltage [mV]
    
    __str__()
        Dump object info as a string
        
        Returns:
            string: "Name: <n>  width: <w>, attenuation: <a>, raw value: <raw>, value: <voltage>"

Usage example:

    from machine import Pin
    import adc1_cal
    
    ADC_PIN   = 35                # ADC input pin no.
    DIV       = 1                 # div = V_measured / V_input; here: no input divider
    AVERAGING = 10                # no. of samples for averaging (default: 10)
    
    # vref = None -> V_ref calibration value is read from efuse
    ubatt = ADC1Cal(Pin(ADC_PIN, Pin.IN), DIV, None, AVERAGING, "ADC1 Calibrated")
    
    # set ADC result width
    ubatt.width(ADC.WIDTH_10BIT)

    # set attenuation
    ubatt.atten(ADC.ATTN_6DB)

    print('ADC Vref: {:4}mV'.format(ubatt.vref))

    print('Voltage:  {:4.1f}mV'.format(ubatt.voltage))