NI-DAQのデジタル出力が遅すぎる?アナログ出力(AO)で擬似TTLを作ってmsオーダーの精度を出す方法

に公開

はじめに

研究室で実験装置の制御を担当することになったのですが、そこでms(ミリ秒)オーダーの正確なタイミング制御の壁にぶつかりました。

今回は、NI(National Instruments)のDAQデバイス『USB-6002』を使用しています。これを使ってTTL信号(ON/OFF信号)を出し、装置を制御しようとしたのですが……。

デジタル出力(DO)が遅すぎる問題

USB-6002のDO(デジタルアウト)は、仕様上ソフトウェアタイミングでしか動作しません。
つまり、Pythonなどのプログラムから「ONになれ!」「OFFになれ!」と命令を送るたびに、OSやUSB通信の遅延が乗ってしまいます。

実際に計測してみると、Pythonコードの行間で約0.6msの遅延が発生していました。しかも、この遅延は一定ではなく、積み重なると数msズレたり、ジッター(ゆらぎ)も標準偏差で0.4msほどありました。

これでは、msオーダーの精密な実験なんて到底できません。「遅延は数百µsだから…」と妥協するには、あまりにも不安定すぎます。

解決策:AO(アナログ出力)をDOとして使う

困り果てて調べていたところ、NI公式のナレッジベースにこんな記述を見つけました。

記事の前半は高機能なシリーズ(Xシリーズ等)向けの内部配線の話ですが、ページ下部の「Additional Information」に重要なヒントがありました。

「アナログ回路を使用することに加えて、信号にシュミットトリガを適用するか(中略)もできます」
7414集積回路は、典型的なシュミットトリガインバータです」

これだ!!
USB-6002のDOにはクロックがありませんが、AO(アナログアウト)には5 kS/sのサンプルクロックがついており、ハードウェアタイミングでの出力が可能です。

つまり、

  1. AOから 0V → 5V の矩形波(四角い波)を出力する(ハードウェアタイミングで正確!)
  2. アナログ信号の立ち上がりをシュミットトリガ(IC)でパキッと整形する
  3. 擬似的なTTL信号として使う

という作戦です。これならPCの負荷に関係なく、正確なパルスが出せるはずです。

回路を作ろう(AIに聞いてみた)

方針は決まりました。NI公式も「7414を使え」と言っています。
しかし私は回路設計のプロではないので、「具体的にどう組めばいいの?」 というところが不安です。
そこで、やりたいことを伝えてAIに回路構成とパーツリストを選定してもらいました。

AI提案のパーツリスト

AIによると、以下のパーツがあれば実現できるそうです。(NI公式で言及されていた7414系がちゃんと選ばれています!)

部品名 規格・型番例 役割
シュミット・インバータ SN74HC14N (DIP-14) NI公式でも言及されていたIC。波形を整形する。
抵抗 1 kΩ AO端子保護用(入力直列に入れる)
抵抗 10 kΩ × 4 未使用ピンの処理(プルアップ/プルダウン)用
コンデンサ 0.1 µF (セラミック) ICのパスコン(ノイズ除去・動作安定用)
コンデンサ 10 µF (電解) 電源ラインの安定化用
電源取り出し基板 SparkFun BOB-15100など USB-C等からIC駆動用の5Vを取るため

実装した回路図

AIのアドバイスを元に、ブレッドボードで組んだ回路図がこちらです。
AOからの出力を1kΩ抵抗を通してシュミットトリガ(74HC14)に入力し、出力をTTLとして実験装置へ送ります。


実際の配線図

ポイントは、ICの電源ピン近くにパスコン(0.1µF)を入れることと、使わない入力ピンをGNDかVCCに落としておく(10kΩ抵抗使用)ことだそうです。これをサボるとノイズで誤動作するらしいので、しっかり実装しました。

結果:劇的な改善!

組み上がった回路を通し、ハードウェアタイミングで制御した信号をオシロスコープで評価しました。
目標とするパルス幅は 1.000 ms です。

【測定結果】 (サンプル数: 10)

  • 平均パルス幅: 1.014 ms
  • 標準偏差 (ジッター): 0.009 ms (約9 µs)

素晴らしい精度です!
DO(ソフトウェア制御)の時は標準偏差が 0.4 ms もあったので、安定性が約40倍に向上しました。平均値のズレもわずか0.014 ms程度で、今回の実験用途には十分すぎるスペックです。

まとめ

  • 安価なDAQ(USB-6002等)のDOはソフトウェアタイミングなので、精密な制御には向かない。
  • NI公式でも、TTL生成のために「シュミットトリガ(7414等)」の使用が言及されている。
  • AO(アナログ出力)のハードウェアタイミング機能を使い、シュミットトリガを通すことで、高精度なTTL信号を作ることができる。

もし同じように「Python制御のDAQが遅延して困る!」という方がいれば、ぜひAO×シュミットトリガの活用を検討してみてください。

Discussion