今天我們來(lái)玩兒ADC。
概述
ESP32 芯片有2 個(gè) 12位的SAR(逐次逼近)ADC,最多可以讀取18個(gè)不同的模擬通道輸入,由5個(gè)專用轉(zhuǎn)換控制器管理,2個(gè)支持高性能多通道掃描,2個(gè)支持Deep-sleep低功耗模式下運(yùn)行,還有一個(gè)專門(mén)用于功率檢測(cè)和峰值監(jiān)測(cè)。
主要特性如下:
- 采用 2 個(gè) SAR ADC,可支持同時(shí)采樣與轉(zhuǎn)換
- 采用 5 個(gè)專用 ADC 控制器,可支持不同應(yīng)用場(chǎng)景(比如,高性能、低功耗,或功率檢測(cè)和峰值檢測(cè))
- 支持 18 個(gè)模擬輸入管腳
- 1個(gè)內(nèi)部電壓 vdd33 通道、 2 個(gè) pa_pkdet 通道(部分控制器支持)
- 可配置 12 位、 11 位、 10 位、 9 位多種分辨率
- 支持 DMA(1 個(gè)控制器支持)
- 支持多通道掃描模式(2 個(gè)控制器支持)
- 支持 Deep-sleep 模式運(yùn)行(1 個(gè)控制器支持)
- 支持 ULP 協(xié)處理器控制(2 個(gè)控制器支持)
硬件
ADC1支持8個(gè)通道(GPIO32-GPIO39),ADC2支持10個(gè)通道(GPIO0、GPIO2、GPIO4、GPIO12-GPIO15、GPIO25-GPIO27),這里有兩點(diǎn)需要注意:
- ADC2的一些引腳比如GPIO0、GPIO2、GPIO15為芯片的Strapping 管腳,使用的時(shí)候要特別注意
- ADC2只能在WiFi功能未啟動(dòng)的情況下使用
ADC模擬輸入引腳可承受最高3.3V的電壓,如果需要測(cè)試更高的電壓,需要通過(guò)分壓之類的方式進(jìn)行降壓之后再進(jìn)行采集。
ESP32 ADC 對(duì)噪聲敏感,從而導(dǎo)致 ADC 讀數(shù)出現(xiàn)較大差異。為了盡量減少噪聲,可以在使用中的 ADC 輸入端連接一個(gè) 0.1uF 的電容,多重采樣也可用于進(jìn)一步減輕噪聲的影響。
軟件
關(guān)于ADC的一些概念,比如時(shí)鐘,分辨率,采樣周期,衰減,量程等大家自行了解,下面我們講一下基礎(chǔ)的使用:
模擬電壓讀取
ADC使用不需要初始化引腳了,直接使用下面的函數(shù)讀取引腳電壓,使用默認(rèn)的參數(shù)進(jìn)行配置,這個(gè)參數(shù)配置能滿足絕大部分的需求了。這里還有一點(diǎn)注意的是這里是阻塞的,直到采集結(jié)束。
analogRead(32);
分辨率設(shè)置
如上文中說(shuō)的,ESP32的ADC是12位的,我們讀取的范圍默認(rèn)是0-4095,如果想改也是可以的,通過(guò)下面你函數(shù)更改,一般用默認(rèn)就好了。
/*
* Sets the conversion resolution
* Default is 12bit (0 - 4095)
* Range is 9 - 12
* */
void analogSetWidth(uint8_t bits);
ADC時(shí)鐘
ADC根據(jù)選擇的分辨率在多個(gè)時(shí)鐘周期內(nèi)進(jìn)行轉(zhuǎn)換,時(shí)鐘速率越快,轉(zhuǎn)換過(guò)程就越快,通過(guò)更改時(shí)鐘分頻系數(shù)來(lái)控制頻率,分頻越大速率越慢,默認(rèn)就是1,最快的速率。
/*
* Set the divider for the ADC clock.
* Default is 1
* Range is 1 - 255
* */
void analogSetClockDiv(uint8_t clockDiv);
ADC參考電壓
ADC的參考電壓Vref,在不同的ESP型號(hào)可能是不一樣的,我們這里ESP32參考電壓為1.1V,一般用內(nèi)部的就可以,要求高的需要校準(zhǔn)一下,當(dāng)然,也可以設(shè)置外置的引腳當(dāng)做參考電壓。
/*
* Set pin to use for ADC calibration if the esp is not already calibrated (25, 26 or 27)
* */
void analogSetVRefPin(uint8_t pin);
ADC衰減倍數(shù)
對(duì)應(yīng)不同的電壓檢測(cè)范圍,我們可以設(shè)置引腳的衰減倍數(shù),默認(rèn)就是11db,實(shí)際檢測(cè)范圍為0-3.3V,下面兩個(gè)函數(shù),一個(gè)設(shè)置所有通道的,一個(gè)設(shè)置特定通道的。
/*
* Set the attenuation for all channels
* Default is 11db
* */
void analogSetAttenuation(adc_attenuation_t attenuation);
/*
* Set the attenuation for a particular pin
* Default is 11db
* */
void analogSetPinAttenuation(uint8_t pin, adc_attenuation_t attenuation);
/*
0dB --- 1.1V
2.5dB --- 1.5V
6dB --- 2.2V
11dB --- 3.9V(實(shí)際最大采集到3.3V電壓)
* */
static uint8_t __analogAttenuation = 3;//11db
typedef enum {
ADC_0db,
ADC_2_5db,
ADC_6db,
ADC_11db
} adc_attenuation_t;
通過(guò)以上介紹一些可能用到的函數(shù),大家了解一下即可,大部分場(chǎng)合都用默認(rèn)的就行啦。
完整程序
#define ANALOG_PIN 32
int analog_value = 0;
void setup()
{
Serial.begin(115200);
Serial.println("ADC Demo!");
}
void loop()
{
analog_value = analogRead(ANALOG_PIN);
Serial.println("ADC value on Pin(%d) is %d!",ANALOG_PIN,analog_value);
delay(1000);
}
我們直接在loop中讀取ADC的值,然后把結(jié)果通過(guò)串口打印出來(lái),ADC都使用的默認(rèn)參數(shù),沒(méi)有進(jìn)行配置。
打印結(jié)果
使用平均數(shù)字濾波器降噪
實(shí)際采集中,我們一般使用多次采集取平均值的辦法,這樣出來(lái)的結(jié)果可以避免一些錯(cuò)誤的噪聲影響準(zhǔn)確性,方法有多種,具體就是采集多次求平均值,或者去掉最大最小求平均值,大家可以試一下。
對(duì)于精度較高的場(chǎng)合,我們可以校準(zhǔn)ADC,這樣出來(lái)的結(jié)果就非常準(zhǔn)確,后面我們?cè)僬归_(kāi)實(shí)際細(xì)說(shuō)。
-
控制器
+關(guān)注
關(guān)注
112文章
16468瀏覽量
179642 -
濾波器
+關(guān)注
關(guān)注
161文章
7876瀏覽量
179064 -
adc
+關(guān)注
關(guān)注
99文章
6537瀏覽量
545888 -
GPIO
+關(guān)注
關(guān)注
16文章
1217瀏覽量
52441 -
ESP32
+關(guān)注
關(guān)注
18文章
980瀏覽量
17566
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
ESP32單片機(jī)學(xué)習(xí)筆記
ESP32之ESP-IDF學(xué)習(xí)筆記
ESP32 開(kāi)發(fā)筆記(四)LVGL控件學(xué)習(xí) Window 窗口控件 X
![<b class='flag-5'>ESP32</b> 開(kāi)發(fā)<b class='flag-5'>筆記</b>(四)LVGL控件<b class='flag-5'>學(xué)習(xí)</b> Window 窗口控件 X](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
[ESP32]學(xué)習(xí)筆記02
![[<b class='flag-5'>ESP32</b>]<b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>02](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
[ESP32]學(xué)習(xí)筆記04
![[<b class='flag-5'>ESP32</b>]<b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>04](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
ESP32 之 ESP-IDF 教學(xué)(八)—— 模數(shù)轉(zhuǎn)換器(ADC)
![<b class='flag-5'>ESP32</b> 之 <b class='flag-5'>ESP</b>-IDF 教學(xué)(八)—— 模數(shù)轉(zhuǎn)換器(<b class='flag-5'>ADC</b>)](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
SPI主線協(xié)議——ESP32學(xué)習(xí)筆記
![SPI主線協(xié)議——<b class='flag-5'>ESP32</b><b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
ESP32 單片機(jī)學(xué)習(xí)筆記 - 08 - WebSocket客戶端
![<b class='flag-5'>ESP32</b> 單片機(jī)<b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b> - 08 - WebSocket客戶端](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
ESP32 單片機(jī)學(xué)習(xí)筆記 - 04 - ADC和定時(shí)器
![<b class='flag-5'>ESP32</b> 單片機(jī)<b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b> - 04 - <b class='flag-5'>ADC</b>和定時(shí)器](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
ESP32芯片模組機(jī)器學(xué)習(xí)算法運(yùn)行的應(yīng)用
ESP32上的深度強(qiáng)化學(xué)習(xí)
![<b class='flag-5'>ESP32</b>上的深度強(qiáng)化<b class='flag-5'>學(xué)習(xí)</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
ESP32學(xué)習(xí)筆記:存儲(chǔ)分布和啟動(dòng)過(guò)程
![<b class='flag-5'>ESP32</b><b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>:存儲(chǔ)分布和啟動(dòng)過(guò)程](https://file1.elecfans.com/web2/M00/8C/BE/wKgZomSw89eATXmCAADaPnSlZig752.jpg)
ESP32學(xué)習(xí)筆記:NVS分區(qū)永久保存數(shù)據(jù)
![<b class='flag-5'>ESP32</b><b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>:NVS分區(qū)永久保存數(shù)據(jù)](https://file1.elecfans.com/web2/M00/8C/D1/wKgaomSyVTCAdyVKAACTwMGvClI085.jpg)
評(píng)論