Files
esp-idf/examples/peripherals/adc/main/adc1_example_main.c
T

109 lines
3.4 KiB
C
Raw Normal View History

/* ADC1 Example
This example code is in the Public Domain (or CC0 licensed, at your option.)
Unless required by applicable law or agreed to in writing, this
software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
CONDITIONS OF ANY KIND, either express or implied.
*/
#include <stdio.h>
#include <stdlib.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "driver/adc.h"
#if CONFIG_IDF_TARGET_ESP32
#include "esp_adc_cal.h"
2019-06-20 16:13:47 +08:00
#endif
2018-01-24 17:22:13 +08:00
#define DEFAULT_VREF 1100 //Use adc2_vref_to_gpio() to obtain a better estimate
2018-02-13 20:47:18 +08:00
#define NO_OF_SAMPLES 64 //Multisampling
2018-01-24 17:22:13 +08:00
2019-06-20 16:13:47 +08:00
#if CONFIG_IDF_TARGET_ESP32
2018-02-13 20:47:18 +08:00
static esp_adc_cal_characteristics_t *adc_chars;
static const adc_channel_t channel = ADC_CHANNEL_6; //GPIO34 if ADC1, GPIO14 if ADC2
static const adc_bits_width_t width = ADC_WIDTH_BIT_12;
2020-01-17 11:47:08 +08:00
#elif CONFIG_IDF_TARGET_ESP32S2
2019-06-20 16:13:47 +08:00
static const adc_channel_t channel = ADC_CHANNEL_6; // GPIO7 if ADC1, GPIO17 if ADC2
static const adc_bits_width_t width = ADC_WIDTH_BIT_13;
2020-01-17 11:47:08 +08:00
#endif
2018-02-13 20:47:18 +08:00
static const adc_atten_t atten = ADC_ATTEN_DB_0;
static const adc_unit_t unit = ADC_UNIT_1;
2019-06-20 16:13:47 +08:00
#if CONFIG_IDF_TARGET_ESP32
static void check_efuse(void)
{
2018-02-13 20:47:18 +08:00
//Check TP is burned into eFuse
if (esp_adc_cal_check_efuse(ESP_ADC_CAL_VAL_EFUSE_TP) == ESP_OK) {
printf("eFuse Two Point: Supported\n");
} else {
printf("eFuse Two Point: NOT supported\n");
}
2018-01-24 17:22:13 +08:00
2018-02-13 20:47:18 +08:00
//Check Vref is burned into eFuse
if (esp_adc_cal_check_efuse(ESP_ADC_CAL_VAL_EFUSE_VREF) == ESP_OK) {
printf("eFuse Vref: Supported\n");
} else {
printf("eFuse Vref: NOT supported\n");
}
}
static void print_char_val_type(esp_adc_cal_value_t val_type)
{
if (val_type == ESP_ADC_CAL_VAL_EFUSE_TP) {
printf("Characterized using Two Point Value\n");
} else if (val_type == ESP_ADC_CAL_VAL_EFUSE_VREF) {
printf("Characterized using eFuse Vref\n");
} else {
printf("Characterized using Default Vref\n");
}
}
2019-06-20 16:13:47 +08:00
#endif
2018-01-24 17:22:13 +08:00
void app_main(void)
2018-02-13 20:47:18 +08:00
{
2019-06-20 16:13:47 +08:00
#if CONFIG_IDF_TARGET_ESP32
2018-02-13 20:47:18 +08:00
//Check if Two Point or Vref are burned into eFuse
check_efuse();
2019-06-20 16:13:47 +08:00
#endif
2018-01-24 17:22:13 +08:00
2018-02-13 20:47:18 +08:00
//Configure ADC
if (unit == ADC_UNIT_1) {
adc1_config_width(width);
2018-02-13 20:47:18 +08:00
adc1_config_channel_atten(channel, atten);
} else {
adc2_config_channel_atten((adc2_channel_t)channel, atten);
}
2018-01-24 17:22:13 +08:00
2019-06-20 16:13:47 +08:00
#if CONFIG_IDF_TARGET_ESP32
2018-02-13 20:47:18 +08:00
//Characterize ADC
adc_chars = calloc(1, sizeof(esp_adc_cal_characteristics_t));
esp_adc_cal_value_t val_type = esp_adc_cal_characterize(unit, atten, width, DEFAULT_VREF, adc_chars);
2018-02-13 20:47:18 +08:00
print_char_val_type(val_type);
2019-06-20 16:13:47 +08:00
#endif
2018-01-24 17:22:13 +08:00
//Continuously sample ADC1
2018-02-13 20:47:18 +08:00
while (1) {
uint32_t adc_reading = 0;
//Multisampling
for (int i = 0; i < NO_OF_SAMPLES; i++) {
if (unit == ADC_UNIT_1) {
adc_reading += adc1_get_raw((adc1_channel_t)channel);
} else {
int raw;
adc2_get_raw((adc2_channel_t)channel, width, &raw);
2018-02-13 20:47:18 +08:00
adc_reading += raw;
}
2018-01-24 17:22:13 +08:00
}
2018-02-13 20:47:18 +08:00
adc_reading /= NO_OF_SAMPLES;
2019-06-20 16:13:47 +08:00
#if CONFIG_IDF_TARGET_ESP32
2018-02-13 20:47:18 +08:00
//Convert adc_reading to voltage in mV
uint32_t voltage = esp_adc_cal_raw_to_voltage(adc_reading, adc_chars);
printf("Raw: %d\tVoltage: %dmV\n", adc_reading, voltage);
2020-01-17 11:47:08 +08:00
#elif CONFIG_IDF_TARGET_ESP32S2
printf("ADC%d CH%d Raw: %d\t\n", unit, channel, adc_reading);
2019-06-20 16:13:47 +08:00
#endif
vTaskDelay(pdMS_TO_TICKS(1000));
}
}