change cv outputs to use timers instead of delay

main
rkcf 2023-01-27 18:25:48 -06:00
parent 5677aebc71
commit d075f1e538
1 changed files with 55 additions and 8 deletions

View File

@ -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) {