【ビデオ出力のオシロスコープの概要】
PIC24Fの高性能さを活用した製作例です。
NTSCのビデオ出力を直接制御しながら、最高5μsec周期でアナログ電圧を計測し、
オシロスコープの形式でグラフに表示する機能を持ったもので、
表示出力に一般のテレビやビデオプロジェクタが利用できるオシロスコープができます。
最高10kHz程度までの波形を見ることができます。
完成した外観は基板ユニットの感じで写真のようになっています。
右下側のRCAジャックがビデオ出力で直接
テレビなどに接続します。
左下側のRCAジャックがアナログ信号の
入力用です。
【機能仕様概要】
このオシロスコープは、ビデオ出力の基本を確認しながら試すため、下表のような機能を
一緒に盛り込んでいます。
項目 仕 様 出力 NTSCコンポジット白黒ビデオ出力
256×192ドット分解能入力 アナログ1チャネル 10mV〜1V
ゲイン、オフセット調整可能機能 ・テストパターン表示
4種類繰り返し
・グラフ表示
3種類、2次元グラフ表示
・文字表示
ASCII英数字96種 32文字×24行
・オシロスコープ(デジタルオシロ)
自動トリガモード、トリガレベル調整可能
シングルモード 表示位置移動可能
サンプリング周期 最高5μsec
周波数特性:DC〜10kHz程度
各機能での表示画面例は下図のようになります。
(1) テストパターン表示
千鳥格子のテストパタン表示で
画像がピッタリ固定していて
ぶれはありません。
PICの割り込みの受付時間が
固定の5サイクルであることで
タイマの割り込みで周期を生成
してもまったく同じ時間で割り込み
が入ってくることが判ります。
(2) グラフ表示
3次元のグラフを計算し描画します。リアルタイムで計算し表示しています。
下記のような結構複雑な計算ですが0.2秒程度で全座標の計算を完了しグラフ化できます。
(3) 文字表示
ASCIIの英文字のみの表示です。
キャラクタデータもPIC24Fの中の
データとして用意し、ビデオメモリ
の指定位置にコピーして表示
させています。
(4) オシロスコープ
2kHzの正弦波を入力して表示させた図で
この程度の周波数でしたら十分実用に
なります。
【全体構成】
このオシロスコープの全体構成をブロック図で表すと下図のようになります。
ビデオ出力部は抵抗3本だけで構成し直接RCAジャックで出力しています。
アナログ入力部はオペアンプで増幅とオフセットを可変にしてからAN0に入力しています。
その他、汎用のデバイスとしてスイッチとLED、可変抵抗を設けました。
可変抵抗は、オシロスコープのトリガ調整と、メモリスコープとして使ったときの
波形表示を左右に動かすのに使います。
スイッチには動作モード設定用に基板用の10進ロータリスイッチを設けました。
これで上記の機能の切り替えを行います。
電源はすべて3.3Vだけで動作させていますので、単純な3端子レギュレータのみで
構成できます。
【NTSCビデオ出力の生成】
今回のNTSCのビデオ出力は、マイクロチップ社のLucio氏が出版した下記の本の
内容を大いに参考にしました。
「Programming 16-bit Microcontroller in C」
NTSCのビデオ出力は、1画面の表示をラスタと呼ばれる線で生成しています。
通常のテレビはインターレースという方法で1回おきに2画面で1つの見る画面を
生成していますが、今回のような静止画面ではインターレースを使わず1回の表示
で1画面を完成させます。こうすると全体の画面は、262本のラスタで構成され
全体の区間で下図のように3種類のラスタ信号が必要となります。
(1) ブランキング区間の場合
(2) 垂直同期区間の場合
(3) 映像表示区間の場合
今回の使い方では、標準の映像範囲よりやや狭い範囲での表示で、256×192
ドットの表示が可能です。表示位置は、表示範囲外のラスタ本数を調整することで
上下方向の位置がずらせますし、ラスタ内での表示開始位置をずらすことで
左右の位置が調整できます。
このラスタのタイミング時間の規定以外に、ビデオ信号として決められた
電圧レベルの規定があります。今回のビデオ出力には、RB4とRB5のPICの2ピン
を使い、映像信号出力用と同期パルス出力用として使っています。
この2つの信号を下図のように抵抗で合成してビデオ信号と必要な電圧レベルを
生成しています。
つまりRB4をLowとしておき同期信号としてRB5をLowにするとほぼ0Vの出力と
なって水平同期レベルとなります。
RB4がLow、RB5がHighのときは、約0.3Vとなって黒レベルの映像信号となり、
RB4もRB5もHighとすると約1Vの出力となって白レベルの映像信号となります。
このようなビデオ信号として必要なタイミングを生成するため、RB4(映像信号)と
RB5(同期信号)のピンを、PIC24Fの下記内蔵モジュールを活用して制御しています。
(1) タイマ2モジュール
水平同期に必要な63.5μsecの一定周期を割り込みで生成しています。
この割り込みで同期出力のRB5をLowにするように制御しています。
(2) 出力コンペア1モジュール
水平同期パルスの幅を制御しています。ブランキング中は57.3μsecの
ワンショットで割り込みを生成し、この割り込みで同期信号のRB5をHighとして
垂直同期用の切り込みパルスを生成します。
その他の期間は、4.7μsecのワンショット割り込みを生成し、この割り込みで
RB5をHighとすることで水平同期パルスを生成します。
(3) 出力コンペア2モジュール
これは、映像表示を出力開始する時間を生成するため、9.4μsecのワンショット
の割り込みを生成しています。ビデオ信号の左右の位置がこれで決まります。
(4) SPIモジュール
映像表示信号を出力します。1ビットが1ドットの表示に相当しSPIモジュールを
通信用ではなく単純なシフトレジスタとして利用しています。
このSPIモジュールの出力ピンにRB4ピンを割付けて直接出力しています。
このSPIモジュールのシフトクロックが映像信号のドットクロックになります。
これを図で表すと下図のようになります。
【回路】
回路図は下図のようになっています。このオシロスコープの回路図は、フリーソフトの
EAGLEを使って描きました。
電源は3.3Vのみですので3端子レギュレータで生成します。手持ちの3.3V 1Aタイプを
使いましたが、電流は30mA程度しか流れませんので小型のものでOKです。
入力には5Vから9VのACアダプタを使うことにしました。
ビデオ出力とアナログ信号の入力接続には基板用のRCAジャックを使って直接基板に
接続できるようします。
マイコンのクロックには8MHzのセラミック発振子を使っています。これで内部で4倍に
てい倍して32MHzで動作させます。
【基板組み立て】
作成した回路図からEAGLEを使ってパターン図を作成しました。
パターンは片面基板で、サンハヤトの10K感光基板(75×100mm)に余裕で納まります。
完成したオシロスコープの基板です。
すべての部品を基板に実装しましたのですっきりしました。
10進のロータリスイッチにはちょっと高価ですが
つまみ付きのものを使って手で回せるようにしました。
基板のはんだ面側です。
はんだ面にはPICの内蔵レギュレータ用バイパス
コンデンサだけがチップ型のセラミックコンデンサを
使ったのでこちら側に実装されています。
このパターンのダウンロードは下記でできます。サンハヤトの感光基板10Kのサイズと
なっています。PDFファイルとしましたのでそのまま印刷してお使い下さい。
★★★ パターン図のダウンロード
【プログラム製作】
このオシロスコープのプログラムはすべてC言語で作成しています。マイクロチップ社から
無償で提供されているMPLAB C30のStudent Editionを使って作成しました。
ここでは、NTSCビデオ信号を生成する割り込み処理部だけ説明します。
(1) タイマ2の割り込み処理
タイマ2の割り込みが1本のラスタの最初のトリガになりますから、最初に同期信号出力
(RB5、SYNC)をLowにし、ラスタ数のカウンタ(VCount)をデクリメントしてから、ラスタ数の
カウンタ値により垂直同期のどのステータス(VState)にあるかを判定し、それで処理内容を
Switch文で分けています。
画面内の表示部分が通常のテレビ画面よりラスタ数が少ないので、ブランキング区間が
表示部の上側と下側の両方に必要となりますから、これを別の区間として分け、これに映像
表示区間と垂直同期区間を加えて4通りの水平同期信号に分岐しています。
下側のブランキングの処理の中でラスタ数カウンタが0になって1画面の表示終了となります
から、ここでビデオメモリのポインタ(VPtr)をバッファの最初(VMem)に戻しています。
(2) OC1の割り込み処理
OC1の割り込みは同期信号の後縁になるわけですので、ここで直ぐ同期信号出力(RB5、SYNC)
をHighに戻しています。
(3) OC2割り込み処理
OC2の割り込みで映像表示出力を開始させるため、SPI1の送信を開始させます。ここでは
送信のダブルバッファの両方にデータを詰め込むため、2ワードのデータを連続で出力します。
データはビデオメモリから取り出しますがポインタ(VPtr)を使ってワードで読み出します。
このSPI1の送信を行う場合、1ワード送信し、その割り込みを待ってから次のデータを送信すると、
2ワード目の出力が遅れてしまって黒い線が縦に入ってしまいます。これを回避するため、SPI1
モジュールの送信バッファがダブルバッファになっていることを利用します。
まず、最初の2ワードは連続して直ぐ送り出してダブルバッファの両方にデータをセットします。
その後はSPI完了割り込みごとに次の1ワードを送るようにすれば、常にダブルバッファの両方に
データがあることになって送信ワードの間に隙間が入りませんから正常な映像表示となります。
(4) SPI1割り込み処理
SPI1の割り込みは基本的に受信割り込みで、受信は使わないのですが、受信したデータを
読み出さないとオーバーフローのエラーとなってその後の通信ができなくなりますので、ダミーで
読み出すだけの動作をしています。
まず先に次の送信データをバッファから取り出して送信しますが、14回目で終了となります。
(OC2の割り込み処理で2個送信しているので合計で16ワードとなり1行分完了する)
このあとダミー読み出しをしています。
以上の部分のリストが下図となります。
上記を含む全プログラムは下記からダウンロードできます。MPLAB IDEの
プロジェクトのフォルダとなっていますので、解凍してそのままお使い下さい。
ただしMPLAB C30の無償版のコンパイラが必要です。
★★★ プログラム1式ダウンロード