速度連動アンプ・ソフトウェア製作その1

愛車のバイクVFR750F(RC36)にて、長距離走行中の暇つぶしのための"MP3プレーヤー車載&ついでに無線機も車載"作業のネタなんです。
前回からだいぶ間隔が開いてしまいましたが、製作の続きなのです。

https://…/2007/08/30/ 回路実験の準備
・・・・これ以前はページ右上の"日記カテゴリ一覧"から『無線』を選択してみてください。

さて、回路の中核はデジタルボリュームチップPGA2310。このチップにデジタル信号でボリュームを指示すると、任意の音量の出力が得られるというのです。
f:id:vfr750f2:20070811233440g:plain
今回は、このデジタルボリュームチップに対してボリュームデータをセットするソフトウェアを実験します。

・デジタルボリューム制御IC
PGA2310
・マイクロコントローラIC
PIC16F84A

ICチップには、メーカーからデータシートという使い方を説明してある資料が提供されています。
昔は大規模なチップでは一冊の本になってしまうほど膨大な紙面だったのですが、今はpdf電子データなので楽チンなのです。


まずはデータシートを読み解かなければなりません。日本のメーカーだと日本語のデータシートがありますが、それ以外はほとんどが英語。フィーリングで理解するしかありません。まずはピンアサインと、それぞれのピンの役割です。

・ピンアサイン ・ピンの説明

これを読むと、ボリューム制御に関連しそうなピンは次のとおりになります。

ピンNo 端子記号 端子名 役割
2 /CS チップセレクト信号 複数のチップを実装する場合に、制御対象のチップであることを指示する
3 SDI シリアルデータ入力 制御コマンドシリアル入力
6 SCLK シリアルデータクロック シリアルデータ同期信号
7 SDO シリアルデータ出力 複数のチップを実装する場合に、制御シリアル信号を数珠繋ぎにするための出力

どうやら、シリアル信号でこのPGA2310チップに対してコマンドを送る方式のようです。今回の回路ではPGA2310チップを一つしか使わないため、シリアルデータ出力ピンはオープンにしておけば良さそうです。

シリアル通信とは・・・(?)

http://itpro.nikkeibp.co.jp/members/NNW/ITARTICLE/20010206/1/ シリアルとパラレル

つづいて、コマンドの中身を調べます。

・シリアル信号の中身 ・データとクロックの関係

このチップは、左右独立で256段階の音量制御ができます。ちょっとコンピュータに詳しい人だと、256=8ビットとすぐに換算できます。
単純に、右音量8ビット+左音量8ビットの16ビットバイナリをクロック信号に同期させて送信すればよいと書いてあります。PGA2310はクロック信号の立ち上がりでビットを取り込む仕組みです。


なるほど、次にクロック信号のタイミングを調べます。タイミング指定では・・・

パラメータ 環境 最小値 標準値 最大値 単位
Serial Clock(SCLK) Frequency tSCLK 0   6.25 MHz
Serial Clock (SCLK) Pulse Width Low tPL 80     nS
Serial Clock (SCLK) Pulse Width High tPH 80     nS
SDI Setup Time tSDS 20     nS
SDI Hold Time tSDH 20     nS

うーむ、最大周波数と、最小の周期幅の規定、それとクロック立ち上がり前後のデータ信号の変動禁止時間の規定がありますが、周期のズレや分周比の規定が書いてありません
クロック』という意味だと、正確な周期で分周比50%の信号が必要と思われます。ところがデータシートを単純に読み解くと、クロックではなく単純にデータストローブ信号としてしか使っていないように思われます。これであれば適当な周期で分周比も適当な信号でも、クロックの立ち上がり時のデータさえ保証すればよいので簡単なのです。


今回は、クロック信号もデータ信号もソフトウェアで作り出すので正確な周期・分周比の波形は作れません。適当な周期・分周比の信号でPGA2310チップが信号を正しく認識してくれるのかを実験するのです。

・電源投入時の動作

しかも、電源投入直後は、ボリューム=ゼロ状態で立ち上がると書いてあります。試しに255(全てのビットを1)のデータを書き込んでみて、出力端子から何かしらの信号が出力されたら成功なのです。
実験用のソフトウェアを作ります。


;==============================================================================
;====== [サブルーチン]シリアル通信出力 ========================================
;==============================================================================
SENDVOL ; [入力] TMP_VOL_L/TMP_VOL_Rレジスタに目的のボリュームをセット
;====== PGA2310チップセレクト信号をアサート
BCF PORTA,BIT_PA_CS

;====== RチャネルBIT7をシリアルバスに出力
BTFSS TMP_VOL_R,7 ; Rチャネルビット7はセット(?)
GOTO R7NEG
BSF PORTA,BIT_PA_SDI ; シリアルバスに1を出力
GOTO R7END
R7NEG BCF PORTA,BIT_PA_SDI ; シリアルバスに0を出力
R7END
BCF PORTA,BIT_PA_SCLK ; クロック同期信号をアサート
BSF PORTA,BIT_PA_SCLK ; クロック同期信号をネゲート

;====== RチャネルBIT6をシリアルバスに出力
BTFSS TMP_VOL_R,6 ; Rチャネルビット6はセット(?)
GOTO R6NEG
BSF PORTA,BIT_PA_SDI ; シリアルバスに1を出力
GOTO R6END
R6NEG BCF PORTA,BIT_PA_SDI ; シリアルバスに0を出力
R6END
BCF PORTA,BIT_PA_SCLK ; クロック同期信号をアサート
BSF PORTA,BIT_PA_SCLK ; クロック同期信号をネゲート

以下、BIT5~0、左チャンネルも同じ。

このプログラムを実行するPICチップ(PIC16F84A)は、10MHz動作しており1命令は0.4uSとなるため、PGA2310が要求する最小パルス幅80nSを満たします。
しかし、このソフトウェアが出力する信号は・・・

クロック{0}期間・・・ 0.4uS
クロック{1}期間・・・ 2.0uS~2.4uS

ときわめて不安定です。

・PICライター ・プログラム書込み中

さて、結果は・・・・

・実験中

あっさりと音が鳴りました成功です