1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
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
|