DEV Community

codemee
codemee

Posted on • Updated on

ESP32 ADC 的陷阱

在使用 ESP32 的 ADC 時, 有一個許多人沒有注意到的陷阱。ESP32 有兩個 ADC, 稱為 ADC1 和 ADC2, ADC2 因為會被 Wi-Fi 佔用, 啟用 Wi-Fi 的情況下無法使用, 所以我們通常使用的是 ADC1, ADC1 有 8 個 channel 可用, 如同大部分教學所說, 我們可以設定這 8 個 channel 的衰減 (attenuation )解析度 (resolution), 而陷阱就是只有衰減是個別 channel 可以有獨自的設定, 解析度卻是所有 channel 共同的設定

請看以下的例子:

>>> from machine import Pin, ADC
>>> adc_33 = ADC(Pin(33))
>>> adc_33.atten(ADC.ATTN_11DB)
>>> adc_33.width(ADC.WIDTH_9BIT)
Enter fullscreen mode Exit fullscreen mode

設定好讓 33 號腳可接受 3.6V 輸入, 並採用 9 位元的解析度, 如果我們直接將控制板上的 3.3V 輸入 33 號腳, 讀取 ADC 值可看到:

>>> adc_33.read()
511
Enter fullscreen mode Exit fullscreen mode

但如果我們另外設定 32 號腳採用 12 位元的解析度:

>>> adc_32 = ADC(Pin(32))
>>> adc_32.width(ADC.WIDTH_12BIT)
Enter fullscreen mode Exit fullscreen mode

再重新讀取一次 33 號腳, 就會發現讀值變成 4095:

>>> adc_33.read()
4095
Enter fullscreen mode Exit fullscreen mode

這表示 33 號腳現在也採用 12 位元的解析度了。如果我們設定 32 腳最高輸入 1.0V:

>>> adc_32.atten(ADC.ATTN_0DB)
Enter fullscreen mode Exit fullscreen mode

然後接一個分壓電路把原本的 3.3V 電壓分一半, 再將分半後的電壓接到 33 號腳後重新讀值:

>>> adc_33.read()
1834
Enter fullscreen mode Exit fullscreen mode

可以看到 33 腳的 ADC 並沒有受到 32 腳的設定影響, 若是將同樣的分壓接到 32 腳, 讀值就會發現超過可量測最高電壓而讀到 4095:

>>> adc_32.read()
4095
Enter fullscreen mode Exit fullscreen mode

如果沒有注意到這一點, 就可能會發生自己嚇自己的靈異現象, 明明設定 10 位元解析度的 ADC 腳位, 卻讀到超過 1023 以上的值, 而誤以為控制板或是感測器壞掉了, 但其實只是因為有其他 ADC 腳位設定成更多位元的解析度而已。

ESP32 API 文件上就有指出 ADC1 的解析度是所有 channel 共用的, 只是比較少看到教學文章強調這一點, 尤其是使用 MicroPython 的話, widthADC 物件的方法, 所以看起來實在很像是可以幫個別 ADC 物件設定解析度。

Top comments (0)