Team for GR-PEACH Producer Meeting

ADCに関する議論

11 Jan 2015

AnalogInに関して、チェックプログラムを作成してみました。

Import programGR-PEACH_test_ADC

ADC performance check


このプログラムでは、一定量(今回は各チャンネルそれぞれ1024回)のデータを短時間で読み込んで、そのデータを分析して情報を展開する構成になっています。

ハードウェアの接続
A0:2.54V付近の電圧を発生するシャントレギュレータの電圧測定
A1&A2:5Kオームの多回転のポテンショメーターをそれぞれに接続
A#,A4&A5:何も接続してません

下記が、接続状況です。
/media/uploads/kenjiArai/peach_adc.jpg

このプログラムを、①GR-PEACH、②NucleoF411RE、③FRDM-K64Fの3つのmbedで動作させてみました。

ADC変換時間(データをRAMに格納するまで)
①Conversion time/ave = 71.244629 [uS], Number of sample 1024, Max 76 [uS], Min 70 [uS]
②Conversion time/ave = 3.652507 [uS], Number of sample 1024, Max 5 [uS], Min 3 [uS]
③Conversion time/ave = 15.307780 [uS], Number of sample 1024, Max 16 [uS], Min 15 [uS]
ADC測定値

ADC0/ave = 0.754462 , Max 0.754823 , Min 0.753846 , Dif 0.000977
ADC1/ave = 0.499908 , Max 0.500366 , Min 0.499634 , Dif 0.000733
ADC2/ave = 0.799984 , Max 0.800244 , Min 0.799023 , Dif 0.001221
ADC3/ave = 0.732370 , Max 0.743101 , Min 0.721612 , Dif 0.021490
ADC4/ave = 0.678152 , Max 0.693040 , Min 0.659341 , Dif 0.033700
ADC5/ave = 0.647049 , Max 0.667399 , Min 0.621978 , Dif 0.045421

ADC0/ave = 0.746850 , Max 0.749695 , Min 0.743590 , Dif 0.006105
ADC1/ave = 0.500503 , Max 0.504518 , Min 0.495971 , Dif 0.008547
ADC2/ave = 0.800578 , Max 0.803663 , Min 0.797070 , Dif 0.006593
ADC3/ave = 0.602833 , Max 0.649573 , Min 0.553846 , Dif 0.095726
ADC4/ave = 0.608159 , Max 0.656654 , Min 0.541880 , Dif 0.114774
ADC5/ave = 0.600823 , Max 0.623687 , Min 0.530647 , Dif 0.093040

ADC0/ave = 0.753448 , Max 0.754391 , Min 0.752743 , Dif 0.001648
ADC1/ave = 0.499624 , Max 0.500313 , Min 0.498817 , Dif 0.001495
ADC2/ave = 0.799466 , Max 0.800168 , Min 0.798413 , Dif 0.001755
ADC3/ave = 0.677678 , Max 0.775372 , Min 0.553597 , Dif 0.221775
ADC4/ave = 0.515027 , Max 0.717830 , Min 0.277302 , Dif 0.440528
ADC5/ave = 0.389646 , Max 0.677241 , Min 0.171405 , Dif 0.505837

変換時間は妥当でしょうか?
変換データの妥当性はいかがでしょうか?
尚、GR-PEACHは最新のアップデートで、大きなRAM領域で作業ができることが確認できました。
ADC_BUF_SIZEを (4096 * 40)と定義とすると、8,519,680Bytesの配列データを利用できました。

12 Jan 2015

追加情報です。
analogin_api.cを覗いたところ、ANALOGIN_MEDIAN_FILTERが定義され、3回のサンプリングを連続して行い、3つの値の大小を比較して真ん中の値を返していました。
それで70μS以上の変換時間となっていました。
この定義を外すと、
①Conversion time/ave = 24.303711 [uS], Number of sample 1024, Max 26 [uS], Min 24 [uS]
となり、変換データは、

