| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315 |
- /*********************************************************************************************************
- * Module : relay
- * Abstract :
- * Version : 1.0.0
- * Author : Leopul(COPYRIGHT 2025 ~ 2027 Leopul. All rights reserved.)
- * Complete : 2025-04-18
- * Content : None
- * Note : None
- *********************************************************************************************************/
- #include "relay.h"
- #include "gd32e23x.h"
- #include "board_cfg.h"
- #include "common.h"
- #define RELAY_RCU RCU_GPIOB
- #define RELAY_GPIO GPIOB
- #if (RelaySlaveChaNum >= 1)
- #define RELAY_1 GPIO_PIN_8
- #endif
- #if (RelaySlaveChaNum >= 2)
- #define RELAY_2 GPIO_PIN_9
- #endif
- #if (RelaySlaveChaNum >= 3)
- #define RELAY_3 GPIO_PIN_10
- #endif
-
- #if ((POWER_TYPE == POWER_AC_3_3) && (ZERO_CTRL_NUM == ZERO_LINE_1))
- #define RELAY_4 GPIO_PIN_11
- #endif
- #if (RelaySlaveChaNum >= 4)
- #define RELAY_4 GPIO_PIN_11
- #endif
- #if (RelaySlaveChaNum >= 5)
- #define RELAY_5 GPIO_PIN_12
- #endif
- #if (RelaySlaveChaNum >= 6)
- #define RELAY_6 GPIO_PIN_13
- #endif
- #if (RelaySlaveChaNum >= 7)
- #define RELAY_7 GPIO_PIN_14
- #endif
- #if (RelaySlaveChaNum >= 8)
- #define RELAY_8 GPIO_PIN_15
- #endif
- #define RELAY_1_ON gpio_bit_set(RELAY_GPIO,RELAY_1);
- #define RELAY_1_OFF gpio_bit_reset(RELAY_GPIO,RELAY_1);
- #define RELAY_2_ON gpio_bit_set(RELAY_GPIO,RELAY_2);
- #define RELAY_2_OFF gpio_bit_reset(RELAY_GPIO,RELAY_2);
- #define RELAY_3_ON gpio_bit_set(RELAY_GPIO,RELAY_3);
- #define RELAY_3_OFF gpio_bit_reset(RELAY_GPIO,RELAY_3);
- #define RELAY_4_ON gpio_bit_set(RELAY_GPIO,RELAY_4);
- #define RELAY_4_OFF gpio_bit_reset(RELAY_GPIO,RELAY_4);
- #define RELAY_5_ON gpio_bit_set(RELAY_GPIO,RELAY_5);
- #define RELAY_5_OFF gpio_bit_reset(RELAY_GPIO,RELAY_5);
- #define RELAY_6_ON gpio_bit_set(RELAY_GPIO,RELAY_6);
- #define RELAY_6_OFF gpio_bit_reset(RELAY_GPIO,RELAY_6);
- #define RELAY_7_ON gpio_bit_set(RELAY_GPIO,RELAY_7);
- #define RELAY_7_OFF gpio_bit_reset(RELAY_GPIO,RELAY_7);
- #define RELAY_8_ON gpio_bit_set(RELAY_GPIO,RELAY_8);
- #define RELAY_8_OFF gpio_bit_reset(RELAY_GPIO,RELAY_8);
- static void relay_open(uint8_t channel);
- static void relay_close(uint8_t channel);
- static void relay_sync(void);
- static void relay_zero_open(uint8_t channel);
- static void relay_zero_close(uint8_t channel);
- void relay_init(void)
- {
- board_t * board = get_board();
- rcu_periph_clock_enable(RELAY_RCU);
-
- #if ((POWER_TYPE == POWER_AC_3_3) && (ZERO_CTRL_NUM == ZERO_LINE_1))
- gpio_mode_set(RELAY_GPIO,GPIO_MODE_OUTPUT,GPIO_PUPD_NONE,RELAY_4);
- gpio_output_options_set(RELAY_GPIO, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, RELAY_4);
- gpio_bit_reset(RELAY_GPIO, RELAY_4);
- #endif
-
- #if (RelaySlaveChaNum >=1)
- gpio_mode_set(RELAY_GPIO,GPIO_MODE_OUTPUT,GPIO_PUPD_NONE,RELAY_1);
- gpio_output_options_set(RELAY_GPIO, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, RELAY_1);
- gpio_bit_reset(RELAY_GPIO, RELAY_1);
- #endif
- #if (RelaySlaveChaNum >=2)
- gpio_mode_set(RELAY_GPIO,GPIO_MODE_OUTPUT,GPIO_PUPD_NONE,RELAY_2);
- gpio_output_options_set(RELAY_GPIO, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, RELAY_2);
- gpio_bit_reset(RELAY_GPIO, RELAY_2);
- #endif
- #if (RelaySlaveChaNum >=3)
- gpio_mode_set(RELAY_GPIO,GPIO_MODE_OUTPUT,GPIO_PUPD_NONE,RELAY_3);
- gpio_output_options_set(RELAY_GPIO, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, RELAY_3);
- gpio_bit_reset(RELAY_GPIO, RELAY_3);
- #endif
- #if (RelaySlaveChaNum >=4)
- gpio_mode_set(RELAY_GPIO,GPIO_MODE_OUTPUT,GPIO_PUPD_NONE,RELAY_4);
- gpio_output_options_set(RELAY_GPIO, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, RELAY_4);
- gpio_bit_reset(RELAY_GPIO, RELAY_4);
- #endif
-
- #if (RelaySlaveChaNum >=5)
- gpio_mode_set(RELAY_GPIO,GPIO_MODE_OUTPUT,GPIO_PUPD_PULLDOWN,RELAY_5);
- gpio_output_options_set(RELAY_GPIO, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, RELAY_5);
- gpio_bit_reset(RELAY_GPIO, RELAY_5);
- #endif
- #if (RelaySlaveChaNum >=6)
- gpio_mode_set(RELAY_GPIO,GPIO_MODE_OUTPUT,GPIO_PUPD_PULLDOWN,RELAY_6);
- gpio_output_options_set(RELAY_GPIO, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, RELAY_6);
- gpio_bit_reset(RELAY_GPIO, RELAY_6);
- #endif
- #if (RelaySlaveChaNum >=7)
- gpio_mode_set(RELAY_GPIO,GPIO_MODE_OUTPUT,GPIO_PUPD_PULLDOWN,RELAY_7);
- gpio_output_options_set(RELAY_GPIO, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, RELAY_7);
- gpio_bit_reset(RELAY_GPIO, RELAY_7);
- #endif
- #if (RelaySlaveChaNum >=8)
- gpio_mode_set(RELAY_GPIO,GPIO_MODE_OUTPUT,GPIO_PUPD_PULLDOWN,RELAY_8);
- gpio_output_options_set(RELAY_GPIO, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, RELAY_8);
- gpio_bit_reset(RELAY_GPIO, RELAY_8);
- #endif
- #if (POWER_TYPE == POWER_DC)
- board->unlock();
- board->lock;
- #endif
- board->open = relay_open;
- board->close = relay_close;
- board->zero_close = relay_zero_close;
- board->zero_open = relay_zero_open;
- //board->relay_sync = relay_sync;
- }
- static void relay_open(uint8_t channel)
- {
- board_t * board = get_board();
- switch(channel)
- {
- #if (RelaySlaveChaNum >= 1)
- case 0:
- RELAY_1_ON;
- break;
- #endif
- #if (RelaySlaveChaNum >= 2)
- case 1:
- RELAY_2_ON;
- break;
- #endif
- #if (RelaySlaveChaNum >= 3)
- case 2:
- RELAY_3_ON;
- break;
- #endif
- #if (RelaySlaveChaNum >= 4)
- case 3:
- RELAY_4_ON;
- break;
- #endif
- #if (RelaySlaveChaNum >= 5)
- case 4:
- RELAY_5_ON;
- break;
- #endif
- #if (RelaySlaveChaNum >= 6)
- case 5:
- RELAY_6_ON;
- break;
- #endif
- #if (RelaySlaveChaNum >= 7)
- case 6:
- RELAY_7_ON;
- break;
- #endif
- #if (RelaySlaveChaNum >= 8)
- case 7:
- RELAY_8_ON;
- break;
- #endif
- default:
- return;
- }
- board->unlock();
- board->lock();
- board->md_data.rw_data.rw_d.relay_status[channel] = RELAY_OPEN;
- }
- static void relay_close(uint8_t channel)
- {
- board_t * board = get_board();
- switch(channel)
- {
- #if (RelaySlaveChaNum >= 1)
- case 0:
- RELAY_1_OFF;
- break;
- #endif
- #if (RelaySlaveChaNum >= 2)
- case 1:
- RELAY_2_OFF;
- break;
- #endif
- #if (RelaySlaveChaNum >= 3)
- case 2:
- RELAY_3_OFF;
- break;
- #endif
- #if (RelaySlaveChaNum >= 4)
- case 3:
- RELAY_4_OFF;
- break;
- #endif
- #if (RelaySlaveChaNum >= 5)
- case 4:
- RELAY_5_OFF;
- break;
- #endif
- #if (RelaySlaveChaNum >= 6)
- case 5:
- RELAY_6_OFF;
- break;
- #endif
- #if (RelaySlaveChaNum >= 7)
- case 6:
- RELAY_7_OFF;
- break;
- #endif
- #if (RelaySlaveChaNum >= 8)
- case 7:
- RELAY_8_OFF;
- break;
- #endif
- default:
- return;
- }
- board->unlock();
- board->lock();
- board->md_data.rw_data.rw_d.relay_status[channel] = RELAY_CLOSE;
- }
- static void relay_sync(void)
- {
- board_t * board = get_board();
- for(int i = 0; i < RelaySlaveChaNum;i++)
- {
- if(board->relay_staging_staus[i] == RELAY_CLOSE)
- {
- relay_close(i);
- }else if(board->relay_staging_staus[i] == RELAY_OPEN)
- {
- relay_open(i);
- }else
- {
- ;
- }
- }
- }
- static void relay_zero_open(uint8_t channel)
- {
- board_t * board = get_board();
- if(channel >= ZERO_CTRL_NUM)
- return;
- switch(channel)
- {
- #if (ZERO_CTRL_NUM >= 1)
- case 0:
- RELAY_4_ON;
- break;
- #endif
- default:
- return;
- }
- board->unlock();
- board->lock();
- board->md_data.rw_data.rw_d.zero_relay_status[channel] = RELAY_OPEN;
- }
- static void relay_zero_close(uint8_t channel)
- {
- board_t * board = get_board();
- switch(channel)
- {
- #if (ZERO_CTRL_NUM >= 1)
- case 0:
- RELAY_4_OFF;
- break;
- #endif
- default:
- return;
- }
- board->unlock();
- board->lock();
- board->md_data.rw_data.rw_d.zero_relay_status[channel] = RELAY_CLOSE;
- }
|