Electricity.c 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348
  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. sts_data_t *data = get_sts();
  44. select_channel(channel);
  45. if(channel == 0)
  46. {
  47. Calculate_HLW8110_MeterData(data->m_data.output_i_k,data->m_data.output_v_k);
  48. }else
  49. {
  50. Calculate_HLW8110_MeterData(data->m_data.input_i_k[channel-1],data->m_data.input_v_k[channel-1]);
  51. }
  52. if(F_AC_V < 6.0)
  53. {
  54. F_AC_V = 0.0;
  55. F_AC_I = 0.0;
  56. F_AC_P = 0.0;
  57. F_AC_LINE_Freq = 0.0;
  58. F_AC_PF = 0.0;
  59. }else if(F_AC_PF < 0.1 || F_AC_PF > 1 || F_AC_P < 1)
  60. {
  61. F_AC_I = 0.0;
  62. F_AC_P = 0.0;
  63. F_AC_PF = 0.0;
  64. }else if(F_AC_LINE_Freq > 100)
  65. {
  66. F_AC_LINE_Freq = 0.0;
  67. }
  68. if(channel == 0)
  69. {
  70. data->m_data.out_power.voltage = F_AC_V * 1000;
  71. data->m_data.out_power.current = F_AC_I * 1000;
  72. data->m_data.out_power.power = F_AC_P* 1000;
  73. data->m_data.out_power.freq = F_AC_LINE_Freq * 1000;
  74. data->m_data.out_power.factor = F_AC_PF * 1000;
  75. data->iic_consumer += F_AC_E;
  76. data->m_data.out_power.consumer = data->iic_consumer * 1000;
  77. }else
  78. {
  79. data->m_data.input[channel-1].voltage = F_AC_V * 1000;
  80. data->m_data.input[channel-1].freq = F_AC_LINE_Freq * 1000;
  81. }
  82. }
  83. static void check_voltage_max(uint8_t channel)
  84. {
  85. sts_data_t *data = get_sts();
  86. if(channel == CH448_CHANNEL_1)
  87. {
  88. if(IS_VOLTAGE_MAX_EN(data->output_wanning_en)) {
  89. if(data->m_data.out_power.voltage > data->m_data.output_th.voltage_max)
  90. {
  91. SET_WANNING_VOLTAGE_MAX(data->m_data.output_waning.waning);
  92. if(!data->o_beep.o_t.o_v_max)
  93. {
  94. data->o_beep.o_t.o_v_max =1;
  95. data->o_beep_flag.o_t.o_v_max =1;
  96. data->beep_count = data->wanning_count;
  97. }
  98. if(IS_OVERFUNC_VOLTAGE_MAX(data->m_data.over_func))
  99. {
  100. data->close_output();
  101. }
  102. }else
  103. {
  104. UNSET_WANNING_VOLTAGE_MAX(data->m_data.output_waning.waning);
  105. if(data->o_beep.o_t.o_v_max)
  106. {
  107. data->o_beep.o_t.o_v_max = 0;
  108. data->o_beep_flag.o_t.o_v_max = 0;
  109. }
  110. }
  111. }
  112. }else
  113. {
  114. uint8_t chn = channel-1;
  115. if(IS_VOLTAGE_MAX_EN(data->input_wanning_en[chn])) {
  116. if(data->m_data.input[chn].voltage > data->m_data.input_th[chn].voltage_max)
  117. {
  118. if(!data->i_beep[chn].i_t.i_v_max)
  119. {
  120. data->i_beep[chn].i_t.i_v_max =1;
  121. data->i_beep_flag[chn].i_t.i_v_max =1;
  122. data->beep_count = data->wanning_count;
  123. }
  124. SET_WANNING_VOLTAGE_MAX(data->m_data.input_wanning.waning[chn]);
  125. }else
  126. {
  127. UNSET_WANNING_VOLTAGE_MAX(data->m_data.input_wanning.waning[chn]);
  128. data->i_beep[chn].i_t.i_v_max =0;
  129. data->i_beep_flag[chn].i_t.i_v_max =0;
  130. }
  131. }
  132. }
  133. }
  134. static void check_voltage_min(uint8_t channel)
  135. {
  136. sts_data_t *data = get_sts();
  137. if(channel == CH448_CHANNEL_1)
  138. {
  139. if(IS_VOLTAGE_MIN_EN(data->output_wanning_en)) {
  140. if(data->m_data.out_power.voltage < data->m_data.output_th.voltage_min)
  141. {
  142. if(!data->o_beep.o_t.o_v_max)
  143. {
  144. data->o_beep.o_t.o_v_min =1;
  145. data->o_beep_flag.o_t.o_v_min =1;
  146. data->beep_count = data->wanning_count;
  147. }
  148. SET_WANNING_VOLTAGE_MIN(data->m_data.output_waning.waning);
  149. if(IS_OVERFUNC_VOLTAGE_MIN(data->m_data.over_func))
  150. {
  151. data->close_output();
  152. }
  153. }else
  154. {
  155. data->o_beep.o_t.o_v_min = 0;
  156. data->o_beep_flag.o_t.o_v_min = 0;
  157. UNSET_WANNING_VOLTAGE_MIN(data->m_data.output_waning.waning);
  158. }
  159. }
  160. }else
  161. {
  162. uint8_t chn = channel-1;
  163. if(IS_VOLTAGE_MIN_EN(data->input_wanning_en[chn])) {
  164. if(data->m_data.input[chn].voltage < data->m_data.input_th[chn].voltage_min)
  165. {
  166. if(!data->i_beep[chn].i_t.i_v_min)
  167. {
  168. data->i_beep[chn].i_t.i_v_min =1;
  169. data->i_beep_flag[chn].i_t.i_v_min =1;
  170. data->beep_count = data->wanning_count;
  171. }
  172. SET_WANNING_VOLTAGE_MIN(data->m_data.input_wanning.waning[chn]);
  173. }else
  174. {
  175. UNSET_WANNING_VOLTAGE_MIN(data->m_data.input_wanning.waning[chn]);
  176. data->i_beep[chn].i_t.i_v_min =0;
  177. data->i_beep_flag[chn].i_t.i_v_min =0;
  178. }
  179. }
  180. }
  181. }
  182. static void check_current_max(uint8_t channel)
  183. {
  184. sts_data_t *data = get_sts();
  185. if(channel == CH448_CHANNEL_1)
  186. {
  187. if(IS_CURRENT_MAX_EN(data->output_wanning_en)) {
  188. if(data->m_data.out_power.current > data->m_data.output_th.current_max)
  189. {
  190. SET_WANNING_CURRENT_MAX(data->m_data.output_waning.waning);
  191. if(!data->o_beep.o_t.o_i_max)
  192. {
  193. data->o_beep.o_t.o_i_max =1;
  194. data->o_beep_flag.o_t.o_i_max =1;
  195. data->beep_count = data->wanning_count;
  196. }
  197. if(IS_OVERFUNC_CURRENT_MAX(data->m_data.over_func))
  198. {
  199. data->close_output();
  200. }
  201. }else
  202. {
  203. data->o_beep.o_t.o_i_max =0;
  204. data->o_beep_flag.o_t.o_i_max =0;
  205. UNSET_WANNING_CURRENT_MAX(data->m_data.output_waning.waning);
  206. }
  207. }
  208. }
  209. }
  210. static void check_power_max(uint8_t channel)
  211. {
  212. sts_data_t *data = get_sts();
  213. if(channel == CH448_CHANNEL_1)
  214. {
  215. if(IS_POWER_MAX_EN(data->output_wanning_en)) {
  216. if(data->m_data.out_power.power > data->m_data.output_th.power_max)
  217. {
  218. if(!data->o_beep.o_t.o_p_max)
  219. {
  220. data->o_beep.o_t.o_p_max =1;
  221. data->o_beep_flag.o_t.o_p_max =1;
  222. data->beep_count = data->wanning_count;
  223. }
  224. SET_WANNING_POWER_MAX(data->m_data.output_waning.waning);
  225. if(IS_OVERFUNC_POWER_MAX(data->m_data.over_func))
  226. {
  227. data->close_output();
  228. }
  229. }else
  230. {
  231. data->o_beep.o_t.o_p_max = 0;
  232. data->o_beep_flag.o_t.o_p_max = 0;
  233. UNSET_WANNING_POWER_MAX(data->m_data.output_waning.waning);
  234. }
  235. }
  236. }
  237. }
  238. static void check_consumer_max(uint8_t channel)
  239. {
  240. sts_data_t *data = get_sts();
  241. if(channel == CH448_CHANNEL_1)
  242. {
  243. if(IS_CONSUMER_MAX_EN(data->output_wanning_en)) {
  244. if(data->m_data.out_power.consumer > data->m_data.output_th.consumer_max)
  245. {
  246. if(!data->o_beep.o_t.o_c_max)
  247. {
  248. data->o_beep.o_t.o_c_max =1;
  249. data->o_beep_flag.o_t.o_c_max =1;
  250. data->beep_count = data->wanning_count;
  251. }
  252. SET_WANNING_CONSUMER_MAX(data->m_data.output_waning.waning);
  253. if(IS_OVERFUNC_CONSUMER_MAX(data->m_data.over_func))
  254. {
  255. data->close_output();
  256. }
  257. }else
  258. {
  259. data->o_beep.o_t.o_c_max =0;
  260. data->o_beep_flag.o_t.o_c_max =0;
  261. UNSET_WANNING_CONSUMER_MAX(data->m_data.output_waning.waning);
  262. }
  263. }
  264. }
  265. }
  266. static void check_freq_max(uint8_t channel)
  267. {
  268. sts_data_t *data = get_sts();
  269. if(channel != CH448_CHANNEL_1)
  270. {
  271. uint8_t chn = channel -1;
  272. if(chn > CH448_CHANNEL_3)
  273. return;
  274. if(IS_FREQ_MAX_EN(data->input_wanning_en[chn])) {
  275. if(data->m_data.input[chn].freq > data->m_data.input_th[chn].freq_max)
  276. {
  277. if(!data->i_beep[chn].i_t.i_hz_max)
  278. {
  279. data->i_beep[chn].i_t.i_hz_max =1;
  280. data->i_beep_flag[chn].i_t.i_hz_max =1;
  281. data->beep_count = data->wanning_count;
  282. }
  283. SET_WANNING_FREQ_MAX(data->m_data.input_wanning.waning[chn]);
  284. }else
  285. {
  286. data->i_beep[chn].i_t.i_hz_max =0;
  287. data->i_beep_flag[chn].i_t.i_hz_max =0;
  288. UNSET_WANNING_FREQ_MAX(data->m_data.input_wanning.waning[chn]);
  289. }
  290. }
  291. }
  292. }
  293. static void check_freq_min(uint8_t channel)
  294. {
  295. sts_data_t *data = get_sts();
  296. if(channel != CH448_CHANNEL_1)
  297. {
  298. uint8_t chn = channel - 1;
  299. if(chn > CH448_CHANNEL_3)
  300. return;
  301. if(IS_FREQ_MIN_EN(data->input_wanning_en[chn])) {
  302. if(data->m_data.input[chn].freq < data->m_data.input_th[chn].freq_min)
  303. {
  304. if(!data->i_beep[chn].i_t.i_hz_min)
  305. {
  306. data->i_beep[chn].i_t.i_hz_min =1;
  307. data->i_beep_flag[chn].i_t.i_hz_min =1;
  308. data->beep_count = data->wanning_count;
  309. }
  310. SET_WANNING_FREQ_MIN(data->m_data.input_wanning.waning[chn]);
  311. }else
  312. {
  313. data->i_beep[chn].i_t.i_hz_min =0;
  314. data->i_beep_flag[chn].i_t.i_hz_min =0;
  315. UNSET_WANNING_FREQ_MIN(data->m_data.input_wanning.waning[chn]);
  316. }
  317. }
  318. }
  319. }
  320. static void check_wanning(uint8_t channel)
  321. {
  322. check_voltage_max(channel);
  323. check_voltage_min(channel);
  324. check_current_max(channel);
  325. check_power_max(channel);
  326. check_consumer_max(channel);
  327. check_freq_max(channel);
  328. check_freq_min(channel);
  329. }