Sync In

Dependencies:   AverageMCP3008 VoltageMonitor mbed-rtos mbed mcp3008

Fork of KIK01_Proto06 by Ryo Od

Committer:
ryood
Date:
Mon Dec 11 12:19:26 2017 +0000
Revision:
34:0ef840ff8f74
Parent:
33:eac518ea0f34
Clean Up

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 33:eac518ea0f34 5 * 2017.12.03 Proto07: SyncIn
ryood 32:41cda5ad45e4 6 * 2017.11.29 Proto06: Add Power Monitor
ryood 27:b07a55935230 7 * 2017.10.19 Proto05: Add NOS01 Controller
ryood 17:a5d9908bd456 8 * 2017.09.16 Proto04: SPI1 for AD8402 Wein Bridge DCO & Internal DAC for Dual-OTA-VCA
ryood 15:8f674acdac03 9 * 2017.07.04 Proto03: MCP4922 DCA
ryood 13:43a43da257e3 10 * 2017.06.19 Proto02
ryood 3:f89b400cfe57 11 * 2017.06.04 created.
ryood 3:f89b400cfe57 12 *
ryood 3:f89b400cfe57 13 */
ryood 3:f89b400cfe57 14
ryood 0:2dcec10e9199 15 #include "mbed.h"
ryood 0:2dcec10e9199 16 #include "rtos.h"
ryood 13:43a43da257e3 17 #include "mcp3008.h"
ryood 28:387c5a6d5206 18 #include "AverageMCP3008.h"
ryood 22:a3bb7594f9bb 19 #include "EnvelopeAR.h"
ryood 0:2dcec10e9199 20
ryood 17:a5d9908bd456 21 #define UART_TRACE (1)
ryood 32:41cda5ad45e4 22 #include "VoltageMonitor.h"
ryood 32:41cda5ad45e4 23
ryood 12:5b498285d121 24 #define PIN_CHECK (1)
ryood 0:2dcec10e9199 25 #define TITLE_STR1 ("KIK01 Kick Machine")
ryood 33:eac518ea0f34 26 #define TITLE_STR2 ("20171211")
ryood 0:2dcec10e9199 27
ryood 0:2dcec10e9199 28 #define PI_F (3.1415926f)
ryood 15:8f674acdac03 29
ryood 29:947992b9904f 30 #define MCP3008_SPI_SPEED (1312500)
ryood 21:a527f51381d6 31 #define AD8402_SPI_SPEED (10000000)
ryood 31:3c7e1cd0d947 32 #define ENVELOPE_UPDATE_RATE (32000) // Hz
ryood 17:a5d9908bd456 33
ryood 20:70a05941db8c 34 #define AD8402_RMAX (10000.0f)
ryood 20:70a05941db8c 35 #define AD8402_RMIN (50.0f)
ryood 20:70a05941db8c 36
ryood 31:3c7e1cd0d947 37 #define AVERAGE_BUFFER_SIZE (4)
ryood 31:3c7e1cd0d947 38
ryood 32:41cda5ad45e4 39 #define PM_VDD (3.32f)
ryood 32:41cda5ad45e4 40 #define PM_LoThreshold (2.375f)
ryood 32:41cda5ad45e4 41 #define PM_HiThreshold (2.625f)
ryood 32:41cda5ad45e4 42
ryood 26:866d672ba446 43 AnalogOut Dac1(PA_4);
ryood 27:b07a55935230 44 AnalogOut Dac2(PA_5);
ryood 3:f89b400cfe57 45
ryood 26:866d672ba446 46 // AD8402 SPI (SPI2)
ryood 26:866d672ba446 47 // SPI (PinName mosi, PinName miso, PinName sclk, PinName ssel=NC)
ryood 26:866d672ba446 48 SPI SpiMAD8402(PB_15, PB_14, PB_13);
ryood 26:866d672ba446 49 DigitalOut AD8402Cs(PC_4);
ryood 15:8f674acdac03 50
ryood 18:1bf4abf6895b 51 // MCP3008 SPI
ryood 26:866d672ba446 52 // SPI (PinName mosi, PinName miso, PinName sclk, PinName ssel=NC)
ryood 26:866d672ba446 53 SPI SpiMAdc(PB_5, PB_4, PB_3);
ryood 32:41cda5ad45e4 54 MCP3008 Adc1(&SpiMAdc, PA_9);
ryood 26:866d672ba446 55 MCP3008 Adc2(&SpiMAdc, PA_8);
ryood 32:41cda5ad45e4 56 MCP3008 Adc3(&SpiMAdc, PB_10);
ryood 31:3c7e1cd0d947 57 AverageMCP3008 AvgAdc1(&Adc1, AVERAGE_BUFFER_SIZE);
ryood 31:3c7e1cd0d947 58 AverageMCP3008 AvgAdc2(&Adc2, AVERAGE_BUFFER_SIZE);
ryood 32:41cda5ad45e4 59 AverageMCP3008 AvgAdc3(&Adc3, AVERAGE_BUFFER_SIZE);
ryood 32:41cda5ad45e4 60
ryood 32:41cda5ad45e4 61 // Power Monitor
ryood 32:41cda5ad45e4 62 AnalogIn PowerMonitorIn(PA_0);
ryood 32:41cda5ad45e4 63 DigitalOut PowerMonitorLed(PA_15);
ryood 34:0ef840ff8f74 64 VoltageMonitor PWMon(&PowerMonitorIn, PM_VDD, PM_LoThreshold, PM_HiThreshold, &PowerMonitorLed);
ryood 34:0ef840ff8f74 65 //VoltageMonitor PWMon(&PowerMonitorIn, PM_VDD, PM_LoThreshold, PM_HiThreshold, NULL);
ryood 8:bb34a4894337 66
ryood 18:1bf4abf6895b 67 // Sync
ryood 33:eac518ea0f34 68 DigitalOut SyncOut(PC_10);
ryood 33:eac518ea0f34 69 InterruptIn SyncIn(PC_11);
ryood 18:1bf4abf6895b 70
ryood 14:8e96f97e261b 71 // Check pins
ryood 26:866d672ba446 72 DigitalOut Dout1(PB_9);
ryood 26:866d672ba446 73 DigitalOut Dout2(PB_8);
ryood 27:b07a55935230 74 DigitalOut Dout3(PB_6);
ryood 14:8e96f97e261b 75
ryood 9:d1e6eae9722b 76 EnvelopeAR envelopeFrequency(5, 300, 880.0f, 120.0f, 40.0f, 0.36f, 0.1f);
ryood 5:846772a77d33 77 EnvelopeAR envelopeAmplitude(50, 200, 0.99f, 1.0f, 0.0f);
ryood 29:947992b9904f 78 EnvelopeAR envelopeNoiseAmplitude(50, 200, 0.99f, 1.0f, 0.0f);
ryood 5:846772a77d33 79
ryood 25:b4977c7e0db7 80 EnvelopeParam frequencyParam;
ryood 25:b4977c7e0db7 81 EnvelopeParam amplitudeParam;
ryood 29:947992b9904f 82 EnvelopeParam noiseAmplitudeParam;
ryood 0:2dcec10e9199 83
ryood 3:f89b400cfe57 84 volatile int ticks;
ryood 3:f89b400cfe57 85 volatile float frequency;
ryood 3:f89b400cfe57 86 volatile float amplitude;
ryood 29:947992b9904f 87 volatile float noiseAmplitude;
ryood 3:f89b400cfe57 88
ryood 5:846772a77d33 89 volatile float bpm;
ryood 5:846772a77d33 90 volatile int envelopeLength;
ryood 14:8e96f97e261b 91 volatile int stepLength;
ryood 0:2dcec10e9199 92
ryood 17:a5d9908bd456 93 void AD8402Write(uint8_t address, uint8_t value)
ryood 17:a5d9908bd456 94 {
ryood 21:a527f51381d6 95 #if (PIN_CHECK)
ryood 26:866d672ba446 96 Dout2 = 1;
ryood 21:a527f51381d6 97 #endif
ryood 21:a527f51381d6 98
ryood 18:1bf4abf6895b 99 AD8402Cs = 0;
ryood 21:a527f51381d6 100 SpiMAD8402.write(address);
ryood 21:a527f51381d6 101 SpiMAD8402.write(value);
ryood 18:1bf4abf6895b 102 AD8402Cs = 1;
ryood 17:a5d9908bd456 103 wait_us(1);
ryood 21:a527f51381d6 104
ryood 21:a527f51381d6 105 #if (PIN_CHECK)
ryood 26:866d672ba446 106 Dout2 = 0;
ryood 21:a527f51381d6 107 #endif
ryood 17:a5d9908bd456 108 }
ryood 17:a5d9908bd456 109
ryood 23:da7c5f7feff1 110 void DcoSetFrequency(float freq)
ryood 17:a5d9908bd456 111 {
ryood 17:a5d9908bd456 112 const float c = 0.00000047;
ryood 17:a5d9908bd456 113 float r = 1.0f / (2.0f * PI_F * frequency * c);
ryood 20:70a05941db8c 114 if (r < AD8402_RMIN) r = AD8402_RMIN;
ryood 20:70a05941db8c 115 if (r > AD8402_RMAX) r = AD8402_RMAX;
ryood 20:70a05941db8c 116
ryood 20:70a05941db8c 117 uint8_t v = 256.0f * (r - AD8402_RMIN) / AD8402_RMAX;
ryood 21:a527f51381d6 118
ryood 17:a5d9908bd456 119 AD8402Write(0, v);
ryood 17:a5d9908bd456 120 AD8402Write(1, v);
ryood 23:da7c5f7feff1 121 }
ryood 17:a5d9908bd456 122
ryood 27:b07a55935230 123 void DcaSetAmplitude(int channel, float amp)
ryood 23:da7c5f7feff1 124 {
ryood 27:b07a55935230 125 switch (channel) {
ryood 27:b07a55935230 126 case 1:
ryood 27:b07a55935230 127 Dac1.write(amp);
ryood 27:b07a55935230 128 break;
ryood 27:b07a55935230 129 case 2:
ryood 33:eac518ea0f34 130 //Dac2.write(amp);
ryood 27:b07a55935230 131 Dac2.write(amp * 0.8f); // Avoid LED,s Non-Linearity
ryood 27:b07a55935230 132 break;
ryood 27:b07a55935230 133 default:
ryood 27:b07a55935230 134 error("DcaSetAmplitude(): invalid channel");
ryood 27:b07a55935230 135 }
ryood 17:a5d9908bd456 136 }
ryood 15:8f674acdac03 137
ryood 2:8dff77a1ee4d 138 void update()
ryood 2:8dff77a1ee4d 139 {
ryood 12:5b498285d121 140 #if (PIN_CHECK)
ryood 26:866d672ba446 141 Dout1 = 1;
ryood 12:5b498285d121 142 #endif
ryood 15:8f674acdac03 143
ryood 14:8e96f97e261b 144 // Output Sync Signal per steps
ryood 17:a5d9908bd456 145 if (ticks % stepLength == 0) {
ryood 33:eac518ea0f34 146 SyncOut = 1;
ryood 14:8e96f97e261b 147 }
ryood 15:8f674acdac03 148
ryood 17:a5d9908bd456 149 // set envelope parameters
ryood 25:b4977c7e0db7 150 envelopeAmplitude.setParam(amplitudeParam);
ryood 25:b4977c7e0db7 151 envelopeFrequency.setParam(frequencyParam);
ryood 30:1291e20b1c53 152 envelopeNoiseAmplitude.setParam(noiseAmplitudeParam);
ryood 11:7e11404adca0 153
ryood 23:da7c5f7feff1 154 frequency = envelopeFrequency.getAmplitude(ticks);
ryood 30:1291e20b1c53 155 amplitude = envelopeAmplitude.getAmplitude(ticks);
ryood 30:1291e20b1c53 156 noiseAmplitude = envelopeNoiseAmplitude.getAmplitude(ticks);
ryood 23:da7c5f7feff1 157
ryood 23:da7c5f7feff1 158 DcoSetFrequency(frequency);
ryood 27:b07a55935230 159 DcaSetAmplitude(1, amplitude); // DCO
ryood 30:1291e20b1c53 160 DcaSetAmplitude(2, noiseAmplitude); // NOS01
ryood 11:7e11404adca0 161
ryood 17:a5d9908bd456 162 ticks++;
ryood 17:a5d9908bd456 163 if (ticks >= envelopeLength) {
ryood 17:a5d9908bd456 164 ticks = 0;
ryood 2:8dff77a1ee4d 165 }
ryood 15:8f674acdac03 166
ryood 14:8e96f97e261b 167 // Output SyncSignal
ryood 33:eac518ea0f34 168 SyncOut = 0;
ryood 15:8f674acdac03 169
ryood 12:5b498285d121 170 #if (PIN_CHECK)
ryood 26:866d672ba446 171 Dout1 = 0;
ryood 12:5b498285d121 172 #endif
ryood 2:8dff77a1ee4d 173 }
ryood 2:8dff77a1ee4d 174
ryood 25:b4977c7e0db7 175 void readParams()
ryood 5:846772a77d33 176 {
ryood 28:387c5a6d5206 177 bpm = AvgAdc1.read_input(7) * 180.0f + 60.0f;
ryood 12:5b498285d121 178 envelopeLength = 60 * ENVELOPE_UPDATE_RATE / bpm;
ryood 14:8e96f97e261b 179 stepLength = envelopeLength / 4;
ryood 11:7e11404adca0 180
ryood 28:387c5a6d5206 181 amplitudeParam.attack = AvgAdc1.read_input(0) * envelopeLength;
ryood 28:387c5a6d5206 182 amplitudeParam.release = AvgAdc1.read_input(1) * envelopeLength;
ryood 28:387c5a6d5206 183 amplitudeParam.v0 = AvgAdc1.read_input(4);
ryood 28:387c5a6d5206 184 amplitudeParam.v1 = AvgAdc1.read_input(5);
ryood 28:387c5a6d5206 185 amplitudeParam.v2 = AvgAdc1.read_input(6);
ryood 28:387c5a6d5206 186 amplitudeParam.attackTauRatio = AvgAdc1.read_input(2) + 0.01f;
ryood 28:387c5a6d5206 187 amplitudeParam.releaseTauRatio = AvgAdc1.read_input(3) + 0.01f;
ryood 11:7e11404adca0 188
ryood 28:387c5a6d5206 189 frequencyParam.attack = AvgAdc2.read_input(0) * envelopeLength * 0.1f;
ryood 28:387c5a6d5206 190 frequencyParam.release = AvgAdc2.read_input(1) * envelopeLength + 1;
ryood 28:387c5a6d5206 191 frequencyParam.v0 = AvgAdc2.read_input(4) * 4000.0f;
ryood 28:387c5a6d5206 192 frequencyParam.v1 = AvgAdc2.read_input(5) * 400.0f;
ryood 28:387c5a6d5206 193 frequencyParam.v2 = AvgAdc2.read_input(6) * 400.0f;
ryood 28:387c5a6d5206 194 frequencyParam.attackTauRatio = AvgAdc2.read_input(2) + 0.01f;
ryood 28:387c5a6d5206 195 frequencyParam.releaseTauRatio = AvgAdc2.read_input(3) + 0.01f;
ryood 29:947992b9904f 196
ryood 29:947992b9904f 197 noiseAmplitudeParam.attack = AvgAdc3.read_input(0) * envelopeLength;
ryood 29:947992b9904f 198 noiseAmplitudeParam.release = AvgAdc3.read_input(1) * envelopeLength;
ryood 29:947992b9904f 199 noiseAmplitudeParam.v0 = AvgAdc3.read_input(4);
ryood 29:947992b9904f 200 noiseAmplitudeParam.v1 = AvgAdc3.read_input(5);
ryood 29:947992b9904f 201 noiseAmplitudeParam.v2 = AvgAdc3.read_input(6);
ryood 29:947992b9904f 202 noiseAmplitudeParam.attackTauRatio = AvgAdc3.read_input(2) + 0.01f;
ryood 29:947992b9904f 203 noiseAmplitudeParam.releaseTauRatio = AvgAdc3.read_input(3) + 0.01f;
ryood 5:846772a77d33 204 }
ryood 5:846772a77d33 205
ryood 33:eac518ea0f34 206 void syncFunction()
ryood 33:eac518ea0f34 207 {
ryood 33:eac518ea0f34 208 ticks = 0;
ryood 34:0ef840ff8f74 209 //PowerMonitorLed = !PowerMonitorLed;
ryood 33:eac518ea0f34 210 }
ryood 33:eac518ea0f34 211
ryood 0:2dcec10e9199 212 int main()
ryood 0:2dcec10e9199 213 {
ryood 27:b07a55935230 214 #if UART_TRACE
ryood 27:b07a55935230 215 printf("\r\n\n%s %s\r\n", TITLE_STR1, TITLE_STR2);
ryood 27:b07a55935230 216 #endif
ryood 15:8f674acdac03 217
ryood 21:a527f51381d6 218 SpiMAD8402.format(8, 0);
ryood 21:a527f51381d6 219 SpiMAD8402.frequency(AD8402_SPI_SPEED);
ryood 17:a5d9908bd456 220
ryood 26:866d672ba446 221 SpiMAdc.format(8, 0);
ryood 26:866d672ba446 222 SpiMAdc.frequency(MCP3008_SPI_SPEED);
ryood 15:8f674acdac03 223
ryood 17:a5d9908bd456 224 frequency = 100.0f;
ryood 0:2dcec10e9199 225 amplitude = 1.0f;
ryood 29:947992b9904f 226 noiseAmplitude = 1.0f;
ryood 17:a5d9908bd456 227 bpm = 120.0f;
ryood 17:a5d9908bd456 228
ryood 25:b4977c7e0db7 229 readParams();
ryood 11:7e11404adca0 230
ryood 3:f89b400cfe57 231 ticks = 0;
ryood 2:8dff77a1ee4d 232 Ticker samplingTicker;
ryood 17:a5d9908bd456 233 samplingTicker.attach(&update, (1.0f/ENVELOPE_UPDATE_RATE));
ryood 33:eac518ea0f34 234
ryood 33:eac518ea0f34 235 // Sync Interrupt
ryood 33:eac518ea0f34 236 SyncIn.rise(&syncFunction);
ryood 11:7e11404adca0 237
ryood 3:f89b400cfe57 238 for (;;) {
ryood 13:43a43da257e3 239 #if (PIN_CHECK)
ryood 26:866d672ba446 240 Dout3 = 1;
ryood 15:8f674acdac03 241 #endif
ryood 25:b4977c7e0db7 242
ryood 25:b4977c7e0db7 243 readParams();
ryood 25:b4977c7e0db7 244
ryood 13:43a43da257e3 245 #if (PIN_CHECK)
ryood 26:866d672ba446 246 Dout3 = 0;
ryood 15:8f674acdac03 247 #endif
ryood 11:7e11404adca0 248
ryood 32:41cda5ad45e4 249
ryood 11:7e11404adca0 250 #if UART_TRACE
ryood 6:897d6392b408 251 printf("%.1f\t%d\t", bpm, envelopeLength);
ryood 11:7e11404adca0 252
ryood 31:3c7e1cd0d947 253 printf("| %d\t%d\t", amplitudeParam.attack, amplitudeParam.release);
ryood 6:897d6392b408 254 printf("%.2f\t%.2f\t%.2f\t", amplitudeParam.v0, amplitudeParam.v1, amplitudeParam.v2);
ryood 6:897d6392b408 255 printf("%.2f\t%.2f\t", amplitudeParam.attackTauRatio, amplitudeParam.releaseTauRatio);
ryood 6:897d6392b408 256
ryood 31:3c7e1cd0d947 257 printf("| %d\t%d\t", frequencyParam.attack, frequencyParam.release);
ryood 6:897d6392b408 258 printf("%.2f\t%.2f\t%.2f\t", frequencyParam.v0, frequencyParam.v1, frequencyParam.v2);
ryood 29:947992b9904f 259 printf("%.2f\t%.2f\t", frequencyParam.attackTauRatio, frequencyParam.releaseTauRatio);
ryood 29:947992b9904f 260
ryood 31:3c7e1cd0d947 261 printf("| %d\t%d\t", noiseAmplitudeParam.attack, noiseAmplitudeParam.release);
ryood 29:947992b9904f 262 printf("%.2f\t%.2f\t%.2f\t", noiseAmplitudeParam.v0, noiseAmplitudeParam.v1, noiseAmplitudeParam.v2);
ryood 32:41cda5ad45e4 263 printf("%.2f\t%.2f\t", noiseAmplitudeParam.attackTauRatio, noiseAmplitudeParam.releaseTauRatio);
ryood 11:7e11404adca0 264 #endif
ryood 11:7e11404adca0 265
ryood 32:41cda5ad45e4 266 PWMon.check();
ryood 32:41cda5ad45e4 267
ryood 13:43a43da257e3 268 Thread::wait(1);
ryood 3:f89b400cfe57 269 }
ryood 0:2dcec10e9199 270 }