« ありがとうPHS | トップページ | ミニマムなキッチンタイマー »

2021/02/09

Arduinoオシロの作り込み

昨年の11月に九州工業大学さんが公開されているArduino簡易オシロスコープを試して気に入ったので、自作Arduinoクローン用のシールドを作製し、電子工作のお供にしています。

このオシロでは、信号を保護抵抗だけを通してADC入力へ入れているため、入力電圧範囲が0~+5Vに制限されます。シールドで約1/10に抵抗分圧できるようにしましたが、負の電圧が観測できないことには変わりなく、例えばロジックのアンダーシュートが確認できませんでした。
また、ADC入力は直接サンプルホールド回路に繋がるためインピーダンスが不明で、実際、ロジックで出ていたエラーがプローブで当たると出なくなるなど相手の動作が変化することがあり、測定器としての信頼に欠けていました。ちなみにATmega328Pのデータシート(リンク先PDF) p.212 23.6.1によると、ADCは信号源の出力インピーダンス約10kΩ以下で最適化しているそうなので、仕方ない話というか使い方の問題です。
さらに、上等なデジタルオシロを使い慣れたものとしては、プリトリガ機能が無いのは少し辛いところです。

今回、ATtiny85を使ったRPN電卓を作るときに一緒に買った部品を使って、オシロを作り込むことにしました。
設計のポイントは、上記の課題の解消がメインですが、付随する課題も色々とあります:
  1. 入力電圧範囲の拡張
    主にマイコンやセンサの波形観測を考えているので、±9Vもあれば充分です。そこで倍電圧負電圧のチャージポンプICを使ってUSBから±10V近い電源を作り、低雑音のオペアンプを駆動します。
    増幅回路は、入力信号と負の電源電圧との差動アンプを、利得1/4で作るとします。簡単に言うと、負電圧が-10Vのとき、入力の-10Vが出力の0Vに、0Vが2.5Vに、10Vが5Vになる仕掛けです。
    ここで減衰増幅器ではノイズと位相余裕(発振)が気になるところですが、幸いに特に問題ありませんでした。
  2. 出力オフセット電圧の校正機能
    USBの電圧から基準電圧なしで作る負電源が増幅の基準になるので、オフセット校正が必須です。
    今回はUIを提供するProcessingのプログラム側に実装しました。
  3. 入力インピーダンスのコントロール
    オペアンプを使うことにしたので、信号入力端子(プローブ端)とGND間に1MΩを入れるだけで大丈夫です。
  4. 基準発振には水晶を使う
    Arduino UNOや私のクローンでは基準発振に周波数許容偏差±0.5%のセラロックを使っていますが、せっかくなので±30ppmの水晶振動子を使います。
  5. 信号表示の手直し
    オリジナルのkit_scopeでは枠をはみ出た信号は切り捨てて表示されず、上下の枠外に張り付くと行方不明になっていました。そこで、アナログオシロっぽく枠の上下まで信号を出し、クリップすると点線表示にしました。
  6. スキンを作り直し、その他のUI要素も少し好みに変えました。

結果としてできたものは、こんな感じです:
Mscope01
はい、またMINTIA BREEZEのケースを使いました。

スクリーンキャプチャはこちら:
Mscope06
右下の"offset CAL"がDCオフセット校正項目です。ここでは、表示色を"change COLOR"で変えてキャプチャしました。

回路は基板2枚に分けています。その1枚目LOGIC boardは、ほぼkit_scopeそのものです:
Mintiascope_sch1
Arduinoクローンを作ったときに入れ忘れていたアナログ電源へのLCフィルタを、今回は入れています。また、間違えてArduinoのスケッチを書き込まないように、RTS(DTR)ラインにジャンパーを付け、通常は外してあります。

