|
雑誌等のプログラムやメーカーのアプリケーションノートのコードを
をコピーして、出来た出来たと喜んでいる者たちには、Accuracy と言っても
"Accuracy って何 ?、どこの世界の話 ?" でしょうね。 リモコン受信機を作るために PICを始めたようなもので、他にこれといって PICで作りたい ものもないのですが、将来何か作る必要が生じた時に PICが使えるかどうか判断するために、 PICの基本性能は把握しておかねばなりません。
PIC を使えば簡単に "A/D コンバーターのようなもの" が構成できますが、A/D コンバーター
のオモチャであるか、実用にも使えるかは PIC の A/D コンバーターの性能によります。
誤差が ±0.1% 程度であれば十分実用機器として使うことが出来ますが、±0.5% 以上もあったら
とてもじゃないが実用機器として使うことは出来ないと考えます。従って発表したり販売したりする
場合はその性能も発表しなければなりません。もし実用に耐えない場合には、"これは PIC を
使ってこのようなものが出来るという EXAMPLE であり、実用を目的としたものではありません。
実用を目的とする場合は、通常の A/D コンバーター をご使用ください。" のような説明を
加えなければなりません。このような説明なしで販売したり発表することは悪質と言わざるを
得ません。中には使えるものとして購入したり、コピーする人がいるからです。
|
|
絶対誤差
PIC 10bit A/D Converter 内蔵 16F874A なぜ絶対誤差かと言えば、通常の電圧計で同じ測定レンジの場合、測定電圧が近ければ相対的な 誤差はほとんど無いからです。当方は 4 1/2 桁のものを使用しておりますが、これは安価な テスターでも言えることです。即ち基準電圧を 2.048V に合わせ、同じ電圧計の同じ測定レンジで 測定電圧を 2.000V に合わせれば相対的な誤差はほとんど生じないということです。しかし新品で 数百円などというオモチャのようなテスターについては知りません。
また A/D 変換の観点から見れば、基準電圧と測定電圧が同じ場合、基準電圧の誤差は A/D 変換
出力に表れません。これは常識的に分かりますね。基準電圧と測定電圧が同じ時、A/D Converter に
変換誤差がなければ同じ変換出力が得られるということです。従って基準電圧と測定電圧が同じであれば
最も良いのですが、A/D Converter の変換誤差が+側にある場合、正しく表示されません。
そこできりの良いところで測定電圧 2.000V としています。
変換出力は 1008 でなんと+0.8% もの誤差があります。これだけ誤差が大きいと、このままでは
実用機器の A/D Converter としては使えません。
データシートのどこにも記述はないのに、PIC の A/D Converter の誤差は±1LSB 以下などと
思い込んでいる者もいるようですが、一度測定してみることを勧めます。思い込みは自由ですが、
思い込みを活字にしてはなりません。
直線性
解決方法として入力・アース間に336KΩを付けたのが青カーブです (Rs は 2.4kΩ = Maximum
recomended impedance for analog sources is 2.5kΩ)。ほぼベストな特性となっていますが、
抵抗値は前段の出力インピーダンスや PIC、基板の作り方により異なってきますので単純に真似は
できません。(^^♪
デジタルもアナログを理解していなければまともなものは出来ないのです。 |
|
内蔵 Vref accuracy 計算値より実測値が少し小さいのは、Vref 回路の電流をオン・オフする TR の飽和電圧 Vsat の ためです。まあ理由はあるにせよ、これだけ誤差が大きいと実用には使えません。お子様のオモチャ には十分使えます。また、Range 1 の VR3-VR0 が 0 と 1 で計算値より実測値の方が少し大きいのは、 Range 0 と Range 1 を切り換える TR の内部抵抗のためです。電源電圧 安定化 5.000V。 |
| VR3-VR0 | Range 0 計算値[V] | Range 0 実測値[V] | Range 1 計算値[V] | Range 1 実測値[V] |
| 0000 | 1.250 | 1.222 | 0.000 | 0.016 |
| 0001 | 1.406 | 1.378 | 0.208 | 0.215 |
| 0010 | 1.563 | 1.532 | 0.417 | 0.414 |
| 0011 | 1.719 | 1.688 | 0.625 | 0.616 |
| 0100 | 1.875 | 1.844 | 0.833 | 0.818 |
| 0101 | 2.031 | 1.999 | 1.042 | 1.020 |
| 0110 | 2.188 | 2.152 | 1.250 | 1.220 |
| 0111 | 2.344 | 2.308 | 1.458 | 1.423 |
| 1000 | 2.500 | 2.465 | 1.667 | 1.630 |
| 1001 | 2.656 | 2.623 | 1.875 | 1.836 |
| 1010 | 2.813 | 2.779 | 2.083 | 2.043 |
| 1011 | 2.969 | 2.937 | 2.292 | 2.251 |
| 1100 | 3.125 | 3.098 | 2.500 | 2.464 |
| 1101 | 3.281 | 3.259 | 2.708 | 2.676 |
| 1110 | 3.438 | 3.413 | 2.917 | 2.881 |
| 1111 | 3.594 | 3.570 | 3.125 | 3.090 |
|
INTOSC accuracy
いくつか OSCCAL値を変えて測定してみましたが、INTOSCの発振周波数は OSCCAL値で最も誤差が
小さくなるように設定されています。従って OSCCAL値を変えても工場出荷時の値より誤差が小さくなる
ことはありません。このため正確な周波数カウンタを持たない者は OSCCAL値を削除してはなりません。
合わせる方法がなくなります。
16F887は INTOSCの accuracyが 1%ということですので測定してみました。CR発振で 1%まで持っていく
のは大変なことです。OSC2 から出力されるクロックを測定していますので、原発振周波数は 4倍しなければ
なりません。周波数安定度は OSCを内蔵した他の PICと同程度と思われます。 |
| OSCTUNE値 | クロック周波数[KHz] | Comment |
| 01111 | 2,224.6 | Maximum frequency |
| 01110 | 2,210.5 | |
| ・ | ||
| ・ | ||
| ・ | ||
| 00001 | 2,022.7 | One step high from default |
| 00000 | 2,008.7 | Factory calibrated frequency |
| 11111 | 1,995.8 | One step low from default |
| ・ | ||
| ・ | ||
| ・ | ||
| 10000 | 1,781.6 | Minimum frequency |