« ダイソー「明るいランチャーライト」「単3x2本ハンドライト」 LED通電テスト60日 | トップページ | ダイソーReVOLTES単3 JIS C8708:2019充放電試験 200サイクル目完了 »

2020年1月 8日 (水)

ミスが広まる 1/1023 vs 1/1024

定番回路、「これはあかんやろ」を指摘したんが
液晶表示モジュールを4ビットモードで使ったときの空きピン処理
誰かが始めた間違ったつなぎ方(この場合はチップメーカーのアプリケーションノートか)がずっと踏襲されて広まってしまったというのを発見しました。
これをトラ技の記事にしたのが2009年5月号。
以後、空きピンをGNDにつないでしまう例、だいぶ少なくなってきたように思います。

で、新年早々こんなのを発見しました。
ラジオペンチ Arduinoを使ったバッテリー放電器
A/D変換データを電圧値にスケーリングする処理がスケッチに書かれています。
ArduinoのanalogRead() は10bit。 0~1023(10進)の値が得られます。
これの処理が間違っていたのです。
ここ↓
//  battV = analogRead(0) * Vcc / 1023.0;       // バッテリー電圧測定(これは間違いで、)
  battV = analogRead(0) * Vcc / 1024.0;       // バッテリー電圧測定(正しくはこっち)

10bit値で1/1023と1/1024の違いですので、差は0.1%ほど。
わずかですが、原理的に間違っていますんでこれはまずいです。
   ※A/Dコンバータが8bitだとミスによる実際の誤差
    が目につくでしょう。
    1/255 vs 1/256 で差が0.4%ほどになり、
    実値との差に気がつく。

※理屈の詳細はラジオペンチさんの記事のコメントをご覧ください。

この「1/1023と1/1024」、調べてみると「1/1023」を使っているプログラム例があちこちに出てきます。
どこが発端なのかは調べ切れてませんが、ArduinoのanalogRead処理で多いような気がします。

ArduinoではArduinoのアナログ基準電圧入力 も勘違いの処理が広まっているかもです。
正しく使えば、「外部基準電圧とAREFピンの間に抵抗を入れておく」なんてことはしなくてもokですから。

|

« ダイソー「明るいランチャーライト」「単3x2本ハンドライト」 LED通電テスト60日 | トップページ | ダイソーReVOLTES単3 JIS C8708:2019充放電試験 200サイクル目完了 »

電子工作」カテゴリの記事

Arduino」カテゴリの記事

コメント

どーもです、今年もよろしくお願い致します。

Arduino のリファレンスに、「0から5Vの入力電圧を0から1023の数値に変換する」と書いてあるので、それを忠実にコードにすると1023になるんでしょうね。原文でもそうなってます

http://www.musashinodenpa.com/arduino/ref/index.php?f=0&pos=2113

投稿: radiopench | 2020年1月 8日 (水) 13時30分

radiopench さん、コメントどうもでっす。

ソフト作りの時にその手本は見るけれど・・・原点となるチップ(ATmega328)のデータシートは(ハードウェアの話は面倒なんで)読まない。
やっぱりこれかな。
フルスケールは5Vジャストではなく「5V - 1LSB」だっと。

液晶4ビット駆動の話もそうだし(これはPICの参考本が悪い)、ハードの元となる日立HD44780のデータシートを見れば「4ビット動作のとき、この4本は使われませんので、オープンにしてください」と書いてあるのに従わないんだから。

Arefピンの話も、元となるソースを見れば処理が分かるのに・・・

投稿: 居酒屋ガレージ店主(JH3DBO) | 2020年1月 8日 (水) 16時48分

Arduinoでの解説、英文のほうはずいぶん追記されていますね。
https://www.arduino.cc/reference/en/language/functions/analog-io/analogread/

・・・this yields a resolution between readings of: 5 volts / 1024 units・・・
っと「1/1024」が出てきます。

投稿: 居酒屋ガレージ店主(JH3DBO) | 2020年1月 9日 (木) 09時18分

ArduinoのA/D変換 1023 vs 1024、ちょっと検索
  (ラジオペンチさんところに記したのも含む)
・1/1023で計算(間違っている)
https://qiita.com/nyagato_00/items/2937a11630109a3db6e1
https://iot.keicode.com/arduino/arduino-analogread.php
https://deviceplus.jp/hobby/arduino_f07/
https://omoroya.com/arduino-extra-edition-05/
https://www.denshi.club/cookbook/stem/maker-uno-stem-6.html
https://www.denshi.club/cookbook/sensor/temp/l.html
http://easylabo.com/2015/04/arduino/8336/
https://novicengineering.com/%E3%80%90arduino%E3%80%91map%E9%96%A2%E6%95%B0/

※map()での数値範囲をミスってるところがあります。
  map(ad, 0, 1024, 0, 256)というふうにしないと。
  map(ad, 0, 1023, 0, 255)では、10bit A/Dの中央値512で
  8bitの中央値128が得られません。

※電圧計算で、Arduinoの電源電圧や内部基準電圧の値を5.0V、1.1Vと
決め打ちしているのが目に付きます。
ほんとにそうか、計ったことありますかな?
私とこのUNOは5.033V。 5Vより0.7%ほど高い。
電圧測定という課題で、基準を決め打ちするのは問題でしょう。
1/1023の処理とともに、テスターでの実測値とArduinoでの測定値
との差が気にならないのか心配です。 (計って比べてない?)

・正しく1/1024で
https://n.mtng.org/ele/arduino/tutorial008.html
https://hsh.s2jp.com/2011/09/arduino-voltmeter/
https://ogapsan.com/archives/150
https://yoshipc.net/arduino-temp/
http://maicommon.ciao.jp/ss/Arduino_g/AnSr/index.htm
https://nekosan0.bake-neko.net/structure_analog_in.html
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14183208509
http://tyk-systems.com/arduinobasic/arduinobasic.html

投稿: 居酒屋ガレージ店主(JH3DBO) | 2020年5月 3日 (日) 14時16分

メモ:コメント先
https://novicengineering.com/%E3%80%90arduino%E3%80%91map%E9%96%A2%E6%95%B0/

投稿: 居酒屋ガレージ店主(JH3DBO) | 2020年5月14日 (木) 13時30分

「map関数」も「1023 vs 1024」です。
・2020年5月17日:Arduino なんとかして誤用を正したい:A/Dの1/1023とmap関数
http://igarage.cocolog-nifty.com/blog/2020/05/post-115911.html

投稿: 居酒屋ガレージ店主(JH3DBO) | 2020年6月 6日 (土) 09時37分

コメントを書く



(ウェブ上には掲載しません)




« ダイソー「明るいランチャーライト」「単3x2本ハンドライト」 LED通電テスト60日 | トップページ | ダイソーReVOLTES単3 JIS C8708:2019充放電試験 200サイクル目完了 »