mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-31 07:03:55 +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:
		| @@ -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); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user