ESP32 の SENSOR_VP / SENSOR_VN 

ESP32 の左上側に、これみよがしに SENSOR_VP , SENSOR_VN というピンがある。

「ESP32-WROOM-32 Datasheet v3.4(2023-02-13版)」(文献1)[^1]

[^1]:ESP32-WROOM-32 Datasheet v3.4(2023-02-13版 https://www.espressif.com/sites/default/files/documentation/esp32-wroom-32_datasheet_en.pdf



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/a69c7c0d-91fe-a0eb-c04b-9ab2fada974d.png)

これは何かな?

(文献1)[^1]によると、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/eb131bcb-81d1-2045-2230-d9a37da9b114.png)
とあります。

# デジタルピン

先の表のように、SENSOR_VP,SENSOR_VN は GPIO 番号だとそれぞれ 36, 39となります。

なお、ESP32 の GPIO34 ~ 39 は入力専用でもあり、SENSOR_VP , SENSOR_VN ともこの制限にひっかかります。
cf.,「ESP32 のGPIOピンのクセ」
https://qiita.com/nanbuwks/items/0c5ee8fb4cf10d9c59e1

pullup/pulldown についても同様に使用できません。


# アナログインプットピン

先の表に ADC1_CH0/3 となっていて、これらをアナログピンとして使うことができます。

ESP32 Arduino ではアナログピンに対して AnalogRead 命令を使うことができ、それぞれ GPIO番号の 36,39を指定できます。またエリアスされた A0,A3 という名称をポート番号に使うこともできます。


|信号名|GPIO|AnalogRead指定ポート|内部ADC|I/O|
|:---:|:---:|:---:|:---:|:---:|
| SENSOR_VP | GPIO36 |A0|	ADC1_CH0 |入力専用|
| SENSOR_VN | GPIO39 |A3|	ADC1_CH3 |入力専用|

ちなみに ESP32 には、ADC 1 と ADC2 があり、ADC2 は WiFi 機能に使用するので WiFi を使っているときには使えません。しかしながら VP,VN は ADC1 を使っているので影響はありません。

# ESP32 のアナログピンの一般的な使い方


内蔵の ADC 基準電圧は 1.1V、分解能がデフォルトが 12bit となり、フルスケール 1.1V を 0〜4095 の整数値で測ることができます。

しかしながら設定可能なアッテネータが接続されていて、入力電圧を減衰して ADC にかけることができます。
|設定値|アッテネータ減衰値|フルスケール|測定可能域|その他|
|:---:|:---:|:---:|:---:|:---:|
|ADC_ATTEN_DB_0|0dB|1.1V|100-950mV||
|ADC_ATTEN_DB_1|2.5dB|1.5V|100-1250mV||
|ADC_ATTEN_DB_2|6dB|2.2V|150-1750mV|デフォルト|
|ADC_ATTEN_DB_3|11dB|3.9V|150-2450mV||


なお、フルスケール電圧はこちらの記述を用いましたが、
「Analog to Digital Converter - ESP32 -  &mdash; ESP-IDF Programming Guide v4.1.1 documentation」 https://docs.espressif.com/projects/esp-idf/en/v4.1.1/api-reference/peripherals/adc.html (文献2)[^2]

[^2]:https://docs.espressif.com/projects/esp-idf/en/v4.1.1/api-reference/peripherals/adc.html


同じドキュメントの v4.2.3

「Analog to Digital Converter - ESP32 -  &mdash; ESP-IDF Programming Guide v4.2.3 documentation」 https://docs.espressif.com/projects/esp-idf/en/v4.2.3/esp32/api-reference/peripherals/adc.html (文献3)[^3]

だと記述がなくなっています。なにか問題があったのかな?

[^3]:「Analog to Digital Converter - ESP32 -  &mdash; ESP-IDF Programming Guide v4.2.3 documentation」 https://docs.espressif.com/projects/esp-idf/en/v4.2.3/esp32/api-reference/peripherals/adc.html 


あえて理解しやすくするためにフルスケール 3.9V だとした場合、デフォルト設定だとそれを 0 〜 4095 で表すことになります。本来ならその値を 3.9V に対する比例で電圧を求めることができそうです。

しかしながらいくつかの問題点があります。


文献2 [^2] によると、

> At 11 dB attenuation the maximum voltage is limited by VDD_A, not the full scale voltage.

となり、ADC_ATTEN_DB_3 として 減衰を 11dB とした場合フルスケールはVDD_A が上限となる、ということらしいです。


ESP32-WROOM-32 Datasheet v3.4(2023-02-13版)(文献4)[^4]

[^4]:ESP32-WROOM-32 Datasheet v3.4(2023-02-13版) https://www.espressif.com/sites/default/files/documentation/esp32-wroom-32_datasheet_en.pdf


には以下のようになっっていて、 VDDAの上限は3.6V です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/ca0cc3b5-4a92-8b22-4715-f5c529352b8f.png)

