Electricity.c 6.2 KB

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