2枚目の基板ANALOG boardは、正負電源と増幅回路です:
Mintiascope_sch2
USBの5Vから倍電圧ICで+10Vを作り、これから負電圧ICで-10Vを作って、簡単なLPFを通してからオペアンプの電源にしています。但し、オペアンプを駆動すると電圧ドロップが生じ、実働上は+9.3Vと-8.9Vになりました。
1/4倍の差動アンプを構成するにあたっては、高精度の金属皮膜抵抗を使うまでもないかなと思って、袋入り(ほぼ同一ロット)の5%カーボン抵抗から抜き取って選別した上で、2直列と2並列で使いました。結果として、抵抗自体のばらつきは0.65%、組み合わせた差動アンプとしての利得誤差は0.45%に収まりました。

ソフトはATmega328Pの組み込みと、PC用のProcessingの二本立てです。
ATmega328Pには前に作ったブートローダライタを使ってArduino UNOのブートローダーを書き込んだ上で、九工大さんの配布されているArduinoスケッチ"kit_scope.ino"を改変せずそのまま使っています。
一方、ProcessingによるUI周りのコードは色々と改変しました。こちらは、GitHubにリポジトリを作ってアップしてあります。実は今回ほとんど初めてProcessingを使って、とても勉強になりました。なお、macOS Catalina, Windows10, Ubuntu 20.04で動作確認済みです。

ケースを開けたところはこちら:
Mscope02
上側がLOGIC board、下側がANALOG boardです。USBシリアル変換には安い秋月電子さんのCH340Eモジュールを使っています。実はこのモジュールはスケッチの書き込みに使うには少々クセがあるのですが、単なる通信用では問題ありません。なお、macOSでもWindows10でもUbuntuでもOS標準ドライバで使えます。
どちらのボードも、配置検討に使った図をシールに印刷して貼り付けて、工作キットのように楽に部品実装できるようにしてみました。結果として、設計上の勘違いや改善点が分かりやすくなりました。そのため、印刷していない部品を追加したり予定していた回路が無くなったりしています。その最たるものはANALOG board左下の、NJW4191を使った負電圧発生回路のところで、増幅基準電圧を細かくチューニングして校正しようと考えていたところ、オペアンプの負荷によって可変範囲がずれ、イタチごっこになったのでやめた跡が残っています。

反対面は、チップ部品と配線です:
Mscope03
…あれこれと試行錯誤しながら配線していた様子が見て取れます(汗

その、配線が整理されていないせいだと思いますが、チャネル間のアイソレーションが充分に取れておらず、CH1に入れた信号の微分波形がCH2に出ています。このとき、CH1には1kHz 5Vp-pのPULSE入力をしており、CH2はオープン状態です。
Mscope04
なお、ここでCH1が上側にクリップして点線になっているのが上記5.で見直した表示です。

今回、オペアンプ回路を20年ぶりに触りました。元々、30数年前に社会人になって最初の仕事がセンサの駆動回路で、そこで様々な種類の設計とトラブルを経験したのが下地にはあるのですが、専門分野が高周波側へシフトしたこともあって(20年前に少しアクティブフィルタを触ったとき以外)離れていたので、すっかりカンが錆び付いていました。けれど、基本的に式を書けばその通りに動く回路だということを思い出すことができて良かったです。

最後に、MINTIA工作シリーズの集合写真を撮っておきました。
Mscope05
左上の少し小さいのはISPプログラマで、下2つはRPN電卓です。

これで、けっこう使い勝手のいい簡易オシロができたと思っています。ただ、クロストークが多いのは問題なので追って修正します。また、今回Processingの勉強が結構できたので、プリトリガ機能が実装できないか、ぼちぼち考えてみたいと思います。

以上、何かの参考になれば幸いです。

パドラッパ from MacBook Air (2017)

| |

« ありがとうPHS | トップページ | ミニマムなキッチンタイマー »

コメント

コメントを書く



(ウェブ上には掲載しません)




« ありがとうPHS | トップページ | ミニマムなキッチンタイマー »