2020年12月31日木曜日

PICのADC2格闘 その1

 PICマイコンにも当然の如くA/Dコンバーターが内蔵されております。
それが最近、「ADC2」という名称の新型が登場。
わざわざ名称を変えるくらいですから、単なるバージョンアップ以上の、
何か凄いものを感じまして、登場後まもなくして手を出しておりました。

はたして、期待を超える中身の難解さに頭を抱えつつも、
なんとかデーターを取得できるようになり、現在に至っておりました。
しかしあるキッカケでデーター取得ルーチンを改良を開始したところ、
急に雲行きが怪しくなってきまして、結構なボリュームの話になってしまいました。
その顛末を複数回に分割して記載します。

************************************************************

前述のADC2ですが、まだ割りと新しい部類に入るため、
積んでるPICマイコンは そんなに多くありません。
その中で私が使っている石はPIC18F47K40とPIC16F18456。
それぞれ、「かんたんスマートモニター」と「V/Aプローブ」に載っています。

先に使い出したのはPIC18F47K40の方ですが、
私がADC2に求めたのは平均化処理の簡便化。
センサーのアナログ値を取得する際にノイズの影響を軽減する為、
連続で複数個のデーターをサンプリングし、平均化して使用してます。
もちろんソフト上で処理することも可能なわけですが、
ADC2ならハードウェアで処理できると聞くと手を出したくなるわけです。

初見のADC2は非常にインテリジェントなデバイスに見えました。
マニュアルのボリュームが凄くて、非常な多機能さを感じたのです。
感覚としては従来のADCの5倍以上というところでしょうか。
しかしこの初見は、今回の騒動で的外れだったことに気付きました。

確かにADC2はADCに比べて多機能なのですが、
インテリジェンスさが不足している為、ユーザーへの負担が大きく、
その為にマニュアルのボリュームが増えてしまっていたのでした。
逆に言えば、機能の量に比べてマニュアルが難解すぎる感じ。
現時点の感想を言えば、無理して手を出すほどの代物ではなかったかも。



そんな私感はさておき、本題を進めます。

一応、「かんたんスマートモニター」にてADC2を動かしていた(つもり)わけですが、
「V/Aプローブ」用のファームを作るにあたり、再度ADC2を見直してみることに。

ならば、「かんたんスマートモニター」のハムノイズ対策を行ってみようと思いました。
通称ハムノイズというのはAC電源ラインからの誘導ノイズのこと。
つまり50Hzもしくは60Hzのノイズがアナログ信号に載ってくる現象です。
周波数が低いので、LPFで除去しずらいんですね。

ではどうするかといいますと、1波長分の時間に渡ってデーターサンプリングを行い、
それを平均化すれば除去できてしまいます。
当然のことながら この間に元の測定信号に変動が有っても
全て平均化されてしまいますので、急激に変化するアナログ信号に対しては使えません。

50Hzの場合、1波長の時間(=周期)は20msですので、
20ms使って1回のデーター取得するようしてみます。
ポイントは2点。
サンプリング回数は多い方が好ましいとい点と、
サンプリング間隔は極力揃っていることという点。
特に後者は大事ですね。

PICマイコン内蔵のA/Dコンバーターのデーターサンプリング時間は、
12μs~100μsというところ。
動作クロックと設定で変わってくるわけですが、最長でも 0.1msとなると、
20msもサンプリングを続けたらデーター数が200個以上に!!

しかしそんな時の為のADC2と思いきや、ADC2はそこまで高機能ではありませんでした。
平均化用のサンプル数を設定することは可能ですが、全体の時間というのは設定不可。

 

ここでADC2が持ってる機能について、さらっと説明。

まず、通常のADCと同様の動作をするレガシーモード。
レジスター構成は異なりますが、デバイスの動きはADCと同じです。

次に積算モード。
サンプリングしたデーターを単純に合算していきます。

次は平均化モード。
サンプリングしたデーターを合算し、サンプリング数で割ることで平均値を出力できます。

最後にバースト平均化モード。
先に書いた平均化モードと何が違うの?という疑問が出ますね。
一言で言うと、サンプリングのトリガーが1回だけなんです。
バースト平均化モードではサンプリングをスタートさせると、
設定回数のサンプリングを行った後に平均値の出力までを一気に実行します。
なので当然ながら動作終了まで そこそこ時間を要します。

ちなみに平均化モードの場合、トリガーを掛けるとサンプリングは1回のみ。
なので例えば16回サンプリングして平均を採りたい場合は、
16回トリガー掛けてやる必要があるわけですね。

ちなみに上記の他にローパスフィルターモードというのが有りますが、
私自身使ったことが無い為、詳しく調べていないので割愛させて頂きます。


さて、上記のように単純にサンプリングしたデーターを平均化したいだけならば、
バースト平均化モードがピッタリですね。
トリガー1回で平均値が出てくるわけですから。

しかし今回は20msに渡ってサンプリングを行うという主旨です。
バースト平均化モードには 時間幅を設定する機能はありません。

ならばプリチャージ時間とアクィジョンタイムを延ばしてみたらどうか、試してみました。
もし各サンプリング動作の前のプリチャージ時間とアクィジョンタイムが延びるなら、
全体のデーター収集時間を20ms近くに出来るかもしれません。

試してみると確かにデーター収集時間は延びるものの、
期待した程は延びてくれません。
どうやらプリチャージ時間とアクィジョンタイムの挿入は、
データー収集全体の前に1回だけっぽいです。
これだと、今回の目的に対して全く意味がありません。

ですのでまた別な手段が必要になりました。
(続く)

0 件のコメント:

コメントを投稿