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
Diff: main.cpp
- Revision:
- 17:a5d9908bd456
- Parent:
- 16:30cb822e072f
- Child:
- 18:1bf4abf6895b
diff -r 30cb822e072f -r a5d9908bd456 main.cpp
--- a/main.cpp Thu Jul 06 07:20:41 2017 +0000
+++ b/main.cpp Fri Sep 15 23:33:27 2017 +0000
@@ -2,6 +2,7 @@
* KIK01
* Kick Machine
*
+ * 2017.09.16 Proto04: SPI1 for AD8402 Wein Bridge DCO & Internal DAC for Dual-OTA-VCA
* 2017.07.04 Proto03: MCP4922 DCA
* 2017.06.19 Proto02
* 2017.06.04 created.
@@ -12,36 +13,34 @@
#include "rtos.h"
#include "mcp3008.h"
-#include "SpiAmpController.h"
-
-#define UART_TRACE (0)
+#define UART_TRACE (1)
#define PIN_CHECK (1)
#define TITLE_STR1 ("KIK01 Kick Machine")
-#define TITLE_STR2 ("20170704")
+#define TITLE_STR2 ("20170916")
#define PI_F (3.1415926f)
-#define SAMPLING_RATE (48000)
-#define SAMPLING_PERIOD (1.0f/SAMPLING_RATE)
-#define ENVELOPE_UPDATE_RATE SAMPLING_RATE
-#define AMP_VREF 0x0fff
+#define MCP3008_SPI_SPEED (1000000)
+#define AD8402_SPI_SPEED (4000000)
+#define ENVELOPE_UPDATE_RATE (1000) // Hz
+
+AnalogOut Dac1(A2);
-AnalogOut Dac1(PA_4);
-
+/*
SPI SpiM1(SPI_MOSI, SPI_MISO, SPI_SCK);
-MCP3008 Adc0(&SpiM1, D10);
-MCP3008 Adc1(&SpiM1, D9);
+*/
-SPI SpiM2(PB_15, PB_14, PB_13);
-SpiAmpController ampController(&SpiM2, PB_1, PC_4);
+SPI SpiM3(D4, D5, D3);
+MCP3008 Adc0(&SpiM3, D6);
+MCP3008 Adc1(&SpiM3, D7);
// Check pins
-DigitalOut Dout0(D2);
-DigitalOut Dout1(D3);
-DigitalOut Dout2(D4);
+DigitalOut Dout0(D8);
+DigitalOut Dout1(D9);
+DigitalOut Dout2(D14);
// Sync
-DigitalOut SyncPin(D7);
+DigitalOut SyncPin(D2);
class EnvelopeAR
{
@@ -166,16 +165,14 @@
volatile EnvelopeParam amplitudeParam;
volatile int ticks;
-volatile int envelopeTicks;
volatile float frequency;
-volatile float phi;
-volatile float phiDelta;
volatile float amplitude;
volatile float bpm;
volatile int envelopeLength;
volatile int stepLength;
+#if 0
//-----------------------------------------------------------------------------//
// Internal DCA
//
@@ -238,6 +235,40 @@
phi = PI_F / 2.0f;
}
}
+#endif
+
+void AD8402Write(uint8_t address, uint8_t value)
+{
+ wait_us(10);
+ /*
+ SpiCs = 0;
+ SpiM.write(address);
+ SpiM.write(value);
+ SpiCs = 1;
+ wait_us(1);
+ */
+}
+
+void DcoSetFrequency()
+{
+#if (PIN_CHECK)
+ Dout1 = 1;
+#endif
+
+ frequency = envelopeFrequency.getAmplitude(ticks);
+ const float c = 0.00000047;
+ float r = 1.0f / (2.0f * PI_F * frequency * c);
+ uint8_t v = 256.0f * (r - 50.0f) / 10000.0f;
+
+ //printf("%d\r\n", v);
+
+ AD8402Write(0, v);
+ AD8402Write(1, v);
+
+#if (PIN_CHECK)
+ Dout1 = 0;
+#endif
+}
void update()
{
@@ -246,40 +277,33 @@
#endif
// Output Sync Signal per steps
- if (envelopeTicks % stepLength == 0) {
+ if (ticks % stepLength == 0) {
SyncPin = 1;
}
- ticks++;
- if (ticks >= SAMPLING_RATE / ENVELOPE_UPDATE_RATE) {
-#if (PIN_CHECK)
- Dout1 = 1;
-#endif
- ticks = 0;
+ // set envelope parameters
+ envelopeAmplitude.setAttack(amplitudeParam.attack);
+ envelopeAmplitude.setRelease(amplitudeParam.release);
+ envelopeAmplitude.setV0(amplitudeParam.v0);
+ envelopeAmplitude.setV1(amplitudeParam.v1);
+ envelopeAmplitude.setV2(amplitudeParam.v2);
+ envelopeAmplitude.setAttackTauRatio(amplitudeParam.attackTauRatio);
+ envelopeAmplitude.setReleaseTauRatio(amplitudeParam.releaseTauRatio);
- // set envelope parameters
- envelopeAmplitude.setAttack(amplitudeParam.attack);
- envelopeAmplitude.setRelease(amplitudeParam.release);
- envelopeAmplitude.setV0(amplitudeParam.v0);
- envelopeAmplitude.setV1(amplitudeParam.v1);
- envelopeAmplitude.setV2(amplitudeParam.v2);
- envelopeAmplitude.setAttackTauRatio(amplitudeParam.attackTauRatio);
- envelopeAmplitude.setReleaseTauRatio(amplitudeParam.releaseTauRatio);
+ envelopeFrequency.setAttack(frequencyParam.attack);
+ envelopeFrequency.setRelease(frequencyParam.release);
+ envelopeFrequency.setV0(frequencyParam.v0);
+ envelopeFrequency.setV1(frequencyParam.v1);
+ envelopeFrequency.setV2(frequencyParam.v2);
+ envelopeFrequency.setAttackTauRatio(frequencyParam.attackTauRatio);
+ envelopeFrequency.setReleaseTauRatio(frequencyParam.releaseTauRatio);
- envelopeFrequency.setAttack(frequencyParam.attack);
- envelopeFrequency.setRelease(frequencyParam.release);
- envelopeFrequency.setV0(frequencyParam.v0);
- envelopeFrequency.setV1(frequencyParam.v1);
- envelopeFrequency.setV2(frequencyParam.v2);
- envelopeFrequency.setAttackTauRatio(frequencyParam.attackTauRatio);
- envelopeFrequency.setReleaseTauRatio(frequencyParam.releaseTauRatio);
+ DcoSetFrequency();
- generateEnvelope_DcaExternal();
-#if (PIN_CHECK)
- Dout1 = 0;
-#endif
+ ticks++;
+ if (ticks >= envelopeLength) {
+ ticks = 0;
}
- generateWave_DcaExternal();
// Output SyncSignal
SyncPin = 0;
@@ -316,24 +340,23 @@
{
printf("%s %s\r\n", TITLE_STR1, TITLE_STR2);
+ /*
SpiM1.format(0, 0);
SpiM1.frequency(2000000);
-
- SpiM2.format(0, 0);
- SpiM2.frequency(20000000);
+ */
+
+ SpiM3.format(8, 0);
+ SpiM3.frequency(MCP3008_SPI_SPEED);
- frequency = 1000.0f;
- phiDelta = 2.0f * frequency / SAMPLING_RATE;
+ frequency = 100.0f;
amplitude = 1.0f;
+ bpm = 120.0f;
+
+ setParams();
ticks = 0;
- envelopeTicks = 0;
-
- bpm = 120.0f;
- setParams();
-
Ticker samplingTicker;
- samplingTicker.attach(&update, SAMPLING_PERIOD);
+ samplingTicker.attach(&update, (1.0f/ENVELOPE_UPDATE_RATE));
for (;;) {
#if (PIN_CHECK)