Number of sample 1024
ADC0/ave = 0.754652 , Max 0.756532 , Min 0.752869 , Dif 0.003663
ADC1/ave = 0.499993 , Max 0.501587 , Min 0.498657 , Dif 0.002930
ADC2/ave = 0.799910 , Max 0.801465 , Min 0.798046 , Dif 0.003419
ADC3/ave = 0.764411 , Max 0.768498 , Min 0.758486 , Dif 0.010012
ADC4/ave = 0.736062 , Max 0.743590 , Min 0.724542 , Dif 0.019048
ADC5/ave = 0.711957 , Max 0.725031 , Min 0.696459 , Dif 0.028571
という結果になりました。
ちなみに8MBのバッファーに蓄えたデータでは、
Number of sample 163840
ADC0/ave = 0.754711 , Max 0.757998 , Min 0.751893 , Dif 0.006105
ADC1/ave = 0.499985 , Max 0.502564 , Min 0.497436 , Dif 0.005128
ADC2/ave = 0.799928 , Max 0.802930 , Min 0.796337 , Dif 0.006593
ADC3/ave = 0.764585 , Max 0.772894 , Min 0.754579 , Dif 0.018315
ADC4/ave = 0.736342 , Max 0.748718 , Min 0.718193 , Dif 0.030525
ADC5/ave = 0.712300 , Max 0.732845 , Min 0.688156 , Dif 0.044689
という結果となりました。
3回の平均でなく、3回の中央値を選んでいるのはなぜ?

14 Jan 2015

Araiさん、ご質問ありがとうございます。

>変換時間は妥当でしょうか?

現在のADCライブラリのAD変換時間は21.48us(ハードウェアの処理時間)になります。
Araiさんのご指摘どおり、AD変換関数内部で3回AD測定した中央値をとっているため、
ライブラリとしてのAD変換時間は 21.48us * 3回 = 64.44us となります。
タイマの操作等の計測自体にかかる時間を考えると、妥当な値といえます。

>変換データの妥当性はいかがでしょうか?

RZ/A1Hの変換誤差は最大±11(RZ/A1Hユーザーズマニュアルに記載)です。
mbed APIのread関数はAD変換結果をAD変換精度(0xFFF)で割った値を返していますので、
RZ/A1Hのread関数は、±11/0xFFF=±0.010752 の誤差があるといえます。
Araiさんの測定結果のDif値は上記誤差の範囲内であるので、変換データは妥当であるといえます。
ADC3-5は上記誤差以上の誤差が出ていますが、これは端子がオープンであることに起因するものと考えます。

>3回の平均でなく、3回の中央値を選んでいるのはなぜ?

他のmbed機器が3回の中央値としており、同様の実装にしております。

14 Jan 2015

Hagimotoさん
回答ありがとうございます。
幾つか追加コメントします。
1)変換時間はR01UH0403JJ0100 Rev.1.00ページ1462によれば、最小変換時間がチャンネル当たり5.0μSとあり、70μSと大きなかい離があることが最初の疑問でした。
②がGR-PEACHと同じだけの「タイマの操作等の計測自体にかかる時間」が入っているとなれば、5μSは驚異的な値です。
こちらも12ビット設定です。
2)ADC3-5は、今回の計測では無視すべき値です。コメントを付けずに申し訳ありません。
プログラムは、ADC0から順次ADC5までの計測していますのでSample&Holdのキャパに残っている電圧を測定していると解釈してみました。
ADC2/ave = 0.799928,Dif 0.006593
ADC3/ave = 0.764585,Dif 0.018315
ADC4/ave = 0.736342,Dif 0.030525
ADC5/ave = 0.712300,Dif 0.044689
とみると、ADC2の値を継続した電圧が、キャパ内電荷の放電とともに電圧が低下していき、誤差が拡大する様子がうかがえます。
但し、②はほとんど電圧低下がありません。③はかなり低下します。この辺は、各社の長年のノウハウがあるのかもしれません。
変換精度に関しては、ボードのノイズ回り込み等、最終版の仕上がりに期待します。
3)「他のmbed機器が3回の中央値」としているとありますが、私の比較した②、③のmbedはソースコードを覗く限り一発変換です。
これはmbedの要求仕様ですか?
②、③のmbedは仕様無視でしょうか?

