ESP32-S3学习笔记<6>:ADC的应用
1. 头文件包含
#include "hal/adc_types.h"
#include "esp_adc/adc_oneshot.h"
#include "esp_adc/adc_cali.h"
#include "esp_adc/adc_cali_scheme.h"
2. ADC的配置
ADC配置,主要分为三个步骤。首先配置ADC外设,然后配置ADC通道,最后初始化校准并获得通道校准句柄。
2.1 配置ADC外设
使用如下函数配置ADC外设:
esp_err_t adc_oneshot_new_unit(const adc_oneshot_unit_init_cfg_t *init_config, adc_oneshot_unit_handle_t *ret_unit);
第一个参数 init_config 的结构定义如下:
typedef struct {
adc_unit_t unit_id; ///< ADC unit
adc_oneshot_clk_src_t clk_src; ///< Clock source
adc_ulp_mode_t ulp_mode; ///< ADC controlled by ULP, see `adc_ulp_mode_t`
} adc_oneshot_unit_init_cfg_t;
第一个成员 unit_id 用于指定要配置哪个ADC。ESP32-S3有2个ADC外设可用。合法的选项有:
typedef enum {
ADC_UNIT_1, ///< SAR ADC 1
ADC_UNIT_2, ///< SAR ADC 2
} adc_unit_t;
第二个成员 clk_src 用于指定时钟源。实际上只有一个选项:
typedef enum {
ADC_RTC_CLK_SRC_RC_FAST = SOC_MOD_CLK_RC_FAST, /*!< Select RC_FAST as the source clock */
ADC_RTC_CLK_SRC_DEFAULT = SOC_MOD_CLK_RC_FAST, /*!< Select RC_FAST as the default clock choice */
} soc_periph_adc_rtc_clk_src_t;
第三个成员 ulp_mode 用于指定是否使用低功耗控制。不需要系统睡眠时ADC运行的话,使用第一个选项即可:
typedef enum {
ADC_ULP_MODE_DISABLE = 0, ///< ADC ULP mode is disabled
ADC_ULP_MODE_FSM = 1, ///< ADC is controlled by ULP FSM
ADC_ULP_MODE_RISCV = 2, ///< ADC is controlled by ULP RISCV
} adc_ulp_mode_t;
函数的第二个参数为出参数,创建成功时返回ADC外设单元的句柄。
2.2 配置ADC通道
ESP32-S3有2个ADC外设,每个ADC外设又支持10个通道输入。因此需要配置ADC量化哪个通道。一个ADC外设在某个时间点,是肯定只能转化一个通道的。但是驱动都将这些做好的。一个ADC可以添加多个通道。
使用如下的函数来指定ADC的通道。
esp_err_t adc_oneshot_config_channel(adc_oneshot_unit_handle_t handle, adc_channel_t channel, const adc_oneshot_chan_cfg_t *config);
第一个参数 handle ,是上一步配置ADC外设时返回的句柄。
第二个参数 channel,指定要将哪个通道加入到ADC外设上。可用的值如下面所示。注意硬件上,GPIO和ADC通道的对应关系。要查数据手册,明确硬件设计的需要ADC的GPIO对应的哪个ADC外设,以及哪个ADC通道。
typedef enum {
ADC_CHANNEL_0, ///< ADC channel
ADC_CHANNEL_1, ///< ADC channel
ADC_CHANNEL_2, ///< ADC channel
ADC_CHANNEL_3, ///< ADC channel
ADC_CHANNEL_4,

最低0.47元/天 解锁文章
1893

被折叠的 条评论
为什么被折叠?



