MCP4922にADSR波形を出力。

Dependencies:   mbed-rtos mbed

Committer:
ryood
Date:
Wed Jun 15 00:50:14 2016 +0000
Revision:
1:6ebe35be504e
Parent:
0:d78518594116
release???

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 1:6ebe35be504e 24 int16_t beatLen = 25;
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 1:6ebe35be504e 32 int16_t release_delta = 1000;
ryood 0:d78518594116 33 int16_t mod_value;
ryood 0:d78518594116 34
ryood 0:d78518594116 35 int16_t tick;
ryood 0:d78518594116 36
ryood 0:d78518594116 37 // DAC A Channelに出力
ryood 0:d78518594116 38 // parameter: v: 出力値(0 .. 4095)
ryood 0:d78518594116 39 void writeToDacA(int16_t v)
ryood 0:d78518594116 40 {
ryood 0:d78518594116 41 // Channel A
ryood 0:d78518594116 42 DacLdac = 1;
ryood 0:d78518594116 43 DacCs = 0;
ryood 0:d78518594116 44 SpiM.write((v >> 8) | 0x30); // 0x30: DAC_A(0) | Vref Unbuffered(0) | Vout 1x(1) | !SHDN(1)
ryood 0:d78518594116 45 SpiM.write(v & 0xff);
ryood 0:d78518594116 46 SPIM_WAIT;
ryood 0:d78518594116 47 DacCs = 1;
ryood 0:d78518594116 48 DacLdac = 0;
ryood 0:d78518594116 49 }
ryood 0:d78518594116 50
ryood 0:d78518594116 51 // DAC B ChannelにA ChannelのVrefを出力
ryood 0:d78518594116 52 void outVref()
ryood 0:d78518594116 53 {
ryood 0:d78518594116 54 // Channel B
ryood 0:d78518594116 55 DacLdac = 1;
ryood 0:d78518594116 56 DacCs = 0;
ryood 0:d78518594116 57 SpiM.write(0x08 | 0xB0); // 0xB0: DAC_B(1) | Vref Unbuffered(0) | Vout 1x(1) | !SHDN(1)
ryood 0:d78518594116 58 SpiM.write(0x00);
ryood 0:d78518594116 59 SPIM_WAIT;
ryood 0:d78518594116 60 DacCs = 1;
ryood 0:d78518594116 61 DacLdac = 0;
ryood 0:d78518594116 62 }
ryood 0:d78518594116 63
ryood 0:d78518594116 64 // ADSR波形を出力
ryood 0:d78518594116 65 void outADSR(void const* arg)
ryood 0:d78518594116 66 {
ryood 0:d78518594116 67 tick++;
ryood 0:d78518594116 68
ryood 0:d78518594116 69 if (tick > beatLen) {
ryood 0:d78518594116 70 tick = 0;
ryood 0:d78518594116 71 // モジュレーション波形を初期化する
ryood 0:d78518594116 72 mod_value = level;
ryood 0:d78518594116 73 decay_delta = (level - sustain) / decay;
ryood 0:d78518594116 74 }
ryood 0:d78518594116 75
ryood 0:d78518594116 76 // 出力値補正
ryood 0:d78518594116 77 if (mod_value < 0) {
ryood 0:d78518594116 78 mod_value = 0;
ryood 0:d78518594116 79 }
ryood 0:d78518594116 80 writeToDacA(mod_value);
ryood 0:d78518594116 81
ryood 0:d78518594116 82 if (tick < decay) {
ryood 0:d78518594116 83 mod_value -= decay_delta;
ryood 0:d78518594116 84 }
ryood 1:6ebe35be504e 85 /*
ryood 1:6ebe35be504e 86 if (tick >= duration) {
ryood 1:6ebe35be504e 87 mod_value -= release_delta;
ryood 1:6ebe35be504e 88 }
ryood 1:6ebe35be504e 89 */
ryood 0:d78518594116 90 if (tick == duration) {
ryood 0:d78518594116 91 mod_value = 0;
ryood 0:d78518594116 92 }
ryood 0:d78518594116 93 }
ryood 0:d78518594116 94
ryood 0:d78518594116 95 int main()
ryood 0:d78518594116 96 {
ryood 0:d78518594116 97 RtosTimer SpiM_timer(outADSR, osTimerPeriodic);
ryood 0:d78518594116 98
ryood 0:d78518594116 99 SpiM.format(8, 0);
ryood 0:d78518594116 100 SpiM.frequency(SPIM_RATE);
ryood 0:d78518594116 101
ryood 0:d78518594116 102 outVref();
ryood 0:d78518594116 103
ryood 0:d78518594116 104 SpiM_timer.start(SPIM_TIMER_PERIOD);
ryood 0:d78518594116 105
ryood 0:d78518594116 106 while(true) {
ryood 0:d78518594116 107 duration = DurationIn.read() * beatLen;
ryood 0:d78518594116 108 decay = DecayIn.read() * beatLen;
ryood 0:d78518594116 109 sustain = SustainIn.read() * 4095;
ryood 0:d78518594116 110
ryood 0:d78518594116 111 printf("%d\t%d\t%d\r\n", duration, decay, sustain);
ryood 0:d78518594116 112
ryood 0:d78518594116 113 Thread::wait(10);
ryood 0:d78518594116 114 }
ryood 0:d78518594116 115 }