NTSCカラーパターンジェネレータ


はじめに

地上デジタル放送が始まってしばらくたちましたが,NTSC入力を持つモニターの修理のためにパターンジェネレータが欲しかったのでAVRで作成しました.

設計・製作

AVRやPICでNTSC信号を発生してTVに画像を出力する事例は色々あり,例えばこちらのページでは非常にシンプルな回路が紹介されています. 今回はNTSC信号について勉強したかったこともあり,AVRのAT90S2313を使って自作することにしました.

今回作成するパターンジェネレータは,白・黄・シアン・緑・マゼンタ・赤・青・黒の8色のカラーバーを表示するだけのものです. まず表計算ソフトで,このパターンをカラーサブキャリア周波数の4倍のサンプリング周波数で出力する場合の電圧を下記のように計算しました.

出力電圧の計算

ハードウェアは,AVRの8つのポートに抵抗を1本ずつつないだだけの簡単なDA変換回路です. AVRはNTSCのカラーサブキャリア周波数の4倍である14.31818MHzで駆動します. 最初はオシレータを内蔵したAVRを使おうと思いましたが,クロックが不安定だったので,水晶発振子を外付けしました.
回路図と完成した基板は次の写真のとおりです.

回路図
完成した基板(表)
完成した基板(裏)

75Ω負荷に対してAVRの各ポートをON/OFFした場合に出力される電圧は,下記のようなPythonスクリプトで求められます.

#!/usr/bin/python
_R = [100.0e3, 47.0e3, 22.0e3, 10.0e3, 4.7e3, 2.2e3, 1.0e3, 470.0] _V = 5.0
for i in range(2 ** 8): rhset = [] rlset = [75] bit = '' for j, r in enumerate(_R): if (i & (1 << j)) != 0: rhset.append(r) bit = '1' + bit else: rlset.append(r) bit = '0' + bit rhsum = 0.0 if not rhset else 1.0 / sum([1.0 / r for r in rhset]) rlsum = 0.0 if not rlset else 1.0 / sum([1.0 / r for r in rlset]) v = 0.0 if not rhset else _V * rlsum / (rlsum + rhsum) print '%d\t%s\t%f' % (i, bit, v)

スプレッドシートで求めた電圧を出力するために,このスクリプトで得られる値をポートに出力します. またバースト信号の位相を合わせるため,クロック周期の4の倍数でタイマー割り込みを発生させて水平同期のタイミングを作っています.

カラーパターンの出力例(キャプチャーカードで取り込んだもの)

ファームウェア

参考資料

  1. 画像。概論の概論
  2. ビデオ信号計測・生成の基本

[戻る]
2014-05-07 ページ作成
(2014-01 製作)
T. Nakagawa