2018年9月11日火曜日

Nucleo DCO 作戦検討

ファームウェアのめどが立ったので作戦を検討しました。


テストプログラム(mbed-cli)
https://github.com/ryood/Nucleo_DCO/tree/master/mbed/Nucleo_DCO_Test10

ブロック図(案)

ピン接続表(案)

POT入力


3オシレーターですが、それぞれのオシレーターで周波数を設定するのではなく、OSC1で基本の周波数を1つ設定(ブロック図のMaster Freq POT)し他のオシレーターはデチューン(ブロック図のDTN POT)として設定しようと思います。

3オシレーターの波形をプログラムでMIXしてオーバーフロー/アンダーフローしないように境界を設けていて、オーバーフローした場合、かなりきつい歪が発生するのでマスターレベル(図のMaster Level POT)で内部的なレベルを調整できるようにします。

当初はPOTで位相を調整するように考えていましたが、音出ししてみるとあまり効果がないので廃止しました。デチューンの仕方によってうなりが発生します。

3OSCともノコギリ波でおおよそ1オクターブずつずらした合成波形

これを7オシレーターぐらいに増やしてちょっとずつデチューンすればSuper SAWになります。

プッシュスイッチ入力


プッシュスイッチの読み取りはmbedのInterruptIn(割り込み)で処理しました。

NucleoでInterruptInを使う場合はピン名のアルファベットの部分がかぶっても大丈夫ですが、数字の部分がかぶると使えません。例えば、PA_0とPA_1の組み合わせはOKで、PA_0とPB_0の組み合わせはNGです。

そのためプッシュスイッチにつなぐZIOヘッダの「PE_10」を飛ばしています。

処理が煩雑なのでInterruptInのオブジェクトは配列にしたかったのですが、引数付きのCallbackの仕方がよくわからず、かっこ悪いですが1つずつ定義しました。

こうしたいが、
InterruptIn Button[] = {
InterruptIn(PB_11, PullUp),
InterruptIn(PB_10, PullUp),
<後略>
こうした
InterruptIn Button0(PB_11, PullUp);
InterruptIn Button1(PB_10, PullUp);
<後略>
以前、FunctionPointer.hで定義されている、int型の引数を1つとるコールバック関数型の「event_callback_t」を使いましたが、Mbed OS5では非推奨となっています。

参考「mbedのコールバック FunctionPointerを使うテスト

Mbed OS 5の「platform/FunctionPointer.h」には

MBED_DEPRECATED_SINCE("mbed-os-5.1",
                          "FunctionPointer has been replaced by Callback<void()>")

という記述がありCallbackクラスをつかうことが推奨されています。いずれ使ってみようと思います。

参考「https://os.mbed.com/docs/v5.8/reference/callback.html

チャタリング対策


チャタリングが発生したのでタイマー割り込みのTickerクラスで対策しました。ピン割り込みがかかったとき、タイマー割り込みを有効にしています。

※1回のみの割り込みなのでTimeoutクラスにすれば良かった?

処理時間の計測

テストプログラム(mbed-cli)

Nucleo F446RE
https://github.com/ryood/Nucleo_DCO/tree/master/mbed/InterruptIn_Test02

Nucleo F767ZI
https://github.com/ryood/Nucleo_DCO/tree/master/mbed/InterruptIn_Test03

Board function ピン割り込み(us) チャタリング対策(us)
F446RE attach() 10.9 3.1
F767ZI attach() 5.5 2.1
F767ZI attach_us() 4.9 2.1

※attach()の引数はflot型、attach_us()の引数は整数型

ピン割り込みの処理時間はF767ZIのattach_us()で4.9usと、波形生成の割り込み周期の10usと比べて十分短いとは言えませんが、Tickerの方が優先順位が高いようです。

Nucleoの割り込みベクタ表は「RM0410 Reference manual」の「10  Nested vectored interrupt controller (NVIC)」に載っています。


赤枠で囲みましたが、TickerがSysTick、InterruptInがEXTxを使っているかどうかはわかりません。mbed OS 5もまだ良く分かっていないのに、1896ページもあるReference Manualを読み解くのはとてもじゃないけど無理な話です。

割り込みの優先順位は、NVIC_SetPriority()で設定できるようです。

参考「割込み 256

出力波形


Aruduino LFOと同じような方法で出力波形を増やしました。メモリが潤沢なので12bit / 64k要素のWave Tableを使用しました。

random()関数の処理時間を計測すると0.113 usで、ノイズも無事出力できました。

random()関数の処理時間を計測するプログラム(mbed-cli)
https://github.com/ryood/Nucleo_DCO/tree/master/mbed/random_Test01

ToDo


周波数設定(Range切り替え含む)

電源電圧監視

OLED表示項目の整理

PA_7(ADC)の読み取り値がおかしい?

0 件のコメント:

コメントを投稿