ogochan
実案件の話なのであまり具体的には書けないのですが、アナログセンサーのボードを作りました。
今時はたいていのセンサーがデジタル化していて、I2CとかSPIとかつなげば動いてしまうのですが、この度のセンサーは純アナログです。
もちろん最終的にはAD変換してデジタルデータにするのですが、そこまでの回路がアナログなわけです。これがちょっと厄介。
概要
アナログのセンサーをデジタルで使うためには、適当なアンプをつないでその信号をADCに入れて... なんですが、今時の傾向を見ればわかると思いますが、そういった簡単なインターフェイスのものは、既にだいたいデジタルのセンサーが存在していて、結構良い性能だったりします。比較的難しいタイプのものでも、信号処理とか含めて1chipになっていたりするので、昔のことしか知らないとびっくりしてしまいます。
そういった背景がありますから、今時アナログセンサーを使うというのは、「そうでないと実現できない」類のセンサーです。以前やったものだと、いわゆるロードセルを使った圧力センサーがそうでした。某潜水艇の深度センサーとして使いました。
このセンサーは「センサー装置」として販売されているものなので、アナログセンサーと言えども生のセンサーからの出力ではなくて、何らかのアナログ的な信号処理(I-V変換とか)がされたものなので、ごく簡単なアナログ処理(250Ω抵抗終端によるI-V変換)の結果を適当なバッファアンプを介してAD変換してやるだけで、後は校正テーブルを作ってやるというごく簡単なものでした。いろんな都合から機体に装着した状態での校正だったので、実際に海に潜ったりしなきゃいけなくて大変だったわけですけど。
左に乗っているのが私。まだ浮上している時なのでぼーっとしてますが、このまま沈めると物差し代わりの紐を見ながら、センサーデータをメモするという大変忙しいことになります。本当に文字通りの「処女航海」なので内心ビビっているわけですが、潜り始めるとそれどころではありませんw
現案件だと、生の電気化学式のガスセンサーです。つまり、インターフェイス部分も含めての設計となります。
第一試作
このタイプのセンサーは直流のバイアスをかけてやって、ガス濃度に逆比例した電流が流れるので、それをI-V変換してからAD変換することになります。と書くと簡単なんですが、
- 「直流バイアス」はセンサーの値にモロに影響を与えます
- 出て来る信号の変化は極端に小さいです
- 精度良く変換するためにはAD変換の精度も考えなければなりません
ということで、深度センサーの時とは随分違うことを考えなければなりません。
幸い、バイアスと増幅については「ガスセンサー用アナログフロントエンド(AFE)IC」なんてものが存在していて、それを使えばだいたいOKです。と言うか、ここをディスクリートで作るのは、極端に面倒臭いことになります。案件始まった頃に半導体不足が始まって、「いくら何でもこんなマイナー用途のICは大丈夫だろう」とか油断していたらどこも在庫が0になってて青くなりました。幸いどこかから出て来たのか入手可能になりましたけど、なかったらディスクリートになって、それはそれでまた半導体の入手が... みたいになるところでした。
基準電圧についてはそれ用のICがあります。これ自体はあまり難しいものではありません。
じゃあこいつらをつなぐと簡単に作れるかと言えば、そうは問屋が卸してくれない。と言うか、とりあえず試作基板を作って外注に渡していろいろ試してもらったら、そりゃもう使いものにならないレベルの問題がありました。まぁ結局のところそこで使っていたマイコン(STM32F3)は半導体不足の影響をモロに受けてしまって、どうせ使いものにならなかったわけですけれど。
ノイズ対策
とりあえず試作の基板を元にいろいろ設計の問題点を点検して行きます。
元の信号変化はごくわずかです。つまり、それは
ノイズに埋もれやすい
ことを意味します。と言うか、回路の実装次第ではノイズの方が大きくなってしまうくらいです。まぁ、ppmとかppbが単位ですから、そんなものなんでしょう。結構工夫はしましたが、
- ノイズを避けるためにはセンサーとAFEの配線は短くしないといけない
- AFEの中身もデジタルを含んでいるからノイズ源となる
- そもそもセンサーそのものがノイズを拾うし、センサーの性質上シールドもできない
ということで、ここで出来る対策には限界があります。そこでパターンを工夫して、AFEとセンサーの間にはシールドがあるという形にして、この対策は終わりってことにしました。
AFEには「基準電圧」が必要です。この電圧の精度や安定性もまたセンサー値に影響を与えます。
実はこの辺のことについては、推奨回路と言うか「メーカ純正デジタルセンサー」の回路図が公開されているのでそれを信用していたのですが、この回路はAFEと基準電源が直結されているだけでした。ところが、AFEの基準電源入力はかなりの高インピーダンスらしく、外来ノイズの影響がモロに出て来ていました。高インピーダンスでノイズが乗りやすいのはある意味当たり前のことなので、AFEの入り口あたりで基準電源の許容範囲の電流が流れる程度の抵抗でGNDに落としてやりました。当然ながら、ノイズはぐっと減ります。「基準電圧」にこんな罠があるとは...
その次にしたことは、「アナログ回路の電源の質の改善」です。
元々、アナログ回路の電源もデジタル回路(マイコンとか)の電源も、同じレギュレータからのものでした。とは言え、デジタル回路で使った電源は質が悪い(ノイズが多い)ものなので、がっつりアナログ的な電源フィルタを入れて、それをアナログ回路の電源としていました。だいたいの「お手軽計測装置」はそうなっていますし、「推奨回路」もそんな感じでした。
試作基板でテストしている時に、やっぱりアナログ電源のノイズは無視できないレベルだということがわかったので、アナログ回路用には超ローノイズのレギュレータを使って、別途電源を作ってやることにしました。同時に、アナログ回路とデジタル回路のGNDを分割しました。回り込みを嫌って、GND間はインダクタで分割されています。もちろん、そのインダクタだけがアナログ回路とデジタル回路のGNDの接続点です。電源回路が別なので、浮かせてしまっても良かったとは思いますが、GND同士で電位が違うと間違いのものなので接続されています。まぁ元の電源は同じものなので、厳密にはGNDが別々とも言いにくいですが。
その辺の工夫(電源を除く)をして計測してみるのですが、やっぱりノイズの低減は限定的です。とは言え、ある種の統計処理をしてみれば、やっぱりちゃんと計測はされていることもわかります。
回路と実装上の問題点がわかったことで、次の試作ボードを設計して発注します。既に半導体不足が深刻化していたので、使う部品もそれに合わせていろいろ変更してやります。元々使っていたSTM32F3が入手出来なくなってしまっていたので、ESP32にします。入手性は良いですし付加価値はつけやすいのですが、ノイズの点ではとても不利になります。配置を工夫することで対策はするのですけど。
信号処理
ノイズがなかなか減らなくて悩んでいた時に、ふと「メーカ純正デジタルセンサー」のプログラム(これも公開されている)を見ると、「4096回計測して平均値をセンサー値とする」という処理がありました。純正デジタルセンサーにあるAD変換器は12bitなので、「4096」というのもその辺に関係があるのかも知れません(深くは調べてない)。要するに計測値はノイズ込みだという前提での処理がされているということです。
ただ、こちらで使っているAD変換器は入手とか制御線の都合で24bitの低速のものなので、「4096回」も計測していたら日が暮れてしまうといった問題があって、ここはデジタルフィルタを構成して、それでノイズ除去を図ることとしました。
と同時に、ちょっと前のトラ技の計測回路の解説記事に、「低速アナログセンサーに使うアンプにはLPFを入れよ」ということが書かれていることを発見しました。まぁ確かにノイズなんてそんなものなので、思いっきり帯域制限かけることにしました。具体的にはI-V変換回路の帰還抵抗(これは外付け)に並列にコンデンサを入れてやります(元々パターンそのものは存在している)。カットオフ周波数は3Hzくらいです。そこにさらに0.1Hzくらいのデジタルフィルタを入れてやります。
ここまでやって、やっと実用的なセンサー値が得られるようになりました。
まとめ
そんなわけで、やった対策をまとめると。
- 無駄に高インピーダンスな回路はなくす
必要ないところではインピーダンスを下げる工夫をする - ノイズにはやっぱりシールド
でも限界はあるし過信もできない - 電源の「質」を考える
- 無駄に広帯域増幅回路にしない
センサーより速い応答は有害無益 - デジタルフィルタは便利
といったことで、まぁ当たり前の話ではあります。
こうやって対策して出来た基板は、メーカ純正デジタルセンサーよりは高精度高機能(!)なものになりました。逆に言えば、この手のセンサーは自前で頑張った方が精度が出せるということですね。もちろんかかる金額は随分違いますけど。