JR-100のビデオ出力のカラーNTSC化(3) 同期ずれが解消できない

本業でバタバタしてブランキング期間がありつつ、こちらも悪戦苦闘してきましたが、どうやら現在のやり方ではうまくいかないことが分かってきました。このまま突き進んでもあまり有益な情報は得られそうもありません。いったん現状をまとめて次の方式の検討に入ろうと思います。

回路について

まず回路はこうなりました。

コンパレータの選択とI/Oポートへの接続

当初はコンパレータとしてNJM360Dを使う計画でしたが、これだと回路全体で3電源が必要(+5V、-5V、PIC用の3.3V)が必要になってしまいます。これではやりたいことに対してちょっと回路が大げさになり過ぎるため、単電源のTL712CP(応答時間:25ns)を使うことにしました。
ここでTL712CPもLM1881Nもいずれも5V出力のため、PICのI/Oポートのうち5Vを受け付けるピンに接続しています(RB5~RB7)。

DA変換

ビデオ信号の出力部は、I/Oポートを5ビット分とそれに抵抗を接続して5bit DA変換とします。抵抗値は次の条件をもとに決定します。なお便宜上IREは同期信号の底を0IREとみなして考えます。

  • 出力を接続していないときに140IREでVp-pが2.0Vになるようにする(75Ωの負荷をつなぐとVp-p=1Vとなる)。
  •  このとき最大電圧は黄色を出力する際の最大振幅である173IRE(2.471V)である。
  • したがって1bitあたり2.471/32=0.072Vとなるように抵抗値を求める。
  • インピーダンス整合のため75Ωの抵抗を出力ピンに並列に入れる。

これにより各ビットの抵抗値は以下のようになります。実際の抵抗値はE24系列のものからなるべく近い値のものを選んでいます。

bit 計算上の
抵抗値(Ω)
電圧(V) 実際の
抵抗値(Ω)
実際の
電圧(V)
1 3130 0.0772 3000 0.0805
2 1528 0.1544 1500 0.1571
4 727 0.3089 680 0.3278
8 326 0.6178 330 0.6111
16 125 1.2355 120 1.2692

ビデオ出力

dsPIC33FJ32GP202のI/Oポートの出力電流は最大1mAのため、バッファ74HC541を間に入れることにしました。

実装

以上を踏まえたブレッドボード上で実装しました。

プログラムについて

基本的な構造は前々回の記事で示した通りです。PICの入力クロック3.5795454MHzをPLLで12倍にして、命令サイクルを42.95454MHzとしています。

ドットクロック

JR-100のドットクロックは7.15909MHzです。つまり1ドットあたり6命令サイクルの周期でサンプリングとドット出力をする必要があります。けっこうギリギリでしたがコードを工夫して何とか入りました。当然アセンブラで書く必要があり、さらにペナルティ無しでループを回すことができるdo命令が必須でした。

カラーバースト

カラーバーストは3.5795454MHzですから、カラーバースト1周期あたり12命令サイクル分の信号を出力可能です。実際には1周期あたり6個(位相が0度、60度、120度、180度、240度、300度)のデータを出せるようにしました。

ここでもdo命令が活躍しています。カラーバーストの各位相の値をテーブルに格納し、これの読み出しと出力をそれぞれ1命令で行うことにより12サイクルで6個のデータを出力することができています。

ところでカラーバーストの位相は、ビデオ信号として出力されていない間も含めてずっと位相が連続している必要があります。水平同期信号を生成してから既定の時間の後に必ず位相0度からカラーバーストを出力するため、水平同期の生成を少し待ち合わせる処理を入れました。具体的にはタイマー1を使って12サイクルマイに割り込みを発生するようにして、割り込みがかかった時点を水平同期信号出力のタイミングとしています。

水平同期

水平同期はJR-100の水平同期信号とはリンクせず、垂直同期開始時点から「PIC側」クロックの2688サイクル毎にタイマー2割り込みを発生させることで生成しています。JR-100の水平同期とリンクすると、JR-100側クロックとPIC側クロックが正確には一致していないことが要因で水平方向のブレが発生してしまうためであり(ビデオキャプチャ内のPLLが誤作動するため?)、これを回避するためにPIC側クロックに合わせてつねに一定の周期で水平同期信号を出力したかったためです。

プログラム

その他、gccのインラインアセンブラで使えるテクニックを多用して作ったプログラムを以下に示します。テクニックの解説はまたいつか。。。

結果

結果はこんなになりました。

左端と上端の白い線は、画面の枠を表示するためわざと生成しています。これを見てわかる通り、プログラム内で生成した左端と上端の線は安定して出力されている一方、キャプチャしたデータは左右方向に1ドット程度ブレが発生してしまっています。

また、実際の波形は以下です。

カラーバーストは想定通り位相0度から9周期分生成されています。カラーバーストの後ろの上方向のパルスは、画面左端の白線部分です。

水平方向のブレについては、これもおそらくJR-100とPICのクロックが一致していないためだと思われます。これを解消すべくバッファキャッシュを使ってサンプリングとデータ出力のタイミング差を計算式を求めて少しずらす処理を入れてみたのですがどうしても解決できず。今回の回路設計についてはここで断念しました。

次の方針ですが、以前の記事のコメントでくろょさんに教えていただいたSビデオ方式での実装を試してみようと思います。水平同期と映像出力はJR-100の出力そのままとすることで水平方向のブレはなくなることが期待できます。あとはカラーバーストのタイミングをどうするかですが……。

ということで次にチャレンジ!

投稿者: けむしろう

プログラミング、サーバ構築、電子工作、旅行が好きです。

コメントを残す

メールアドレスが公開されることはありません。