88b05f9391
Added component containg API that is able to correct raw ADC readings into a voltage in mV. Also provided a helper function that combines the process of getting the raw ADC1 reading then converting it to a voltage in mV. In doing so, the adc1_get_voltage() function of the ADC driver has been deprecated. Instead there is now adc1_get_raw to obtain the raw ADC1 reading, and adc1_to_voltage() that gets the raw reading and converts all in one function. Functions using the deprecated adc1_get_voltage() have also been updated to use adc1_get_raw(). Conversion is based on ADC characteristics. The characteristics are based on the ADC's v_ref, herefore the appropriate structure and functions have been provided to obtain the ADC characteristics. The existing ADC driver has also been modified by adding a function to route the internal ADC reference voltage to a GPIO allowing users to measure it manually. Relevant documentation has also been updated
141 lines
6 KiB
C
141 lines
6 KiB
C
// Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
#include <stdint.h>
|
|
#include "driver/adc.h"
|
|
|
|
/** @cond */
|
|
#define ADC_CAL_GAIN_SCALE 16
|
|
#define ADC_CAL_OFFSET_SCALE 10
|
|
|
|
#define ADC_CAL_IDEAL_V_REF 1100 //In mV
|
|
#define ADC_CAL_LOW_V_REF 1000
|
|
#define ADC_CAL_HIGH_V_REF 1200
|
|
#define ADC_CAL_MIN 0
|
|
#define ADC_CAL_MAX 4095
|
|
/** @endcond */
|
|
|
|
/**
|
|
* @brief Structure storing Lookup Table
|
|
*
|
|
* The Lookup Tables (LUT) of a given attenuation contains 33 equally spaced
|
|
* points. The Gain and Offset curves are used to find the appopriate gain and
|
|
* offset factor given a reference voltage v_ref.
|
|
*
|
|
* @note A seperate LUT is provided for each attenuation and are defined in
|
|
* esp_adc_cal_lookup_tables.c
|
|
*/
|
|
typedef struct {
|
|
uint32_t gain_m; /**<Gradient of Gain Curve */
|
|
uint32_t gain_c; /**<Offset of Gain Curve */
|
|
uint32_t offset_m; /**<Gradient of Offset Curve */
|
|
uint32_t offset_c; /**<Offset of Offset Curve */
|
|
uint32_t bit_shift; /**<Bit shift used find corresponding LUT points
|
|
given an ADC reading*/
|
|
uint32_t voltage[]; /**<Array of voltages in mV representing the
|
|
ADC-Voltage curve */
|
|
} esp_adc_cal_lookup_table_t;
|
|
|
|
/**
|
|
* @brief Structure storing ADC characteristics of given v_ref
|
|
*
|
|
* The ADC Characteristics structure stores the gain and offset factors of an
|
|
* ESP32 module's ADC. These factors are calculated using the reference voltage,
|
|
* and the Gain and Offset curves provided in the lookup tables.
|
|
*
|
|
* @note Call esp_adc_cal_get_characteristics() to initialize the structure
|
|
*
|
|
*/
|
|
typedef struct {
|
|
uint32_t v_ref; /**<Reference Voltage of current ESP32 Module in mV*/
|
|
uint32_t gain; /**<Scaling factor used to correct LUT voltages to
|
|
current v_ref. Bit shifted by << ADC_CAL_GAIN_SCALE
|
|
for uint32 arithmetic */
|
|
uint32_t offset; /**<Offset in mV used to correct LUT Voltages to current v_ref */
|
|
uint32_t ideal_offset; /**<Offset in mV at the ideal reference voltage */
|
|
adc_bits_width_t bit_width; /**<Bit width of ADC e.g. ADC_WIDTH_12Bit */
|
|
const esp_adc_cal_lookup_table_t *table; /**<Pointer to LUT */
|
|
} esp_adc_cal_characteristics_t;
|
|
|
|
extern const esp_adc_cal_lookup_table_t esp_adc_cal_table_atten_0; /**<LUT for atten0 */
|
|
extern const esp_adc_cal_lookup_table_t esp_adc_cal_table_atten_1; /**<LUT for atten1 */
|
|
extern const esp_adc_cal_lookup_table_t esp_adc_cal_table_atten_2; /**<LUT for atten2 */
|
|
extern const esp_adc_cal_lookup_table_t esp_adc_cal_table_atten_3; /**<LUT for atten3 */
|
|
|
|
/**
|
|
* @brief Calculate characteristics of ADC
|
|
*
|
|
* This function will calculate the gain and offset factors based on the
|
|
* reference voltage parameter and the Gain and Offset curve provided in the LUT.
|
|
*
|
|
* @note reference voltage of the ADCs can be routed to GPIO using
|
|
* adc2_vref_to_gpio() from the ADC driver
|
|
*
|
|
* @note The LUT members have been bit shifted by ADC_CAL_GAIN_SCALE or
|
|
* ADC_CAL_OFFSET_SCALE to make them uint32_t compatible. This bit shifting will
|
|
* accounted for in this function
|
|
*
|
|
* @param[in] v_ref true reference voltage of the ADC in mV (1000 to 1200mV). Nominal
|
|
* value for reference voltage is 1100mV.
|
|
* @param[in] atten attenuation setting used to select the corresponding lookup table
|
|
* @param[in] bit_width bit width of ADC
|
|
* @param[out] chars pointer to structure used to store ADC characteristics of module
|
|
*/
|
|
void esp_adc_cal_get_characteristics(uint32_t v_ref,
|
|
adc_atten_t atten,
|
|
adc_bits_width_t bit_width,
|
|
esp_adc_cal_characteristics_t *chars);
|
|
|
|
/**
|
|
* @brief Convert raw ADC reading to voltage in mV
|
|
*
|
|
* This function converts a raw ADC reading to a voltage in mV. This conversion
|
|
* is based on the ADC's characteristics. The raw ADC reading is referenced
|
|
* against the LUT (pointed to inside characteristics struct) to obtain a voltage.
|
|
* Gain and offset factors are then applied to the voltage in order to obtain
|
|
* the final result.
|
|
*
|
|
* @param[in] adc ADC reading (different bit widths will be handled)
|
|
* @param[in] chars pointer to structure containing ADC characteristics of
|
|
* the module. Structure also contains pointer to the
|
|
* corresponding LUT
|
|
*
|
|
* @return Calculated voltage in mV
|
|
*
|
|
* @note characteristics structure must be initialized using
|
|
* esp_adc_cal_get_characteristics() before this function is used
|
|
*/
|
|
uint32_t esp_adc_cal_raw_to_voltage(uint32_t adc,
|
|
const esp_adc_cal_characteristics_t *chars);
|
|
|
|
/**
|
|
* @brief Reads ADC1 and returns voltage in mV
|
|
*
|
|
* This function reads the ADC1 using adc1_get_raw() to obtain a raw ADC
|
|
* reading. The reading is then converted into a voltage value using
|
|
* esp_adc_cal_raw_to_voltage().
|
|
*
|
|
* @param[in] channel Channel of ADC1 to measure
|
|
* @param[in] chars Pointer to ADC characteristics struct
|
|
*
|
|
* @return voltage Calculated voltage in mV
|
|
*
|
|
* @note ADC must be initialized using adc1_config_width() and
|
|
* adc1_config_channel_atten() before this function is used
|
|
*
|
|
* @note characteristics structure must be initialized using
|
|
* esp_adc_cal_get_characteristics() before this function is used
|
|
*/
|
|
uint32_t adc1_to_voltage(adc1_channel_t channel, const esp_adc_cal_characteristics_t *chars);
|
|
|