• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 博客專欄

    EEPW首頁 > 博客 > 老宇哥帶你玩轉(zhuǎn) ESP32:05 ADC用起來這也太簡單了吧

    老宇哥帶你玩轉(zhuǎn) ESP32:05 ADC用起來這也太簡單了吧

    發(fā)布人:芯片之大家 時間:2023-07-04 來源:工程師 發(fā)布文章
    image.png


    今天我們來玩兒ADC

    概述

    ESP32 芯片有2 個 12位的SAR(逐次逼近)ADC,最多可以讀取18個不同的模擬通道輸入,由5個專用轉(zhuǎn)換控制器管理,2個支持高性能多通道掃描,2個支持Deep-sleep低功耗模式下運行,還有一個專門用于功率檢測和峰值監(jiān)測。

    image.png


    主要特性如下:

    • 采用 2 個 SAR ADC,可支持同時采樣與轉(zhuǎn)換

    • 采用 5 個專用 ADC 控制器,可支持不同應(yīng)用場景(比如,高性能、低功耗,或功率檢測和峰值檢測)

    • 支持 18 個模擬輸入管腳

    • 1個內(nèi)部電壓 vdd33 通道、 2 個 pa_pkdet 通道(部分控制器支持)

    • 可配置 12 位、 11 位、 10 位、 9 位多種分辨率

    • 支持 DMA(1 個控制器支持)

    • 支持多通道掃描模式(2 個控制器支持)

    • 支持 Deep-sleep 模式運行(1 個控制器支持)

    • 支持 ULP 協(xié)處理器控制(2 個控制器支持)

    硬件

    ADC1支持8個通道(GPIO32-GPIO39),ADC2支持10個通道(GPIO0、GPIO2、GPIO4、GPIO12-GPIO15、GPIO25-GPIO27),這里有兩點需要注意:

    • ADC2的一些引腳比如GPIO0、GPIO2、GPIO15為芯片的Strapping 管腳,使用的時候要特別注意

    • ADC2只能在WiFi功能未啟動的情況下使用

    image.png


    ADC模擬輸入引腳可承受最高3.3V的電壓,如果需要測試更高的電壓,需要通過分壓之類的方式進行降壓之后再進行采集。

    ESP32 ADC 對噪聲敏感,從而導(dǎo)致 ADC 讀數(shù)出現(xiàn)較大差異。為了盡量減少噪聲,可以在使用中的 ADC 輸入端連接一個 0.1uF 的電容,多重采樣也可用于進一步減輕噪聲的影響。

    軟件

    關(guān)于ADC的一些概念,比如時鐘,分辨率,采樣周期,衰減,量程等大家自行了解,下面我們講一下基礎(chǔ)的使用:

    模擬電壓讀取

    ADC使用不需要初始化引腳了,直接使用下面的函數(shù)讀取引腳電壓,使用默認(rèn)的參數(shù)進行配置,這個參數(shù)配置能滿足絕大部分的需求了。這里還有一點注意的是這里是阻塞的,直到采集結(jié)束。

    analogRead(32);

    分辨率設(shè)置

    如上文中說的,ESP32的ADC是12位的,我們讀取的范圍默認(rèn)是0-4095,如果想改也是可以的,通過下面你函數(shù)更改,一般用默認(rèn)就好了。

    /*
    * Sets the conversion resolution
    * Default is 12bit (0 - 4095)
    * Range is 9 - 12
    * */void analogSetWidth(uint8_t bits);

    ADC時鐘

    ADC根據(jù)選擇的分辨率在多個時鐘周期內(nèi)進行轉(zhuǎn)換,時鐘速率越快,轉(zhuǎn)換過程就越快,通過更改時鐘分頻系數(shù)來控制頻率,分頻越大速率越慢,默認(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型號可能是不一樣的,我們這里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ù)

    對應(yīng)不同的電壓檢測范圍,我們可以設(shè)置引腳的衰減倍數(shù),默認(rèn)就是11db,實際檢測范圍為0-3.3V,下面兩個函數(shù),一個設(shè)置所有通道的,一個設(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(實際最大采集到3.3V電壓)
    * */static uint8_t __analogAttenuation = 3;//11dbtypedef enum {
        ADC_0db,
        ADC_2_5db,
        ADC_6db,    
        ADC_11db
    } adc_attenuation_t;

    通過以上介紹一些可能用到的函數(shù),大家了解一下即可,大部分場合都用默認(rèn)的就行啦。

    完整程序

    #define ANALOG_PIN   32int analog_value = 0;void setup(){
      Serial.begin(115200);
      Serial.println("ADC Demo!"); 
    } 
    void loop(){  
      analog_value = analogRead(ANALOG_PIN);
      Serial.print("ADC value on Pin("); 
      Serial.print(ANALOG_PIN); 
      Serial.print(") is ");
      Serial.print(analog_value); 
      Serial.println("!");
      delay(1000);
    }

    我們直接在loop中讀取ADC的值,然后把結(jié)果通過串口打印出來,ADC都使用的默認(rèn)參數(shù),沒有進行配置。

    打印結(jié)果

    image.png


    使用平均數(shù)字濾波器降噪

    實際采集中,我們一般使用多次采集取平均值的辦法,這樣出來的結(jié)果可以避免一些錯誤的噪聲影響準(zhǔn)確性,方法有多種,具體就是采集多次求平均值,或者去掉最大最小求平均值,大家可以試一下。

    對于精度較高的場合,我們可以校準(zhǔn)ADC,這樣出來的結(jié)果就非常準(zhǔn)確,后面我們再展開實際細(xì)說。

    感謝大家,關(guān)于ESP32的學(xué)習(xí),希望大家Enjoy!


    *博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權(quán)請聯(lián)系工作人員刪除。



    關(guān)鍵詞: ADC

    相關(guān)推薦

    技術(shù)專區(qū)

    關(guān)閉
    主站蜘蛛池模板: 大石桥市| 图木舒克市| 青浦区| 福建省| 会昌县| 清水县| 开化县| 独山县| 河曲县| 五大连池市| 赤壁市| 南丹县| 东至县| 安义县| 荃湾区| 海伦市| 方城县| 肃南| 兰西县| 曲麻莱县| 镇江市| 龙州县| 鸡西市| 景德镇市| 白水县| 临夏县| 临汾市| 称多县| 迭部县| 闽侯县| 林甸县| 泰和县| 海原县| 南川市| 南康市| 永仁县| 栾城县| 额济纳旗| 靖江市| 定西市| 阿勒泰市|