2017年12月23日土曜日

KIK01 処理タイミングの計測

mbed Repository:
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より少し少ない。

メモ:


純粋にプログラミングだけ考えるとまだまだ追い込めそうですが、一旦保留。