2个12位的ADC,共计18通道,ADC2比较特殊的一点就是:ADC2和wifi共用,wifi的优先级更高,所以ADC2只有在WIFI模块不用的情况下好使;

在读取ADC数据之前,必须先对ADC进行设置,然后才可以读出数据,设置的示例代码如下:

//Configure ADC
if (unit == ADC_UNIT_1) {
  adc1_config_width(ADC_WIDTH_BIT_12);
  adc1_config_channel_atten(channel, atten);
} else {
  adc2_config_channel_atten((adc2_channel_t)channel, atten);
}

可以很明显对比出ADC1和ADC2的初始化是不一样的,ADC2知己设置通道&衰减之后就可以用了,通道2没有设置宽度,以后咱们就直接按照示例来用就可以,我也不知道为什么;

The reading width of ADC2 is configured every time you take the reading.这是官方给出的原因,说是每次读ADC2数据之前的时候设置ADC2的宽度;

经过上述的设置之后就可以读取ADC的数据了,读取数据的函数如下: adc1_get_raw() and adc2_get_raw()

这里需要特别注意的一点就是,大家不要忘记我们在初始化ADC2的时候没有初始化宽度,在读ADC2数据的时候需要把宽度作为一个参数输入读数据的API函数adc2_get_raw()中;

ADC1还可以用来读取霍尔传感器的数值,但是又两点特别注意的地方:读内置霍尔传感器数值的时候智能用ADC1的0和3通道,这就要求我们这两个通道别拿出来干别的事情,就是(GPIO36和GPIO39)别链接别的设备了,用特定函数hall_sensor_read()来读取霍尔传感器数值,和普通的读取函数不同哦;

adc2_vref_to_gpio()用来把内部的参考电压引流至GPIO口,消除噪音的时候,这个函数有用处;

ESP32是存在噪音的,读值需要校正,可以在GPIO上连接一个0.1微法的电容来降低噪音,也可以读取多个数值后取平均值来降低噪音;ESP32的参考电压在应该是1100mV,但是实际上每片ESP32的参考电压都不同(参考电压在1000-1200之间),这就要求我们得校正参考电压,因为参考电压不一样的时候,对相同电压的读值就不同了,所以得校正参考电压;

读取adc1_get_raw() and adc2_get_raw()的数值需要校正成mV,是通过一个函数来校正的(y = coeff_a * x + coeff_b),实际上就是一条斜率一定的曲线,那么怎么得到这条曲线呢?这就需要存储在eFuse里的参数或者是咱们用户自己提供的参数,至于这些参数怎么得到,咱不讲了,就知道esp_adc_cal_raw_to_voltage(reading, adc_chars);就是通过一条斜率曲线把读取adc1_get_raw() and adc2_get_raw()的数值转变成了mV的就行了,当然是用之前要得到斜率曲线的代码必须码上如下:

//Characterize ADC at particular atten
esp_adc_cal_characteristics_t *adc_chars = calloc(1, sizeof(esp_adc_cal_characteristics_t));
esp_adc_cal_value_t val_type = esp_adc_cal_characterize(unit, atten, ADC_WIDTH_BIT_12, DEFAULT_VREF, adc_chars);
//Check type of calibration value used to characterize ADC
if (val_type == ESP_ADC_CAL_VAL_EFUSE_VREF) {
printf("eFuse Vref");
} else if (val_type == ESP_ADC_CAL_VAL_EFUSE_TP) {
printf("Two Point");
} else {
printf("Default");
}

至此ADC就算可以正常读值了!总结一下,读值之前必须先设置宽度和量程,然后读值,读值需要转化成毫伏,所以需要得到校正曲线,然后把原始读值转化成毫伏;

05-04 00:55