JR-100のビデオ出力をきちんとビデオキャプチャできるようにしたいという目標のもと、PIC17Fで垂直同期信号を補間することから始め、dsPIC24Fでカラーバーストを載せたりSビデオ信号に変換してみたりといったことをこれまで試行してきました。しかしどれも満足のいく結果は得られませんでした。ここまできたら、そもそも根本的に対処するやり方を考えるときが来たのかもしれません。そこで次はスキャンコンバータを作って最終解決を図ってみようと思います。
方針
これまでの敗因は以下の2点です。
- JR-100のビデオ信号の周波数とPICが使用するクロック周波数はどちらも3.579545MHzの倍数なのですが、実際は微妙にずれているため、表示される文字が左右にブレる現象(うなり)が発生してしまう。
- そもそもJR-100のビデオ信号の形式がNTSCから大きく外れたものであり、ビデオキャプチャがそんな「異常な」信号を処理できない。
1点目はJR-100内部のクロック信号を取り出してPICの入力にしたり、PLLを使ってクロックを同期させたりという解決方法が考えられます。しかし「そもそも」の2点目を解決しないと、安定した結果が得られないような気がします。
そこで2点目の課題を解決するため、スキャンコンバータを作ることにします。つまりJR-100の出力信号をキャプチャしてバッファメモリに格納し、これ取り込み処理とは独立にバッファメモリからデータを取り出して正しいNTSC信号を再生成するという方式です。この方式であれば結果的に上の2点の課題を解決することになります。しかし入力と出力を同時に処理するというのは、高度な処理能力が必要ということを意味します。例えばこういう方法があるでしょう。
- 高性能なプロセッサを使う。
- 中性能のプロセッサを2個使って並列処理する。
- CPLDやFPGAにより高い並列度で処理をする。
今回は回路設計が簡単な方式1を採用することにします。その分ソフトウェア設計にかかる負担は大きいですが、柔軟性はありそうですし、なによりトライ&エラーでの実験がやり易いです。そこでPICをベースにいくつかのプロセッサを比較した結果、入手が容易であるPIC32MZ2048EFH144を使うことにしました。これだと2.54mmの変換基板に実装されたものが秋月で手に入ります。こいつはデータシート上は252MHzのクロックまで対応可能と謳っていますから、処理性能は十分です(後述するように実際は171.81816MHzで動作させます)。
以下の記事中では、読みやすさのため、PIC32MZ2048EFH144のことを単にPIC32MZと呼ぶことにします。
ハードの設計
PIC32MZの持つ機能をいろいろ調べ、スキャンコンバータとして以下の機能を使うこととします。ただし完成までの試行の結果、機能の入れ替えは十分あり得ます。
I/OポートPMP (2018/3/5修正)
8ビットのデジタル信号出力として。今回使うPIC32MZはDACを持っていないのでI/OポートPMPの出力を外付けのDACに与えます。- タイマー
各種タイミングの生成用として。 - コンパレータ
入力信号の同期信号のエッジ検出用として。 - 入力キャプチャ
JR-100が生成する特殊な垂直同期信号の検出用として。 - ADコンバータ
入力信号のキャプチャ用として。 - DMA
カラーバースト信号と映像信号の出力用として。
これをもとに作ってみた回路はこうです。
(2018/3/5) 回路図を差し替えました。変更点はPMPを使うためにビデオ信号の出力ピンを変更(ポートKからPMDxピン)したことと、コンパレータから入力キャプチャの接続に過電流保護用の抵抗を挿入したことです。
これまで回路図の作成は水魚堂さんの回路図エディタBSch3Vを愛用してきましたが、今回からKiCadに乗り換えています。最終的にプリント基板まで起こしたいと考えているためです。
以下にハード設計上のポイントをいくつか説明します。
ビデオ信号の入力について
JR-100のビデオ出力を75Ωの負荷抵抗で受けて、この電圧をPICのコンパレータ(C1INAピン)とADC(AN0, AN1ピン)に入力します。コンパレータ入力のインピーダンスは適当に1kΩとしていますが、ADCへの入力はなるべく小さくしないとサンプリング周波数とサンプルのビット数を上げることができないようです。
データシートによると、PIC32MZのADCのサンプリング性能はこうなっています。
項目 | 最大 | 条件 |
---|---|---|
サンプル時間 | 3Tad | インピーダンス200Ω以下 |
4Tad | インピーダンス500Ω以下 | |
5Tad | インピーダンス1kΩ以下 | |
13Tad | インピーダンス5kΩ以下 | |
変換時間 | 13Tad | 12ビット |
11Tad | 10ビット | |
9Tad | 8ビット | |
7Tad | 6ビット |
サンプリングレートはデータ1つをサンプルする時間とサンプルしたデータをデジタル値に変換する時間の合計で決まり、これらの合計時間が短ければ短いほど高速なサンプリングが可能となります。表中のTadはADCに与えるクロックで、今回の場合は約218ns(カラーサブキャリア周波数3.579545MHzの12倍の逆数)です。なぜ12倍なのかは次回説明します。この表から分かるようにサンプリングを高速に行うためにはサンプル時間と変換時間のTad値の合計がなるべく小さくなるようにすればよいです。つまりインピーダンス200Ωとして変換解像度を6bitにすれば良さそうです。このときの1サンプル当たりに必要な時間は3Tad+7Tad=10Tadですから、サンプリングレートは(12/10)*3.579545*10^6=4.3Mspsです。
ところでJR-100の生成する映像信号のドットクロックは7.15909MHzであることが分かっています。あれ、このサンプリングレートでは性能が足りない。しかしPIC32MZのADCにはターボモードというのがあります! これは2つのADCモジュールを同時に使い、サンプルするタイミングをインターリーブさせることで、見かけ上のサンプリングレートを2倍にすることができる機能です。これを使えばJR-100のドットクロックを処理できそう。しかしここで別の問題が……。ターボモードでは6ビットのサンプリングができないとデータシートにありました……。そこで8ビットにした場合のサンプリングレートを計算してみます。この場合は3Tad+9Tad=12Tadとなりますから、2*(12/12)*3.579545*10^6=7.15909Msps。ギリギリ足りるというかピッタリであることが分かりました。
以上からADCへの入力は200Ωのインピーダンスとすればよいことが分かりました。そこでAN0とAN1ピンの前に200Ωの抵抗を付けることにします。
一方、1つの信号を3つに分割してPIC32MZに入れているので電圧降下が気になりますが、入力信号はシンクチップ、黒レベル、白レベルの3値しか見ないので、電圧の絶対値自体は気にしないでよいでしょう(気にしなくても良いようソフトを設計します)。
DACとビデオアンプについて
今回のPIC32MZは残念ながらDAC機能を持っていません。外付けDACのやり方はいろいろ考えられそうですが、今回は簡易にR-2Rラダーを使ってDACを構成します。R-2Rラダーだと8ビットDACを作るためには抵抗が16本必要になり、はんだ付けの面倒さを避けて集合抵抗を使うことにします。抵抗はBourns社の4610X-R2R-103LFで、10kΩと20kΩの抵抗がパッケージされているものです。
PICのビット幅を最大限に活用するため、PICからの出力は0V~3.3V(電源電圧)付近を256分割したものをI/Oポートから8ビットで出力し、これを2.2kΩと1kΩの抵抗を使って約2:1に分圧することで1Vp-pの電圧を作り出しています。
次にこの信号をアンプに接続します。今回はスタンダードな75Ωドライバ内蔵の6dBアンプNJM2267Dを使います。
NJM2267Dのデータシートで示されている構成例では、Vin1の前段にAC結合用(だと思います)のカップリングコンデンサが入っています。このAC結合化された信号をNJM2267D内部にあるクランプ回路で1.9Vまで電圧を底上げして6dBアンプに入力しています。集合抵抗から入ってくる信号は0V~1VまでのDC結合相当の信号ですから、カップリングコンデンサであえてACにしてから再度DC信号を復元する必要は無いはず。直接DCで入れてしまってもいいんじゃないか、と考えました。ここは私の仮定によるものですから、もしうまくいかなかったら別のやり方を考えようと思います。
その他
その他、PICkit3からプログラムを書き込むための6ピンコネクタや、PICとシリアル通信するためのUARTから線を引き出してきています。クロックは14.31818MHzの水晶振動子を付け、これをPICのPLLで48倍にします。また電源はPIC用の3.3VとNJM2267D用の+5Vが必要なので三端子レギュレータを入れています。
あと分かりにくいですが61番ピンと62番ピンを直結しています。これはコンパレータ出力を入力キャプチャ機能に流し込んでシンクチップの時間を計測することで、そのシンクチップが垂直同期信号なのか水平同期信号なのかを判定することを想定しています。詳細は次回。
次は……
ハードができたので、次はソフトウェアを考えていきます。
コメント