summaryrefslogtreecommitdiff
path: root/sw/Core/Src/adc.h
diff options
context:
space:
mode:
authorStijn Kuipers <stijnkuipers@gmail.com>2023-06-29 16:26:07 +0200
committerStijn Kuipers <stijnkuipers@gmail.com>2023-06-29 16:26:07 +0200
commitfb5a321dd7c2848128b04b306f3e1e59c87a3f70 (patch)
treea8ef6273f9f331ebb1971a9baf20a8c897955612 /sw/Core/Src/adc.h
parentbae7568fd4dd0676b370be8548c7ec95d6521ba1 (diff)
downloadplinky-fb5a321dd7c2848128b04b306f3e1e59c87a3f70.tar.gz
Initial Filedump
Tadaaa!!
Diffstat (limited to 'sw/Core/Src/adc.h')
-rwxr-xr-xsw/Core/Src/adc.h91
1 files changed, 91 insertions, 0 deletions
diff --git a/sw/Core/Src/adc.h b/sw/Core/Src/adc.h
new file mode 100755
index 0000000..68ea07b
--- /dev/null
+++ b/sw/Core/Src/adc.h
@@ -0,0 +1,91 @@
+#pragma once
+
+#define ADC_CHANS 8
+#define ADC_SAMPLES 8
+extern u16 adcbuf[ADC_CHANS*ADC_SAMPLES];
+enum {
+ ADC_IN1, // fifth jack - pitch
+ ADC_IN2, // sixth jack - gate
+ ADC_IN3, //third jack -
+ ADC_IN4,// fourth jack
+ ADC_IN5, // top jack
+ ADC_IN6, // second jack
+ ADC_POT1,
+ ADC_POT2,
+
+ ADC_PITCH = ADC_IN1,
+ ADC_GATE = ADC_IN2,
+ ADC_XCV = ADC_IN3,
+ ADC_YCV = ADC_IN4,
+ ADC_ACV = ADC_IN5,
+ ADC_BCV = ADC_IN6,
+ ADC_AKNOB = ADC_POT2,
+ ADC_BKNOB = ADC_POT1,
+};
+void adc_init(void);
+
+typedef struct CVCalib {
+ float bias, scale;
+} CVCalib;
+
+#ifdef IMPL
+u16 adcbuf[ADC_CHANS*ADC_SAMPLES];
+CVCalib cvcalib[10] = {
+ // 6 input
+ {52100.f, 1.f / -9334.833333f},
+ {31716.f, 0.2f / -6548.1f},
+ {31665.f, 0.2f / -6548.1f},
+ {31666.f, 0.2f / -6548.1f},
+ {31041.f, 0.2f / -6548.1f},
+ {31712.f, 0.2f / -6548.1f},
+ // 2 pots
+ {32768.f, 1.05f / -32768.f},
+ {32768.f, 1.05f / -32768.f},
+ // 2 output
+ // 2048 per semitone, so...
+ {42490.f, (26620-42490) * (1.f / (2048.f * 12.f * 2.f))},
+ {42511.f, (26634-42511) * (1.f / (2048.f * 12.f * 2.f))},
+};
+
+static inline int GetADCSmoothedNoCalib(int chan) {
+ u32 rv = 0;
+ u16* src = adcbuf + chan;
+ if (chan == ADC_GATE) { // get max not average, to respond to short gates better
+ for (int i = 0; i < ADC_SAMPLES; ++i) {
+ rv = maxi(rv,*src);
+ src += ADC_CHANS;
+ }
+ return rv;
+ }
+ for (int i = 0; i < ADC_SAMPLES; ++i) {
+ rv += *src;
+ src += ADC_CHANS;
+ }
+ return rv / ADC_SAMPLES;
+}
+
+static inline float GetADCSmoothed(int chan) {
+ return (GetADCSmoothedNoCalib(chan) - cvcalib[chan].bias) * cvcalib[chan].scale;
+}
+
+//volatile u32 adccounter;
+//
+//void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc) {
+// adccounter++;
+//}
+
+void adc_init(void) {
+ for (int i = 0; i < ADC_CHANS * ADC_SAMPLES; ++i)
+ adcbuf[i] = 32768;
+#ifndef EMU
+ HAL_ADC_Start_DMA(&hadc1, (uint32_t*) &adcbuf, ADC_CHANS * ADC_SAMPLES);
+#endif
+}
+
+void adc_start(void) {
+#ifndef EMU
+ HAL_TIM_Base_Start(&htim6);
+#endif
+}
+
+#endif