mirror of
				https://github.com/0xFEEDC0DE64/arduino-esp32.git
				synced 2025-10-30 21:51:40 +01:00 
			
		
		
		
	
		
			
	
	
		
			154 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			154 lines
		
	
	
		
			6.2 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.
 | ||
|  | 
 | ||
|  | #ifndef __ESP_ADC_CAL_H__
 | ||
|  | #define __ESP_ADC_CAL_H__
 | ||
|  | 
 | ||
|  | #ifdef __cplusplus
 | ||
|  | extern "C" { | ||
|  | #endif
 | ||
|  | 
 | ||
|  | #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); | ||
|  | 
 | ||
|  | #ifdef __cplusplus
 | ||
|  | } | ||
|  | #endif
 | ||
|  | 
 | ||
|  | #endif /* __ESP_ADC_CAL_H__ */
 |