From b6cc1a0ec83feb07884140ca324055485df2588d Mon Sep 17 00:00:00 2001 From: Alexey Zholtikov Date: Sat, 18 Oct 2025 12:06:40 +0300 Subject: [PATCH] wip: --- README.md | 8 +++--- include/zh_ac_dimmer.h | 4 +-- zh_ac_dimmer.c | 64 +++++++++++++++++++----------------------- 3 files changed, 34 insertions(+), 42 deletions(-) diff --git a/README.md b/README.md index 4492659..de06dde 100644 --- a/README.md +++ b/README.md @@ -4,10 +4,10 @@ void app_main(void) { - // esp_log_level_set("zh_ac_dimmer", ESP_LOG_NONE); + esp_log_level_set("zh_ac_dimmer", ESP_LOG_NONE); zh_ac_dimmer_init_config_t ac_dimmer_init_config = ZH_AC_DIMMER_INIT_CONFIG_DEFAULT(); - ac_dimmer_init_config.zero_cross_gpio = GPIO_NUM_1; - ac_dimmer_init_config.triac_gpio = GPIO_NUM_2; + ac_dimmer_init_config.zero_cross_gpio = GPIO_NUM_16; + ac_dimmer_init_config.triac_gpio = GPIO_NUM_17; zh_ac_dimmer_init(&ac_dimmer_init_config); zh_ac_dimmer_start(); for (;;) @@ -17,7 +17,7 @@ void app_main(void) zh_ac_dimmer_set(i); vTaskDelay(100 / portTICK_PERIOD_MS); } - for (uint8_t i = 100; i >= 0; --i) + for (uint8_t i = 100; i > 0; --i) { zh_ac_dimmer_set(i); vTaskDelay(100 / portTICK_PERIOD_MS); diff --git a/include/zh_ac_dimmer.h b/include/zh_ac_dimmer.h index 0323357..0ab2874 100644 --- a/include/zh_ac_dimmer.h +++ b/include/zh_ac_dimmer.h @@ -10,8 +10,7 @@ #define ZH_AC_DIMMER_INIT_CONFIG_DEFAULT() \ { \ .zero_cross_gpio = GPIO_NUM_MAX, \ - .triac_gpio = GPIO_NUM_MAX, \ - .triac_time = 1} + .triac_gpio = GPIO_NUM_MAX} #ifdef __cplusplus @@ -23,7 +22,6 @@ extern "C" { uint8_t zero_cross_gpio; // Zero cross GPIO. uint8_t triac_gpio; // Triac GPIO. - uint8_t triac_time; // Triac turn-on time (in microseconds). Depends on the type of triac. Tested on BTA16-600. } zh_ac_dimmer_init_config_t; /** diff --git a/zh_ac_dimmer.c b/zh_ac_dimmer.c index d76772c..ac5880f 100644 --- a/zh_ac_dimmer.c +++ b/zh_ac_dimmer.c @@ -21,14 +21,16 @@ static const char *TAG = "zh_ac_dimmer"; goto tag; \ } -gptimer_handle_t _dimmer_timer = NULL; +static gptimer_handle_t _dimmer_timer = NULL; +static gptimer_alarm_config_t _alarm_config = {0}; static zh_ac_dimmer_init_config_t _init_config = {0}; -volatile static bool _is_dimmer_work = false; -volatile static uint64_t _current_micros = 0; -volatile static uint16_t _current_frequency = 0; -volatile static uint16_t _old_frequency = 0; -volatile static uint8_t _dimmer_value = 0; +static bool _is_dimmer_work = false; +static uint64_t _prev_micros = 0; +static uint16_t _current_frequency = 0; +static uint16_t _prev_frequency = 0; +static uint16_t _zero_cross_time = 0; +static uint8_t _dimmer_value = 0; static bool _is_initialized = false; static esp_err_t _zh_ac_dimmer_validate_config(const zh_ac_dimmer_init_config_t *config); @@ -105,7 +107,7 @@ esp_err_t _zh_ac_dimmer_gpio_init(const zh_ac_dimmer_init_config_t *config) esp_err_t err = gpio_config(&triac_gpio_config); ZH_ERROR_CHECK(err == ESP_OK, err, "Triac GPIO configuration failed."); gpio_config_t zero_cross_gpio_config = { - .intr_type = GPIO_INTR_NEGEDGE , + .intr_type = GPIO_INTR_POSEDGE, .mode = GPIO_MODE_INPUT, .pin_bit_mask = (1ULL << config->zero_cross_gpio), .pull_down_en = GPIO_PULLDOWN_DISABLE, @@ -152,37 +154,30 @@ void IRAM_ATTR _zh_ac_dimmer_isr_handler(void *arg) return; } gpio_set_level(_init_config.triac_gpio, 0); - // if (gpio_get_level(_init_config.zero_cross_gpio) == 1) - // { - // gpio_set_level(_init_config.triac_gpio, 0); - // } - // else - // { - uint64_t time = esp_timer_get_time(); - _current_frequency = time - _current_micros; - if (_current_frequency < 1000) + uint64_t _current_micros = esp_timer_get_time(); + _current_frequency = _current_micros - _prev_micros; + _prev_micros = _current_micros; + if (_current_frequency < 1000) + { + if (_current_frequency > 50) { - _current_frequency = _old_frequency; + _zero_cross_time = _current_frequency; } - // ESP_DRAM_LOGI(TAG, "%d", _current_frequency); - _current_micros = time; - _old_frequency = _current_frequency; - if (_dimmer_value != 0) + _current_frequency = _prev_frequency; + } + _prev_frequency = _current_frequency; + if (_dimmer_value != 0) + { + if (_dimmer_value == 100) { - if (_dimmer_value == 100) - { - gpio_set_level(_init_config.triac_gpio, 1); - return; - } - // ESP_DRAM_LOGI(TAG, "%d", _current_frequency); - gptimer_alarm_config_t alarm_config = { - .alarm_count = (_current_frequency / 100) * (100 - _dimmer_value), - .flags.auto_reload_on_alarm = false, - }; - gptimer_set_alarm_action(_dimmer_timer, &alarm_config); - gptimer_start(_dimmer_timer); + gpio_set_level(_init_config.triac_gpio, 1); + return; } - // } + _alarm_config.alarm_count = ((_current_frequency / 105) * (100 - _dimmer_value)) + _zero_cross_time; + _alarm_config.flags.auto_reload_on_alarm = false; + gptimer_set_alarm_action(_dimmer_timer, &_alarm_config); + gptimer_start(_dimmer_timer); + } } bool _zh_ac_dimmer_timer_on_alarm_cb(gptimer_handle_t timer, const gptimer_alarm_event_data_t *edata, void *user_ctx) @@ -190,6 +185,5 @@ bool _zh_ac_dimmer_timer_on_alarm_cb(gptimer_handle_t timer, const gptimer_alarm gpio_set_level(_init_config.triac_gpio, 1); gptimer_stop(_dimmer_timer); gptimer_set_raw_count(_dimmer_timer, 0); - // gpio_set_level(_init_config.triac_gpio, 0); return true; } \ No newline at end of file