From fb5a321dd7c2848128b04b306f3e1e59c87a3f70 Mon Sep 17 00:00:00 2001 From: Stijn Kuipers Date: Thu, 29 Jun 2023 16:26:07 +0200 Subject: Initial Filedump Tadaaa!! --- sw/Core/Src/adc.h | 91 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100755 sw/Core/Src/adc.h (limited to 'sw/Core/Src/adc.h') 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 -- cgit v1.2.3