センサの数字は何を表す?|A/D変換・分解能・標本化・ビット操作
センサから320という値が返ったら、温度は320度なのでしょうか。数字が電圧の区間を示すのか、換算済みの物理量なのかで意味が違います。変換条件を確認してから、測定値を読みましょう。
事例:温度センサの電圧を10ビットで読む
温度センサは0℃で0.5V、1℃上がるごとに0.01V増える特性です。入力範囲0V以上3.2V未満を、10ビットのADCで変換します。ここでは理想的に各区間の下端へ対応する整数符号を返す方式とします。
量子化の区間幅は3.2/1024=0.003125Vです。入力1.000Vの符号は320で、その下端の電圧を使った温度換算は(1.000-0.5)/0.01=50℃となります。
- 1. 電圧
- 2. 符号×区間幅
- 3. センサ特性で換算
ADCの符号と温度は別の値です。センサの特性とADCの変換条件の両方を使います。
10ビットなのに、最大値が1023なのはなぜ?
- 符号数
Nビットなら2^N通りです。10ビットでは1024通りあります。
- 最大符号
符号が0から始まるため、10ビットの最大値は1023です。
- 区間幅
この事例では入力範囲を1024等分するので、3.2V/1024です。
符号数と最大符号は一つ違います。2^Nで区間幅を求めるモデルと、端点を2^N-1へ対応させる換算式を混ぜません。実際の伝達特性、基準電圧、符号形式はADCの仕様で確認します。
今回のモデルでは符号320が示す入力は1.000V以上1.003125V未満です。50℃はその下端に対応する推定値で、連続した入力を一点へ丸めた結果です。符号から元の電圧を完全には復元できません。
ビット数を増やせば、正確さも保証される?
このセンサでは10ビットの一段が0.003125/0.01=0.3125℃に対応します。同じ入力範囲を12ビットにすると一段は0.00078125V、温度では0.078125℃です。
条件 | 電圧の一段 | 温度の一段 |
|---|---|---|
10ビット・3.2V範囲 | 3.125mV | 0.3125℃ |
12ビット・3.2V範囲 | 0.78125mV | 0.078125℃ |
細かい段階を表せることと、実際の値へ正確に一致することは別です。センサの誤差、基準電圧のずれ、雑音、ADCの非直線性などがあれば、ビット数だけを増やしてもそれらは解消しません。
入力が範囲を超えると、最大符号へ飽和する、故障や異常を示すなど、仕様に応じた扱いになります。上限を超えた物理量まで正しく測れると解釈せず、異常値の検出と入力保護も確認します。
標本化の周期で、何を見逃す?
標本化は、時間的に連続する信号を一定間隔の値として取り出す処理です。100回/秒なら標本化周波数は100Hz、周期は10msです。振幅を段階的な値にする量子化とは別の処理です。
帯域が制限された信号を基本帯域で復元する条件では、標本化周波数を最大周波数の二倍より高くし、標本化前に不要な高周波成分を抑えます。実際のフィルタには余裕のある周波数設定が必要です。
100Hzで標本化した170Hzの正弦波は、サンプル上では30Hzの信号と区別できない場合があります。高い周波数が別の低い周波数へ見える折返しです。変換後の平均処理だけで元の信号を一意に取り戻せません。
どちらも数字にする処理ですが、制約は異なります。
bit 3だけを変えたいとき、何を使う?
bit 0を最下位とする8ビット値を扱います。ビットを立てるならOR、下げるなら反転したマスクとのAND、状態を調べるならマスクとのANDを使います。
値 = 0xA5 # 1010 0101
bit 3を立てる:値 | 0x08 = 0xAD
bit 2を下げる:0xAD & 0xFB = 0xA9
bit 3を調べる:0xA9 & 0x08 = 0x08同じビットを二回立てても立ったままです。一方、XORは反転なので二回使うと元へ戻ります。「有効にする」と「今の状態を反転する」は操作の目的が違います。
複数ビットの設定と、実レジスタの注意
bits 5〜3を3へ設定するなら、マスク0x38の部分を消してから3<<3をORします。元が0xA5なら結果は0x9Dです。他のビットを保持することが目的です。
field = (value >> 3) & 0x07
updated = (value & 0xC7) | ((new_field & 0x07) << 3)これらは通常の8ビット値の計算例です。ハードウェアには1を書いてフラグを消すビットや、読み出すと状態が変わるレジスタもあります。通常の読出し・変更・書戻しが使えるかを仕様で確認します。
割込みとタスクが同じ値を変更する場合、読出しと書戻しの間に別の更新が入り、変更が消えることもあります。ビット演算を使っただけで原子的な更新になるわけではありません。排他や専用の設定・解除レジスタを検討します。
計測値を答案へ使う前に確かめる
符号数、入力範囲、変換の基準、センサ特性、時刻の単位を揃えます。誤差の扱いを指定していない問題で、下端・中央値・端点換算を勝手に混ぜないようにします。
閾値の近くでは一段の変化や雑音で判定が行き来することがあります。ヒステリシスや連続確認を使うなら、検出が遅れる影響も含めて設計します。精度と応答の両方を条件に結び付けます。
演習1:区間幅
条件:入力範囲は3.2V、10ビットで1024等分します。
問い:一段の幅を求めてください。
解答例:0.003125V、つまり3.125mVです。
根拠:3.2/1024で求めます。10ビットは10段という意味ではありません。
誤答の理由:3.2/1023は別の端点換算のモデルであり、この事例の条件と異なります。
演習2:温度への換算
条件:符号320、下端電圧=符号×0.003125V、0℃で0.5V・1℃あたり0.01Vです。
問い:下端に対応する温度はいくつですか。
解答例:50℃です。
根拠:320×0.003125=1Vから、(1-0.5)/0.01=50℃となります。
誤答の理由:320℃や100℃は、ADCの換算やセンサの0.5Vのオフセットを無視した値です。
演習3:分解能の比較
条件:入力範囲3.2V、センサの傾き0.01V/℃を変えず12ビットへ増やします。
問い:一段は何℃ですか。
解答例:0.078125℃です。
根拠:3.2/4096/0.01で求め、10ビットの一段の四分の一になります。
誤答の理由:正確さが必ず四倍になるという主張は、雑音やセンサ誤差まで改善したことになりません。
演習4:標本化の条件
条件:100Hzで標本化し、測定したい信号の最高周波数は20Hzです。
問い:計測前に高周波雑音を抑える理由を説明してください。
解答例:標本化で高周波成分が低周波へ折り返し、測定対象と区別できなくなるのを抑えるためです。
根拠:測定対象の帯域だけでなく、入力に含まれる不要な成分も標本化されます。
誤答の理由:100Hzが20Hzの二倍より高いのでフィルタ不要、とだけ判断すると雑音を見落とします。
演習5:一ビットの設定
条件:値は0xA5、bit 0が最下位です。bit 3だけを1にします。
問い:式と結果を答えてください。
解答例:0xA5 | 0x08 = 0xADです。
根拠:bit 3のマスクは2³=8で、ORなら他のビットを変えません。
誤答の理由:XORは既に1なら0へ戻すため、常に1に設定する操作とは異なります。
演習6:フィールドの置換
条件:値0xA5のbits 5〜3を3へ設定し、他のビットを維持します。
問い:結果はいくつですか。
解答例:(0xA5 & 0xC7) | (3<<3) = 0x9Dです。
根拠:対象部分を0にしてから新しい値を入れます。
誤答の理由:消さずにORだけを使うと、元から1の対象ビットを0へ変えられません。実レジスタの副作用も別に確認します。
出典と仕様を確認する
関連テーマを続けて学ぶ
次におすすめの学習
編集・検証について
編集・検証:IT資格ラボ編集部
IPAが公開する試験要綱・シラバス・過去問題と、各技術の公式資料を優先して内容を確認しています。制度変更や誤りを確認した場合は、記事を見直して更新します。
編集方針・情報源・訂正方針を見る