CPU実験室

誰も見向きもしない古いCPUをいじって動かしてみようというプロジェクトです

裸の周波数特性

DSP基板でADCの読取値をそのままDACに書いて折り返すプログラムの周波数特性を
見てみました。
 
PC上でテスト信号を発生するWaveGeneとFFTのWave Spectraを同時に起動し
WaveGeneの設定をサイン波出力、周波数を20Hzから20000Hzまでスイープとなる
設定をしてDSP基板のアナログ入力に接続しておきます
 
イメージ 1
 
 
一方、WaveSpectraのほうはDSP基板の出力信号を取り込ませ、FFTのピークレベルをホールドするようにします。
するとサイン波の単峰ピークの位置の軌跡がDSP基板の周波数特性を描くことになります。 
これは測定している途中ですが緑のFFT波形が赤いピークホールドレベルを押し上げながら曲線を描いていくのは見てておもしろいですね
 
イメージ 2
 
 
周波数スイープに10分程度掛けて完成した周波数特性です。
100Hz~10kHzはほぼフラット、10数kHzでコーデック内のLPFでカットオフされています。この付近の周波数になるとWaveGeneが出力するサイン波もサンプリング周波数の1/2に近づくので高調波ひずみが多くなっているので肩特性がきれいに出てませんがしかたがありません。
WageGnenとWaveSpectraは連携して動いてるわけではないので、本来はアナログ入力にはハードウェアの発振器を外置きすればいい訳ですが、やはりPC上だけで実現できてしまうというのは圧倒的に便利です
 
 
イメージ 3
 
 
ところで、コーデックTLC320AC01にはA/Dコンバータの直前にアンチエイリアス用のLPFと同時にHPFを挿入することができます。
 
イメージ 5
 
 
初期設定でHPFをイネーブルにしたときの周波数特性です
100Hz以下が抑圧されていることがわかります
 
イメージ 4
 

PC上でFFT

DSP基板でデジタルフィルタを構成した場合、特性が設計どおりかどうか実測してみなければなりません。
最初、オシレータとAC電圧計で対数方眼紙にプロットしていこうかと思っていましたがPCのサウンドボードをつかってオーディオアナライザ的な測定ができるとわかり、ソフトをダウンロードしてきました。
 
使ってみたのはテスト信号を出力するWaveGeneと取り込んだ信号をFFT処理するWaveSpectraです。
ともにサウンドボードの入出力を使っているのでサンプリング周波数は44.1kHzですが、ターゲットのこの基板自体のfsが25kHzなので充分です。
 
まず手始めにDACにインクリメントデータを出力して発生させたノコギリ波をWaveSpectraに入力してみました
 
イメージ 1
 
 
非常にきれいに取り込まれて、FFT表示のほうもn次高調波の列がきれいに見えます
10kHzを越えたあたりですとんと落ち込んでいるのはDSP基板側LPFの影響であり
その効果も一目瞭然です
 
ていうか、PC上でこれだけできるならばハードウェアのDSPいらないじゃん・・・

割込み駆動化(2)

この状態でパラレルLEDをプローブしてやると割込みの状況がわかります。
コーデックの初期化でサンプリング周波数を25kHzに設定したので、正確に40μsごとに割込みが発生しています。
でもよく見ると2回づつ割込みが発生しているような・・・
 
イメージ 2
 
この部分を拡大してみました。
 
2回の割込みが終わるまで1μsかかっています。この割込みの理由はもう少し調べるとして次のサンプリングデータ取得まで39μsの余裕があることがわかります。
現状では読み取ったデータを折り返しているだけですが、これだけの時間があれば結構な処理ができるわけです。
 
 
イメージ 1
 

割込み駆動化

前回のプログラムは割込みが終了するまでIDLE命令でDSPを待ちの状態にしてしまうのでDSPの利用効率が悪いといえます
そこでメインルーチンは空ループにしておき、信号処理自体はADCデータ受信ごとの割り込みルーチンの中で全てやってしまう構造にしてみました
 
これがプログラムのメイン部分です。
DSP初期化、コーデック初期化の後、割込みをシリアル受信割込みだけ生かして永久ループに入ります
 
イメージ 1
 
 
次に受信割込みサービスルーチンですが
ADCから受け取ったデータをシフトして14ビットの読み取りデータに変換し
さらにコントロールビットの2ビットを付加してDACに書き込みます
受信割込みルーチンの間だけパラレル8ビットLEDの最下位が点灯するように仕込んでおきます
 
イメージ 2
 
プログラム動作中の基板です。
パラレルLEDの最下位1ビットが淡く黄色で点灯していますが、点灯している期間が割り込み処理中となります
 
イメージ 3
 
 

Cコーディング

統合開発環境にプロジェクト設定メニューを追加しました。
処理系をアセンブラ、Cコンパイラの選択とコマンドラインに与える簡単なオプション類の設定をおこないプロジェクトファイルに保存できるようになりました。
 
イメージ 1
 
 
LEDチカチカプログラムもCで書けばDSPアーキテクチャが隠蔽されてこれだけで済みますが・・
 
イメージ 2
 
コンパイラが吐いたアセンブルリストを見るとかなり無駄なことをしています
 
イメージ 3
 

ハード完成

というわけで、ハードが完成したので記念撮影。
 
左はかなり前に作成したC25プロトタイプ基板。今回とほぼ同じ回路ですがアナログI/Fは載っていません。中央が今回のボードですが、やはり基板外注と表面実装部品の多用で小さくまとまりました。
右は参考でテキサス製のTMS320C50評価キットです。
これも構成、機能はほぼ同じですがRAMの外付けが無くチップ内蔵のエリアしか利用できないので今回の自作ボードの方が勝っていますw
 
イメージ 1
 
 
 
ところで基板のほうはいっぺんに12枚もできてしまい持て余してます。
手元の部品であと2~3枚位は作るかもしれませんが、残りは作ってみたい方にさしあげます
 
・基板のみで部品供給はできません
・CADが商用ではないしパタンバグもあるので無償です
・キーパーツのDSPとコーデックはTIではNRND(Not Recommended for New Design)ですが
 digikeyなどにも在庫があるようです
・動かなくても保証はできませんw
 
・・・と、言ってもこんな古いデバイスで、しかもパタンミスがある基板なんてほしい人はいないと思いますけど。
 
イメージ 2
 

A/Dコンバータテスト

コーデックのアナログ入力に発振器を接続し、14ビットA/D変換後、そっくりそのまま
D/A変換してアナログ出力するループバックを行います

 

DSP、コーデックの初期化の後、ループの中でA/D変換完了とD/A変換完了の割込みを待ちます


LOOP			; メイン信号処理
	IDLE 		; 受信完了割り込み待ち
	LAC	DRR	; 受信データ読み込み
			; 
	ANDK 	0fffch 	; コントロールビット=00
	SACL	DXR 	; 送信データ書込み
	IDLE		; 送信完了割り込み待ち
	B 	LOOP

 

アナログデータはいったんアキュームレータ上に保持され、今回はそのまま出力していますがここで線形非線形の関数で波形変換をしたり時間軸上過去のデータとの演算でデジタルフィルタが実現できます

 

以下は各種波形をそのまま出力した例です
(下側=入力、上側=出力波形 Fs=25kHz)

 

  正弦波 2kHz 0.5Vp-p

イメージ 1

 

  矩形波 2kHz 0.5Vp-p

イメージ 2

 

  三角波 2kHz 0.5Vp-p

イメージ 3

 

  ノコギリ波 2kHz 0.5Vp-p

イメージ 4