製作モジュール一覧

2016年11月9日水曜日

ベースマシン UIとSequencerを再び統合

UIとSequencerでNucleo Boardを分けてSPI通信させていたのを再び統合した。I/Oピンが足りないのはI/OエキスパンダのMCP23S17を使う目論見。

配線図


NucleoからのSPI出力は(MISOを使わないので出力のみ)、バスバッファの74HC541でバッファリングして信号を補強した。

mbed repository:
https://developer.mbed.org/users/ryood/code/BaseMachine/ revision:2

UIとSequencerのハードウェアを分けたときに互いの結合度を下げたので、プログラムも変更してUI関係の処理はUIController Classとして分離した。

普通のGPIOピンを使ったUI部とシーケンサー部のプログラムの結合はまあまあうまく行ったようだが、I/Oエキスパンダを使ったUI部のプログラミングはまだ。機能としては9月下旬の「ベースマシンの音出し動画」まで戻った感じだ(^q^;

この間を振り返ってみると

  • SPIでプロセッサ間の通信。UARTは遅いし信頼性が低い。I2Cは遅い上に難解。
  • SPI信号の波形を整えた。バスバッファの74HC541を使う実験。ダンピング抵抗を入れる実験。
  • I/Oエキスパンダを使う実験。


というようなことをやっていたようだ。

ToDo:


BaseMachineUIController Class内でI/Oエキスパンダを使えるようにコーディング。

配線、パラメータ等のドキュメント整理。

74HC541を使ったSPIバスバッファをユニバーサル基板で実装。http://dad8893.blogspot.jp/2016/10/spi-tc74hc541.html

PSoC4 DCOにリセット線をつける。電源の立ち上げ時にSPI信号が入るタイミングで起動に失敗するようだ。オンボードの青色LEDが点滅する。これはPSoC 4 Prototyping Kitがプログラミングモードに入っていると思う。←未確認。

<追記:2016.12.26>

SPIの信号線のCSの初期値がLo(0)になっていたのが原因だったようです。対処療法でちゃんとは把握できていないですが、初期値をHi(1)にすると起動時に青色LEDがチカチカして停止する現象はなくなりました。

SPIのCSはReset信号とうと同じく負論理で、Active Lowです。一方CやC++では0で初期化するのが普通なのでプログラミングするときはCSを1で初期化するように気をつけたほうがいいと思います。

</追記>


電源ボードを検討。±9V(安定化なし)、±5V(7805/7905で安定化?)、+3V(安定化)


メモ:


よく言われることだと思うが、規模が大きくなると掛け算でエラー発生要因が増える。ハードウェアもプログラムもユニット・テストを今まで以上に慎重にやらないといけないようだ。

完成しても、DCOやDCFをいろいろ作って遊びたいので、今回はあまり妥協はしたくない。

2016年11月7日月曜日

Wave GeneratorのAD9833の出力にLPFを入れてみる。

前回なんとか動かせた感じだが(参考:「Wave GeneratorのAD9833をArduinoで動作させてみる。」)かなりノイズが乗っていたので、自作のバターワース特性の4次VCVS LPFを通してみた。


4次バターワースLPFのありなし

ch1:4次バターワースフィルターなし ch2:4次バターワースフィルターあり

多少ノイズは減らせている(線が細くなっている)


オシロで20MHzに帯域制限できる機能があるのでかけてみた。



ch1:4次バターワースフィルターなし ch2:4次バターワースフィルターあり

オペアンプを使ったLPFよりはっきりノイズが減らせている。オシロ(OWON SDS7102)の中の回路がどうなっているかわからないが、これぐらいの帯域になるとオペアンプを使ったフィルターでは歯が立たないようだが、オシロの帯域制限は効いている。

FFTしてみる。


4次バターワースLPFなし、帯域制限なし


10kHz/div (可聴帯域付近)

380kHz、920kHz付近でノイズのピークあり

5MHz/div (デジタルノイズ付近)

4MHz、25MHz、36MHz付近でノイズのピーク


4次バターワースLPFあり、帯域制限あり(20MHz)


10kHz/div (可聴帯域付近)

4次バターワースLPFなし、帯域制限あり

4次バターワースLPFあり、帯域制限あり

1kHz/div (可聴帯域内)

4次バターワースLPFなし、帯域制限あり

4次バターワースLPFあり、帯域制限あり

メモ:


可聴帯域付近になるとオペアンプを使ったフィルターも多少効きそうだが、MHz帯のデジタルノイズには太刀打ちできないようだ。

LCRのパッシブフィルタならいけたりするのかどうなのか(@@?

2016年11月5日土曜日

Nucleo F401RE(mbed)でMCP23S17を使う。 バッファリングしてみる。

使っているライブラリがTickerで一定間隔で状態を問い合わせる仕組みになっているので毎回MCP23S17にSPIで問い合わせると通信コストが高そうなので、バッファリングしてみることを考えてみた。

mbedのソースの中までは見ていないが、SPI通信中は値が取得できるまで待ち状態になってそうな気がする。必要な値を毎回MCP23S17にぶら下がっているデバイスに問い合わせているとその間他の処理ができなくなる可能性が高いと思う。

MCP23S17のGPIOを全部読み取りとして使えば定期的にSPI経由でポーリングして2Byte(MCP23S17はGPIOがPortAx8bit、PortBx8bit)を本体のNucleoにバッファリングしてやれば、SPI通信のコストは下げられそうだ。

4×4のキーパッドを使うとGPIOのうち4本は書き込みに使わないといけないので、バッファリングの仕組みが複雑になる。キーパッドはあきらめてタクトスイッチとロータリーエンコーダーだけにしてテストしてみた。


mbed repogitory:
https://developer.mbed.org/users/ryood/code/ExioBufferdController_Test/

SPI通信のようす


PortBにつなげているタクトスイッチx8を適当に押しながら測定


ch1:sck ch2:MISO

拡大