14 Jan 2015

確かにNXP系は3回計測で中央値取り出しをしていました。
ADC変換値を疑っていて、自信が持てないのかな?
ノイズ等の排除処理はユーザー側の持ち分のような気がしますが・・・

14 Jan 2015

確認ですが、裸のデータが欲しい場合は、 マクロの値を再設定すれば使えるのですね?

あと、青mbedのADCの方式はキャパシタに貯まった電荷量を測る方式で、過去、使ってみたが、100usecも時間がかかり、3サンプリングでも、ばらつきが大きく、リアルタイムな測定には使えない感じでした。要は入力インピーダンスが固定でないので、安定測定のために、さらに外付けで大きなキャパシタを入れて安定化が必要になります。これで、さらに測定の応答性が悪くなる。 私の感想では、ADCは、青mbedの弱点の一つです。

My trial to make a dosimeter with GR-SAKURA, http://www.slideshare.net/hirofumiinomata58/gr-sakura-bydigipontar9en これのシート8あたりで、mbedからGR-Sakuraへ乗り換えた理由を説明しています。

いっぽう、GR-SakuraのADCは、安定して使えてます。今回のRzシリーズのADCの方式によりますが、Rxシリーズと同じであれば、裸の値を提供で、使うプログラムの方で、計算すれば良いと思います。できれば、GR-Sakuraと同程度のサンプリングレートで、10usecだいが希望です。 また、mbedのユーザプログラムも、ADCのデータをさらに平均取るようなプログラムを入れ込んでるのが見受けられます。

過去のプロデューサーミーティングとルネナイトのプレゼン資料を一冊にまとめて、後発のボード開発者がまとめてみれるようになっていた方が、効率が上がりそうです→ 事務局

14 Jan 2015

Inomataさん
現在はmbedのライブラリーをmbed-srcで代用しています。
更に正式発行のmbed-srcに反映されない内容があるので、GR-PEACH特別版nombed-srcが提供されています。
プロデューサー活動が終息し一般販売が始まった際には、mbedライブラリーへ移行してmbed-srcを使用しないことが中の人の目標のはずです。
となるとマクロを外す技は一般的ではありません。
この際、皆さんの意見を反映して、NXP方式か一発方式かを決定すべきと思います。
勿論、mbed仕様といわれると困ってしまいますが・・・
私は5μSの変換時間で最速変換とし、そのデータ処理はユーザー任せが良いと思っています。

14 Jan 2015

そうですね。 あとは、RzのTIPSとして、個別にサンプルを、Cookbookで公開する感じでしょうか?

例えば、アセンブラであれば、 http://developer.mbed.org/cookbook/Assembly-Language

ご参考

19 Jan 2015

中の人へ
質問が明確になっていませんでした。
下記質問に回答いただけませんか?

1)3回変換して真ん中の値を選択しているのは、mbedの仕様ですか?
「他のmbed機器が3回の中央値としており、同様の実装にしております。」
では、仕様とは言えないようなニュアンスですが、いかがでしょうか?
2)仕様でなければ、1回のデータで平均化等の加工はユーザー側に一任しませんか?
3)21.48usの変換時間ということですが、3μS以上長いような気がしますが?
「タイマの操作等の計測自体にかかる時間を考えると、妥当な値といえます。」
との回答をいただいていますが、同じ計測をすると3.6μS(一回変換時間)の②のmbedではタイマー処理時間が大半となりませんか?
同じプログラムですので今度はタイマー計測に問題があるでしょうか?

27 Jan 2015

