KIK01 Proto 08

Dependencies:   AverageMCP3008 VoltageMonitor mbed-rtos mbed mcp3008

Fork of KIK01_Proto07 by Ryo Od

Committer:
ryood
Date:
Sun Sep 17 19:11:41 2017 +0000
Revision:
22:a3bb7594f9bb
Parent:
21:a527f51381d6
Child:
23:da7c5f7feff1
Separate Envelope.h

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ryood 3:f89b400cfe57 1 /*
ryood 3:f89b400cfe57 2 * KIK01
ryood 3:f89b400cfe57 3 * Kick Machine
ryood 3:f89b400cfe57 4 *
ryood 17:a5d9908bd456 5 * 2017.09.16 Proto04: SPI1 for AD8402 Wein Bridge DCO & Internal DAC for Dual-OTA-VCA
ryood 15:8f674acdac03 6 * 2017.07.04 Proto03: MCP4922 DCA
ryood 13:43a43da257e3 7 * 2017.06.19 Proto02
ryood 3:f89b400cfe57 8 * 2017.06.04 created.
ryood 3:f89b400cfe57 9 *
ryood 3:f89b400cfe57 10 */
ryood 3:f89b400cfe57 11
ryood 0:2dcec10e9199 12 #include "mbed.h"
ryood 0:2dcec10e9199 13 #include "rtos.h"
ryood 13:43a43da257e3 14 #include "mcp3008.h"
ryood 22:a3bb7594f9bb 15 #include "EnvelopeAR.h"
ryood 0:2dcec10e9199 16
ryood 17:a5d9908bd456 17 #define UART_TRACE (1)
ryood 12:5b498285d121 18 #define PIN_CHECK (1)
ryood 0:2dcec10e9199 19 #define TITLE_STR1 ("KIK01 Kick Machine")
ryood 17:a5d9908bd456 20 #define TITLE_STR2 ("20170916")
ryood 0:2dcec10e9199 21
ryood 0:2dcec10e9199 22 #define PI_F (3.1415926f)
ryood 15:8f674acdac03 23
ryood 17:a5d9908bd456 24 #define MCP3008_SPI_SPEED (1000000)
ryood 21:a527f51381d6 25 #define AD8402_SPI_SPEED (10000000)
ryood 21:a527f51381d6 26 #define ENVELOPE_UPDATE_RATE (20000) // Hz
ryood 17:a5d9908bd456 27
ryood 20:70a05941db8c 28 #define AD8402_RMAX (10000.0f)
ryood 20:70a05941db8c 29 #define AD8402_RMIN (50.0f)
ryood 20:70a05941db8c 30
ryood 17:a5d9908bd456 31 AnalogOut Dac1(A2);
ryood 3:f89b400cfe57 32
ryood 18:1bf4abf6895b 33 // AD8402 SPI
ryood 21:a527f51381d6 34 SPI SpiMAD8402(SPI_MOSI, SPI_MISO, SPI_SCK);
ryood 18:1bf4abf6895b 35 DigitalOut AD8402Cs(D10);
ryood 15:8f674acdac03 36
ryood 18:1bf4abf6895b 37 // MCP3008 SPI
ryood 17:a5d9908bd456 38 SPI SpiM3(D4, D5, D3);
ryood 17:a5d9908bd456 39 MCP3008 Adc0(&SpiM3, D6);
ryood 17:a5d9908bd456 40 MCP3008 Adc1(&SpiM3, D7);
ryood 8:bb34a4894337 41
ryood 18:1bf4abf6895b 42 // Sync
ryood 18:1bf4abf6895b 43 DigitalOut SyncPin(D2);
ryood 18:1bf4abf6895b 44
ryood 14:8e96f97e261b 45 // Check pins
ryood 17:a5d9908bd456 46 DigitalOut Dout0(D8);
ryood 17:a5d9908bd456 47 DigitalOut Dout1(D9);
ryood 17:a5d9908bd456 48 DigitalOut Dout2(D14);
ryood 14:8e96f97e261b 49
ryood 9:d1e6eae9722b 50 EnvelopeAR envelopeFrequency(5, 300, 880.0f, 120.0f, 40.0f, 0.36f, 0.1f);
ryood 5:846772a77d33 51 EnvelopeAR envelopeAmplitude(50, 200, 0.99f, 1.0f, 0.0f);
ryood 5:846772a77d33 52
ryood 5:846772a77d33 53 volatile EnvelopeParam frequencyParam;
ryood 5:846772a77d33 54 volatile EnvelopeParam amplitudeParam;
ryood 0:2dcec10e9199 55
ryood 3:f89b400cfe57 56 volatile int ticks;
ryood 3:f89b400cfe57 57 volatile float frequency;
ryood 3:f89b400cfe57 58 volatile float amplitude;
ryood 3:f89b400cfe57 59
ryood 5:846772a77d33 60 volatile float bpm;
ryood 5:846772a77d33 61 volatile int envelopeLength;
ryood 14:8e96f97e261b 62 volatile int stepLength;
ryood 0:2dcec10e9199 63
ryood 17:a5d9908bd456 64 void AD8402Write(uint8_t address, uint8_t value)
ryood 17:a5d9908bd456 65 {
ryood 21:a527f51381d6 66 #if (PIN_CHECK)
ryood 21:a527f51381d6 67 Dout1 = 1;
ryood 21:a527f51381d6 68 #endif
ryood 21:a527f51381d6 69
ryood 18:1bf4abf6895b 70 AD8402Cs = 0;
ryood 21:a527f51381d6 71 SpiMAD8402.write(address);
ryood 21:a527f51381d6 72 SpiMAD8402.write(value);
ryood 18:1bf4abf6895b 73 AD8402Cs = 1;
ryood 17:a5d9908bd456 74 wait_us(1);
ryood 21:a527f51381d6 75
ryood 21:a527f51381d6 76 #if (PIN_CHECK)
ryood 21:a527f51381d6 77 Dout1 = 0;
ryood 21:a527f51381d6 78 #endif
ryood 17:a5d9908bd456 79 }
ryood 17:a5d9908bd456 80
ryood 17:a5d9908bd456 81 void DcoSetFrequency()
ryood 17:a5d9908bd456 82 {
ryood 17:a5d9908bd456 83 frequency = envelopeFrequency.getAmplitude(ticks);
ryood 20:70a05941db8c 84
ryood 17:a5d9908bd456 85 const float c = 0.00000047;
ryood 17:a5d9908bd456 86 float r = 1.0f / (2.0f * PI_F * frequency * c);
ryood 20:70a05941db8c 87 if (r < AD8402_RMIN) r = AD8402_RMIN;
ryood 20:70a05941db8c 88 if (r > AD8402_RMAX) r = AD8402_RMAX;
ryood 20:70a05941db8c 89
ryood 20:70a05941db8c 90 uint8_t v = 256.0f * (r - AD8402_RMIN) / AD8402_RMAX;
ryood 21:a527f51381d6 91
ryood 17:a5d9908bd456 92 AD8402Write(0, v);
ryood 17:a5d9908bd456 93 AD8402Write(1, v);
ryood 17:a5d9908bd456 94
ryood 17:a5d9908bd456 95 }
ryood 15:8f674acdac03 96
ryood 2:8dff77a1ee4d 97 void update()
ryood 2:8dff77a1ee4d 98 {
ryood 12:5b498285d121 99 #if (PIN_CHECK)
ryood 15:8f674acdac03 100 Dout0 = 1;
ryood 12:5b498285d121 101 #endif
ryood 15:8f674acdac03 102
ryood 14:8e96f97e261b 103 // Output Sync Signal per steps
ryood 17:a5d9908bd456 104 if (ticks % stepLength == 0) {
ryood 14:8e96f97e261b 105 SyncPin = 1;
ryood 14:8e96f97e261b 106 }
ryood 15:8f674acdac03 107
ryood 17:a5d9908bd456 108 // set envelope parameters
ryood 17:a5d9908bd456 109 envelopeAmplitude.setAttack(amplitudeParam.attack);
ryood 17:a5d9908bd456 110 envelopeAmplitude.setRelease(amplitudeParam.release);
ryood 17:a5d9908bd456 111 envelopeAmplitude.setV0(amplitudeParam.v0);
ryood 17:a5d9908bd456 112 envelopeAmplitude.setV1(amplitudeParam.v1);
ryood 17:a5d9908bd456 113 envelopeAmplitude.setV2(amplitudeParam.v2);
ryood 17:a5d9908bd456 114 envelopeAmplitude.setAttackTauRatio(amplitudeParam.attackTauRatio);
ryood 17:a5d9908bd456 115 envelopeAmplitude.setReleaseTauRatio(amplitudeParam.releaseTauRatio);
ryood 11:7e11404adca0 116
ryood 17:a5d9908bd456 117 envelopeFrequency.setAttack(frequencyParam.attack);
ryood 17:a5d9908bd456 118 envelopeFrequency.setRelease(frequencyParam.release);
ryood 17:a5d9908bd456 119 envelopeFrequency.setV0(frequencyParam.v0);
ryood 17:a5d9908bd456 120 envelopeFrequency.setV1(frequencyParam.v1);
ryood 17:a5d9908bd456 121 envelopeFrequency.setV2(frequencyParam.v2);
ryood 17:a5d9908bd456 122 envelopeFrequency.setAttackTauRatio(frequencyParam.attackTauRatio);
ryood 17:a5d9908bd456 123 envelopeFrequency.setReleaseTauRatio(frequencyParam.releaseTauRatio);
ryood 11:7e11404adca0 124
ryood 17:a5d9908bd456 125 DcoSetFrequency();
ryood 11:7e11404adca0 126
ryood 17:a5d9908bd456 127 ticks++;
ryood 17:a5d9908bd456 128 if (ticks >= envelopeLength) {
ryood 17:a5d9908bd456 129 ticks = 0;
ryood 2:8dff77a1ee4d 130 }
ryood 15:8f674acdac03 131
ryood 14:8e96f97e261b 132 // Output SyncSignal
ryood 14:8e96f97e261b 133 SyncPin = 0;
ryood 15:8f674acdac03 134
ryood 12:5b498285d121 135 #if (PIN_CHECK)
ryood 15:8f674acdac03 136 Dout0 = 0;
ryood 12:5b498285d121 137 #endif
ryood 2:8dff77a1ee4d 138 }
ryood 2:8dff77a1ee4d 139
ryood 5:846772a77d33 140 void setParams()
ryood 5:846772a77d33 141 {
ryood 13:43a43da257e3 142 bpm = Adc0.read_input(7) * 180.0f + 60.0f;
ryood 12:5b498285d121 143 envelopeLength = 60 * ENVELOPE_UPDATE_RATE / bpm;
ryood 14:8e96f97e261b 144 stepLength = envelopeLength / 4;
ryood 11:7e11404adca0 145
ryood 13:43a43da257e3 146 amplitudeParam.attack = Adc0.read_input(0) * envelopeLength;
ryood 13:43a43da257e3 147 amplitudeParam.release = Adc0.read_input(1) * envelopeLength;
ryood 13:43a43da257e3 148 amplitudeParam.v0 = Adc0.read_input(4);
ryood 14:8e96f97e261b 149 amplitudeParam.v1 = Adc0.read_input(5);
ryood 14:8e96f97e261b 150 amplitudeParam.v2 = Adc0.read_input(6);
ryood 5:846772a77d33 151 amplitudeParam.attackTauRatio = 0.36f;
ryood 13:43a43da257e3 152 amplitudeParam.releaseTauRatio = Adc0.read_input(3) + 0.01f;
ryood 11:7e11404adca0 153
ryood 13:43a43da257e3 154 frequencyParam.attack = Adc1.read_input(0) * envelopeLength * 0.1f;
ryood 13:43a43da257e3 155 frequencyParam.release = Adc1.read_input(1) * envelopeLength + 1;
ryood 13:43a43da257e3 156 frequencyParam.v0 = Adc1.read_input(4) * 4000.0f;
ryood 13:43a43da257e3 157 frequencyParam.v1 = Adc1.read_input(5) * 400.0f;
ryood 13:43a43da257e3 158 frequencyParam.v2 = Adc1.read_input(6) * 400.0f;
ryood 13:43a43da257e3 159 frequencyParam.attackTauRatio = Adc1.read_input(2) + 0.01f;
ryood 13:43a43da257e3 160 frequencyParam.releaseTauRatio = Adc1.read_input(3) + 0.01f;
ryood 5:846772a77d33 161 }
ryood 5:846772a77d33 162
ryood 0:2dcec10e9199 163 int main()
ryood 0:2dcec10e9199 164 {
ryood 0:2dcec10e9199 165 printf("%s %s\r\n", TITLE_STR1, TITLE_STR2);
ryood 15:8f674acdac03 166
ryood 21:a527f51381d6 167 SpiMAD8402.format(8, 0);
ryood 21:a527f51381d6 168 SpiMAD8402.frequency(AD8402_SPI_SPEED);
ryood 17:a5d9908bd456 169
ryood 17:a5d9908bd456 170 SpiM3.format(8, 0);
ryood 17:a5d9908bd456 171 SpiM3.frequency(MCP3008_SPI_SPEED);
ryood 15:8f674acdac03 172
ryood 17:a5d9908bd456 173 frequency = 100.0f;
ryood 0:2dcec10e9199 174 amplitude = 1.0f;
ryood 17:a5d9908bd456 175 bpm = 120.0f;
ryood 17:a5d9908bd456 176
ryood 17:a5d9908bd456 177 setParams();
ryood 11:7e11404adca0 178
ryood 3:f89b400cfe57 179 ticks = 0;
ryood 2:8dff77a1ee4d 180 Ticker samplingTicker;
ryood 17:a5d9908bd456 181 samplingTicker.attach(&update, (1.0f/ENVELOPE_UPDATE_RATE));
ryood 11:7e11404adca0 182
ryood 3:f89b400cfe57 183 for (;;) {
ryood 13:43a43da257e3 184 #if (PIN_CHECK)
ryood 13:43a43da257e3 185 Dout2 = 1;
ryood 15:8f674acdac03 186 #endif
ryood 5:846772a77d33 187 setParams();
ryood 13:43a43da257e3 188 #if (PIN_CHECK)
ryood 13:43a43da257e3 189 Dout2 = 0;
ryood 15:8f674acdac03 190 #endif
ryood 11:7e11404adca0 191
ryood 11:7e11404adca0 192 #if UART_TRACE
ryood 6:897d6392b408 193 printf("%.1f\t%d\t", bpm, envelopeLength);
ryood 11:7e11404adca0 194
ryood 6:897d6392b408 195 printf("%d\t%d\t", amplitudeParam.attack, amplitudeParam.release);
ryood 6:897d6392b408 196 printf("%.2f\t%.2f\t%.2f\t", amplitudeParam.v0, amplitudeParam.v1, amplitudeParam.v2);
ryood 6:897d6392b408 197 printf("%.2f\t%.2f\t", amplitudeParam.attackTauRatio, amplitudeParam.releaseTauRatio);
ryood 6:897d6392b408 198
ryood 6:897d6392b408 199 printf("%d\t%d\t", frequencyParam.attack, frequencyParam.release);
ryood 6:897d6392b408 200 printf("%.2f\t%.2f\t%.2f\t", frequencyParam.v0, frequencyParam.v1, frequencyParam.v2);
ryood 6:897d6392b408 201 printf("%.2f\t%.2f\r\n", frequencyParam.attackTauRatio, frequencyParam.releaseTauRatio);
ryood 11:7e11404adca0 202 #endif
ryood 11:7e11404adca0 203
ryood 13:43a43da257e3 204 Thread::wait(1);
ryood 3:f89b400cfe57 205 }
ryood 0:2dcec10e9199 206 }