https://os.mbed.com/users/ryood/code/KIK01_Proto08/ Revision:36
波形更新
ch1:D14(波形更新の間隔) ch2:D15(DCOへのSPI出力)
UART_TRACE、POTx8 PizzaBoxとPOTx16 LunchBoxからのパラメータ読み込みは抑止している。
ch1のD14はファームウェアでDout1と定義している。
void update() { #if (PIN_CHECK) Dout1 = 1; #endif // Output Sync Signal per steps if (ticks % stepLength == 0) { SyncOut = 1; #if (LED_SYNCOUT_BLINK) LedSyncOut = 1; timeoutLedSyncOut.attach(&ledSyncOutAtTimeout, LED_SYNCOUT_BLINK_CYCLE); #endif } // set envelope parameters envelopeAmplitude.setParam(amplitudeParam); envelopeFrequency.setParam(frequencyParam); envelopeNoiseAmplitude.setParam(noiseAmplitudeParam); frequency = envelopeFrequency.getAmplitude(ticks); amplitude = envelopeAmplitude.getAmplitude(ticks); noiseAmplitude = envelopeNoiseAmplitude.getAmplitude(ticks); DcoSetFrequency(frequency); DcaSetAmplitude(1, amplitude); // DCO DcaSetAmplitude(2, noiseAmplitude); // NOS01 ticks++; if (ticks >= envelopeLength) { ticks = 0; LedBeat = 1; timeoutLedBeat.attach(&ledBeatAtTimeout, LED_BEAT_BLINK_CYCLE); } // Output SyncSignal SyncOut = 0; #if (PIN_CHECK) Dout1 = 0; #endif }
32kHzで割り込みを発生させてupdate()を呼び出しているので、ch1の矩形波の周波数は32kHzになるが一部処理が引き伸ばされている。この割り込みタイミングの揺れは波形の周波数には関係なく(波形本体はAD8402 WeinBridge DCOとNOS01でアナログ回路で発生させている)、DCOとVCAに送っているエンベロープのサンプリング・ポイントの揺れになるので、実用上はあまり気にしなくていい。
ただ、ちょっと気持ち悪いので原因が何か?できる範囲で調べてみるつもり。
ch2のD15はファームウェアでDout2と定義している。
void AD8402Write(uint8_t address, uint8_t value) { #if (PIN_CHECK) Dout2 = 1; #endif AD8402Cs = 0; SpiMAD8402.write(address); SpiMAD8402.write(value); AD8402Cs = 1; wait_us(1); #if (PIN_CHECK) Dout2 = 0; #endif }
こちらはさらにタイミングが揺れているが、同じくDCOの周波数変調のエンベロープのサンプリング・ポイントの揺れになる。
WeinBridge回路の2個のRを同時に設定しているので2回H/Lされている。
波形更新(拡大)
ch1:D14(波形更新の間隔) ch2:D15(DCOへのSPI出力)
割り込みの周波数は32kHzなので、周期は31.25us。
オシロの波形から大体の処理時間を表にすると
通常時
割り込みが引き伸ばされた場合
前処理は予め読み取っていたパラメータをEnvelopeARクラスのオブジェクトへの代入、エンベロープ波形の生成を行っている。後処理ではエンベロープ波形を内蔵DACから出力している。
以前も「KIK01 SPI制御VCAと演算による振幅変調の比較」でSPI通信の処理時間を測ってみたが、このときはSPI DACのMCP4922へのSPI送信で、今回はAD8402へのSPI送信なので条件が異なる。
POTx8 LunchBoxとPOTx16 PizzaBoxからのパラメータの読み取り
今度は波形更新処理を抑止して、パラメータ読み取りの処理時間を計測した。
ch1:D14(波形更新の間隔) ch2:D2(パラメータの読み取り)
パラメータの読み取りはmain()関数のメインループ内で1msのThread::wait()をかけて呼び出しているので周波数は1kHzになる。
パラメータ読み取りの処理時間は468us。
波形更新処理を有効化すると
ch1:D14(波形更新の間隔) ch2:D2(パラメータの読み取り)
Thread::wait()なので、タイマー割り込み処理によってかなり引き伸ばされて1/166.4Hz≒6msごとの処理になっている。ch2がLの期間がThread::wait()で待ちの状態で1msより少し少ない。
メモ:
純粋にプログラミングだけ考えるとまだまだ追い込めそうですが、一旦保留。
0 件のコメント:
コメントを投稿