回答が遅くなりまして申し訳ありません。

Hirofumi Inomata さん>

>確認ですが、裸のデータが欲しい場合は、 マクロの値を再設定すれば使えるのですね?

ANALOGIN_MEDIAN_FILTER マクロを 0に設定することで使用可能です。

Kenji Arai さん>

>1)3回変換して真ん中の値を選択しているのは、mbedの仕様ですか?
> 「他のmbed機器が3回の中央値としており、同様の実装にしております。」
> では、仕様とは言えないようなニュアンスですが、いかがでしょうか?

mbedの仕様ではありません。

>2)仕様でなければ、1回のデータで平均化等の加工はユーザー側に一任しませんか?

以下にも記載しますが、変換回数は1回とし、ユーザ側に一任する仕様に変更することにします。

>3)21.48usの変換時間ということですが、3μS以上長いような気がしますが?
>  「タイマの操作等の計測自体にかかる時間を考えると、妥当な値といえます。」
> との回答をいただいていますが、同じ計測をすると3.6μS(一回変換時間)の②のmbedではタイマー処理時間が大半となりませんか?
> 同じプログラムですので今度はタイマー計測に問題があるでしょうか?

ADの変換自体は22usで完了していますが
AD変換関数 adc_read()の実行時間は 24us でした。
>ライブラリとしてのAD変換時間は 21.48us * 3回 = 64.44us となります。
は 「ライブラリとしてのAD変換時間は 24us * 3回 = 72us」 と訂正させてください。
申し訳ありません。

プロデューサーの皆様>
皆様からのご意見をこちらでも検討し、A/D変換結果についてはユーザ側に一任するのが望ましいとの結論に至りました。これまでの「3回取得した結果の中央値を採用」から「1回の結果」に変更とさせていただきます。(次回、mbed-srcより反映)

27 Jan 2015

Hagimotoさん
詳細回答、ありがとうございました。
「一回の結果」に変更、賛成です。
mbed-src内のソースプログラムは変更せず、ANALOGIN_MEDIAN_FILTER マクロを 0に設定する事を要望します。
将来、mbedライブラリーにマージされた時には「一回の結果」で、mbed-srcを利用してマクロで「3回取得した結果の中央値を採用」が選択できるのがよいと思います。
Inomataさんが青mbedに言及しておられるので、LPC1768も測定してみました。1024回のデータ解析はRAMサイズが不足しますので、512回としました。
前回利用したシャントレギュレータとポテンショが抵抗値変更なしでそのまま残っていましたので、下記を参照ください。
追加で、最初の状態が保存されていることを確認するため、1024回の再測定値も載せておきます。
LPC1768はADCが、端子の接続時のインピーダンスに大きく左右されそうですね。
変換時間は結構速いと思います。

