KIK01 Proto 08

Dependencies:   AverageMCP3008 VoltageMonitor mbed-rtos mbed mcp3008

Fork of KIK01_Proto07 by Ryo Od

Committer:
ryood
Date:
Fri Dec 01 10:38:26 2017 +0000
Revision:
32:41cda5ad45e4
Parent:
31:3c7e1cd0d947
Child:
33:eac518ea0f34
Add Power Monitor

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