ESP32(二) ADC
理论
ESP32c3 的 ADC 分为两个单元, 我们这里使用了单元 1 .
步骤
- 设置 ADC 位宽
- 设置 ADC 通道衰减
- 为使用的 ADC 单元设置 ADC 矫正
- 取得 ADC 数值
- ADC 转化电压
代码
至于esp_adc_cal_characterize()
的 3300 这个数值其实没有任何作用的,因为ADC_ATTEN_DB_12
这个变量已经设置了衰减,也就是规定了 ADC 的基准电压 .
#include "sdkconfig.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/adc.h"
#include "esp_adc_cal.h"
static esp_adc_cal_characteristics_t *adc_chars;
void app_main(void){
adc1_config_width(ADC_WIDTH_BIT_12);
adc1_config_channel_atten( ADC1_CHANNEL_0,ADC_ATTEN_DB_12);
adc1_config_channel_atten( ADC1_CHANNEL_1,ADC_ATTEN_DB_12);
adc1_config_channel_atten( ADC1_CHANNEL_2,ADC_ATTEN_DB_12);
adc1_config_channel_atten( ADC1_CHANNEL_3,ADC_ATTEN_DB_12);
adc1_config_channel_atten( ADC1_CHANNEL_4,ADC_ATTEN_DB_12);
adc_chars = calloc(1, sizeof(esp_adc_cal_characteristics_t));
esp_adc_cal_characterize(ADC_UNIT_1, ADC_ATTEN_DB_12, ADC_WIDTH_BIT_12, 3300, adc_chars);
while(1){
vTaskDelay(200 / portTICK_PERIOD_MS);
int read_raw_1 = adc1_get_raw(ADC1_CHANNEL_0); //GPIO1
int read_raw_2 = adc1_get_raw(ADC1_CHANNEL_1); //gpio2
int read_raw_3 = adc1_get_raw(ADC1_CHANNEL_2); //gpio3
int read_raw_4 = adc1_get_raw(ADC1_CHANNEL_3); //gpio3
int read_raw_5 = adc1_get_raw(ADC1_CHANNEL_4); //gpio3
float voltage_1 = (float)(esp_adc_cal_raw_to_voltage(read_raw_1, adc_chars))/1000.0f;
float voltage_2 = (float)(esp_adc_cal_raw_to_voltage(read_raw_2, adc_chars))/1000.0f;
float voltage_3 = (float)(esp_adc_cal_raw_to_voltage(read_raw_3, adc_chars))/1000.0f;
float voltage_4 = (float)(esp_adc_cal_raw_to_voltage(read_raw_4, adc_chars))/1000.0f;
float voltage_5 = (float)(esp_adc_cal_raw_to_voltage(read_raw_5, adc_chars))/500.0f;
printf("voltage1 = %.2f\t"
"voltage2 = %.2f\t"
"voltage3 = %.2f\t"
"voltage4 = %.2f\t"
"voltage5 = %.2f\n",voltage_1,voltage_2,voltage_3,voltage_4,voltage_5);
}
}
License:
CC BY 4.0