Arduino UNO R4のDACサンプルに出てくるmap関数
・Arduino UNO R4 Minima Digital-to-Analog Converter (DAC)
この中のサンプルプログラムに
freq = map(analogRead(A5), 0, 1024, 0, 10000);
というma関数を使った変換式が出てきます。
トラ技の著者でもあるjh4vajさんが、ブログで
「1024じゃなくて1023だと思うが」と書かれています。
これにちょっと反論を。
※jh4vajさんのブログにうまくコメントできないので
ここに記しておきます。
・Arduino UNO R4 MinimaのDAC ~ analogWaveクラス編
mapの1023・1024問題、これは
10bit→8bitの変換にmap(a, 0, 1023, 0, 255)
とするからおかしいのであって、(本来は1/4するだけ)
map(a, 0, 1024, 0, 10000)は
「そういう変換」だからこれでかまいません。
「1024の時に10000になるよ」あるいは
「なったよ」を表現しているわけです。
10bitのADCだとフルスケールが1023で
規制されるのでおかしな感じになりますが、
半値の512だと5000だし、
2倍の2048なら20000になり、
ADCの分解能を上げ下げしても線形補間の傾きは同じです。
※a=1023だと9990.234に
ですので、当然
map(a, 0, 1023, 0, 10000)
も、okなわけです。
「1023の時は10000でっせ」の変換式です。
10bit→8bit変換での1023・1024問題とは関係なくて、
これは正しい使い方です。
※関連
・トランジスタ技術2024年3月号に記事が載りました
・Arduino なんとかして誤用を正したい:A/Dの1/1023とmap関数
map(x, 0,1023, 0,255) ・・・これが正しい例を紹介
| 固定リンク
「1023 vs 1024」カテゴリの記事
- おっと。map関数の計算桁に注意(2024.10.06)
- サーミスタでの温度測定、「inf」の出現に耐えられるか?(2024.05.13)
- トラ技2024年5月号に「3.3/65535」(2024.04.07)
- ラズピコだと1/65535が出現(2024.03.30)
- Arduino UNO R4のDACサンプルに出てくるmap関数(2024.02.19)
コメント
整理すると、jh4vjaさんのおっしゃる
freq = map(analogRead(A5), 0, 1023, 0, 10000);
でもOKで、ケースバイケースということですよね。
例えば、可変抵抗を廻して値を設定する場合。
freq = map(analogRead(A5), 0, 1024, 0, 10000);
とやると、ツマミをいっぱい廻してもfreqの値がフルスケールの10000にならないので、プログラムのバグと言われちゃいます。
一方でバイナリーの値として均一に変換したい場合は、こっち(1024)を使わないといけない。
投稿: ラジオペンチ | 2024年2月21日 (水) 08時37分
map(a, 0, 1023, 0, 255)がダメなのは、
「10bit→8bitの変換」に使ったから。
他の用例は、「そういう変換」だからOK。
分解能「2^n」やフルスケール「2^n - 1」じゃなくても、値はなんでもエエんです。
基点もゼロじゃなくてもok。
入りの値と出の値が2点あり、その直線上の値を求める。
線形補間って、そういうものです。
1024,,10000)の場合、中央512で5000が出ます。
1023,,10000)だと512で5004。
四捨五入は別にして、1024,,10000)で変換値を出し、入力フルスケール1023をチェックしてその時だけを10000とするほうが良いかなっと思ったりします。
入力値に対して約10倍のスケールアップ、入力がアナログ値なんでなかなか微妙かと。
投稿: 居酒屋ガレージ店主(JH3DBO) | 2024年2月21日 (水) 10時01分
1023/1024問題について昨夜Xでこんなやり取りをしました。
https://x.com/yas0107/status/1760272406361600463?s=20
https://x.com/radiopench1/status/1760288142043803811?s=20
返信を全部読むと判りますが、ChatGPTの回答がブレていて面白いです。
投稿: ラジオペンチ | 2024年2月22日 (木) 07時17分
はははは。 おもしろい!!
投稿: 居酒屋ガレージ店主(JH3DBO) | 2024年2月22日 (木) 08時57分