出力は内蔵12bitDACから、A/DコンバーターとのSPI通信はSCK、MOSI、CSに33Ωのダンピング抵抗を入れた。MISOは1kΩのRでプルダウンした。
オーディオ出力波形は前回と変わらない。(参考:「キックマシン KIK01 Nucleo(mbed)でプロトタイピング」)
mbed repository:
https://developer.mbed.org/users/ryood/code/KIK01_Proto02/ Revision:13
SPI通信のようす
MOSI
ch1:MOSI ch2:SCK
MISO
ch1:MISO ch2:SCK
CS1(D11)
ch1:CS1 ch2:SCK
CS2(D10)
ch1:CS2 ch2:SCK
SPIクロック(SCK)が419.7kHzとなっているが、MCP3008クラスがSPIオブジェクトをコピーして持つ仕様になっているようで、MCP3008クラスのコンストラクタを呼び出す前にSPI.frequecy()を呼び出さないとクロックの設定が反映されないようだ。なので、デフォルトの周波数になっている。
SPIオブジェクトの周波数をローカルで設定をしないとダメなので、しばし保留。参照かポインタでSPIオブジェクトを持つように変更する予定です。
処理時間の計測
DigitalOutをH/Lさせて、
D2: サンプリング周期ごとの割り込み中の処理時間(エンベロープ生成+波形出力)
D3: エンベロープ生成時間
D4: MCP3008/16chの読み取り時間
がわかるようにしてみた。
D2: サンプリング周期ごとの割り込み中の処理時間
ch1:D2 ch2:SPI_SCK
50kHzの割り込み中の処理時間は5us。プログラムで48kHzに設定しているのでちょっと速い。
割り込み処理中のch1がHiになっている間も、ch2のA/Dコンバーター読み取り用のSPIの SCK(クロック)が出力されているのでSPI通信は非同期で行われているようだ。
普通、SPI用ハードウェアはレジスタに値を設定してやれば、CPUと独立して勝手に通信を行ってくれる。mbedでもこの仕組が効いているんだと思う。ありがたいことです(^q^/
D3: エンベロープ生成時間
ch1:D3 ch2:SPI_SCK
エンベロープ生成には3usかかっている。
D2:D3
ch1:D2 ch2:D3
わかりやすいようにD2とD3を同時に測定。48kHzのサンプリングレートだと周期の1/4を処理に使っているので、まだ余裕がありそう。
D4: MCP3008/16chの読み取り時間
c1:D4 ch2:SPI_SCK
MCP3008の16ch分の読み取りに0.732msかかっていて、その間SCKが出力されている。A/Dコンバーターの読み取りはメイン・ループ内で行っているのでエンベロープ生成、波形出力の割り込みが優先される。(←はず)
0 件のコメント:
コメントを投稿