diff --git a/src/main/esp32_eurorack_generic.c b/src/main/esp32_eurorack_generic.c index e201d78..ebc6e7e 100644 --- a/src/main/esp32_eurorack_generic.c +++ b/src/main/esp32_eurorack_generic.c @@ -4,8 +4,18 @@ #include "esp_log.h" #include "esp_adc/adc_cali.h" #include "esp_adc/adc_cali_scheme.h" +#include "esp_adc/adc_continuous.h" #include "hal/adc_types.h" +/* ADC input pins */ +#define ADC_INPUT_1_PIN 4 +#define ADC_INPUT_2_PIN 6 +#define ADC_INPUT_3_PIN 9 /* TODO Reroute from pin 46 to 9 on schematic, cant do ADC */ +#define ADC_INPUT_4_PIN 10 + +/* ADC channels */ +static adc_channel_t channel[4] = {ADC_CHANNEL_3, ADC_CHANNEL_5, ADC_CHANNEL_8, ADC_CHANNEL_9}; + static const char *TAG = "EERG"; @@ -21,10 +31,46 @@ static void adc_cali_init(void) .bitwidth = ADC_BITWIDTH_DEFAULT }; ESP_ERROR_CHECK(adc_cali_create_scheme_curve_fitting(&cali_config, &cali_handle)); - ESP_ERROR_CHECK(adc_cali_delete_scheme_curve_fitting(cali_handle)); +} + +/* Initializes internal 12bit ADC */ +static void adc_init(void) +{ + /* Initialize calibration driver */ + adc_cali_init(); + + ESP_LOGI(TAG, "Initializing ADC continuous mode driver"); + + /* Create continuous mode driver handle */ + adc_continuous_handle_t adc_handle = NULL; + adc_continuous_handle_cfg_t adc_handle_config = { + .max_store_buf_size = 1024, + .conv_frame_size = 100 + }; + ESP_ERROR_CHECK(adc_continuous_new_handle(&adc_handle_config, &adc_handle)); + + /* Configure continuous driver */ + adc_continuous_config_t adc_config = { + .sample_freq_hz = 20 * 1000, /* 20kHz TODO calculate proper sampling rate */ + .conv_mode = ADC_CONV_SINGLE_UNIT_1, + .format = ADC_DIGI_OUTPUT_FORMAT_TYPE2, + .pattern_num = 4 + }; + + /* Loop through channels for their configs */ + adc_digi_pattern_config_t adc_pattern[4] = {0}; + for (int i = 0; i < 4; i++){ + adc_pattern[i].atten = ADC_ATTEN_DB_0; + adc_pattern[i].channel = channel[i] & 0x7; + adc_pattern[i].unit = ADC_UNIT_1; + adc_pattern[i].bit_width = ADC_BITWIDTH_12; + } + adc_config.adc_pattern = adc_pattern; + ESP_ERROR_CHECK(adc_continuous_config(adc_handle, & adc_config)); } void app_main(void) { - adc_cali_init(); + /* Initialize internal ADC */ + adc_init(); }