Electricity.c 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  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. extern float F_AC_V;
  32. extern float F_AC_I;
  33. extern float F_AC_P;
  34. extern float F_AC_LINE_Freq;
  35. extern float F_AC_E;
  36. extern float F_AC_PF;
  37. extern float F_Angle;
  38. extern uint32_t read_ele_count;
  39. extern uint8_t read_ele_flag;
  40. void electricity_read(uint8_t channel)
  41. {
  42. electricity_t ele = {0};
  43. select_channel(channel);
  44. //DelayNus(50);
  45. Check_WriteReg_Success();
  46. // read_ele_flag = 1;
  47. // read_ele_count = 0;
  48. Calculate_HLW8110_MeterData();
  49. // read_ele_flag = 0;
  50. // ele.voltage = read_hlw8110_v();
  51. // ele.current = read_hlw8110_i();
  52. // ele.consumer = read_hlw8110_e();
  53. // ele.power = read_hlw8110_p();
  54. // ele.freq = read_hlw8110_freq();
  55. // ele.factor = read_hlw8110_pf();
  56. sts_data_t *data = get_sts();
  57. if(channel == 0)
  58. {
  59. data->m_data.out_power.voltage = F_AC_V * 1000;
  60. data->m_data.out_power.current = F_AC_I * 1000;
  61. data->m_data.out_power.power = F_AC_P* 1000;
  62. data->m_data.out_power.freq = F_AC_LINE_Freq * 1000;
  63. data->m_data.out_power.factor = F_AC_PF * 1000;
  64. data->iic_consumer += F_AC_E;
  65. data->m_data.out_power.consumer = data->iic_consumer * 1000;
  66. data->m_data.out_power.angle = F_Angle *1000;
  67. }else
  68. {
  69. data->m_data.input[channel-1].voltage = F_AC_V * 1000;
  70. data->m_data.input[channel-1].freq = F_AC_LINE_Freq * 1000;
  71. }
  72. }
  73. static void check_voltage_max(uint8_t channel)
  74. {
  75. sts_data_t *data = get_sts();
  76. if(channel == CH448_CHANNEL_1)
  77. {
  78. if(IS_VOLTAGE_MAX_EN(data->output_wanning_en)) {
  79. if(data->m_data.out_power.voltage > data->m_data.output_th.voltage_max)
  80. {
  81. SET_WANNING_VOLTAGE_MAX(data->m_data.output_waning.waning);
  82. if(IS_OVERFUNC_VOLTAGE_MAX(data->m_data.over_func))
  83. {
  84. data->close_output();
  85. }
  86. }else
  87. {
  88. UNSET_WANNING_VOLTAGE_MAX(data->m_data.output_waning.waning);
  89. }
  90. }
  91. }else
  92. {
  93. uint8_t chn = channel-1;
  94. if(IS_VOLTAGE_MAX_EN(data->input_wanning_en[chn])) {
  95. if(data->m_data.input[chn].voltage > data->m_data.input_th[chn].voltage_max)
  96. {
  97. SET_WANNING_VOLTAGE_MAX(data->m_data.input_wanning.waning[chn]);
  98. }else
  99. {
  100. UNSET_WANNING_VOLTAGE_MAX(data->m_data.input_wanning.waning[chn]);
  101. }
  102. }
  103. }
  104. }
  105. static void check_voltage_min(uint8_t channel)
  106. {
  107. sts_data_t *data = get_sts();
  108. if(channel == CH448_CHANNEL_1)
  109. {
  110. if(IS_VOLTAGE_MIN_EN(data->output_wanning_en)) {
  111. if(data->m_data.out_power.voltage < data->m_data.output_th.voltage_min)
  112. {
  113. SET_WANNING_VOLTAGE_MIN(data->m_data.output_waning.waning);
  114. if(IS_OVERFUNC_VOLTAGE_MIN(data->m_data.over_func))
  115. {
  116. data->close_output();
  117. }
  118. }else
  119. {
  120. UNSET_WANNING_VOLTAGE_MIN(data->m_data.output_waning.waning);
  121. }
  122. }
  123. }else
  124. {
  125. uint8_t chn = channel-1;
  126. if(IS_VOLTAGE_MIN_EN(data->input_wanning_en[chn])) {
  127. if(data->m_data.input[chn].voltage < data->m_data.input_th[chn].voltage_min)
  128. {
  129. SET_WANNING_VOLTAGE_MIN(data->m_data.input_wanning.waning[chn]);
  130. }else
  131. {
  132. UNSET_WANNING_VOLTAGE_MIN(data->m_data.input_wanning.waning[chn]);
  133. }
  134. }
  135. }
  136. }
  137. static void check_current_max(uint8_t channel)
  138. {
  139. sts_data_t *data = get_sts();
  140. if(channel == CH448_CHANNEL_1)
  141. {
  142. if(IS_CURRENT_MAX_EN(data->output_wanning_en)) {
  143. if(data->m_data.out_power.current > data->m_data.output_th.current_max)
  144. {
  145. SET_WANNING_CURRENT_MAX(data->m_data.output_waning.waning);
  146. if(IS_OVERFUNC_CURRENT_MAX(data->m_data.over_func))
  147. {
  148. data->close_output();
  149. }
  150. }else
  151. {
  152. UNSET_WANNING_CURRENT_MAX(data->m_data.output_waning.waning);
  153. }
  154. }
  155. }
  156. }
  157. static void check_power_max(uint8_t channel)
  158. {
  159. sts_data_t *data = get_sts();
  160. if(channel == CH448_CHANNEL_1)
  161. {
  162. if(IS_POWER_MAX_EN(data->output_wanning_en)) {
  163. if(data->m_data.out_power.power > data->m_data.output_th.power_max)
  164. {
  165. SET_WANNING_POWER_MAX(data->m_data.output_waning.waning);
  166. if(IS_OVERFUNC_POWER_MAX(data->m_data.over_func))
  167. {
  168. data->close_output();
  169. }
  170. }else
  171. {
  172. UNSET_WANNING_POWER_MAX(data->m_data.output_waning.waning);
  173. }
  174. }
  175. }
  176. }
  177. static void check_consumer_max(uint8_t channel)
  178. {
  179. sts_data_t *data = get_sts();
  180. if(channel == CH448_CHANNEL_1)
  181. {
  182. if(IS_CONSUMER_MAX_EN(data->output_wanning_en)) {
  183. if(data->m_data.out_power.consumer > data->m_data.output_th.consumer_max)
  184. {
  185. SET_WANNING_CONSUMER_MAX(data->m_data.output_waning.waning);
  186. if(IS_OVERFUNC_CONSUMER_MAX(data->m_data.over_func))
  187. {
  188. data->close_output();
  189. }
  190. }else
  191. {
  192. UNSET_WANNING_CONSUMER_MAX(data->m_data.output_waning.waning);
  193. }
  194. }
  195. }
  196. }
  197. static void check_freq_max(uint8_t channel)
  198. {
  199. sts_data_t *data = get_sts();
  200. if(channel != CH448_CHANNEL_1)
  201. {
  202. uint8_t chn = channel -1;
  203. if(chn > CH448_CHANNEL_3)
  204. return;
  205. if(IS_FREQ_MAX_EN(data->input_wanning_en[chn])) {
  206. if(data->m_data.input[chn].freq > data->m_data.input_th[chn].freq_max)
  207. {
  208. SET_WANNING_FREQ_MAX(data->m_data.input_wanning.waning[chn]);
  209. }else
  210. {
  211. UNSET_WANNING_FREQ_MAX(data->m_data.input_wanning.waning[chn]);
  212. }
  213. }
  214. }
  215. }
  216. static void check_freq_min(uint8_t channel)
  217. {
  218. sts_data_t *data = get_sts();
  219. if(channel != CH448_CHANNEL_1)
  220. {
  221. uint8_t chn = channel - 1;
  222. if(chn > CH448_CHANNEL_3)
  223. return;
  224. if(IS_FREQ_MIN_EN(data->input_wanning_en[chn])) {
  225. if(data->m_data.input[chn].freq < data->m_data.input_th[chn].freq_min)
  226. {
  227. SET_WANNING_FREQ_MIN(data->m_data.input_wanning.waning[chn]);
  228. }else
  229. {
  230. UNSET_WANNING_FREQ_MIN(data->m_data.input_wanning.waning[chn]);
  231. }
  232. }
  233. }
  234. }
  235. static void check_wanning(uint8_t channel)
  236. {
  237. check_voltage_max(channel);
  238. check_voltage_min(channel);
  239. check_current_max(channel);
  240. check_power_max(channel);
  241. check_consumer_max(channel);
  242. check_freq_max(channel);
  243. check_freq_min(channel);
  244. }