From ca706b9afaeb331a3229d86fadee47eaa0aa7283 Mon Sep 17 00:00:00 2001 From: Alexey Zholtikov Date: Wed, 10 Sep 2025 11:27:59 +0300 Subject: [PATCH] wip: --- README.md | 55 ++++++- include/zh_avr_ac_dimmer.h | 9 +- triac_400hz_delay — копия.xlsx | Bin 15708 -> 0 bytes triac_400hz_delay.xlsx | Bin 15708 -> 0 bytes zh_avr_ac_dimmer.c | 268 +++++++++++++++++++++++++++------ 5 files changed, 284 insertions(+), 48 deletions(-) delete mode 100644 triac_400hz_delay — копия.xlsx delete mode 100644 triac_400hz_delay.xlsx diff --git a/README.md b/README.md index 5181aa0..ab668b2 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,55 @@ -# zh_avr_ac_dimmer +# FreeRTOS based AVR library for AC dimmer +## Features + +1. Support of 50 Hz, 60 Hz and 400 Hz power frequency. + +## Dependencies + +1. [zh_avr_common](http://git.zh.com.ru/avr_libraries/zh_avr_common) + +## Using + +In an existing project, run the following command to install the components: + +```text +cd ../your_project/lib +git clone http://git.zh.com.ru/avr_libraries/zh_avr_common +git clone http://git.zh.com.ru/avr_libraries/zh_avr_ac_dimmer +``` + +In the application, add the component: + +```c +#include "zh_avr_ac_dimmer.h" +``` + +## Examples + +```c +#include "zh_avr_ac_dimmer.h" + +int main(void) +{ + zh_avr_ac_dimmer_init_config_t ac_dimmer_init_config = ZH_AVR_AC_DIMMER_INIT_CONFIG_DEFAULT(); + ac_dimmer_init_config.ac_dimmer_frequency = ZH_50HZ; + ac_dimmer_init_config.zero_cross_port = AVR_PORTD; + ac_dimmer_init_config.zero_cross_gpio = PORTD2; + ac_dimmer_init_config.triac_port = AVR_PORTD; + ac_dimmer_init_config.triac_gpio = PORTD3; + zh_avr_ac_dimmer_init(&ac_dimmer_init_config); + zh_avr_ac_dimmer_set(50); + zh_avr_ac_dimmer_start(); + for (;;) + { + } + return 0; +} + +// ISR(PCINT0_vect) // For AVR_PORTB. +// ISR(PCINT1_vect) // For AVR_PORTC. +ISR(PCINT2_vect) // For AVR_PORTD. +{ + zh_avr_ac_dimmer_isr_handler(); +} +``` diff --git a/include/zh_avr_ac_dimmer.h b/include/zh_avr_ac_dimmer.h index fd71481..ecba712 100644 --- a/include/zh_avr_ac_dimmer.h +++ b/include/zh_avr_ac_dimmer.h @@ -23,8 +23,8 @@ extern "C" typedef enum { ZH_50HZ = 1, - ZH_60HZ, - ZH_400HZ + ZH_60HZ = 2, + ZH_400HZ = 3 } zh_avr_ac_dimmer_frequency_t; typedef struct // Structure for initial initialization of AC dimmer. @@ -72,6 +72,11 @@ extern "C" */ avr_err_t zh_avr_ac_dimmer_set(uint8_t value); + /** + * @brief AC dimmer ISR handler. + */ + void zh_avr_ac_dimmer_isr_handler(void); + #ifdef __cplusplus } #endif \ No newline at end of file diff --git a/triac_400hz_delay — копия.xlsx b/triac_400hz_delay — копия.xlsx deleted file mode 100644 index aa41f37cfa38b7f527cfd80749cd1fc6d101e338..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15708 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 diff --git a/triac_400hz_delay.xlsx b/triac_400hz_delay.xlsx deleted file mode 100644 index aa41f37cfa38b7f527cfd80749cd1fc6d101e338..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15708 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 diff --git a/zh_avr_ac_dimmer.c b/zh_avr_ac_dimmer.c index cbfb82e..e37abfc 100644 --- a/zh_avr_ac_dimmer.c +++ b/zh_avr_ac_dimmer.c @@ -1,81 +1,115 @@ #include "zh_avr_ac_dimmer.h" +static zh_avr_ac_dimmer_init_config_t _init_config = {0}; volatile static bool _is_dimmer_work = false; volatile static uint8_t _dimmer_value = 0; +volatile static uint8_t _dimmer_count = 0; static bool _is_initialized = false; +static uint8_t _prescaler = 0; static avr_err_t _zh_avr_ac_dimmer_validate_config(const zh_avr_ac_dimmer_init_config_t *config); +static void _zh_avr_ac_dimmer_gpio_init(void); +static avr_err_t _zh_avr_ac_dimmer_timer_init(void); -static avr_err_t zh_avr_ac_dimmer_init(const zh_avr_ac_dimmer_init_config_t *config) +avr_err_t zh_avr_ac_dimmer_init(const zh_avr_ac_dimmer_init_config_t *config) { ZH_ERROR_CHECK(_is_initialized == false, AVR_ERR_INVALID_STATE); - avr_err_t err = _zh_avr_pcf8574_validate_config(config); + avr_err_t err = _zh_avr_ac_dimmer_validate_config(config); ZH_ERROR_CHECK(err == AVR_OK, err); - switch (config->zero_cross_port) - { - case AVR_PORTB: - DDRB &= ~(1 << config->zero_cross_gpio); - PORTB |= (1 << config->zero_cross_gpio); - PCICR |= (1 << PCIE0); - PCMSK0 |= (1 << config->zero_cross_gpio); - break; - case AVR_PORTC: - DDRC &= ~(1 << config->zero_cross_gpio); - PORTC |= (1 << config->zero_cross_gpio); - PCICR |= (1 << PCIE1); - PCMSK1 |= (1 << config->zero_cross_gpio); - break; - case AVR_PORTD: - DDRD &= ~(1 << config->zero_cross_gpio); - PORTD |= (1 << config->zero_cross_gpio); - PCICR |= (1 << PCIE2); - PCMSK2 |= (1 << config->zero_cross_gpio); - break; - default: - break; - } - switch (config->triac_port) - { - case AVR_PORTB: - DDRB |= (1 << config->triac_gpio); - PORTB &= ~(1 << config->triac_gpio); - break; - case AVR_PORTC: - DDRC |= (1 << config->triac_gpio); - PORTC &= ~(1 << config->triac_gpio); - break; - case AVR_PORTD: - DDRD |= (1 << config->triac_gpio); - PORTD &= ~(1 << config->triac_gpio); - break; - default: - break; - } + _init_config = *config; + cli(); + _zh_avr_ac_dimmer_gpio_init(); + err = _zh_avr_ac_dimmer_timer_init(); + ZH_ERROR_CHECK(err == AVR_OK, err); + sei(); _is_initialized = true; return AVR_OK; } -static avr_err_t zh_avr_ac_dimmer_start(void) +avr_err_t zh_avr_ac_dimmer_start(void) { ZH_ERROR_CHECK(_is_initialized == true, AVR_ERR_NOT_FOUND); _is_dimmer_work = true; return AVR_OK; } -static avr_err_t zh_avr_ac_dimmer_stop(void) +avr_err_t zh_avr_ac_dimmer_stop(void) { ZH_ERROR_CHECK(_is_initialized == true, AVR_ERR_NOT_FOUND); _is_dimmer_work = false; return AVR_OK; } -static avr_err_t zh_avr_ac_dimmer_set(uint8_t value) +avr_err_t zh_avr_ac_dimmer_set(uint8_t value) { ZH_ERROR_CHECK(_dimmer_value <= 100, AVR_ERR_INVALID_ARG); _dimmer_value = value; return AVR_OK; } +void zh_avr_ac_dimmer_isr_handler(void) +{ + uint8_t flag = false; + switch (_init_config.zero_cross_port) + { + case AVR_PORTB: + if ((PINB & (1 << _init_config.zero_cross_gpio)) == 0) + { + flag = true; + } + break; + case AVR_PORTC: + if ((PINC & (1 << _init_config.zero_cross_gpio)) == 0) + { + flag = true; + } + break; + case AVR_PORTD: + if ((PIND & (1 << _init_config.zero_cross_gpio)) == 0) + { + flag = true; + } + break; + default: + break; + } + if (_is_dimmer_work == true && flag == true) + { + if (_dimmer_value != 0) + { + if (_dimmer_value == 100) + { + switch (_init_config.triac_port) + { + case AVR_PORTB: + PORTB |= (1 << _init_config.triac_gpio); + asm("nop"); + PORTB &= ~(1 << _init_config.triac_gpio); + break; + case AVR_PORTC: + PORTC |= (1 << _init_config.triac_gpio); + asm("nop"); + PORTC &= ~(1 << _init_config.triac_gpio); + break; + case AVR_PORTD: + PORTD |= (1 << _init_config.triac_gpio); + asm("nop"); + PORTD &= ~(1 << _init_config.triac_gpio); + break; + default: + break; + } + } + else + { + TCNT0 = 0; + TCCR0B |= _prescaler; + TIMSK0 |= (1 << OCIE0A); + } + } + } +} + static avr_err_t _zh_avr_ac_dimmer_validate_config(const zh_avr_ac_dimmer_init_config_t *config) { ZH_ERROR_CHECK(config != NULL, AVR_ERR_INVALID_ARG); @@ -85,4 +119,148 @@ static avr_err_t _zh_avr_ac_dimmer_validate_config(const zh_avr_ac_dimmer_init_c ZH_ERROR_CHECK(config->triac_port >= AVR_PORTB && config->triac_port <= AVR_PORTD, AVR_ERR_INVALID_ARG); ZH_ERROR_CHECK(config->ac_dimmer_frequency >= ZH_50HZ && config->ac_dimmer_frequency <= ZH_400HZ, AVR_ERR_INVALID_ARG); return AVR_OK; +} + +static void _zh_avr_ac_dimmer_gpio_init(void) +{ + switch (_init_config.zero_cross_port) + { + case AVR_PORTB: + DDRB &= ~(1 << _init_config.zero_cross_gpio); + PORTB |= (1 << _init_config.zero_cross_gpio); + PCICR |= (1 << PCIE0); + PCMSK0 |= (1 << _init_config.zero_cross_gpio); + break; + case AVR_PORTC: + DDRC &= ~(1 << _init_config.zero_cross_gpio); + PORTC |= (1 << _init_config.zero_cross_gpio); + PCICR |= (1 << PCIE1); + PCMSK1 |= (1 << _init_config.zero_cross_gpio); + break; + case AVR_PORTD: + DDRD &= ~(1 << _init_config.zero_cross_gpio); + PORTD |= (1 << _init_config.zero_cross_gpio); + PCICR |= (1 << PCIE2); + PCMSK2 |= (1 << _init_config.zero_cross_gpio); + break; + default: + break; + } + switch (_init_config.triac_port) + { + case AVR_PORTB: + DDRB |= (1 << _init_config.triac_gpio); + PORTB &= ~(1 << _init_config.triac_gpio); + break; + case AVR_PORTC: + DDRC |= (1 << _init_config.triac_gpio); + PORTC &= ~(1 << _init_config.triac_gpio); + break; + case AVR_PORTD: + DDRD |= (1 << _init_config.triac_gpio); + PORTD &= ~(1 << _init_config.triac_gpio); + break; + default: + break; + } +} + +static avr_err_t _zh_avr_ac_dimmer_timer_init(void) +{ + TCCR0A |= (1 << WGM01); + switch (F_CPU) + { + case 8000000: + switch (_init_config.ac_dimmer_frequency) + { + case ZH_50HZ: + OCR0A = 99; + _prescaler = (1 << CS01); + break; + case ZH_60HZ: + OCR0A = 82; + _prescaler = (1 << CS01); + break; + case ZH_400HZ: + OCR0A = 99; + _prescaler = (1 << CS00); + break; + default: + break; + } + break; + case 16000000: + switch (_init_config.ac_dimmer_frequency) + { + case ZH_50HZ: + OCR0A = 24; + _prescaler = (1 << CS01) | (1 << CS00); + break; + case ZH_60HZ: + OCR0A = 165; + _prescaler = (1 << CS01); + break; + case ZH_400HZ: + OCR0A = 24; + _prescaler = (1 << CS01); + break; + default: + break; + } + break; + case 20000000: + switch (_init_config.ac_dimmer_frequency) + { + case ZH_50HZ: + OCR0A = 249; + _prescaler = (1 << CS01); + break; + case ZH_60HZ: + OCR0A = 206; + _prescaler = (1 << CS01); + break; + case ZH_400HZ: + OCR0A = 249; + _prescaler = (1 << CS00); + break; + default: + break; + } + break; + default: + return AVR_ERR_INVALID_ARG; + break; + } + return AVR_OK; +} + +ISR(TIMER0_COMPA_vect) +{ + ++_dimmer_count; + if (_dimmer_count == (100 - _dimmer_value)) + { + _dimmer_count = 0; + TCCR0B &= ~_prescaler; + TIMSK0 &= ~(1 << OCIE0A); + switch (_init_config.triac_port) + { + case AVR_PORTB: + PORTB |= (1 << _init_config.triac_gpio); + asm("nop"); + PORTB &= ~(1 << _init_config.triac_gpio); + break; + case AVR_PORTC: + PORTC |= (1 << _init_config.triac_gpio); + asm("nop"); + PORTC &= ~(1 << _init_config.triac_gpio); + break; + case AVR_PORTD: + PORTD |= (1 << _init_config.triac_gpio); + asm("nop"); + PORTD &= ~(1 << _init_config.triac_gpio); + break; + default: + break; + } + } } \ No newline at end of file