テストプログラム(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);以前、FunctionPointer.hで定義されている、int型の引数を1つとるコールバック関数型の「event_callback_t」を使いましたが、Mbed OS5では非推奨となっています。
InterruptIn Button1(PB_10, PullUp);
<後略>
参考「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 件のコメント:
コメントを投稿