Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: AverageMCP3008 VoltageMonitor mbed-rtos mbed mcp3008
Fork of KIK01_Proto05 by
main.cpp
00001 /* 00002 * KIK01 00003 * Kick Machine 00004 * 00005 * 2017.11.29 Proto06: Add Power Monitor 00006 * 2017.10.19 Proto05: Add NOS01 Controller 00007 * 2017.09.16 Proto04: SPI1 for AD8402 Wein Bridge DCO & Internal DAC for Dual-OTA-VCA 00008 * 2017.07.04 Proto03: MCP4922 DCA 00009 * 2017.06.19 Proto02 00010 * 2017.06.04 created. 00011 * 00012 */ 00013 00014 #include "mbed.h" 00015 #include "rtos.h" 00016 #include "mcp3008.h" 00017 #include "AverageMCP3008.h" 00018 #include "EnvelopeAR.h" 00019 00020 #define UART_TRACE (1) 00021 #include "VoltageMonitor.h" 00022 00023 #define PIN_CHECK (1) 00024 #define TITLE_STR1 ("KIK01 Kick Machine") 00025 #define TITLE_STR2 ("20171129") 00026 00027 #define PI_F (3.1415926f) 00028 00029 #define MCP3008_SPI_SPEED (1312500) 00030 #define AD8402_SPI_SPEED (10000000) 00031 #define ENVELOPE_UPDATE_RATE (32000) // Hz 00032 00033 #define AD8402_RMAX (10000.0f) 00034 #define AD8402_RMIN (50.0f) 00035 00036 #define AVERAGE_BUFFER_SIZE (4) 00037 00038 #define PM_VDD (3.32f) 00039 #define PM_LoThreshold (2.375f) 00040 #define PM_HiThreshold (2.625f) 00041 00042 AnalogOut Dac1(PA_4); 00043 AnalogOut Dac2(PA_5); 00044 00045 // AD8402 SPI (SPI2) 00046 // SPI (PinName mosi, PinName miso, PinName sclk, PinName ssel=NC) 00047 SPI SpiMAD8402(PB_15, PB_14, PB_13); 00048 DigitalOut AD8402Cs(PC_4); 00049 00050 // MCP3008 SPI 00051 // SPI (PinName mosi, PinName miso, PinName sclk, PinName ssel=NC) 00052 SPI SpiMAdc(PB_5, PB_4, PB_3); 00053 MCP3008 Adc1(&SpiMAdc, PA_9); 00054 MCP3008 Adc2(&SpiMAdc, PA_8); 00055 MCP3008 Adc3(&SpiMAdc, PB_10); 00056 AverageMCP3008 AvgAdc1(&Adc1, AVERAGE_BUFFER_SIZE); 00057 AverageMCP3008 AvgAdc2(&Adc2, AVERAGE_BUFFER_SIZE); 00058 AverageMCP3008 AvgAdc3(&Adc3, AVERAGE_BUFFER_SIZE); 00059 00060 // Power Monitor 00061 AnalogIn PowerMonitorIn(PA_0); 00062 DigitalOut PowerMonitorLed(PA_15); 00063 VoltageMonitor PWMon(&PowerMonitorIn, PM_VDD, PM_LoThreshold, PM_HiThreshold, &PowerMonitorLed); 00064 00065 // Sync 00066 DigitalOut SyncPin(PA_10); 00067 00068 // Check pins 00069 DigitalOut Dout1(PB_9); 00070 DigitalOut Dout2(PB_8); 00071 DigitalOut Dout3(PB_6); 00072 00073 EnvelopeAR envelopeFrequency(5, 300, 880.0f, 120.0f, 40.0f, 0.36f, 0.1f); 00074 EnvelopeAR envelopeAmplitude(50, 200, 0.99f, 1.0f, 0.0f); 00075 EnvelopeAR envelopeNoiseAmplitude(50, 200, 0.99f, 1.0f, 0.0f); 00076 00077 EnvelopeParam frequencyParam; 00078 EnvelopeParam amplitudeParam; 00079 EnvelopeParam noiseAmplitudeParam; 00080 00081 volatile int ticks; 00082 volatile float frequency; 00083 volatile float amplitude; 00084 volatile float noiseAmplitude; 00085 00086 volatile float bpm; 00087 volatile int envelopeLength; 00088 volatile int stepLength; 00089 00090 void AD8402Write(uint8_t address, uint8_t value) 00091 { 00092 #if (PIN_CHECK) 00093 Dout2 = 1; 00094 #endif 00095 00096 AD8402Cs = 0; 00097 SpiMAD8402.write(address); 00098 SpiMAD8402.write(value); 00099 AD8402Cs = 1; 00100 wait_us(1); 00101 00102 #if (PIN_CHECK) 00103 Dout2 = 0; 00104 #endif 00105 } 00106 00107 void DcoSetFrequency(float freq) 00108 { 00109 const float c = 0.00000047; 00110 float r = 1.0f / (2.0f * PI_F * frequency * c); 00111 if (r < AD8402_RMIN) r = AD8402_RMIN; 00112 if (r > AD8402_RMAX) r = AD8402_RMAX; 00113 00114 uint8_t v = 256.0f * (r - AD8402_RMIN) / AD8402_RMAX; 00115 00116 AD8402Write(0, v); 00117 AD8402Write(1, v); 00118 } 00119 00120 void DcaSetAmplitude(int channel, float amp) 00121 { 00122 switch (channel) { 00123 case 1: 00124 Dac1.write(amp); 00125 break; 00126 case 2: 00127 Dac2.write(amp * 0.8f); // Avoid LED,s Non-Linearity 00128 break; 00129 default: 00130 error("DcaSetAmplitude(): invalid channel"); 00131 } 00132 } 00133 00134 void update() 00135 { 00136 #if (PIN_CHECK) 00137 Dout1 = 1; 00138 #endif 00139 00140 // Output Sync Signal per steps 00141 if (ticks % stepLength == 0) { 00142 SyncPin = 1; 00143 } 00144 00145 // set envelope parameters 00146 envelopeAmplitude.setParam(amplitudeParam); 00147 envelopeFrequency.setParam(frequencyParam); 00148 envelopeNoiseAmplitude.setParam(noiseAmplitudeParam); 00149 00150 frequency = envelopeFrequency.getAmplitude(ticks); 00151 amplitude = envelopeAmplitude.getAmplitude(ticks); 00152 noiseAmplitude = envelopeNoiseAmplitude.getAmplitude(ticks); 00153 00154 DcoSetFrequency(frequency); 00155 DcaSetAmplitude(1, amplitude); // DCO 00156 DcaSetAmplitude(2, noiseAmplitude); // NOS01 00157 00158 ticks++; 00159 if (ticks >= envelopeLength) { 00160 ticks = 0; 00161 } 00162 00163 // Output SyncSignal 00164 SyncPin = 0; 00165 00166 #if (PIN_CHECK) 00167 Dout1 = 0; 00168 #endif 00169 } 00170 00171 void readParams() 00172 { 00173 bpm = AvgAdc1.read_input(7) * 180.0f + 60.0f; 00174 envelopeLength = 60 * ENVELOPE_UPDATE_RATE / bpm; 00175 stepLength = envelopeLength / 4; 00176 00177 amplitudeParam.attack = AvgAdc1.read_input(0) * envelopeLength; 00178 amplitudeParam.release = AvgAdc1.read_input(1) * envelopeLength; 00179 amplitudeParam.v0 = AvgAdc1.read_input(4); 00180 amplitudeParam.v1 = AvgAdc1.read_input(5); 00181 amplitudeParam.v2 = AvgAdc1.read_input(6); 00182 amplitudeParam.attackTauRatio = AvgAdc1.read_input(2) + 0.01f; 00183 amplitudeParam.releaseTauRatio = AvgAdc1.read_input(3) + 0.01f; 00184 00185 frequencyParam.attack = AvgAdc2.read_input(0) * envelopeLength * 0.1f; 00186 frequencyParam.release = AvgAdc2.read_input(1) * envelopeLength + 1; 00187 frequencyParam.v0 = AvgAdc2.read_input(4) * 4000.0f; 00188 frequencyParam.v1 = AvgAdc2.read_input(5) * 400.0f; 00189 frequencyParam.v2 = AvgAdc2.read_input(6) * 400.0f; 00190 frequencyParam.attackTauRatio = AvgAdc2.read_input(2) + 0.01f; 00191 frequencyParam.releaseTauRatio = AvgAdc2.read_input(3) + 0.01f; 00192 00193 noiseAmplitudeParam.attack = AvgAdc3.read_input(0) * envelopeLength; 00194 noiseAmplitudeParam.release = AvgAdc3.read_input(1) * envelopeLength; 00195 noiseAmplitudeParam.v0 = AvgAdc3.read_input(4); 00196 noiseAmplitudeParam.v1 = AvgAdc3.read_input(5); 00197 noiseAmplitudeParam.v2 = AvgAdc3.read_input(6); 00198 noiseAmplitudeParam.attackTauRatio = AvgAdc3.read_input(2) + 0.01f; 00199 noiseAmplitudeParam.releaseTauRatio = AvgAdc3.read_input(3) + 0.01f; 00200 } 00201 00202 int main() 00203 { 00204 #if UART_TRACE 00205 printf("\r\n\n%s %s\r\n", TITLE_STR1, TITLE_STR2); 00206 #endif 00207 00208 SpiMAD8402.format(8, 0); 00209 SpiMAD8402.frequency(AD8402_SPI_SPEED); 00210 00211 SpiMAdc.format(8, 0); 00212 SpiMAdc.frequency(MCP3008_SPI_SPEED); 00213 00214 frequency = 100.0f; 00215 amplitude = 1.0f; 00216 noiseAmplitude = 1.0f; 00217 bpm = 120.0f; 00218 00219 readParams(); 00220 00221 ticks = 0; 00222 Ticker samplingTicker; 00223 samplingTicker.attach(&update, (1.0f/ENVELOPE_UPDATE_RATE)); 00224 00225 for (;;) { 00226 #if (PIN_CHECK) 00227 Dout3 = 1; 00228 #endif 00229 00230 readParams(); 00231 00232 #if (PIN_CHECK) 00233 Dout3 = 0; 00234 #endif 00235 00236 00237 #if UART_TRACE 00238 printf("%.1f\t%d\t", bpm, envelopeLength); 00239 00240 printf("| %d\t%d\t", amplitudeParam.attack, amplitudeParam.release); 00241 printf("%.2f\t%.2f\t%.2f\t", amplitudeParam.v0, amplitudeParam.v1, amplitudeParam.v2); 00242 printf("%.2f\t%.2f\t", amplitudeParam.attackTauRatio, amplitudeParam.releaseTauRatio); 00243 00244 printf("| %d\t%d\t", frequencyParam.attack, frequencyParam.release); 00245 printf("%.2f\t%.2f\t%.2f\t", frequencyParam.v0, frequencyParam.v1, frequencyParam.v2); 00246 printf("%.2f\t%.2f\t", frequencyParam.attackTauRatio, frequencyParam.releaseTauRatio); 00247 00248 printf("| %d\t%d\t", noiseAmplitudeParam.attack, noiseAmplitudeParam.release); 00249 printf("%.2f\t%.2f\t%.2f\t", noiseAmplitudeParam.v0, noiseAmplitudeParam.v1, noiseAmplitudeParam.v2); 00250 printf("%.2f\t%.2f\t", noiseAmplitudeParam.attackTauRatio, noiseAmplitudeParam.releaseTauRatio); 00251 #endif 00252 00253 PWMon.check(); 00254 00255 Thread::wait(1); 00256 } 00257 }
Generated on Tue Sep 27 2022 21:11:35 by
1.7.2
