Electricity.c 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. /*********************************************************************************************************
  2. * Module : Electricity.c
  3. * Abstract : Electricity modules.
  4. * Version : 1.0.0
  5. * Author : Leopul(COPYRIGHT 2025 - 2027 Leopul. All rights reserved.)
  6. * Complete : 2025-02-16
  7. * Content : None
  8. * Note : None
  9. *********************************************************************************************************/
  10. #include "Electricity.h"
  11. #include "Uart1.h"
  12. #include "Hlw8110.h"
  13. #include "SysTick.h"
  14. #include "main.h"
  15. void electricity_read(uint8_t channel);
  16. static void check_wanning(uint8_t channel);
  17. void electricity_init()
  18. {
  19. InitCH448F();
  20. InitUART1(9600);
  21. for(uint8_t i = 0; i < 3;i++)
  22. {
  23. select_channel(i);
  24. DelayNus(50);
  25. Init_HLW8110();
  26. }
  27. sts_data_t *data = get_sts();
  28. data->read_ele = electricity_read;
  29. data->check_wanning = check_wanning;
  30. }
  31. void electricity_read(uint8_t channel)
  32. {
  33. electricity_t ele = {0};
  34. select_channel(channel);
  35. DelayNus(50);
  36. Check_WriteReg_Success();
  37. ele.voltage = read_hlw8110_v();
  38. ele.current = read_hlw8110_i();
  39. ele.consumer = read_hlw8110_e();
  40. ele.power = read_hlw8110_p();
  41. ele.freq = read_hlw8110_freq();
  42. ele.factor = read_hlw8110_pf();
  43. sts_data_t *data = get_sts();
  44. if(channel == 0)
  45. {
  46. data->m_data.out_power.voltage = ele.voltage * 1000;
  47. data->m_data.out_power.current = ele.current * 1000;
  48. data->m_data.out_power.power = ele.power * 1000;
  49. data->m_data.out_power.freq = ele.freq * 1000;
  50. data->m_data.out_power.factor = ele.factor * 1000;
  51. data->iic_consumer += ele.consumer;
  52. data->m_data.out_power.consumer = data->iic_consumer * 1000;
  53. }else
  54. {
  55. data->m_data.out_power.voltage = ele.voltage * 1000;
  56. data->m_data.out_power.freq = ele.freq * 1000;
  57. }
  58. }
  59. static void check_voltage_max(uint8_t channel)
  60. {
  61. sts_data_t *data = get_sts();
  62. if(channel == CH448_CHANNEL_1)
  63. {
  64. if(IS_VOLTAGE_MAX_EN(data->output_wanning_en)) {
  65. if(data->m_data.out_power.voltage > data->m_data.output_th.voltage_max)
  66. {
  67. SET_WANNING_VOLTAGE_MAX(data->m_data.output_waning.waning);
  68. }else
  69. {
  70. UNSET_WANNING_VOLTAGE_MAX(data->m_data.output_waning.waning);
  71. }
  72. }
  73. }else
  74. {
  75. uint8_t chn = channel-1;
  76. if(IS_VOLTAGE_MAX_EN(data->input_wanning_en[chn])) {
  77. if(data->m_data.input[chn].voltage > data->m_data.input_th[chn].voltage_max)
  78. {
  79. SET_WANNING_VOLTAGE_MAX(data->m_data.input_wanning.waning[chn]);
  80. }else
  81. {
  82. UNSET_WANNING_VOLTAGE_MAX(data->m_data.input_wanning.waning[chn]);
  83. }
  84. }
  85. }
  86. }
  87. static void check_voltage_min(uint8_t channel)
  88. {
  89. sts_data_t *data = get_sts();
  90. if(channel == CH448_CHANNEL_1)
  91. {
  92. if(IS_VOLTAGE_MIN_EN(data->output_wanning_en)) {
  93. if(data->m_data.out_power.voltage < data->m_data.output_th.voltage_min)
  94. {
  95. SET_WANNING_VOLTAGE_MIN(data->m_data.output_waning.waning);
  96. }else
  97. {
  98. UNSET_WANNING_VOLTAGE_MIN(data->m_data.output_waning.waning);
  99. }
  100. }
  101. }else
  102. {
  103. uint8_t chn = channel-1;
  104. if(IS_VOLTAGE_MIN_EN(data->input_wanning_en[chn])) {
  105. if(data->m_data.input[chn].voltage < data->m_data.input_th[chn].voltage_min)
  106. {
  107. SET_WANNING_VOLTAGE_MIN(data->m_data.input_wanning.waning[chn]);
  108. }else
  109. {
  110. UNSET_WANNING_VOLTAGE_MIN(data->m_data.input_wanning.waning[chn]);
  111. }
  112. }
  113. }
  114. }
  115. static void check_current_max(uint8_t channel)
  116. {
  117. sts_data_t *data = get_sts();
  118. if(channel == CH448_CHANNEL_1)
  119. {
  120. if(IS_CURRENT_MAX_EN(data->output_wanning_en)) {
  121. if(data->m_data.out_power.current > data->m_data.output_th.current_max)
  122. {
  123. SET_WANNING_CURRENT_MAX(data->m_data.output_waning.waning);
  124. }else
  125. {
  126. UNSET_WANNING_CURRENT_MAX(data->m_data.output_waning.waning);
  127. }
  128. }
  129. }
  130. }
  131. static void check_power_max(uint8_t channel)
  132. {
  133. sts_data_t *data = get_sts();
  134. if(channel == CH448_CHANNEL_1)
  135. {
  136. if(IS_POWER_MAX_EN(data->output_wanning_en)) {
  137. if(data->m_data.out_power.power > data->m_data.output_th.power_max)
  138. {
  139. SET_WANNING_POWER_MAX(data->m_data.output_waning.waning);
  140. }else
  141. {
  142. UNSET_WANNING_POWER_MAX(data->m_data.output_waning.waning);
  143. }
  144. }
  145. }
  146. }
  147. static void check_consumer_max(uint8_t channel)
  148. {
  149. sts_data_t *data = get_sts();
  150. if(channel == CH448_CHANNEL_1)
  151. {
  152. if(IS_CONSUMER_MAX_EN(data->output_wanning_en)) {
  153. if(data->m_data.out_power.consumer > data->m_data.output_th.consumer_max)
  154. {
  155. SET_WANNING_CONSUMER_MAX(data->m_data.output_waning.waning);
  156. }else
  157. {
  158. UNSET_WANNING_CONSUMER_MAX(data->m_data.output_waning.waning);
  159. }
  160. }
  161. }
  162. }
  163. static void check_freq_max(uint8_t channel)
  164. {
  165. sts_data_t *data = get_sts();
  166. if(channel != CH448_CHANNEL_1)
  167. {
  168. uint8_t chn = channel -1;
  169. if(chn > CH448_CHANNEL_3)
  170. return;
  171. if(IS_FREQ_MAX_EN(data->input_wanning_en[chn])) {
  172. if(data->m_data.input[chn].freq > data->m_data.input_th[chn].freq_max)
  173. {
  174. SET_WANNING_FREQ_MAX(data->m_data.input_wanning.waning[chn]);
  175. }else
  176. {
  177. UNSET_WANNING_FREQ_MAX(data->m_data.input_wanning.waning[chn]);
  178. }
  179. }
  180. }
  181. }
  182. static void check_freq_min(uint8_t channel)
  183. {
  184. sts_data_t *data = get_sts();
  185. if(channel != CH448_CHANNEL_1)
  186. {
  187. uint8_t chn = channel - 1;
  188. if(chn > CH448_CHANNEL_3)
  189. return;
  190. if(IS_FREQ_MIN_EN(data->input_wanning_en[chn])) {
  191. if(data->m_data.input[chn].freq < data->m_data.input_th[chn].freq_min)
  192. {
  193. SET_WANNING_FREQ_MIN(data->m_data.input_wanning.waning[chn]);
  194. }else
  195. {
  196. UNSET_WANNING_FREQ_MIN(data->m_data.input_wanning.waning[chn]);
  197. }
  198. }
  199. }
  200. }
  201. static void check_wanning(uint8_t channel)
  202. {
  203. check_voltage_max(channel);
  204. check_voltage_min(channel);
  205. check_current_max(channel);
  206. check_power_max(channel);
  207. check_consumer_max(channel);
  208. check_freq_max(channel);
  209. check_freq_min(channel);
  210. }