1023はどこから来たのか
前回、10bitADCの出力値を電圧に変換するコードをCodexが出力した際に、1023で割っていることを話題にした。
adc_value = adc_read(ADC_CHANNEL_LM61);
millivolts = (uint16_t)((((uint32_t)adc_value * ADC_VREF_MV) + 511UL) / 1023UL);
ADCは0vと基準電圧の間を、ビット数の段階分だけ量子化する。
2の十乗は1024なので、1024で割るのが正しい。
電圧=\frac{基準電圧}{2^{n}}ADCの出力値
基準電圧が5VでADC出力が1の場合は
4.88=\frac{5000}{1024}1
となる。
ここで下の1024の代わりに、1023を使っているコードを多数見かけるのだが、それなりの便宜的な理由が有るようだ。
10bit数の最大値は1023だ。
ADCが1023を出力した時、基準電圧と同じなほうが見た目が良い。
4995.1=\frac{5000}{1024}1023
5000=\frac{5000}{1023}1023
そのために、誤差を覚悟で1023を使うようだ。
しかしながら、ADCが出力1023を出すのは
4995mvと5000mvの区間であり、実際には5000mvと定まらない。
どれだけRail to RailなADCであっても、GNDレベルと基準電圧と完全に一致することを計測できない。
端数を加える場合
上記のCodexは、計算式に端数を加えている。
1024を基数する場合、ADC出力値1023の場合実際の電圧は4995mvと5000mvの間である。
そこで端数を加えると、区間の丁度中間になる。
4997.5=\frac{5000}{1024}1023 + \frac{5000}{1024}0.5
こちらの方が、気持ちがいいかもしれない。
しかし基数1023の場合に端数を加えると基準電圧を超えてしまう。