electricity.c 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291
  1. #include "electricity.h"
  2. #include "uart.h"
  3. #include "common.h"
  4. #include "board_cfg.h"
  5. #include "Hlw8110.h"
  6. #include "relay.h"
  7. #include "ADC.h"
  8. static board_t *board = 0;
  9. static void read_ele(uint8_t channel);
  10. static void check_wanning(uint8_t in_out,uint8_t channel);
  11. static void opt_over_func(uint8_t channel);
  12. extern float F_AC_V;
  13. extern float F_AC_I;
  14. extern float F_AC_P;
  15. extern float F_AC_LINE_Freq;
  16. extern float F_AC_E;
  17. extern float F_AC_PF;
  18. extern uint32_t adc_Avg_value[ADC_CH_N];
  19. float elec[RelaySlaveChaNum] = {0.0};
  20. void electricity_init(void)
  21. {
  22. board = get_board();
  23. #if (POWER_TYPE == POWER_DC)
  24. che442e_Init();
  25. Init_ADC();
  26. uart1_config(115200);
  27. #else
  28. uart1_config(9600);
  29. ch448f_config();
  30. for(int i = 0 ; i < RelaySlaveChaNum;i++)
  31. {
  32. select_channel(i);
  33. Init_HLW8110();
  34. }
  35. #endif
  36. board->read_ele = read_ele;
  37. board->check_wanning = check_wanning;
  38. board->opt_overfunc = opt_over_func;
  39. }
  40. static void read_ele(uint8_t channel)
  41. {
  42. if(channel < RelaySlaveChaNum)
  43. {
  44. #if (POWER_TYPE == POWER_DC)
  45. if(channel >=4)
  46. {
  47. board->md_data.r_data.r_d.ele_out[channel].voltage = read_voltage(STM32_ADC_V_2);
  48. }else
  49. {
  50. board->md_data.r_data.r_d.ele_out[channel].voltage = read_voltage(STM32_ADC_V_1);
  51. }
  52. read_adc_val();
  53. board->md_data.r_data.r_d.ele_out[channel].current = DC_I_calfunction(adc_Avg_value[channel],channel);
  54. uint32_t temp_v;
  55. uint32_t temp_i;
  56. temp_v = board->md_data.r_data.r_d.ele_out[channel].voltage / 10;
  57. temp_i = board->md_data.r_data.r_d.ele_out[channel].current / 10;
  58. board->md_data.r_data.r_d.ele_out[channel].power = (temp_v * temp_i) / 10;
  59. #else
  60. select_channel(channel);
  61. Calculate_HLW8110_MeterData();
  62. board->md_data.r_data.r_d.ele_out[channel].voltage = F_AC_V * 1000;
  63. board->md_data.r_data.r_d.ele_out[channel].current = F_AC_I * 1000;
  64. board->md_data.r_data.r_d.ele_out[channel].power = F_AC_P * 1000;
  65. board->md_data.r_data.r_d.ele_out[channel].freq = F_AC_LINE_Freq * 100;
  66. board->md_data.r_data.r_d.ele_out[channel].factor = F_AC_PF * 100;
  67. elec[channel] += F_AC_E;
  68. board->md_data.r_data.r_d.ele_out[channel].consumer = board->ele_restore[channel] + elec[channel] * 1000;
  69. if(board->md_data.r_data.r_d.ele_out[channel].voltage < 100)
  70. {
  71. board->md_data.r_data.r_d.ele_out[channel].voltage = 0;
  72. board->md_data.r_data.r_d.ele_out[channel].current = 0;
  73. board->md_data.r_data.r_d.ele_out[channel].power = 0;
  74. board->md_data.r_data.r_d.ele_out[channel].factor = 0;
  75. board->md_data.r_data.r_d.ele_out[channel].freq = 0;
  76. }else if(board->md_data.r_data.r_d.ele_out[channel].factor < 1)
  77. {
  78. board->md_data.r_data.r_d.ele_out[channel].current = 0;
  79. board->md_data.r_data.r_d.ele_out[channel].power = 0;
  80. board->md_data.r_data.r_d.ele_out[channel].factor = 0;
  81. }
  82. #endif
  83. }
  84. }
  85. static void check_wanning(uint8_t in_out,uint8_t channel)
  86. {
  87. if(in_out == ELE_INPUT)
  88. {
  89. if(IS_VOLTAGE_MAX_EN(board->in_wanning_en[channel]) &&
  90. (board->md_data.r_data.r_d.ele_3_in.info[channel].voltage > board->md_data.rw_data.rw_d.th_in[channel].th_voltage_max))
  91. {
  92. SET_WANNING_VOLTAGE_MAX(board->md_data.r_data.r_d.ele_3_in.info[channel].wanning);
  93. }else
  94. {
  95. UNSET_WANNING_VOLTAGE_MAX(board->md_data.r_data.r_d.ele_3_in.info[channel].wanning);
  96. }
  97. if(IS_VOLTAGE_MIN_EN(board->in_wanning_en[channel]) &&
  98. board->md_data.r_data.r_d.ele_3_in.info[channel].voltage < board->md_data.rw_data.rw_d.th_in[channel].th_voltage_min)
  99. {
  100. SET_WANNING_VOLTAGE_MIN(board->md_data.r_data.r_d.ele_3_in.info[channel].wanning);
  101. }else
  102. {
  103. UNSET_WANNING_VOLTAGE_MIN(board->md_data.r_data.r_d.ele_3_in.info[channel].wanning);
  104. }
  105. if(IS_CURRENT_MAX_EN(board->in_wanning_en[channel]) &&
  106. board->md_data.r_data.r_d.ele_3_in.info[channel].current > board->md_data.rw_data.rw_d.th_in[channel].th_current_max)
  107. {
  108. SET_WANNING_CURRENT_MAX(board->md_data.r_data.r_d.ele_3_in.info[channel].wanning);
  109. }else
  110. {
  111. UNSET_WANNING_CURRENT_MAX(board->md_data.r_data.r_d.ele_3_in.info[channel].wanning);
  112. }
  113. if(IS_POWER_MAX_EN(board->in_wanning_en[channel]) &&
  114. board->md_data.r_data.r_d.ele_3_in.info[channel].power > board->md_data.rw_data.rw_d.th_in[channel].th_power_max)
  115. {
  116. SET_WANNING_POWER_MAX(board->md_data.r_data.r_d.ele_3_in.info[channel].wanning);
  117. }else
  118. {
  119. UNSET_WANNING_POWER_MAX(board->md_data.r_data.r_d.ele_3_in.info[channel].wanning);
  120. }
  121. if(IS_CONSUMER_MAX_EN(board->in_wanning_en[channel]) &&
  122. board->md_data.r_data.r_d.ele_3_in.info[channel].consumer > board->md_data.rw_data.rw_d.th_in[channel].th_consumer_max)
  123. {
  124. SET_WANNING_CONSUMER_MAX(board->md_data.r_data.r_d.ele_3_in.info[channel].wanning);
  125. }else
  126. {
  127. UNSET_WANNING_CONSUMER_MAX(board->md_data.r_data.r_d.ele_3_in.info[channel].wanning);
  128. }
  129. }else
  130. {
  131. if(channel < RelaySlaveChaNum)
  132. {
  133. if(IS_VOLTAGE_MAX_EN(board->out_wanning_en[channel]) &&
  134. board->md_data.r_data.r_d.ele_out[channel].voltage > board->md_data.rw_data.rw_d.th_out[channel].th_voltage_max)
  135. {
  136. SET_WANNING_VOLTAGE_MAX(board->md_data.r_data.r_d.ele_out[channel].wanning);
  137. if(IS_OVERFUNC_VOLTAGE_MAX(board->md_data.rw_data.rw_d.over_func_out[channel]))
  138. {
  139. board->over_func[channel] = 1;
  140. }
  141. }else
  142. {
  143. UNSET_WANNING_VOLTAGE_MAX(board->md_data.r_data.r_d.ele_out[channel].wanning);
  144. }
  145. if(IS_VOLTAGE_MIN_EN(board->out_wanning_en[channel]) &&
  146. board->md_data.r_data.r_d.ele_out[channel].voltage < board->md_data.rw_data.rw_d.th_out[channel].th_voltage_min)
  147. {
  148. SET_WANNING_VOLTAGE_MIN(board->md_data.r_data.r_d.ele_out[channel].wanning);
  149. if(IS_OVERFUNC_VOLTAGE_MIN(board->md_data.rw_data.rw_d.over_func_out[channel]))
  150. {
  151. board->over_func[channel] = 1;
  152. }
  153. }else
  154. {
  155. UNSET_WANNING_VOLTAGE_MIN(board->md_data.r_data.r_d.ele_out[channel].wanning);
  156. }
  157. if(IS_CURRENT_MAX_EN(board->out_wanning_en[channel]) &&
  158. board->md_data.r_data.r_d.ele_out[channel].current > board->md_data.rw_data.rw_d.th_out[channel].th_current_max)
  159. {
  160. SET_WANNING_CURRENT_MAX(board->md_data.r_data.r_d.ele_out[channel].wanning);
  161. if(IS_OVERFUNC_CURRENT_MAX(board->md_data.rw_data.rw_d.over_func_out[channel]))
  162. {
  163. board->over_func[channel] = 1;
  164. }
  165. }else
  166. {
  167. UNSET_WANNING_CURRENT_MAX(board->md_data.r_data.r_d.ele_out[channel].wanning);
  168. }
  169. if(IS_POWER_MAX_EN(board->out_wanning_en[channel]) &&
  170. board->md_data.r_data.r_d.ele_out[channel].voltage > board->md_data.rw_data.rw_d.th_out[channel].th_power_max)
  171. {
  172. SET_WANNING_POWER_MAX(board->md_data.r_data.r_d.ele_out[channel].wanning);
  173. if(IS_OVERFUNC_POWER_MAX(board->md_data.rw_data.rw_d.over_func_out[channel]))
  174. {
  175. board->over_func[channel] = 1;
  176. }
  177. }else
  178. {
  179. UNSET_WANNING_POWER_MAX(board->md_data.r_data.r_d.ele_out[channel].wanning);
  180. }
  181. if(IS_CONSUMER_MAX_EN(board->out_wanning_en[channel]) &&
  182. board->md_data.r_data.r_d.ele_out[channel].voltage > board->md_data.rw_data.rw_d.th_out[channel].th_consumer_max)
  183. {
  184. SET_WANNING_CONSUMER_MAX(board->md_data.r_data.r_d.ele_out[channel].wanning);
  185. if(IS_OVERFUNC_CONSUMER_MAX(board->md_data.rw_data.rw_d.over_func_out[channel]))
  186. {
  187. board->over_func[channel] = 1;
  188. }
  189. }else
  190. {
  191. UNSET_WANNING_CONSUMER_MAX(board->md_data.r_data.r_d.ele_out[channel].wanning);
  192. }
  193. }
  194. }
  195. }
  196. static void opt_over_func(uint8_t channel)
  197. {
  198. #if (POWER_TYPE == POWER_AC_3_1 || POWER_TYPE == POWER_AC || POWER_TYPE == POWER_DC)
  199. if(board->over_func[channel])
  200. {
  201. board->over_func[channel] = 0;
  202. if(board->md_data.rw_data.rw_d.relay_status[channel] == RELAY_OPEN && board->md_data.rw_data.rw_d.chn_ctrl[channel] == 0)
  203. {
  204. async_data da = {0};
  205. da.channel = channel;
  206. da.fire_or_zero = _FIRE;
  207. da.method = PROMPT_CTRL;
  208. da.reg = &board->relay_staging_staus[channel];
  209. da.status = RELAY_CLOSE;
  210. da.w_eep_flag = FLAG_N_W_EEP;
  211. set_relay_sta_async(&da);
  212. }
  213. }
  214. #elif (POWER_TYPE == POWER_AC_3_3)
  215. if((channel+1) % 3 == 0)
  216. {
  217. if(board->over_func[channel] || board->over_func[channel-1] || board->over_func[channel-2])
  218. {
  219. if( board->md_data.rw_data.rw_d.relay_status[channel ] == RELAY_OPEN ||
  220. board->md_data.rw_data.rw_d.relay_status[channel-1] == RELAY_OPEN ||
  221. board->md_data.rw_data.rw_d.relay_status[channel-2] == RELAY_OPEN)
  222. {
  223. async_data da = {0};
  224. if(board->md_data.rw_data.rw_d.relay_status[channel ] == RELAY_OPEN &&
  225. board->md_data.rw_data.rw_d.chn_ctrl[channel] == 0)
  226. {
  227. da.channel = channel;
  228. da.fire_or_zero = _FIRE;
  229. da.method = PROMPT_CTRL;
  230. da.reg = &board->relay_staging_staus[channel];
  231. da.status = RELAY_CLOSE;
  232. da.w_eep_flag = FLAG_N_W_EEP;
  233. set_relay_sta_async(&da);
  234. }
  235. if(board->md_data.rw_data.rw_d.relay_status[channel-1] == RELAY_OPEN &&
  236. board->md_data.rw_data.rw_d.chn_ctrl[channel-1] == 0)
  237. {
  238. da.channel = channel-1;
  239. da.fire_or_zero = _FIRE;
  240. da.method = PROMPT_CTRL;
  241. da.reg = &board->relay_staging_staus[channel-1];
  242. da.status = RELAY_CLOSE;
  243. da.w_eep_flag = FLAG_N_W_EEP;
  244. set_relay_sta_async(&da);
  245. }
  246. if(board->md_data.rw_data.rw_d.relay_status[channel-2] == RELAY_OPEN &&
  247. board->md_data.rw_data.rw_d.chn_ctrl[channel-2] == 0)
  248. {
  249. da.channel = channel-2;
  250. da.fire_or_zero = _FIRE;
  251. da.method = PROMPT_CTRL;
  252. da.reg = &board->relay_staging_staus[channel-2];
  253. da.status = RELAY_CLOSE;
  254. da.w_eep_flag = FLAG_N_W_EEP;
  255. set_relay_sta_async(&da);
  256. }
  257. }
  258. board->over_func[channel] = 0;
  259. board->over_func[channel-1] =0;
  260. board->over_func[channel-2] =0;
  261. }
  262. }
  263. #endif
  264. }