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就算可以正常讀值了!總結一下,讀值之前必須先設置寬度和量程,然后讀值,讀值需要轉化成毫伏,所以需要得到校正曲線,然后把原始讀值轉化成毫伏;
