mirror of
https://github.com/esphome/esphome.git
synced 2025-07-29 14:46:40 +00:00
[adc] Add ESP32-C5 support (#9486)
Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Co-authored-by: oxynatOr <98734567+oxynatOr@users.noreply.github.com> Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com>
This commit is contained in:
parent
9e621a1769
commit
78c32eac04
@ -5,6 +5,7 @@ from esphome.components.esp32.const import (
|
|||||||
VARIANT_ESP32,
|
VARIANT_ESP32,
|
||||||
VARIANT_ESP32C2,
|
VARIANT_ESP32C2,
|
||||||
VARIANT_ESP32C3,
|
VARIANT_ESP32C3,
|
||||||
|
VARIANT_ESP32C5,
|
||||||
VARIANT_ESP32C6,
|
VARIANT_ESP32C6,
|
||||||
VARIANT_ESP32H2,
|
VARIANT_ESP32H2,
|
||||||
VARIANT_ESP32S2,
|
VARIANT_ESP32S2,
|
||||||
@ -85,6 +86,16 @@ ESP32_VARIANT_ADC1_PIN_TO_CHANNEL = {
|
|||||||
3: adc_channel_t.ADC_CHANNEL_3,
|
3: adc_channel_t.ADC_CHANNEL_3,
|
||||||
4: adc_channel_t.ADC_CHANNEL_4,
|
4: adc_channel_t.ADC_CHANNEL_4,
|
||||||
},
|
},
|
||||||
|
# ESP32-C5 ADC1 pin mapping - based on official ESP-IDF documentation
|
||||||
|
# https://docs.espressif.com/projects/esp-idf/en/latest/esp32c5/api-reference/peripherals/gpio.html
|
||||||
|
VARIANT_ESP32C5: {
|
||||||
|
1: adc_channel_t.ADC_CHANNEL_0,
|
||||||
|
2: adc_channel_t.ADC_CHANNEL_1,
|
||||||
|
3: adc_channel_t.ADC_CHANNEL_2,
|
||||||
|
4: adc_channel_t.ADC_CHANNEL_3,
|
||||||
|
5: adc_channel_t.ADC_CHANNEL_4,
|
||||||
|
6: adc_channel_t.ADC_CHANNEL_5,
|
||||||
|
},
|
||||||
# https://github.com/espressif/esp-idf/blob/master/components/soc/esp32c6/include/soc/adc_channel.h
|
# https://github.com/espressif/esp-idf/blob/master/components/soc/esp32c6/include/soc/adc_channel.h
|
||||||
VARIANT_ESP32C6: {
|
VARIANT_ESP32C6: {
|
||||||
0: adc_channel_t.ADC_CHANNEL_0,
|
0: adc_channel_t.ADC_CHANNEL_0,
|
||||||
@ -155,6 +166,8 @@ ESP32_VARIANT_ADC2_PIN_TO_CHANNEL = {
|
|||||||
VARIANT_ESP32C3: {
|
VARIANT_ESP32C3: {
|
||||||
5: adc_channel_t.ADC_CHANNEL_0,
|
5: adc_channel_t.ADC_CHANNEL_0,
|
||||||
},
|
},
|
||||||
|
# ESP32-C5 has no ADC2 channels
|
||||||
|
VARIANT_ESP32C5: {}, # no ADC2
|
||||||
# https://github.com/espressif/esp-idf/blob/master/components/soc/esp32c6/include/soc/adc_channel.h
|
# https://github.com/espressif/esp-idf/blob/master/components/soc/esp32c6/include/soc/adc_channel.h
|
||||||
VARIANT_ESP32C6: {}, # no ADC2
|
VARIANT_ESP32C6: {}, # no ADC2
|
||||||
# https://github.com/espressif/esp-idf/blob/master/components/soc/esp32h2/include/soc/adc_channel.h
|
# https://github.com/espressif/esp-idf/blob/master/components/soc/esp32h2/include/soc/adc_channel.h
|
||||||
|
@ -104,9 +104,10 @@ class ADCSensor : public sensor::Sensor, public PollingComponent, public voltage
|
|||||||
/// @param attenuation The desired ADC attenuation level (e.g., ADC_ATTEN_DB_0, ADC_ATTEN_DB_11).
|
/// @param attenuation The desired ADC attenuation level (e.g., ADC_ATTEN_DB_0, ADC_ATTEN_DB_11).
|
||||||
void set_attenuation(adc_atten_t attenuation) { this->attenuation_ = attenuation; }
|
void set_attenuation(adc_atten_t attenuation) { this->attenuation_ = attenuation; }
|
||||||
|
|
||||||
/// Configure the ADC to use a specific channel on ADC1.
|
/// Configure the ADC to use a specific channel on a specific ADC unit.
|
||||||
/// This sets the channel for single-shot or continuous ADC measurements.
|
/// This sets the channel for single-shot or continuous ADC measurements.
|
||||||
/// @param channel The ADC1 channel to configure, such as ADC_CHANNEL_0, ADC_CHANNEL_3, etc.
|
/// @param unit The ADC unit to use (ADC_UNIT_1 or ADC_UNIT_2).
|
||||||
|
/// @param channel The ADC channel to configure, such as ADC_CHANNEL_0, ADC_CHANNEL_3, etc.
|
||||||
void set_channel(adc_unit_t unit, adc_channel_t channel) {
|
void set_channel(adc_unit_t unit, adc_channel_t channel) {
|
||||||
this->adc_unit_ = unit;
|
this->adc_unit_ = unit;
|
||||||
this->channel_ = channel;
|
this->channel_ = channel;
|
||||||
|
@ -43,9 +43,10 @@ void ADCSensor::setup() {
|
|||||||
adc_oneshot_unit_init_cfg_t init_config = {}; // Zero initialize
|
adc_oneshot_unit_init_cfg_t init_config = {}; // Zero initialize
|
||||||
init_config.unit_id = this->adc_unit_;
|
init_config.unit_id = this->adc_unit_;
|
||||||
init_config.ulp_mode = ADC_ULP_MODE_DISABLE;
|
init_config.ulp_mode = ADC_ULP_MODE_DISABLE;
|
||||||
#if USE_ESP32_VARIANT_ESP32C3 || USE_ESP32_VARIANT_ESP32C6 || USE_ESP32_VARIANT_ESP32H2
|
#if USE_ESP32_VARIANT_ESP32C3 || USE_ESP32_VARIANT_ESP32C5 || USE_ESP32_VARIANT_ESP32C6 || USE_ESP32_VARIANT_ESP32H2
|
||||||
init_config.clk_src = ADC_DIGI_CLK_SRC_DEFAULT;
|
init_config.clk_src = ADC_DIGI_CLK_SRC_DEFAULT;
|
||||||
#endif // USE_ESP32_VARIANT_ESP32C3 || USE_ESP32_VARIANT_ESP32C6 || USE_ESP32_VARIANT_ESP32H2
|
#endif // USE_ESP32_VARIANT_ESP32C3 || USE_ESP32_VARIANT_ESP32C5 || USE_ESP32_VARIANT_ESP32C6 ||
|
||||||
|
// USE_ESP32_VARIANT_ESP32H2
|
||||||
esp_err_t err = adc_oneshot_new_unit(&init_config, &ADCSensor::shared_adc_handles[this->adc_unit_]);
|
esp_err_t err = adc_oneshot_new_unit(&init_config, &ADCSensor::shared_adc_handles[this->adc_unit_]);
|
||||||
if (err != ESP_OK) {
|
if (err != ESP_OK) {
|
||||||
ESP_LOGE(TAG, "Error initializing %s: %d", LOG_STR_ARG(adc_unit_to_str(this->adc_unit_)), err);
|
ESP_LOGE(TAG, "Error initializing %s: %d", LOG_STR_ARG(adc_unit_to_str(this->adc_unit_)), err);
|
||||||
@ -74,7 +75,8 @@ void ADCSensor::setup() {
|
|||||||
adc_cali_handle_t handle = nullptr;
|
adc_cali_handle_t handle = nullptr;
|
||||||
esp_err_t err;
|
esp_err_t err;
|
||||||
|
|
||||||
#if USE_ESP32_VARIANT_ESP32C3 || USE_ESP32_VARIANT_ESP32C6 || USE_ESP32_VARIANT_ESP32S3 || USE_ESP32_VARIANT_ESP32H2
|
#if USE_ESP32_VARIANT_ESP32C3 || USE_ESP32_VARIANT_ESP32C5 || USE_ESP32_VARIANT_ESP32C6 || \
|
||||||
|
USE_ESP32_VARIANT_ESP32S3 || USE_ESP32_VARIANT_ESP32H2
|
||||||
// RISC-V variants and S3 use curve fitting calibration
|
// RISC-V variants and S3 use curve fitting calibration
|
||||||
adc_cali_curve_fitting_config_t cali_config = {}; // Zero initialize first
|
adc_cali_curve_fitting_config_t cali_config = {}; // Zero initialize first
|
||||||
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 3, 0)
|
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 3, 0)
|
||||||
@ -111,7 +113,7 @@ void ADCSensor::setup() {
|
|||||||
ESP_LOGW(TAG, "Line fitting calibration failed with error %d, will use uncalibrated readings", err);
|
ESP_LOGW(TAG, "Line fitting calibration failed with error %d, will use uncalibrated readings", err);
|
||||||
this->setup_flags_.calibration_complete = false;
|
this->setup_flags_.calibration_complete = false;
|
||||||
}
|
}
|
||||||
#endif // USE_ESP32_VARIANT_ESP32C3 || ESP32C6 || ESP32S3 || ESP32H2
|
#endif // USE_ESP32_VARIANT_ESP32C3 || ESP32C5 || ESP32C6 || ESP32S3 || ESP32H2
|
||||||
}
|
}
|
||||||
|
|
||||||
this->setup_flags_.init_complete = true;
|
this->setup_flags_.init_complete = true;
|
||||||
@ -185,11 +187,12 @@ float ADCSensor::sample_fixed_attenuation_() {
|
|||||||
} else {
|
} else {
|
||||||
ESP_LOGW(TAG, "ADC calibration conversion failed with error %d, disabling calibration", err);
|
ESP_LOGW(TAG, "ADC calibration conversion failed with error %d, disabling calibration", err);
|
||||||
if (this->calibration_handle_ != nullptr) {
|
if (this->calibration_handle_ != nullptr) {
|
||||||
#if USE_ESP32_VARIANT_ESP32C3 || USE_ESP32_VARIANT_ESP32C6 || USE_ESP32_VARIANT_ESP32S3 || USE_ESP32_VARIANT_ESP32H2
|
#if USE_ESP32_VARIANT_ESP32C3 || USE_ESP32_VARIANT_ESP32C5 || USE_ESP32_VARIANT_ESP32C6 || \
|
||||||
|
USE_ESP32_VARIANT_ESP32S3 || USE_ESP32_VARIANT_ESP32H2
|
||||||
adc_cali_delete_scheme_curve_fitting(this->calibration_handle_);
|
adc_cali_delete_scheme_curve_fitting(this->calibration_handle_);
|
||||||
#else // Other ESP32 variants use line fitting calibration
|
#else // Other ESP32 variants use line fitting calibration
|
||||||
adc_cali_delete_scheme_line_fitting(this->calibration_handle_);
|
adc_cali_delete_scheme_line_fitting(this->calibration_handle_);
|
||||||
#endif // USE_ESP32_VARIANT_ESP32C3 || ESP32C6 || ESP32S3 || ESP32H2
|
#endif // USE_ESP32_VARIANT_ESP32C3 || ESP32C5 || ESP32C6 || ESP32S3 || ESP32H2
|
||||||
this->calibration_handle_ = nullptr;
|
this->calibration_handle_ = nullptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -217,7 +220,8 @@ float ADCSensor::sample_autorange_() {
|
|||||||
// Need to recalibrate for the new attenuation
|
// Need to recalibrate for the new attenuation
|
||||||
if (this->calibration_handle_ != nullptr) {
|
if (this->calibration_handle_ != nullptr) {
|
||||||
// Delete old calibration handle
|
// Delete old calibration handle
|
||||||
#if USE_ESP32_VARIANT_ESP32C3 || USE_ESP32_VARIANT_ESP32C6 || USE_ESP32_VARIANT_ESP32S3 || USE_ESP32_VARIANT_ESP32H2
|
#if USE_ESP32_VARIANT_ESP32C3 || USE_ESP32_VARIANT_ESP32C5 || USE_ESP32_VARIANT_ESP32C6 || \
|
||||||
|
USE_ESP32_VARIANT_ESP32S3 || USE_ESP32_VARIANT_ESP32H2
|
||||||
adc_cali_delete_scheme_curve_fitting(this->calibration_handle_);
|
adc_cali_delete_scheme_curve_fitting(this->calibration_handle_);
|
||||||
#else
|
#else
|
||||||
adc_cali_delete_scheme_line_fitting(this->calibration_handle_);
|
adc_cali_delete_scheme_line_fitting(this->calibration_handle_);
|
||||||
@ -228,7 +232,8 @@ float ADCSensor::sample_autorange_() {
|
|||||||
// Create new calibration handle for this attenuation
|
// Create new calibration handle for this attenuation
|
||||||
adc_cali_handle_t handle = nullptr;
|
adc_cali_handle_t handle = nullptr;
|
||||||
|
|
||||||
#if USE_ESP32_VARIANT_ESP32C3 || USE_ESP32_VARIANT_ESP32C6 || USE_ESP32_VARIANT_ESP32S3 || USE_ESP32_VARIANT_ESP32H2
|
#if USE_ESP32_VARIANT_ESP32C3 || USE_ESP32_VARIANT_ESP32C5 || USE_ESP32_VARIANT_ESP32C6 || \
|
||||||
|
USE_ESP32_VARIANT_ESP32S3 || USE_ESP32_VARIANT_ESP32H2
|
||||||
adc_cali_curve_fitting_config_t cali_config = {};
|
adc_cali_curve_fitting_config_t cali_config = {};
|
||||||
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 3, 0)
|
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 3, 0)
|
||||||
cali_config.chan = this->channel_;
|
cali_config.chan = this->channel_;
|
||||||
@ -256,7 +261,8 @@ float ADCSensor::sample_autorange_() {
|
|||||||
if (err != ESP_OK) {
|
if (err != ESP_OK) {
|
||||||
ESP_LOGW(TAG, "ADC read failed in autorange with error %d", err);
|
ESP_LOGW(TAG, "ADC read failed in autorange with error %d", err);
|
||||||
if (handle != nullptr) {
|
if (handle != nullptr) {
|
||||||
#if USE_ESP32_VARIANT_ESP32C3 || USE_ESP32_VARIANT_ESP32C6 || USE_ESP32_VARIANT_ESP32S3 || USE_ESP32_VARIANT_ESP32H2
|
#if USE_ESP32_VARIANT_ESP32C3 || USE_ESP32_VARIANT_ESP32C5 || USE_ESP32_VARIANT_ESP32C6 || \
|
||||||
|
USE_ESP32_VARIANT_ESP32S3 || USE_ESP32_VARIANT_ESP32H2
|
||||||
adc_cali_delete_scheme_curve_fitting(handle);
|
adc_cali_delete_scheme_curve_fitting(handle);
|
||||||
#else
|
#else
|
||||||
adc_cali_delete_scheme_line_fitting(handle);
|
adc_cali_delete_scheme_line_fitting(handle);
|
||||||
@ -275,7 +281,8 @@ float ADCSensor::sample_autorange_() {
|
|||||||
voltage = raw * 3.3f / 4095.0f;
|
voltage = raw * 3.3f / 4095.0f;
|
||||||
}
|
}
|
||||||
// Clean up calibration handle
|
// Clean up calibration handle
|
||||||
#if USE_ESP32_VARIANT_ESP32C3 || USE_ESP32_VARIANT_ESP32C6 || USE_ESP32_VARIANT_ESP32S3 || USE_ESP32_VARIANT_ESP32H2
|
#if USE_ESP32_VARIANT_ESP32C3 || USE_ESP32_VARIANT_ESP32C5 || USE_ESP32_VARIANT_ESP32C6 || \
|
||||||
|
USE_ESP32_VARIANT_ESP32S3 || USE_ESP32_VARIANT_ESP32H2
|
||||||
adc_cali_delete_scheme_curve_fitting(handle);
|
adc_cali_delete_scheme_curve_fitting(handle);
|
||||||
#else
|
#else
|
||||||
adc_cali_delete_scheme_line_fitting(handle);
|
adc_cali_delete_scheme_line_fitting(handle);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user