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のサンプルクロックがついており、ハードウェアタイミングでの出力が可能です。
つまり、
- AOから 0V → 5V の矩形波(四角い波)を出力する(ハードウェアタイミングで正確!)
- アナログ信号の立ち上がりをシュミットトリガ(IC)でパキッと整形する
- 擬似的な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