From 80b1f0bf23aefd50a130c270c31ec09c297db5d1 Mon Sep 17 00:00:00 2001 From: Alexey Zholtikov Date: Sat, 6 Dec 2025 10:21:15 +0300 Subject: [PATCH] wip: --- README.md | 1 + include/zh_ac_dimmer.h | 6 +++++- version.txt | 2 +- zh_ac_dimmer.c | 46 +++++++++++++++++++++++++++++------------- 4 files changed, 39 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 17435ec..fd4b2ff 100644 --- a/README.md +++ b/README.md @@ -47,6 +47,7 @@ void app_main(void) zh_ac_dimmer_init_config_t config = ZH_AC_DIMMER_INIT_CONFIG_DEFAULT(); config.zero_cross_gpio = GPIO_NUM_16; config.triac_gpio = GPIO_NUM_17; + config.ac_frequency = 50; zh_ac_dimmer_init(&config); zh_ac_dimmer_start(); uint8_t value = 0; diff --git a/include/zh_ac_dimmer.h b/include/zh_ac_dimmer.h index 2b33191..612589d 100644 --- a/include/zh_ac_dimmer.h +++ b/include/zh_ac_dimmer.h @@ -17,7 +17,9 @@ #define ZH_AC_DIMMER_INIT_CONFIG_DEFAULT() \ { \ .zero_cross_gpio = GPIO_NUM_MAX, \ - .triac_gpio = GPIO_NUM_MAX} + .triac_gpio = GPIO_NUM_MAX, \ + .glitch_filter = 2, \ + .ac_frequency = 50} #ifdef __cplusplus extern "C" @@ -31,6 +33,8 @@ extern "C" { uint8_t zero_cross_gpio; /*!< Zero cross GPIO. */ uint8_t triac_gpio; /*!< Triac GPIO. */ + uint8_t glitch_filter; /*!< Zero cross interrupt glitch filter (in us). */ + uint8_t ac_frequency; /*!< AC frequency (50 - 400 Hz). */ } zh_ac_dimmer_init_config_t; /** diff --git a/version.txt b/version.txt index 867e524..589268e 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -1.2.0 \ No newline at end of file +1.3.0 \ No newline at end of file diff --git a/zh_ac_dimmer.c b/zh_ac_dimmer.c index c4ec561..4b52d8c 100755 --- a/zh_ac_dimmer.c +++ b/zh_ac_dimmer.c @@ -20,11 +20,12 @@ static zh_ac_dimmer_init_config_t _init_config = {0}; static volatile uint64_t _prev_us = 0; static volatile uint32_t _current_period_us = 0; static volatile uint32_t _prev_period_us = 0; -static volatile uint16_t _zero_cross_us = 0; +// static volatile uint16_t _zero_cross_us = 0; static volatile uint8_t _dimmer_value = 0; static volatile bool _is_dimmer_work = false; static bool _is_initialized = false; static bool _is_prev_gpio_isr_handler = false; +// static bool _is_zero_crossing = false; static esp_err_t _zh_ac_dimmer_validate_config(const zh_ac_dimmer_init_config_t *config); static esp_err_t _zh_ac_dimmer_gpio_init(const zh_ac_dimmer_init_config_t *config); @@ -38,6 +39,7 @@ esp_err_t zh_ac_dimmer_init(const zh_ac_dimmer_init_config_t *config) ZH_ERROR_CHECK(_is_initialized == false, ESP_ERR_INVALID_STATE, NULL, "AC dimmer initialization failed. AC dimmer is already initialized."); esp_err_t err = _zh_ac_dimmer_validate_config(config); ZH_ERROR_CHECK(err == ESP_OK, err, NULL, "AC dimmer initialization failed. Initial configuration check failed."); + // _prev_us = esp_timer_get_time(); err = _zh_ac_dimmer_gpio_init(config); ZH_ERROR_CHECK(err == ESP_OK, err, NULL, "AC dimmer initialization failed. GPIO initialization failed."); err = _zh_ac_dimmer_timer_init(); @@ -74,8 +76,8 @@ esp_err_t zh_ac_dimmer_deinit(void) _dimmer_timer = NULL; _dimmer_value = 0; _current_period_us = 0; - _prev_period_us = 0; - _zero_cross_us = 0; + // _prev_period_us = 0; + // _zero_cross_us = 0; _prev_us = 0; ZH_LOGI("AC dimmer deinitialization completed successfully."); return ESP_OK; @@ -125,6 +127,8 @@ static esp_err_t _zh_ac_dimmer_validate_config(const zh_ac_dimmer_init_config_t ZH_ERROR_CHECK((config->zero_cross_gpio >= GPIO_NUM_0 && config->zero_cross_gpio < GPIO_NUM_MAX), ESP_ERR_INVALID_ARG, NULL, "Zero cross GPIO invalid."); ZH_ERROR_CHECK((config->triac_gpio >= GPIO_NUM_0 && config->triac_gpio < GPIO_NUM_MAX), ESP_ERR_INVALID_ARG, NULL, "Triac GPIO invalid."); ZH_ERROR_CHECK((config->zero_cross_gpio != config->triac_gpio), ESP_ERR_INVALID_ARG, NULL, "Both GPIO is same."); + ZH_ERROR_CHECK((config->ac_frequency >= 50 && config->ac_frequency <= 400), ESP_ERR_INVALID_ARG, NULL, "AC frequency invalid."); + ZH_ERROR_CHECK((config->glitch_filter != 0), ESP_ERR_INVALID_ARG, NULL, "Glitch filter invalid."); return ESP_OK; } @@ -192,19 +196,31 @@ static void IRAM_ATTR _zh_ac_dimmer_isr_handler(void *arg) { return; } - gpio_set_level(_init_config.triac_gpio, 0); uint64_t _current_us = esp_timer_get_time(); - _current_period_us = (uint32_t)(_current_us - _prev_us); - _prev_us = _current_us; - if (_current_period_us < 1000) + if (_current_us - _prev_us <= _init_config.glitch_filter) { - if (_current_period_us > 50) - { - _zero_cross_us = (uint16_t)_current_period_us; - } - _current_period_us = _prev_period_us; + _prev_us = _current_us; + return; } - _prev_period_us = _current_period_us; + gpio_set_level(_init_config.triac_gpio, 0); + _current_period_us = _current_us - _prev_us; + _prev_us = _current_us; + // if (_is_zero_crossing == false) + // { + // } + // gpio_set_level(_init_config.triac_gpio, 0); + // uint64_t _current_us = esp_timer_get_time(); + // _current_period_us = (uint32_t)(_current_us - _prev_us); + // _prev_us = _current_us; + // if (_current_period_us < 1000) + // { + // if (_current_period_us > 50) + // { + // _zero_cross_us = (uint16_t)_current_period_us; + // } + // _current_period_us = _prev_period_us; + // } + // _prev_period_us = _current_period_us; if (_dimmer_value != 0) { if (_dimmer_value == 100) @@ -212,7 +228,9 @@ static void IRAM_ATTR _zh_ac_dimmer_isr_handler(void *arg) gpio_set_level(_init_config.triac_gpio, 1); return; } - _alarm_config.alarm_count = (uint64_t)(((_current_period_us / 110) * (100 - _dimmer_value)) + _zero_cross_us); + // _alarm_config.alarm_count = (uint64_t)(((_current_period_us / 110) * (100 - _dimmer_value)) + _zero_cross_us); + // _alarm_config.alarm_count = (uint64_t)((1 / (_init_config.ac_frequency * 200)) * (100 - _dimmer_value)); + _alarm_config.alarm_count = (uint64_t)((_current_period_us / 100) * (100 - _dimmer_value)); _alarm_config.flags.auto_reload_on_alarm = false; gptimer_set_alarm_action(_dimmer_timer, &_alarm_config); gptimer_start(_dimmer_timer);