---LPC1768------

  1. ANALOGIN_MEDIAN_FILTER 1
    Conversion time/ave = 21.170898 [uS], Number of sample 512, Max 22 [uS], Min 21 [uS]

    Number of sample 512
    ADC0/ave = 0.749166 , Max 0.750183 , Min 0.748718 , Dif 0.001465
    ADC1/ave = 0.797426 , Max 0.797802 , Min 0.796825 , Dif 0.000977
    ADC2/ave = 0.498045 , Max 0.499390 , Min 0.497192 , Dif 0.002198
    ADC3/ave = 0.735794 , Max 0.770940 , Min 0.682296 , Dif 0.088645
    ADC4/ave = 0.736741 , Max 0.786081 , Min 0.663004 , Dif 0.123077
    ADC5/ave = 0.731476 , Max 0.790965 , Min 0.658120 , Dif 0.132845

  2. ANALOGIN_MEDIAN_FILTER 0
    Conversion time/ave = 8.295573 [uS], Number of sample 512, Max 9 [uS], Min 8 [uS]

    Number of sample 512
    ADC0/ave = 0.748616 , Max 0.750183 , Min 0.747741 , Dif 0.002442
    ADC1/ave = 0.797758 , Max 0.800000 , Min 0.795604 , Dif 0.004396
    ADC2/ave = 0.497964 , Max 0.500366 , Min 0.495727 , Dif 0.004640
    ADC3/ave = 0.731113 , Max 0.769719 , Min 0.676923 , Dif 0.092796
    ADC4/ave = 0.730759 , Max 0.779487 , Min 0.668132 , Dif 0.111355
    ADC5/ave = 0.731023 , Max 0.797314 , Min 0.652991 , Dif 0.144322

    ---GR-PEACH-------

  3. ANALOGIN_MEDIAN_FILTER 1
    Conversion time/ave = 71.246745 [uS], Number of sample 512, Max 77 [uS], Min 70 [uS]

    Number of sample 512
    ADC0/ave = 0.754472 , Max 0.754823 , Min 0.753846 , Dif 0.000977
    ADC1/ave = 0.799898 , Max 0.800488 , Min 0.799512 , Dif 0.000977
    ADC2/ave = 0.499936 , Max 0.500366 , Min 0.499634 , Dif 0.000733
    ADC3/ave = 0.536089 , Max 0.540171 , Min 0.529915 , Dif 0.010256
    ADC4/ave = 0.567318 , Max 0.572161 , Min 0.558730 , Dif 0.013431
    ADC5/ave = 0.583959 , Max 0.592430 , Min 0.573871 , Dif 0.018559

  4. ANALOGIN_MEDIAN_FILTER 0
    Conversion time/ave = 24.322591 [uS], Number of sample 512, Max 25 [uS], Min 24 [uS]

    Number of sample 512
    ADC0/ave = 0.754298 , Max 0.755556 , Min 0.753602 , Dif 0.001954
    ADC1/ave = 0.799908 , Max 0.801221 , Min 0.799267 , Dif 0.001954
    ADC2/ave = 0.499936 , Max 0.500611 , Min 0.498657 , Dif 0.001954
    ADC3/ave = 0.518091 , Max 0.520147 , Min 0.511844 , Dif 0.008303
    ADC4/ave = 0.532543 , Max 0.536508 , Min 0.523565 , Dif 0.012943
    ADC5/ave = 0.544646 , Max 0.549451 , Min 0.532357 , Dif 0.017094

    ---GR-PEACH-------

  5. ANALOGIN_MEDIAN_FILTER 1
    Conversion time/ave = 71.244303 [uS], Number of sample 1024, Max 75 [uS], Min 70 [uS]

    Number of sample 1024
    ADC0/ave = 0.754575 , Max 0.755067 , Min 0.754090 , Dif 0.000977
    ADC1/ave = 0.799907 , Max 0.800488 , Min 0.799512 , Dif 0.000977
    ADC2/ave = 0.499924 , Max 0.500366 , Min 0.499634 , Dif 0.000733
    ADC3/ave = 0.536028 , Max 0.540171 , Min 0.530891 , Dif 0.009280
    ADC4/ave = 0.567135 , Max 0.571429 , Min 0.558486 , Dif 0.012943
    ADC5/ave = 0.583781 , Max 0.592918 , Min 0.573138 , Dif 0.019780

  6. ANALOGIN_MEDIAN_FILTER 0
    Conversion time/ave = 24.312174 [uS], Number of sample 1024, Max 25 [uS], Min 24 [uS]

    Number of sample 1024
    ADC0/ave = 0.754598 , Max 0.756044 , Min 0.753846 , Dif 0.002198
    ADC1/ave = 0.799873 , Max 0.801465 , Min 0.798046 , Dif 0.003419
    ADC2/ave = 0.499923 , Max 0.500855 , Min 0.498657 , Dif 0.002198
    ADC3/ave = 0.518670 , Max 0.524054 , Min 0.513553 , Dif 0.010501
    ADC4/ave = 0.533227 , Max 0.543101 , Min 0.524298 , Dif 0.018803
    ADC5/ave = 0.545549 , Max 0.560195 , Min 0.532845 , Dif 0.027350