上記は ESP32 チップ単体でのお話なのですが、日本で ESP32 を使うときによく使われる ESP32-WROOM-32 については、内部ですべて VDD33 につながっています。(文献1)[^1]


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/76d3e3af-3725-0ec2-4aae-eb15e805e4cd.png)

VDD33 は通常は 3.3V を供給されることが多いでしょうから、そういったところではフルスケールの上限が3.3V となるということになりそうです。


また、直線性が維持できるのは上記の表の「測定可能域」のみだそうです。

とすると、この「測定可能域」で、例えば ADC_ATTEN_DB_3 で 減衰を 11dB とすると、(3.9/4095)*(ADコンバータの出力値)で電圧が求まって、それが 150-2450mV の間だと測定できると考えていいのかな?


# 正確に求めるためには


しかしながらそうは行かない理由があります。減衰器を通す前の本来のフルスケール 1.1V は ESP32 の基準電圧 1100mV で決まっています。 基準電圧は個体ごとにばらつきがあり、1000mV ～ 1200mV でばらつきます。
この基準電圧がどんな値になっているかは、2018/1W 以降に製造された ESP32-D0WD および ESP32-D0WDQ6 において、工場出荷時に基準電圧が測定され、値がチップに書き込まれています。

この値を元にするとばらつきを修正した、より正確な値が出ます。Arduino-ESP32 では専用命令があり、`analogReadMilliVolts() ` で測定値が校正済みのミリボルト単位で取得できます。


また、上記とは別の注意点として、文献3 では 0.1uF のコンデンサーの取り付けが推奨されています。


> The ESP32 ADC can be sensitive to noise leading to large discrepancies in ADC readings. To minimize noise, users may connect a 0.1uF capacitor to the ADC input pad in use. Multisampling may also be used to further mitigate the effects of noise.


# sensor_VP/VN の特殊性

「ESP32 Hardware Design Guidelines」https://docs.espressif.com/projects/esp-hardware-design-guidelines/en/latest/esp32/esp-hardware-design-guidelines-en-master-esp32.pdf (文献5)[^5] の 「 3.9 ADC 」によると、

[^5]:「ESP32 Hardware Design Guidelines」https://docs.espressif.com/projects/esp-hardware-design-guidelines/en/latest/esp32/esp-hardware-design-guidelines-en-master-esp32.pdf 

> When RTC peripherals (SAR ADC1/SAR ADC2/AMP) is powered on, the inputs of GPIO36 (SENSOR_VP) and
GPIO39 (SENSOR_VN) will be pulled down for approximately 80 ns. Therefore, it is recommended to use SENSOR_VP and SENSOR_VN as ADC pins.
If SENSOR_VP and SENSOR_VN are used as GPIOs in the design, while ADC is supported by other pins, then
software should disregard the glitch. Optionally, make SENSOR_VP and SENSOR_VN active high pins.

とあり、電源起動時に短時間 Lo レベルに落ちるらしいです。なのでそれに対する悪影響が無いかどうか検討する必要があります。
また、

(文献1)[^1]によると、ESP32-WROOM-32 には以下のようにコンデンサが接続されています。SNSOR_CAPP と SENSOR_CAPN は ESP32-WROOM-32 の端子には出てきていませんが、GPIO37,38 として扱うことができます。GPIO37,38 をLo に落としておくなどすると何らかの改善が得られるかも知れません。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/7440ec55-22ff-5025-217a-2cd4ecfa391e.png)

また、SENSOR_VP/SENSOR_VN には他のアナログ入力ピンでは発生しない電圧降下スパイクについてこちらの記事が実験で示されてました。
 http://radiopench.blog96.fc2.com/blog-entry-1036.html

 オペアンプか何かが接続されていた名残かな?
 

# そもそも SENSOR_VP , SENSOR_VN って?

https://esp32.com/viewtopic.php?t=3206
によると、2017年の投稿で

> They are dedicated to measure small DC signals (e.g. from a thermocouple), see section "Low-Noise Amplifier" in https://espressif.com/sites/default/fil ... ual_en.pdf

とありますが、その後の投稿では

> Re: sensVP and sensVN pins
Postby ESP_Sprite » Mon May 02, 2022 3:09 am
>
> The low noise amplifier in the ESP32 is removed from the specs and documentation as it never really worked well. As such, you can't use those pins for low voltage measurements. You can still use them as ADC pins, but they have the same range as other ADC pins.

となりました。
実際に、


「ESP32 Technical Reference Manual」Version 5.0(2023.07版)
https://www.espressif.com/sites/default/files/documentation/esp32_technical_reference_manual_en.pdf

では、"Low-Noise Amplifter" の記述や、SENSOR_VP についての説明はありませんでした。

「ESP32 Low Noise Amplifier (IDFGH-68) · Issue #814 · espressif/esp-idf」
https://github.com/espressif/esp-idf/issues/814
によると、2018年に Technical Refaerence から削除されたようです。




経緯はココらへんにまとめられています。
https://github.com/krzychb/esp32-lna