在使用 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)
設定好讓 33 號腳可接受 3.6V 輸入, 並採用 9 位元的解析度, 如果我們直接將控制板上的 3.3V 輸入 33 號腳, 讀取 ADC 值可看到:
>>> adc_33.read()
511
但如果我們另外設定 32 號腳採用 12 位元的解析度:
>>> adc_32 = ADC(Pin(32))
>>> adc_32.width(ADC.WIDTH_12BIT)
再重新讀取一次 33 號腳, 就會發現讀值變成 4095:
>>> adc_33.read()
4095
這表示 33 號腳現在也採用 12 位元的解析度了。如果我們設定 32 腳最高輸入 1.0V:
>>> adc_32.atten(ADC.ATTN_0DB)
然後接一個分壓電路把原本的 3.3V 電壓分一半, 再將分半後的電壓接到 33 號腳後重新讀值:
>>> adc_33.read()
1834
可以看到 33 腳的 ADC 並沒有受到 32 腳的設定影響, 若是將同樣的分壓接到 32 腳, 讀值就會發現超過可量測最高電壓而讀到 4095:
>>> adc_32.read()
4095
如果沒有注意到這一點, 就可能會發生自己嚇自己的靈異現象, 明明設定 10 位元解析度的 ADC 腳位, 卻讀到超過 1023 以上的值, 而誤以為控制板或是感測器壞掉了, 但其實只是因為有其他 ADC 腳位設定成更多位元的解析度而已。
在 ESP32 API 文件上就有指出 ADC1 的解析度是所有 channel 共用的, 只是比較少看到教學文章強調這一點, 尤其是使用 MicroPython 的話, width
是 ADC
物件的方法, 所以看起來實在很像是可以幫個別 ADC 物件設定解析度。