31 Jan 2015

mbed-src-RZ-A1H-pre-releaseが昨日リリースされましたので、ADC変換の変更結果を再度測定してみました。

Conversion time/ave = 7.634928 [uS], Number of sample 1024, Max 10 [uS], Min 7 [uS]
Number of sample 1024
ADC0/ave = 0.754922 , Max 0.756288 , Min 0.754090 , Dif 0.002198
ADC1/ave = 0.799948 , Max 0.800733 , Min 0.799023 , Dif 0.001709
ADC2/ave = 0.500082 , Max 0.501099 , Min 0.499390 , Dif 0.001709
ADC3/ave = 0.517612 , Max 0.522100 , Min 0.512088 , Dif 0.010012
ADC4/ave = 0.532134 , Max 0.539683 , Min 0.524054 , Dif 0.015629
ADC5/ave = 0.544795 , Max 0.556044 , Min 0.532845 , Dif 0.023199

妥当な変換時間71.2[us]から最良の7.6[uS]となりました(とは言っても1uS精度のタイマー計測なので)。
今回、ADC変換時間が5.1[uS]に設定されたようで、三回測定中間値採用から最速変換一回測定で約10倍速くなったことになります
修正、ご苦労様でした。
改めて比較対象を含め整理しておきます(F411とK64FのADC接続が他と違っていましたので、順序変更しています)。

  1.  GR-PEACH
    Conversion time/ave = 7.634928 [uS], Number of sample 1024, Max 10 [uS], Min 7 [uS]
    ADC0/ave = 0.754922 , Max 0.756288 , Min 0.754090 , Dif 0.002198
    ADC1/ave = 0.799948 , Max 0.800733 , Min 0.799023 , Dif 0.001709
    ADC2/ave = 0.500082 , Max 0.501099 , Min 0.499390 , Dif 0.001709
  2.  NucleoF411RE
    Conversion time/ave = 3.652507 [uS], Number of sample 1024, Max 5 [uS], Min 3 [uS]
    ADC0/ave = 0.746850 , Max 0.749695 , Min 0.743590 , Dif 0.006105
    ADC2/ave = 0.800578 , Max 0.803663 , Min 0.797070 , Dif 0.006593
    ADC1/ave = 0.500503 , Max 0.504518 , Min 0.495971 , Dif 0.008547
  3.  FRDM-K64F
    Conversion time/ave = 15.307780 [uS], Number of sample 1024, Max 16 [uS], Min 15 [uS]
    ADC0/ave = 0.753448 , Max 0.754391 , Min 0.752743 , Dif 0.001648
    ADC2/ave = 0.799466 , Max 0.800168 , Min 0.798413 , Dif 0.001755
    ADC1/ave = 0.499624 , Max 0.500313 , Min 0.498817 , Dif 0.001495
  4.  LPC1768
    Conversion time/ave = 21.170898 [uS], Number of sample 512, Max 22 [uS], Min 21 [uS]
    ADC0/ave = 0.749166 , Max 0.750183 , Min 0.748718 , Dif 0.001465
    ADC1/ave = 0.797426 , Max 0.797802 , Min 0.796825 , Dif 0.000977
    ADC2/ave = 0.498045 , Max 0.499390 , Min 0.497192 , Dif 0.002198
  5.  NucleoL152RE 新規測定
    Conversion time/ave = 32.031413 [uS], Number of sample 1024, Max 37 [uS], Min 30 [uS]
    ADC0/ave = 0.749062 , Max 0.753114 , Min 0.747253 , Dif 0.005861
    ADC1/ave = 0.800359 , Max 0.802930 , Min 0.798046 , Dif 0.004884
    ADC2/ave = 0.500353 , Max 0.504029 , Min 0.497436 , Dif 0.006593