2016年6月24日金曜日

mbedでMCP4922にエンベロープ波形を送るクラスを作る。

エンベロープ波形の生成とSPI送信をmbedでクラス化してみた。

ブレッドボード図


MCP4922の出力でNJM13700を使ったVCAのコントロールもしてみたかったが、配線がぐちゃぐちゃしてきたのでまずは単体でテストした。

mbed repository:
https://developer.mbed.org/users/ryood/code/AmpController_Test/

main.cpp

/*
 * EnvelopeをMCP4922に出力するテスト
 *
 * 2016.06.23
 *
 */

#include "mbed.h"
#include "rtos.h"
#include "Envelope.h"
#include "SpiAmpController.h"

#define AMP_VREF    0x0fff
#define SPIM_RATE   1000000

const int envLength = 25;

AnalogIn levelIn(A0);
AnalogIn durationIn(A1);
AnalogIn decayIn(A2);
AnalogIn sustainIn(A3);

SPI spiM(SPI_MOSI, SPI_MISO, SPI_SCK);

int main()
{
    spiM.format(8, 0);
    spiM.frequency(SPIM_RATE);
       
    // Envelope(level, length, duration, decay, sustain)
    Envelope envelope(4095, envLength, envLength*3/4, envLength/2, 2047);
    SpiAmpController ampController(&spiM, D8, D7);
    ampController.setVref(AMP_VREF);
        
    printf("\r\n\n*** Amp Controller Test ***\r\n");
    envelope.init();
    int cnt = 0;
    int vref = 0;
    while (true) {
        ampController.outDca(envelope.getModLevel());
        envelope.update();
        
        cnt++;
        if (cnt == envLength) {
            cnt = 0;
            envelope.setLevel(levelIn * 4095);
            envelope.setDuration(durationIn * envLength);
            envelope.setDecay(decayIn * envLength);
            envelope.setSustain(sustainIn * 4095);
            
            /*
            printf("%d\t%d\t%d\t%d\t%d\t\r\n",
                envelope.getLevel(), envelope.getLength(), envelope.getDuration(), envelope.getDecay(), envelope.getSustain());
            */
            envelope.init();
            ampController.setVref(vref);
            vref += 0x10;
            if (vref > 0x0fff) {
                vref = 0;
            }
        }
        Thread::wait(5);
    }
}

プログラム(クラス構成)もなんかぐちゃぐちゃしてきた(^q^;

一度クラス図を書いて整理したほうが良さそうな気もする。

vrefを0x07ff0x0fff(Vdd)にした時のエンベロープ波形

vrefを0x07ff(Vdd/2)にした時のエンベロープ波形

メモ:

Arduino Headerのアサイン(SPI関連)

D13  SPI SCK
D12  SPI MISO
D11  SPI MOSI
D10  DCF CS
D9    DCO CS
D8    DCA CS
D7    DCA LDAC