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和ADC2
adc_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 );
}
}