質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

解決済

3回答

6235閲覧

ESP32を用いた分圧(1/2)の返り値について

shu160

総合スコア8

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

1クリップ

投稿2017/05/23 08:50

編集2017/05/23 09:03

###前提・実現したいこと
ESP32のADC変換を理解している途中でつまずいています。

3.9V出力をアッテネーターで減衰させて、3.3V出力とし、
3.3/3.9の電圧を12BIT解像度にて分圧するのまでは理解できたのですが、

テスターでの実測値とシリアルの表示値(analogRead)の違いに苦しんでいます。

###発生している問題・エラーメッセージ

###該当のソースコード

void setup(){

Serial.begin(115200);

}
void loop(){
float B=3435,T=298.15,R0=10.0,R1=4.71,rr1,t;
int n;

n=analogRead(32);
rr1=R1*(n)/(3.3/3.9*4096-(n));
t=1/(log(rr1/R0)/B+(1/T));

Serial.print("n=");
Serial.print(n);
Serial.print(" rr1=");
Serial.print(rr1);
Serial.print(" temp=");
Serial.println(t-273.15);
delay(5000);
}

ここにご自身が実行したソースコードを書いてください

###試したこと ボードの3V3より出力して1個目の金属皮膜抵抗(4.71k)に入りそこ(※)から分圧取得のためにPIN-32へ結線、 また(※)から2個目の金属皮膜抵抗(4.71k)を通過しボードのGNDに結線しています。 つまり、出力電圧を1/2とします。 この時の返り値n=1755、抵抗値rr1=4.08 実測抵抗値rr1=4.71 です。 また、返り値は短絡時はn=4095を表示します。 期待値はn=1733なのですが返り値との差22が説明できません。 また、抵抗値の実測値と表示値の差も説明できません。 ADC変換における誤差も検討しましたが、しっくり来ません。 どなたかご教授願えませんでしょうか? ![イメージ説明](ef6bbd93dc48b148e44671d0ae07d394.png) ###補足情報(言語/FW/ツール等のバージョンなど)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ozwk

2017/05/23 23:24

抵抗入れ替えるとどうなりますか?
shu160

2017/05/23 23:29

抵抗を入替えても同じです。金属皮膜抵抗を用いて出来るだけ同じものを選びでして確認をとっています。また、返り値は抵抗値を変えても同じですので使用頻度の多い4.7kΩとしています。
guest

回答3

0

実機持ってないんで自信ないですが
[TW#12287] ESP32 ADC accuracy
こんなの見つけました

見るとADCの非線形性グラフあるんで
それかなぁと

投稿2017/05/23 23:46

ozwk

総合スコア13521

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shu160

2017/05/23 23:53

”The ADC has a non-linear response”そこでしたか! 後ほど近似関数を参考にして組み直してみます。
ozwk

2017/05/23 23:57

n=1755で計算してみたら1.6505517Vになったので 大体合ってるかと
shu160

2017/05/24 01:36

最後まで読んでみるとユーザー側でそれぞれに対処方法を見つけ出すか?制作側で近似関数でこの問題を収束がつくのかに議論されているみたいですね。 私も大体あっているものとして、この状態でサーミスタ(103AT)を入れてみると電圧・抵抗値が10〜15%違う表示を示します。 夕刻にでも可変抵抗を用いてサンプリングしてみます。 教えていただいた、やり取りをもう少し拝見してみます。
guest

0

自己解決

実際にデータをとりました。結果は近似関数で少なくとも4次関数です。
等比関数ではないので、ディベロッパーの公式発表が必要かと思います。
私の結論は、ESP32 にて analogRead は今は使わない方向で色々とやってみる。
となりました。

皆さん、ありがとうございました。

投稿2017/05/26 03:25

shu160

総合スコア8

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

理想的に1/2に分圧されてると仮定すると、元の電圧は
1755/4096 * 3.90[v] * 2 ≒ 3.34[v]
であると推測できます。
テスターで出力ピンとGNDの電位差を測ってみてください。二つの抵抗の両端でもいいです。

理由は知りませんけど3.3[v]出力とされているものは、測ると3.30~3.35[v]の値をとることが多く、特に3.34[v]をよく見ます。
品質の悪い導線を使ったときの降下や、温度依存性(例えば0℃~60℃で3.3[v]以上を確保する)のためかもしれません。

コード中の3.3(=3.30000000....)は理想の値です。別のADCポートがあるなら出力ピンの実際の電圧を計測して、それを元に分圧された電圧を計算してはどうでしょう。

投稿2017/05/23 12:26

編集2017/05/23 12:36
sharow

総合スコア1149

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shu160

2017/05/23 23:17

実測電圧は3.29Vで両抵抗共に同圧がかかっています。 実測値はあらゆる点で測定してみたのですが…
sharow

2017/05/24 01:44

3.29[v]ならこの件の容疑は薄れますね。 ozwkさん指摘の非線形性の件が濃厚ですね。ある種のキャリブレーションが必要なのかもしれません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問