#AD変換とは
AD変換(アナログ/デジタル変換)とは,
アナログ信号(信号の変化が時間的に連続している信号)をデジタル信号(0と1で構成された信号)に変換する機能の事です.
光センサや温度センサ,電流センサなどが感知した値は数字で表すことのできないアナログ信号です.
しかしマイコン内部で扱う値は全てデジタル信号なので,AD変換が必要になるわけです.
#AD変換における疑問点
茶番はこれくらいにして本題に入ろう.
例えばの話,Arduinoでは10bitのAD変換器が搭載されているので分解能は2^10=1024となり,測定上限電圧が5Vなので,0~5Vを0~1023の値にAD変換しているわけだ.
だったら
(測定電圧をAD変換した値) ÷ 1023 × 5 = (測定電圧)
が正解のはず.
でも巷のAD変換を使っているサイトを見ると1024で割ってるやつが結構ある.
これは完全な誤りであるとして,彼らのやり方は誤差を生まないのか?
(2019/03/30追記)
コメントで指摘されましたが私の勘違いでした.1024で割るのが正解です.
以下に情報を追記...
Arduino UNOに載っているマイコンAtmega328PのデータシートのP261,21.7 ADC Conversion Resultに
ADC = \frac{V_{in} \times 1024}{V_{ref}}
と記載されてます.
更にそのあとに,
0x000 represents analog ground, and 0x3FF represents the selected reference voltage minus one LSB.
つまり0x000 ~ 0x3FF(0 ~ 1023)で電圧値が表される(つまりその値が返ってくる).
結局1023なのか1024なのかという話なのですが,基準電圧が5Vであれば
5(V) ÷ 1024 ≒ 4.8828(mV)
に対してデジタルで区切るわけなので,以下の表の様な電圧範囲がADCの値になります.(3.3Vの場合はレンジが違うだけです)
Input voltage(V) | ADC(AnalogReadの返り値) |
---|---|
0 ~ 0.0049未満 | 0 |
0.0049 ~ 0.0098未満 | 1 |
0.0098 ~ 0.0146未満 | 2 |
... | ... |
4.9902 ~ 4.9951未満 | 1022 |
4.9951 ~ 5(未満?) | 1023 |
厳密には$V_{ref}=V_{in}$なら1024になると思いますが,測定装置に繋いだ時点でインピーダンス的に存在しないでしょうし,なによりリファレンスガイドが言ってるんで1024は返って来ないです,はい.
以上,1024で割った値をADC変換の際の下限値にする事で上手く0~1023になってることが分かりました.
詳しい話は以下のサイトにも載ってます.
ArduinoでセンサIC(アナログ電圧出力)を使う(詳しい話)
(2020/06/05追記)
コメントで指摘されました.
ADCの値からInput voltage(V)の値を求める際には厳密には上で示した表のようにはなりません.
ADC = \frac{V_{in} \times 1024}{V_{ref}}
を逆算して$ V_{in} $を導く必要があります.
その際,$ V_{ref} $はいくつかの基準電圧を選択可能ですが,どれも誤差が大小なりに存在するので実測値を用いるのが良さそうです.
詳しくはコメント参照してくれ.若しくはデータシートの「21.2 Overview」読め.
あと実測についてのサイトを個人的にメモ.
[#5-10 電源電圧を計測する]
(http://hello.world.coocan.jp/ARDUINO5/arduino5_a.html)
#まとめ
値は0~1023で返ってくるが,計算は1024を使う.
ADCの値で計算した電圧値は,((ADCで計算した値)+0.0049V)の範囲内の値という事に気を付けよう.