From d075f1e538310c71f11a4fd560dbb54754436725 Mon Sep 17 00:00:00 2001 From: rkcf Date: Fri, 27 Jan 2023 18:25:48 -0600 Subject: [PATCH] change cv outputs to use timers instead of delay --- main/esp32-sequencer.c | 63 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 55 insertions(+), 8 deletions(-) diff --git a/main/esp32-sequencer.c b/main/esp32-sequencer.c index cd3c3ef..e6c10c7 100644 --- a/main/esp32-sequencer.c +++ b/main/esp32-sequencer.c @@ -23,6 +23,9 @@ #define GPIO_CLK_OUT (7) // Clock Out #define GPIO_GATE_OUT (8) // Gate CV Out +gptimer_handle_t clk_cv_timer = NULL; +gptimer_handle_t gate_cv_timer = NULL; + /* LED GPIO Pins */ #define LEDC_CLK_OUT (5) #define LEDC_GATE_OUT (6) @@ -30,6 +33,17 @@ gptimer_handle_t clk_blink_timer = NULL; gptimer_handle_t gate_blink_timer = NULL; + +static void clk_cv_off_alarm_cb(gptimer_handle_t timer, const gptimer_alarm_event_data_t *edata, void *user_data) { + gptimer_stop(clk_cv_timer); + gpio_set_level(GPIO_CLK_OUT, 0); +} + +static void gate_cv_off_alarm_cb(gptimer_handle_t timer, const gptimer_alarm_event_data_t *edata, void *user_data) { + gptimer_stop(gate_cv_timer); + gpio_set_level(GPIO_GATE_OUT, 0); +} + static void gpio_init(void) { // Setup Clock CV Output gpio_reset_pin(GPIO_CLK_OUT); @@ -37,15 +51,45 @@ static void gpio_init(void) { // Setup Gate CV Output gpio_reset_pin(GPIO_GATE_OUT); gpio_set_direction(GPIO_GATE_OUT, GPIO_MODE_OUTPUT); + + // Setup CV output timer + gptimer_config_t cv_out_timer_config = { + .clk_src = GPTIMER_CLK_SRC_DEFAULT, + .direction = GPTIMER_COUNT_UP, + .resolution_hz = 1 * 1000 * 1000 // 1MHz; 1 tick = 1 µs + }; + ESP_ERROR_CHECK(gptimer_new_timer(&cv_out_timer_config, &clk_cv_timer)); + ESP_ERROR_CHECK(gptimer_new_timer(&cv_out_timer_config, &gate_cv_timer)); + + // Configure timer alarm + gptimer_alarm_config_t cv_off_alarm_config = { + .alarm_count = 10 * 1000, // 10ms @ 1MHz + .reload_count = 0, + .flags.auto_reload_on_alarm = true + }; + ESP_ERROR_CHECK(gptimer_set_alarm_action(clk_cv_timer, &cv_off_alarm_config)); + ESP_ERROR_CHECK(gptimer_set_alarm_action(gate_cv_timer, &cv_off_alarm_config)); + + //register clk callback + gptimer_event_callbacks_t clk_cbs = {.on_alarm = clk_cv_off_alarm_cb}; + ESP_ERROR_CHECK( + gptimer_register_event_callbacks(clk_cv_timer, &clk_cbs, NULL)); + ESP_ERROR_CHECK(gptimer_enable(clk_cv_timer)); + + // register gate callback + gptimer_event_callbacks_t gate_cbs = {.on_alarm = gate_cv_off_alarm_cb}; + ESP_ERROR_CHECK( + gptimer_register_event_callbacks(gate_cv_timer, &gate_cbs, NULL)); + ESP_ERROR_CHECK(gptimer_enable(gate_cv_timer)); } -static void gate_off_alarm_cb(gptimer_handle_t timer, const gptimer_alarm_event_data_t *edata, void *user_data) { +static void gate_led_off_alarm_cb(gptimer_handle_t timer, const gptimer_alarm_event_data_t *edata, void *user_data) { gptimer_stop(gate_blink_timer); ESP_ERROR_CHECK(ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_1, 0)); ESP_ERROR_CHECK(ledc_update_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_1)); } -static void clk_off_alarm_cb(gptimer_handle_t timer, const gptimer_alarm_event_data_t *edata, void *user_data) { +static void clk_led_off_alarm_cb(gptimer_handle_t timer, const gptimer_alarm_event_data_t *edata, void *user_data) { gptimer_stop(clk_blink_timer); ESP_ERROR_CHECK(ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0, 0)); ESP_ERROR_CHECK(ledc_update_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0)); @@ -97,7 +141,7 @@ static void ledc_init(void) { // Configure timer alarm gptimer_alarm_config_t led_off_alarm_config = { - .alarm_count = 100 * 1000, // 50ms @ 1MHz + .alarm_count = 50 * 1000, // 50ms @ 1MHz .reload_count = 0, .flags.auto_reload_on_alarm = true }; @@ -105,20 +149,20 @@ static void ledc_init(void) { ESP_ERROR_CHECK(gptimer_set_alarm_action(gate_blink_timer, &led_off_alarm_config)); //register clk callback - gptimer_event_callbacks_t clk_cbs = {.on_alarm = clk_off_alarm_cb}; + gptimer_event_callbacks_t clk_cbs = {.on_alarm = clk_led_off_alarm_cb}; ESP_ERROR_CHECK( gptimer_register_event_callbacks(clk_blink_timer, &clk_cbs, NULL)); ESP_ERROR_CHECK(gptimer_enable(clk_blink_timer)); // register gate callback - gptimer_event_callbacks_t gate_cbs = {.on_alarm = gate_off_alarm_cb}; + gptimer_event_callbacks_t gate_cbs = {.on_alarm = gate_led_off_alarm_cb}; ESP_ERROR_CHECK( gptimer_register_event_callbacks(gate_blink_timer, &gate_cbs, NULL)); ESP_ERROR_CHECK(gptimer_enable(gate_blink_timer)); } static void blink_led(ledc_channel_t channel) { - ESP_ERROR_CHECK(ledc_set_duty(LEDC_LOW_SPEED_MODE, channel, 9000)); + ESP_ERROR_CHECK(ledc_set_duty(LEDC_LOW_SPEED_MODE, channel, 4095)); ESP_ERROR_CHECK(ledc_update_duty(LEDC_LOW_SPEED_MODE, channel)); if (channel == LEDC_CHANNEL_0) { @@ -130,8 +174,11 @@ static void blink_led(ledc_channel_t channel) { static void pulse_cv(uint8_t gpio_num) { gpio_set_level(gpio_num, 1); - vTaskDelay(20 / portTICK_PERIOD_MS); - gpio_set_level(gpio_num, 0); + if (gpio_num == GPIO_CLK_OUT) { + ESP_ERROR_CHECK(gptimer_start(clk_cv_timer)); + } else if (gpio_num == GPIO_GATE_OUT) { + ESP_ERROR_CHECK(gptimer_start(gate_cv_timer)); + } } static void gen_rand_seq(uint8_t *sequence) {