MCP4922にADSR波形を出力。

Dependencies:   mbed-rtos mbed

Committer:
ryood
Date:
Tue Jun 14 22:37:17 2016 +0000
Revision:
0:d78518594116
Child:
1:6ebe35be504e
first commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ryood 0:d78518594116 1 #include "mbed.h"
ryood 0:d78518594116 2 #include "rtos.h"
ryood 0:d78518594116 3 #include "AverageAnalogIn.h"
ryood 0:d78518594116 4
ryood 0:d78518594116 5 #define SPIM_TIMER_PERIOD (5) // 5ms
ryood 0:d78518594116 6 #define SPIM_RATE (8000000) // 8MHz
ryood 0:d78518594116 7 #define SPIM_WAIT /*(wait_us(1))*/
ryood 0:d78518594116 8
ryood 0:d78518594116 9 // ピン・アサイン
ryood 0:d78518594116 10 #define PIN_CHECK PA_10
ryood 0:d78518594116 11 #define PIN_DAC_CS PA_9
ryood 0:d78518594116 12 #define PIN_DAC_LDAC PA_8
ryood 0:d78518594116 13
ryood 0:d78518594116 14 SPI SpiM(SPI_MOSI, SPI_MISO, SPI_SCK);
ryood 0:d78518594116 15 DigitalOut DacCs(PIN_DAC_CS);
ryood 0:d78518594116 16 DigitalOut DacLdac(PIN_DAC_LDAC);
ryood 0:d78518594116 17
ryood 0:d78518594116 18 DigitalOut CheckPin(PIN_CHECK);
ryood 0:d78518594116 19
ryood 0:d78518594116 20 AverageAnalogIn DurationIn(A0);
ryood 0:d78518594116 21 AverageAnalogIn DecayIn(A1);
ryood 0:d78518594116 22 AverageAnalogIn SustainIn(A2);
ryood 0:d78518594116 23
ryood 0:d78518594116 24 int16_t beatLen = 100;
ryood 0:d78518594116 25
ryood 0:d78518594116 26 int16_t level = 4095;
ryood 0:d78518594116 27 int16_t duration = 400;
ryood 0:d78518594116 28 int16_t decay = 100;
ryood 0:d78518594116 29 int16_t sustain = 2000;
ryood 0:d78518594116 30
ryood 0:d78518594116 31 int16_t decay_delta;
ryood 0:d78518594116 32 int16_t mod_value;
ryood 0:d78518594116 33
ryood 0:d78518594116 34 int16_t tick;
ryood 0:d78518594116 35
ryood 0:d78518594116 36 // DAC A Channelに出力
ryood 0:d78518594116 37 // parameter: v: 出力値(0 .. 4095)
ryood 0:d78518594116 38 void writeToDacA(int16_t v)
ryood 0:d78518594116 39 {
ryood 0:d78518594116 40 // Channel A
ryood 0:d78518594116 41 DacLdac = 1;
ryood 0:d78518594116 42 DacCs = 0;
ryood 0:d78518594116 43 SpiM.write((v >> 8) | 0x30); // 0x30: DAC_A(0) | Vref Unbuffered(0) | Vout 1x(1) | !SHDN(1)
ryood 0:d78518594116 44 SpiM.write(v & 0xff);
ryood 0:d78518594116 45 SPIM_WAIT;
ryood 0:d78518594116 46 DacCs = 1;
ryood 0:d78518594116 47 DacLdac = 0;
ryood 0:d78518594116 48 }
ryood 0:d78518594116 49
ryood 0:d78518594116 50 // DAC B ChannelにA ChannelのVrefを出力
ryood 0:d78518594116 51 void outVref()
ryood 0:d78518594116 52 {
ryood 0:d78518594116 53 // Channel B
ryood 0:d78518594116 54 DacLdac = 1;
ryood 0:d78518594116 55 DacCs = 0;
ryood 0:d78518594116 56 SpiM.write(0x08 | 0xB0); // 0xB0: DAC_B(1) | Vref Unbuffered(0) | Vout 1x(1) | !SHDN(1)
ryood 0:d78518594116 57 SpiM.write(0x00);
ryood 0:d78518594116 58 SPIM_WAIT;
ryood 0:d78518594116 59 DacCs = 1;
ryood 0:d78518594116 60 DacLdac = 0;
ryood 0:d78518594116 61 }
ryood 0:d78518594116 62
ryood 0:d78518594116 63 // ADSR波形を出力
ryood 0:d78518594116 64 void outADSR(void const* arg)
ryood 0:d78518594116 65 {
ryood 0:d78518594116 66 tick++;
ryood 0:d78518594116 67
ryood 0:d78518594116 68 if (tick > beatLen) {
ryood 0:d78518594116 69 tick = 0;
ryood 0:d78518594116 70 // モジュレーション波形を初期化する
ryood 0:d78518594116 71 mod_value = level;
ryood 0:d78518594116 72 decay_delta = (level - sustain) / decay;
ryood 0:d78518594116 73 }
ryood 0:d78518594116 74
ryood 0:d78518594116 75 // 出力値補正
ryood 0:d78518594116 76 if (mod_value < 0) {
ryood 0:d78518594116 77 mod_value = 0;
ryood 0:d78518594116 78 }
ryood 0:d78518594116 79 writeToDacA(mod_value);
ryood 0:d78518594116 80
ryood 0:d78518594116 81 if (tick < decay) {
ryood 0:d78518594116 82 mod_value -= decay_delta;
ryood 0:d78518594116 83 }
ryood 0:d78518594116 84 if (tick == duration) {
ryood 0:d78518594116 85 mod_value = 0;
ryood 0:d78518594116 86 }
ryood 0:d78518594116 87 }
ryood 0:d78518594116 88
ryood 0:d78518594116 89 int main()
ryood 0:d78518594116 90 {
ryood 0:d78518594116 91 RtosTimer SpiM_timer(outADSR, osTimerPeriodic);
ryood 0:d78518594116 92
ryood 0:d78518594116 93 SpiM.format(8, 0);
ryood 0:d78518594116 94 SpiM.frequency(SPIM_RATE);
ryood 0:d78518594116 95
ryood 0:d78518594116 96 outVref();
ryood 0:d78518594116 97
ryood 0:d78518594116 98 SpiM_timer.start(SPIM_TIMER_PERIOD);
ryood 0:d78518594116 99
ryood 0:d78518594116 100 while(true) {
ryood 0:d78518594116 101 duration = DurationIn.read() * beatLen;
ryood 0:d78518594116 102 decay = DecayIn.read() * beatLen;
ryood 0:d78518594116 103 sustain = SustainIn.read() * 4095;
ryood 0:d78518594116 104
ryood 0:d78518594116 105 printf("%d\t%d\t%d\r\n", duration, decay, sustain);
ryood 0:d78518594116 106
ryood 0:d78518594116 107 Thread::wait(10);
ryood 0:d78518594116 108 }
ryood 0:d78518594116 109 }