Ryo Od / Mbed 2 deprecated KIK01_Proto06

Dependencies:   AverageMCP3008 VoltageMonitor mbed-rtos mbed mcp3008

Fork of KIK01_Proto05 by Ryo Od

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

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 }