ADC采样即模数转换器,将模拟数据转换为数字数据。为什么要做这样的转化呢?想想原因是啥呢?对单片机来说肯定是数字信号处理方便啊。用ADC的话单片机肯定好处理一些,外界的数据肯定是不一样的,那么我们转换的话肯定是转成数字信号比较方便运算处理。那么我们进行接下来的操作步骤:
1.资源分配
ADC采样的时候需要先进行资源分配,看一下相关函数:
esp_err_t adc_oneshot_new_unit(const adc_oneshot_unit_init_cfg_t *init_config, adc_oneshot_unit_handle_t *ret_unit)
参数1:const adc_oneshot_unit_init_cfg_t *init_config,显然是我们的我们的配置内容,内容分别是
typedef struct {adc_unit_t unit_id; //选择ADC组,ESP32C3开发板有ADC1和ADC2adc_oneshot_clk_src_t clk_src; //选择时钟源adc_ulp_mode_t ulp_mode; //选择是否使用低功耗模式
} adc_oneshot_unit_init_cfg_t;
参数2:dc_oneshot_unit_handle_t *ret_unit这个参数是ADC的handle
2.配置通道
因为ADC转换器有多个通道,所以我们需要配置相应的通道才能准确的告诉单片机是哪个引脚,根据下图我们使用ADC1的通道0
esp_err_t adc_oneshot_config_channel(adc_oneshot_unit_handle_t handle, adc_channel_t channel, const adc_oneshot_chan_cfg_t *config)
参数1:ADC的句柄
参数2:通道号
参数3:对ADC通道的配置
综合来说对ADC1的配置如下:
void ADC_config_init(void)
{const adc_oneshot_unit_init_cfg_t initadc_config={.clk_src=SOC_MOD_CLK_APB,.ulp_mode=ADC_ULP_MODE_DISABLE,.unit_id=ADC_UNIT_1};adc_oneshot_new_unit(&initadc_config, &adc_return);const adc_oneshot_chan_cfg_t chanle_config={.atten= ADC_ATTEN_DB_11, .bitwidth=ADC_BITWIDTH_12};adc_oneshot_config_channel(adc_return, ADC_CHANNEL_0,& chanle_config);
}
下面是读取的ADC值的代码:
adc_int_t ADC_get_value(void )
{adc_int_t out_raw;adc_oneshot_read(adc_return, ADC_CHANNEL_0, &out_raw);return out_raw;}
接下来到主函数中去调用:
extern "C" void app_main(void)
{ADC_config_init();int adc_value=0;while(1)
{adc_value=ADC_get_value();ESP_LOGI(TAG,"ADC_value%d",adc_value);vTaskDelay(10 );}}