2018年9月18日火曜日

Nucleo DCO 作戦検討 その3

ふたたび作戦を検討しました。


ブロック図(案)


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

ロータリーエンコーダー


波形切り替えと周波数レンジ切り替えは、操作性がよくなるのでプッシュスイッチからロータリーエンコーダーに変更しました。(現状はOSC 1の2個だけ)

OLED表示とADC読み取り


OLEDはSSD1306(I2C)の128x64のものが届いたので交換しました。

OLED表示とADC読み取りはメイン・ループ内で行っています。

OLEDの表示は非常に時間がかかり、ADCの読み取りのレスポンスが悪くなるので、OLEDの表示をオフにするスイッチを設けました。

OLEDの表示中は4.6fps程度でPOTを回すと出音がブチブチですが、OFFにするとなめらかに変化します。

ADCの読み取りは移動平均で補間しました。補間するタイミングは波形生成割り込み中に行いました。結果、周波数からDDSのチューニングワードを毎回計算することになり、割り込みごとの処理時間が大幅に増えました。


ch2:CheckPin1(D4)

※サンプリングレートが100kHzだと処理が間に合わないので、50kHzに下げて計測。

補間処理を入れる前は割り込み時の処理時間は2マイクロ秒程度でしたが(参考「Nucleo DCO 内蔵ADCで入力系のテスト」)5マイクロ秒にまで増えてしまいまいした。結構な量の浮動小数点数演算をしていますが、F767ZIのFPUの能力のおかげでなんとかなっています。

ここまでFPUが強力だと、DDSではなく毎回波形を計算しても間に合うんじゃないかとも。

サンプリングレート62.5kHz(サンプリング周期:16マイクロ秒)までは動作します。

前回やった、浮動小数点数演算の速度を比較の結果などから、もう少しプログラムを改良できるかもしれません。

メモ:


u8g2-mbedのI2Cのクロックが50us程度になっている(I2CのStandard Modeは100kHz)。→手を加えてHW I2CやSPIで接続できるようにする?

OLED表示を別スレッドにして、プライオリティを下げればADC読み取りが優先されてOLED表示をオフにしなくても済む?

Callbackクラスを使うようにする?

0 件のコメント:

コメントを投稿