2017年6月21日水曜日

キックマシン KIK01 POTをMCP3008で読み取り

Nucleo F446RE(mbed)でA/DコンバーターのMCP3008を使ってPOTの値を読み取るようにしてみた。


出力は内蔵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コンバーターの読み取りはメイン・ループ内で行っているのでエンベロープ生成、波形出力の割り込みが優先される。(←はず)