2018年1月21日日曜日

Arduino LFOの構想

KIK01ベースマシンのパラメータ設定用のPOTのかわりにLFOやエンベロープ・ジェネレーターをつないで変調することを考えてみました。

アナログLFOもおもしろそうですが、ぴゅんぴゅん2号をベースに、Arduinoでやってみることにしました。

仕様
波形: サイン波、三角波、ノコギリ波(上昇)、ノコギリ波(下降)、矩形波(パルス幅設定)
周波数: 0Hz~100Hz程度
振幅: 3.3Vp-p(単電源波形)

KIK01やベースマシンのPOT入力用のADCは3.3V系なので、0V~3.3Vの単電源波形とします。←できれば振幅を調節できるようにする。

受け側のADCは10~12bit精度、サンプリング周期1kHz程度ですが、アナログ回路でも使えるようにできるだけきれいな波形を出力することを目標とします。

今回はArduinoしばりをかけます(^q^;

ブロック図

波形選択はタクトスイッチ1個の順送りで行い、LEDで選択中の波形を表示します。LFOのRateはPOTで設定、矩形波のパルス幅もPOTで設定。

出力はMCP4922を使い、デジタル歪を除去するためにLPFをかけます。

Arduinoのテスト・スケッチ


Github:
https://github.com/ryood/ArduinoLFO/tree/a904798e7fd8e1f79e818c88adfa5c5905da3cc4

波形生成はDDSで行いました。DDSは波形の周期性が出たりデメリットもあるのですが、少ない演算量の整数演算で済むのでArduinoで任意波形を出すならこれ一択だと思います。

テスト用ブレッドボード配線図


出力波形


100Hzのサイン波を出力して測定しました。


拡大

相当ガタガタしています。ガタガタの幅は60us程度で、サンプリングレート15625Hz(64us)と合致します。

高さは40mV程度。 3.3V / 40mV = 82.5 step でかなり荒くなっています。

FFT


WaveSpectraでFFTしました。(窓関数:FlatTop)


上側のウィンドウの波形でもガタガタが確認できます。スペクトラムを見ると100Hzの整数倍の高調波歪は大きくないですが、その他の歪が猛烈に出ています。サンプリングレートの15kHz付近にピークが出ています。

処理時間


Pinの出力のH/Lで処理時間を計測しました。

割り込みとSPI処理

ch1:LDAC ch2:A4

ch1:LDACはMCP4922とのSPI通信の最初と最後でH/Lして、20usかかっています。ch2:A4はサンプリング周期ごとのTimer2の割り込みの最初と最後でH/Lしていて38.4usかかっています。

結構ギリギリですね(^q^;

割り込みとメインループ

ch1:A5 ch2:A4

ch1:A5はメインループのloop()の最初と最後でH/Lしています。現状ではパラメータ読み取り用のanalogRead()を無効化しています。Timer2の割り込み中はloop()内の処理は引き伸ばされているようです。

割り込み処理の時間がかかりすぎると、loop()に処理が戻ってこず、パラメータ読み取りが出来ない可能性があります。

SPI通信



ch1:MOSI ch2:SCK

SPIクロック(SCK)は、スケッチで指定している通り8MHzになっています。MCP4922は20MHzまでなので多少波形が汚くても大丈夫だと思います。←憶測(^q^;

メモ:


ぴゅんぴゅん2号の波形テーブルは、8bit長、要素数256にしている。これをMCP4922の12bit長にし、要素数も増やして出力波形が改善されるか見てみる。

ノコギリ波、三角波はDDSではなく線形補間でやってみる?

矩形波は一番簡単なH/Lで(^q^?

ノイズ(S&H)もできそう?

アナログLPFで必要な帯域外を削るにしても、かけすぎるとサイン波以外は波形がなまってしまってよくない。

割り込みの周期が揺れていないかオシロのトリガ(パルス幅)で確認できる?