HLW8110.c 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215
  1. /*=========================================================================================================
  2. * File Name : HLW8110.c
  3. * Describe : HLW8110 UART 通讯程序,使用USATR2.(HLW8110 code,use USATE2)
  4. * Author : Tuqiang
  5. * Version : V1.3
  6. * Record : 2019/04/16,V1.2
  7. * Record : 2020/04/02, V1.3
  8. ==========================================================================================================*/
  9. #include "HLW8110.h"
  10. #include "stdio.h"
  11. #include "TM52F1386_bsp.h"
  12. #include "sTimeout.h"
  13. #include "iap.h"
  14. #include "uart2.h"
  15. #define HIGH 1
  16. #define LOW 0
  17. //8112A通道或8110通道校正系数
  18. #define D_CAL_U 1000/1000 //电压校正系数
  19. #define D_CAL_A_I 1000/1000 //A通道电流校正系数
  20. #define D_CAL_A_P 1000/1000 //A通道功率校正系数
  21. #define D_CAL_A_E 1000/1000 //A通道电能校正系数
  22. //8112 B通道校正系数
  23. #define D_CAL_B_P 1000/1000 //B通道功率校正系数
  24. #define D_CAL_B_I 1000/1000 //B通道电流校正系数
  25. #define D_CAL_B_E 1000/1000 //B通道电能校正系数
  26. unsigned char HLW8110Msg = 0; //程序状态机
  27. hlw8110_power_t hlw8110_power_data;
  28. long int SystemTimer;
  29. unsigned char power_data[50];
  30. /*---------------------------------------------------------------------------------------------------------*/
  31. /*---------------------------------------------------------------------------------------------------------*/
  32. union IntData
  33. {
  34. unsigned int inte;
  35. unsigned char byte[2];
  36. };
  37. union LongData
  38. {
  39. unsigned long word_;
  40. unsigned int inte_[2];
  41. unsigned char byte_[4];
  42. };
  43. /*---------------------------------------------------------------------------------------------------------*/
  44. /*---------------------------------------------------------------------------------------------------------*/
  45. unsigned char u8_TxBuf[10] = {0xA5,0x70};
  46. unsigned char u8_RxBuf[10];
  47. unsigned char u8_TX_Length;
  48. unsigned char u8_RX_Length;
  49. unsigned char u8_RX_Index = 0;
  50. //unsigned char B_ReadReg_Time_EN; // 串口读取寄存器数据,时间计数器标志位,1--开启计数,0--关闭计数
  51. //unsigned char B_Tx_Finish;
  52. unsigned char B_Rx_Finish;
  53. unsigned char B_Rx_Data_ING; // 接收数据标志位 , < 1:接收数据中,0:未接收到数据 >
  54. unsigned char B_Read_Error; // UART读取出据校验和出错,< 1:数据读错,0:数据读取正确 >
  55. //unsigned char u8_ReadReg_Index;
  56. //unsigned char u8_ReadReg_Time; // 串口读取寄存器数据的时间
  57. /*---------------------------------------------------------------------------------------------------------*/
  58. /*---------------------------------------------------------------------------------------------------------*/
  59. unsigned int U16_TempData;
  60. unsigned int U16_IFData;
  61. unsigned int U16_RIFData;
  62. unsigned int U16_LineFData;
  63. unsigned int U16_AngleData;
  64. unsigned int U16_PFData;
  65. unsigned int U16_HFConst_RegData;
  66. /*---------------------------------------------------------------------------------------------------------*/
  67. /*---------------------------------------------------------------------------------------------------------*/
  68. unsigned int U16_RMSIAC_RegData[3]; // A通道电流转换系数
  69. unsigned int U16_RMSIBC_RegData[3]; // B通道电流转换系数
  70. unsigned int U16_RMSUC_RegData[3]; // 电压通道转换系数
  71. unsigned int U16_PowerPAC_RegData[3]; // A通道功率转换系数
  72. unsigned int U16_PowerPBC_RegData[3]; // B通道功率转换系数
  73. unsigned int U16_PowerSC_RegData[3]; // 视在功率转换系数,如果选择A通道,则是A通道视在功率转换系数。A和B通道只能二者选其一
  74. unsigned int U16_EnergyAC_RegData[3]; // A通道有功电能(量)转换系数
  75. unsigned int U16_EnergyBC_RegData[3]; // A通道有功电能(量)转换系数
  76. unsigned int U16_CheckSUM_RegData[3]; // 转换系数的CheckSum
  77. unsigned int U16_CheckSUM_Data; // 转换系数计算出来的CheckSum
  78. unsigned int U16_Check_SysconReg_Data;
  79. unsigned int U16_Check_EmuconReg_Data;
  80. unsigned int U16_Check_Emucon2Reg_Data;
  81. /*---------------------------------------------------------------------------------------------------------*/
  82. /*---------------------------------------------------------------------------------------------------------*/
  83. unsigned long U32_RMSIA_RegData; // A通道电流有效值寄存器
  84. unsigned long U32_RMSU_RegData; // 电压有效值寄存器
  85. unsigned long U32_POWERPA_RegData; // A通道功率有效值寄存器
  86. unsigned long U32_ENERGY_PA_RegData; // A通道有功电能(量)有效值寄存器
  87. unsigned long U32_RMSIB_RegData; // B通道电流有效值寄存器
  88. unsigned long U32_POWERPB_RegData; // B通道功率有效值寄存器
  89. unsigned long U32_ENERGY_PB_RegData; // B通道有功电能(量)有效值寄存器
  90. /*---------------------------------------------------------------------------------------------------------*/
  91. /*---------------------------------------------------------------------------------------------------------*/
  92. float F_AC_V; // 电压有效值
  93. float F_AC_I; // A通道电流
  94. float F_AC_P; // A通道有功功率
  95. float F_AC_E; // A通道有功电能(量)
  96. float F_AC_BACKUP_E; // A通道电量备份
  97. float F_AC_PF; // 功率因素,A通道和B通道只能选其一
  98. float F_Angle; // 相角,A通道和B通道只能选其一
  99. /*---------------------------------------------------------------------------------------------------------*/
  100. /*---------------------------------------------------------------------------------------------------------*/
  101. /*=========================================================================================================
  102. * Function : void Clear_RxBuf(void)
  103. * Describe : 在准备接收串口数据前,清空接收缓存器的数据
  104. * Input : none
  105. * Output : none
  106. * Return : none
  107. * Record : 2019/04/03
  108. =========================================================================================================*/
  109. void Clear_RxBuf(void)
  110. {
  111. unsigned char i;
  112. for(i = 0;i<10;i++)
  113. {
  114. u8_RxBuf[i] = 0x00;
  115. }
  116. B_Rx_Data_ING = 0;
  117. B_Rx_Finish = FALSE;
  118. u8_RX_Index = 0;
  119. }
  120. /*=========================================================================================================
  121. * Function : unsigned char HLW8110_checkSum_Write(unsigned char u8_Reg_length)
  122. * Describe :
  123. * Input : none
  124. * Output : none
  125. * Return : none
  126. * Record : 2019/04/03
  127. =========================================================================================================*/
  128. unsigned char HLW8110_checkSum_Write(unsigned char u8_Reg_length)
  129. {
  130. unsigned char i;
  131. unsigned char Temp_u8_checksum;
  132. unsigned int a;
  133. a = 0x0000;
  134. Temp_u8_checksum = 0;
  135. for (i = 0; i< (u8_Reg_length-1); i++)
  136. {
  137. a += u8_TxBuf[i];
  138. }
  139. a = ~a;
  140. Temp_u8_checksum = a & 0xff;
  141. return Temp_u8_checksum;
  142. }
  143. /*=========================================================================================================
  144. * Function : unsigned char HLW8110_checkSum_Read(void)
  145. * Describe :
  146. * Input : none
  147. * Output : none
  148. * Return : none
  149. * Record : 2019/04/03
  150. ==========================================================================================================*/
  151. unsigned char HLW8110_checkSum_Read(unsigned char u8_Reg_length)
  152. {
  153. unsigned char i;
  154. unsigned char Temp_u8_checksum;
  155. unsigned int a;
  156. a = 0x0000;
  157. Temp_u8_checksum = 0;
  158. for (i = 0; i< (u8_Reg_length-1); i++)
  159. {
  160. a += u8_RxBuf[i];
  161. }
  162. a = a + u8_TxBuf[0] + u8_TxBuf[1];
  163. a = ~a;
  164. Temp_u8_checksum = a & 0xff;
  165. return Temp_u8_checksum;
  166. }
  167. /*=========================================================================================================
  168. * Function : void Uart_HLW8110_WriteREG_EN(void)
  169. * Describe :
  170. * Input : none
  171. * Output : none
  172. * Return : none
  173. * Record : 2019/04/03
  174. ==========================================================================================================*/
  175. void Uart_HLW8110_WriteREG_EN(void)
  176. {
  177. u8_TX_Length = 4;
  178. u8_RX_Length = 0;
  179. u8_TxBuf[0] = 0xa5;
  180. u8_TxBuf[1] = 0xea;
  181. u8_TxBuf[2] = 0xe5;
  182. // u8_TxBuf[3] = 0x8b; //checksum
  183. u8_TxBuf[3] = HLW8110_checkSum_Write(u8_TX_Length);
  184. Start_Send_UartData(u8_TX_Length);
  185. }
  186. /*=========================================================================================================
  187. * Function : void Uart_HLW8110_WriteREG_DIS(void)
  188. * Describe :
  189. * Input : none
  190. * Output : none
  191. * Return : none
  192. * Record : 2019/04/03
  193. ==========================================================================================================*/
  194. void Uart_HLW8110_WriteREG_DIS(void)
  195. {
  196. u8_TX_Length = 4;
  197. u8_RX_Length = 0;
  198. u8_TxBuf[0] = 0xa5;
  199. u8_TxBuf[1] = 0xea;
  200. u8_TxBuf[2] = 0xdc;
  201. // u8_TxBuf[3] = 0x94; //checksum
  202. u8_TxBuf[3] = HLW8110_checkSum_Write(u8_TX_Length);
  203. Start_Send_UartData(u8_TX_Length);
  204. }
  205. /*=========================================================================================================
  206. * Function : void Uart_HLW8110_Set_Channel_A(void)
  207. * Describe :
  208. * Input : none
  209. * Output : none
  210. * Return : none
  211. * Record : 2019/04/03
  212. ==========================================================================================================*/
  213. void Uart_HLW8110_Set_Channel_A(void)
  214. {
  215. u8_TX_Length = 4;
  216. u8_RX_Length = 0;
  217. u8_TxBuf[0] = 0xa5;
  218. u8_TxBuf[1] = 0xea;
  219. u8_TxBuf[2] = 0x5a;
  220. // u8_TxBuf[3] = 0x16; //checksum
  221. u8_TxBuf[3] = HLW8110_checkSum_Write(u8_TX_Length);
  222. Start_Send_UartData(u8_TX_Length);
  223. }
  224. /*=========================================================================================================
  225. * Function : void Uart_Read_HLW8110_Reg(unsigned char ADDR_Reg,unsigned char u8_reg_length)
  226. * Describe :
  227. * Input :
  228. * Output :
  229. * Return :
  230. * Record : 2019/04/04
  231. ==========================================================================================================*/
  232. void Uart_Read_HLW8110_Reg(unsigned char ADDR_Reg,unsigned char u8_reg_length)
  233. {
  234. u8_TxBuf[0] = 0xa5;
  235. u8_TxBuf[1] = ADDR_Reg;
  236. u8_TX_Length = 2;
  237. u8_RX_Length = u8_reg_length + 1; // +1,是因为接收的数据长度,除了REG值,还有一个校验和数据
  238. Clear_RxBuf(); //清空接收缓冲区
  239. Start_Send_UartData(u8_TX_Length);
  240. }
  241. /*=========================================================================================================
  242. * Function : void Uart_Write_HLW8110_Reg(unsigned char ADDR_Reg,unsigned char u8_reg_length,unsigned long u32_data)
  243. * Describe : 写寄存器命令,u8_reg_length:写入的寄存器数据字节长度
  244. * Input :
  245. * Output :
  246. * Return :
  247. * Record : 2019/04/03
  248. ==========================================================================================================*/
  249. void Uart_Write_HLW8110_Reg(unsigned char ADDR_Reg,unsigned char u8_reg_length,unsigned long u32_data)
  250. {
  251. unsigned char i;
  252. union LongData Temp_u32_a;
  253. u8_TxBuf[0] = 0xa5;
  254. u8_TxBuf[1] = ADDR_Reg|0x80;
  255. Temp_u32_a.word_ = u32_data;
  256. for (i = 0; i< u8_reg_length; i++)
  257. {
  258. u8_TxBuf[i+2] = Temp_u32_a.byte_[u8_reg_length-1-i]; //STM32,32位MCU,union定义,是低位在前
  259. //u8_TxBuf[i+2] = Temp_u32_a.byte[4-u8_reg_length + i]; //STM8,STC MCU, union定义,是高位在前
  260. }
  261. u8_TX_Length = 3 + u8_reg_length ;
  262. u8_RX_Length = 0;
  263. u8_TxBuf[u8_TX_Length-1] = HLW8110_checkSum_Write(u8_TX_Length);
  264. Start_Send_UartData(u8_TX_Length);
  265. }
  266. /*=========================================================================================================
  267. * Function : void Uart_HLW8110_Reset(void)
  268. * Describe :
  269. * Input : none
  270. * Output : none
  271. * Return : none
  272. * Record : 2019/04/03
  273. ==========================================================================================================*/
  274. void Uart_HLW8110_Reset(void)
  275. {
  276. u8_TX_Length = 4;
  277. u8_RX_Length = 0;
  278. u8_TxBuf[0] = 0xa5;
  279. u8_TxBuf[1] = 0xea;
  280. u8_TxBuf[2] = 0x96;
  281. // u8_TxBuf[3] = 0xda; //checksum
  282. u8_TxBuf[3] = HLW8110_checkSum_Write(u8_TX_Length);
  283. Start_Send_UartData(u8_TX_Length);
  284. }
  285. /*=========================================================================================================
  286. * Function : void Judge_CheckSum_HLW8110_Calfactor(void)
  287. * Describe : 验证地址0x70-0x77地址的系数和
  288. * Input : none
  289. * Output : none
  290. * Return : none
  291. * Record : 2019/03/18
  292. ==========================================================================================================*/
  293. unsigned char Judge_CheckSum_HLW8110_Calfactor(unsigned char nun)
  294. {
  295. unsigned long a;
  296. //unsigned int b;
  297. //unsigned int c;
  298. unsigned char d;
  299. //读取RmsIAC、RmsIBC、RmsUC、PowerPAC、PowerPBC、PowerSC、EnergAc、EnergBc的值
  300. Uart_Read_HLW8110_Reg(REG_RMS_IAC_ADDR,2);
  301. bsp_delay_ms(30);
  302. if ( u8_RxBuf[u8_RX_Length-1] == HLW8110_checkSum_Read(u8_RX_Length) )
  303. {
  304. if(nun == 1) //第一路
  305. {
  306. U16_RMSIAC_RegData[0] = (u8_RxBuf[0]<<8) + u8_RxBuf[1] ; //printf("A通道电流转换系数:%x\n " ,U16_RMSIAC_RegData);
  307. }
  308. else if(nun == 2) //第二路
  309. {
  310. U16_RMSIAC_RegData[1] = (u8_RxBuf[0]<<8) + u8_RxBuf[1] ; //printf("A通道电流转换系数:%x\n " ,U16_RMSIAC_RegData);
  311. }
  312. else if(nun == 3) //第三路
  313. {
  314. U16_RMSIAC_RegData[2] = (u8_RxBuf[0]<<8) + u8_RxBuf[1] ; //printf("A通道电流转换系数:%x\n " ,U16_RMSIAC_RegData);
  315. }
  316. }
  317. Uart_Read_HLW8110_Reg(REG_RMS_IBC_ADDR,2);
  318. bsp_delay_ms(30);
  319. if ( u8_RxBuf[u8_RX_Length-1] == HLW8110_checkSum_Read(u8_RX_Length) )
  320. {
  321. if(nun == 1) //第一路
  322. {
  323. U16_RMSIBC_RegData[0] = (u8_RxBuf[0]<<8) + u8_RxBuf[1] ; //printf("B通道电流转换系数:%x\n " ,U16_RMSIBC_RegData);
  324. }
  325. else if(nun == 2) //第二路
  326. {
  327. U16_RMSIBC_RegData[1] = (u8_RxBuf[0]<<8) + u8_RxBuf[1] ; //printf("B通道电流转换系数:%x\n " ,U16_RMSIBC_RegData);
  328. }
  329. else if(nun == 3) //第三路
  330. {
  331. U16_RMSIBC_RegData[2] = (u8_RxBuf[0]<<8) + u8_RxBuf[1] ; //printf("B通道电流转换系数:%x\n " ,U16_RMSIBC_RegData);
  332. }
  333. }
  334. Uart_Read_HLW8110_Reg(REG_RMS_UC_ADDR,2);
  335. bsp_delay_ms(30);
  336. if ( u8_RxBuf[u8_RX_Length-1] == HLW8110_checkSum_Read(u8_RX_Length) )
  337. {
  338. if(nun == 1) //第一路
  339. {
  340. U16_RMSUC_RegData[0] = (u8_RxBuf[0]<<8) + u8_RxBuf[1] ;//printf("电压通道转换系数:%x\n " ,U16_RMSUC_RegData);
  341. }
  342. else if(nun == 2) //第二路
  343. {
  344. U16_RMSUC_RegData[1] = (u8_RxBuf[0]<<8) + u8_RxBuf[1] ;//printf("电压通道转换系数:%x\n " ,U16_RMSUC_RegData);
  345. }
  346. else if(nun == 3) //第三路
  347. {
  348. U16_RMSUC_RegData[2] = (u8_RxBuf[0]<<8) + u8_RxBuf[1] ;//printf("电压通道转换系数:%x\n " ,U16_RMSUC_RegData);
  349. }
  350. }
  351. Uart_Read_HLW8110_Reg(REG_POWER_PAC_ADDR,2);
  352. bsp_delay_ms(30);
  353. if ( u8_RxBuf[u8_RX_Length-1] == HLW8110_checkSum_Read(u8_RX_Length) )
  354. {
  355. if(nun == 1) //第一路
  356. {
  357. U16_PowerPAC_RegData[0] = (u8_RxBuf[0]<<8) + u8_RxBuf[1] ;//printf("A通道功率转换系数:%x\n " ,U16_PowerPAC_RegData);
  358. }
  359. else if(nun == 2) //第二路
  360. {
  361. U16_PowerPAC_RegData[1] = (u8_RxBuf[0]<<8) + u8_RxBuf[1] ;//printf("A通道功率转换系数:%x\n " ,U16_PowerPAC_RegData);
  362. }
  363. else if(nun == 3) //第三路
  364. {
  365. U16_PowerPAC_RegData[2] = (u8_RxBuf[0]<<8) + u8_RxBuf[1] ;//printf("A通道功率转换系数:%x\n " ,U16_PowerPAC_RegData);
  366. }
  367. }
  368. Uart_Read_HLW8110_Reg(REG_POWER_PBC_ADDR,2);
  369. bsp_delay_ms(30);
  370. if ( u8_RxBuf[u8_RX_Length-1] == HLW8110_checkSum_Read(u8_RX_Length) )
  371. {
  372. if(nun == 1) //第一路
  373. {
  374. U16_PowerPBC_RegData[0] = (u8_RxBuf[0]<<8) + u8_RxBuf[1] ;//printf("B通道功率转换系数:%x\n " ,U16_PowerPAC_RegData);
  375. }
  376. else if(nun == 2) //第二路
  377. {
  378. U16_PowerPBC_RegData[1] = (u8_RxBuf[0]<<8) + u8_RxBuf[1] ;//printf("B通道功率转换系数:%x\n " ,U16_PowerPAC_RegData);
  379. }
  380. else if(nun == 3) //第三路
  381. {
  382. U16_PowerPBC_RegData[2] = (u8_RxBuf[0]<<8) + u8_RxBuf[1] ;//printf("B通道功率转换系数:%x\n " ,U16_PowerPAC_RegData);
  383. }
  384. }
  385. Uart_Read_HLW8110_Reg(REG_POWER_SC_ADDR,2);
  386. bsp_delay_ms(30);
  387. if ( u8_RxBuf[u8_RX_Length-1] == HLW8110_checkSum_Read(u8_RX_Length) )
  388. {
  389. if(nun == 1) //第一路
  390. {
  391. U16_PowerSC_RegData[0] = (u8_RxBuf[0]<<8) + u8_RxBuf[1] ;//printf("视在功率转换系数:%x\n " ,U16_PowerSC_RegData);
  392. }
  393. else if(nun == 2) //第二路
  394. {
  395. U16_PowerSC_RegData[1] = (u8_RxBuf[0]<<8) + u8_RxBuf[1] ;//printf("视在功率转换系数:%x\n " ,U16_PowerSC_RegData);
  396. }
  397. else if(nun == 3) //第三路
  398. {
  399. U16_PowerSC_RegData[2] = (u8_RxBuf[0]<<8) + u8_RxBuf[1] ;//printf("视在功率转换系数:%x\n " ,U16_PowerSC_RegData);
  400. }
  401. }
  402. Uart_Read_HLW8110_Reg(REG_ENERGY_AC_ADDR,2);
  403. bsp_delay_ms(30);
  404. if ( u8_RxBuf[u8_RX_Length-1] == HLW8110_checkSum_Read(u8_RX_Length) )
  405. {
  406. if(nun == 1) //第一路
  407. {
  408. U16_EnergyAC_RegData[0] = (u8_RxBuf[0]<<8) + u8_RxBuf[1] ;//printf("A通道电量转换系数:%x\n " ,U16_EnergyAC_RegData);
  409. }
  410. else if(nun == 2) //第二路
  411. {
  412. U16_EnergyAC_RegData[1] = (u8_RxBuf[0]<<8) + u8_RxBuf[1] ;//printf("A通道电量转换系数:%x\n " ,U16_EnergyAC_RegData);
  413. }
  414. else if(nun == 3) //第三路
  415. {
  416. U16_EnergyAC_RegData[2] = (u8_RxBuf[0]<<8) + u8_RxBuf[1] ;//printf("A通道电量转换系数:%x\n " ,U16_EnergyAC_RegData);
  417. }
  418. }
  419. Uart_Read_HLW8110_Reg(REG_ENERGY_BC_ADDR,2);
  420. bsp_delay_ms(30);
  421. if ( u8_RxBuf[u8_RX_Length-1] == HLW8110_checkSum_Read(u8_RX_Length) )
  422. {
  423. if(nun == 1) //第一路
  424. {
  425. U16_EnergyBC_RegData[0] = (u8_RxBuf[0]<<8) + u8_RxBuf[1] ;//printf("B通道电量转换系数:%x\n " ,U16_EnergyBC_RegData);
  426. }
  427. else if(nun == 2) //第二路
  428. {
  429. U16_EnergyBC_RegData[1] = (u8_RxBuf[0]<<8) + u8_RxBuf[1] ;//printf("B通道电量转换系数:%x\n " ,U16_EnergyBC_RegData);
  430. }
  431. else if(nun == 3) //第三路
  432. {
  433. U16_EnergyBC_RegData[2] = (u8_RxBuf[0]<<8) + u8_RxBuf[1] ;//printf("B通道电量转换系数:%x\n " ,U16_EnergyBC_RegData);
  434. }
  435. }
  436. Uart_Read_HLW8110_Reg(REG_CHECKSUM_ADDR,2);
  437. bsp_delay_ms(30);
  438. if ( u8_RxBuf[u8_RX_Length-1] == HLW8110_checkSum_Read(u8_RX_Length) )
  439. {
  440. if(nun == 1) //第一路
  441. {
  442. U16_CheckSUM_RegData[0] = (u8_RxBuf[0]<<8) + u8_RxBuf[1] ;//printf("系数校验和:%x\n " ,U16_CheckSUM_RegData);
  443. }
  444. else if(nun == 2) //第二路
  445. {
  446. U16_CheckSUM_RegData[1] = (u8_RxBuf[0]<<8) + u8_RxBuf[1] ;//printf("系数校验和:%x\n " ,U16_CheckSUM_RegData);
  447. }
  448. else if(nun == 3) //第三路
  449. {
  450. U16_CheckSUM_RegData[2] = (u8_RxBuf[0]<<8) + u8_RxBuf[1] ;//printf("系数校验和:%x\n " ,U16_CheckSUM_RegData);
  451. }
  452. }
  453. a = 0;
  454. if(nun == 1)
  455. {
  456. a = ~(0xffff+U16_RMSIAC_RegData[0] + U16_RMSIBC_RegData[0] + U16_RMSUC_RegData[0] +
  457. U16_PowerPAC_RegData[0] + U16_PowerPBC_RegData[0] + U16_PowerSC_RegData[0] +
  458. U16_EnergyAC_RegData[0] + U16_EnergyBC_RegData[0] );
  459. U16_CheckSUM_Data = a & 0xffff;
  460. //printf("计算系数校验和:%x\n " ,U16_CheckSUM_Data);
  461. if ( U16_CheckSUM_Data == U16_CheckSUM_RegData[0])
  462. {
  463. d = 1;//printf("校验和正确\r\n ");
  464. }
  465. else
  466. {
  467. d = 0; //printf("校验和出错\r\n ");
  468. }
  469. }
  470. else if(nun == 2)
  471. {
  472. a = ~(0xffff+U16_RMSIAC_RegData[1] + U16_RMSIBC_RegData[1] + U16_RMSUC_RegData[1] +
  473. U16_PowerPAC_RegData[1] + U16_PowerPBC_RegData[1] + U16_PowerSC_RegData[1] +
  474. U16_EnergyAC_RegData[1] + U16_EnergyBC_RegData[1] );
  475. U16_CheckSUM_Data = a & 0xffff;
  476. //printf("计算系数校验和:%x\n " ,U16_CheckSUM_Data);
  477. if ( U16_CheckSUM_Data == U16_CheckSUM_RegData[1])
  478. {
  479. d = 1;//printf("校验和正确\r\n ");
  480. }
  481. else
  482. {
  483. d = 0; //printf("校验和出错\r\n ");
  484. }
  485. }
  486. else if(nun == 3)
  487. {
  488. a = ~(0xffff+U16_RMSIAC_RegData[2] + U16_RMSIBC_RegData[2] + U16_RMSUC_RegData[2] +
  489. U16_PowerPAC_RegData[2] + U16_PowerPBC_RegData[2] + U16_PowerSC_RegData[2] +
  490. U16_EnergyAC_RegData[2] + U16_EnergyBC_RegData[2] );
  491. U16_CheckSUM_Data = a & 0xffff;
  492. //printf("计算系数校验和:%x\n " ,U16_CheckSUM_Data);
  493. if ( U16_CheckSUM_Data == U16_CheckSUM_RegData[2])
  494. {
  495. d = 1;//printf("校验和正确\r\n ");
  496. }
  497. else
  498. {
  499. d = 0; //printf("校验和出错\r\n ");
  500. }
  501. }
  502. return d;
  503. }
  504. /*=========================================================================================================
  505. * Function : void Init_HLW8110(void)
  506. * Describe :
  507. * Input : none
  508. * Output : none
  509. * Return : none
  510. * Record : 2019/04/03
  511. ==========================================================================================================*/
  512. void Init_HLW8110(unsigned char nun)
  513. {
  514. Uart_HLW8110_WriteREG_EN();
  515. bsp_delay_ms(30);
  516. //电流通道A设置命令,指定当前用于计算视在功率、功率因数、相角、瞬时有功功率、瞬时视在功率和有功功率过载的信号指示 的通道为通道A
  517. Uart_HLW8110_Set_Channel_A();
  518. bsp_delay_ms(30);
  519. Uart_Write_HLW8110_Reg(REG_SYSCON_ADDR,2,0x0a04); //开启A通道,关闭B通道,电压通道PGA = 1,电流通道PGA = 16
  520. bsp_delay_ms(30);
  521. Uart_Write_HLW8110_Reg(REG_EMUCON_ADDR,2,0x0001); //1,使能PFA 脉冲输出和有功电能寄存器累加;
  522. // Uart_Write_HLW8110_Reg(REG_EMUCON_ADDR,2,0x0018); //正向和负向过零点均发生变化,ZXD0 = 1,ZXD1 = 1
  523. Uart_Write_HLW8110_Reg(REG_EMUCON2_ADDR,2,0x0465); //0x0001是EMUCON2的默认值,waveEn = 1,zxEn = 1,A通道电量寄存器,读后不清0,EPA_CB = 1;打开功率因素检测
  524. bsp_delay_ms(30);
  525. Uart_HLW8110_WriteREG_DIS();
  526. bsp_delay_ms(3);
  527. //读取地址是0x6F至0x77的寄存器,验证系数是否正确
  528. Judge_CheckSum_HLW8110_Calfactor(nun);
  529. }
  530. /*=========================================================================================================
  531. * Function : void Check_WriteReg_Success(void)
  532. * Describe : 检验写入的REG是否正确写入
  533. * Input : none
  534. * Output : none
  535. * Return : none
  536. * Record : 2020/04/02
  537. ==========================================================================================================*/
  538. void Check_WriteReg_Success(void)
  539. {
  540. Uart_Read_HLW8110_Reg(REG_SYSCON_ADDR,2);
  541. bsp_delay_ms(30);
  542. if ( u8_RxBuf[u8_RX_Length-1] == HLW8110_checkSum_Read(u8_RX_Length) )
  543. {
  544. U16_Check_SysconReg_Data = (u8_RxBuf[0]<<8) + (u8_RxBuf[1]);
  545. //printf("写入的SysconReg寄存器:%lx\n " ,U16_Check_SysconReg_Data);
  546. }
  547. else
  548. {
  549. //printf("SysconReg寄存器读取出错\r\n");
  550. B_Read_Error = 1;
  551. }
  552. Uart_Read_HLW8110_Reg(REG_EMUCON_ADDR,2);
  553. bsp_delay_ms(30);
  554. if ( u8_RxBuf[u8_RX_Length-1] == HLW8110_checkSum_Read(u8_RX_Length) )
  555. {
  556. U16_Check_EmuconReg_Data = (u8_RxBuf[0]<<8) + (u8_RxBuf[1]);
  557. //printf("写入的EmuconReg寄存器:%lx\n " ,U16_Check_EmuconReg_Data);
  558. }
  559. else
  560. {
  561. //printf("EmuconReg寄存器读取出错\r\n");
  562. B_Read_Error = 1;
  563. }
  564. Uart_Read_HLW8110_Reg(REG_EMUCON2_ADDR,2);
  565. bsp_delay_ms(30);
  566. if ( u8_RxBuf[u8_RX_Length-1] == HLW8110_checkSum_Read(u8_RX_Length) )
  567. {
  568. U16_Check_Emucon2Reg_Data = (u8_RxBuf[0]<<8) + (u8_RxBuf[1]);
  569. //printf("写入的Emucon2Reg寄存器寄存器:%lx\n " ,U16_Check_Emucon2Reg_Data);
  570. }
  571. else
  572. {
  573. //printf("Emucon2Reg寄存器读取出错\r\n");
  574. B_Read_Error = 1;
  575. }
  576. }
  577. /*=========================================================================================================
  578. * Function : void Read_HLW8112_IA(void)
  579. * Describe : 读取A通道电流
  580. * Input : none
  581. * Output : none
  582. * Return : none
  583. * Record : 2019/04/03
  584. ==========================================================================================================*/
  585. void Read_HLW8110_IA(unsigned char nun)
  586. {
  587. float a;
  588. Uart_Read_HLW8110_Reg(REG_RMSIA_ADDR,3);
  589. bsp_delay_ms(30);
  590. //delay_ms(3);
  591. if ( u8_RxBuf[u8_RX_Length-1] == HLW8110_checkSum_Read(u8_RX_Length) )
  592. {
  593. U32_RMSIA_RegData = (unsigned long)(u8_RxBuf[0]<<16) + (unsigned long)(u8_RxBuf[1]<<8) + (unsigned long)(u8_RxBuf[2]);
  594. //printf("A通道电流寄存器:%lx\n " ,U32_RMSIA_RegData);
  595. }
  596. else
  597. {
  598. //printf("A通道电流寄存器读取出错\r\n");
  599. B_Read_Error = 1;
  600. }
  601. //A通道电流PGA = 16,电压通道PGA = 1;电流采样电阻1mR,电压采样电阻1M
  602. //计算公式,U16_AC_I = (U32_RMSIA_RegData * U16_RMSIAC_RegData)/(电流系数* 2^23)
  603. if ((U32_RMSIA_RegData & 0x800000) == 0x800000)
  604. {
  605. if(nun == 1)
  606. {
  607. hlw8110_power_data.F_AC_I[0] = 0;
  608. }
  609. else if(nun == 2)
  610. {
  611. hlw8110_power_data.F_AC_I[1] = 0;
  612. }
  613. else if(nun == 3)
  614. {
  615. hlw8110_power_data.F_AC_I[2] = 0;
  616. }
  617. }
  618. else
  619. {
  620. a = (float)U32_RMSIA_RegData;
  621. if(nun == 1)
  622. {
  623. a = a * U16_RMSIAC_RegData[0];
  624. }
  625. else if(nun == 2)
  626. {
  627. a = a * U16_RMSIAC_RegData[1];
  628. }
  629. else if(nun == 3)
  630. {
  631. a = a * U16_RMSIAC_RegData[2];
  632. }
  633. //a = a * U16_RMSIAC_RegData;
  634. a = a/0x800000; //电流计算出来的浮点数单位是mA,比如5003.12
  635. a = a/1; // 1 = 电流系数
  636. a = a/1000; //a= 5003ma,a/1000 = 5.003A,单位转换成A
  637. a = a * D_CAL_A_I; //D_CAL_A_I是校正系数,默认是1
  638. //F_AC_I = a;
  639. if(nun == 1)
  640. {
  641. hlw8110_power_data.F_AC_I[0] = a;
  642. }
  643. else if(nun == 2)
  644. {
  645. hlw8110_power_data.F_AC_I[1] = a;
  646. }
  647. else if(nun == 3)
  648. {
  649. hlw8110_power_data.F_AC_I[2] = a;
  650. }
  651. }
  652. }
  653. /*=========================================================================================================
  654. * Function : void Read_HLW8110_U(void)
  655. * Describe : 读取电压
  656. * Input : none
  657. * Output : none
  658. * Return : none
  659. * Record : 2019/04/03
  660. ==========================================================================================================*/
  661. void Read_HLW8110_U(unsigned char nun)
  662. {
  663. float a;
  664. Uart_Read_HLW8110_Reg(REG_RMSU_ADDR,3);
  665. bsp_delay_ms(30);
  666. //delay_ms(3);
  667. if ( u8_RxBuf[u8_RX_Length-1] == HLW8110_checkSum_Read(u8_RX_Length) )
  668. {
  669. U32_RMSU_RegData = (unsigned long)(u8_RxBuf[0]<<16) + (unsigned long)(u8_RxBuf[1]<<8) + (unsigned long)(u8_RxBuf[2]);
  670. //printf("电压通道寄存器:%lx\n " ,U32_RMSU_RegData);
  671. }
  672. else
  673. {
  674. //printf("电压通道寄存器读取出错\r\n");
  675. B_Read_Error = 1;
  676. }
  677. //电压
  678. //计算:U16_AC_V = (U32_RMSU_RegData * U16_RMSUC_RegData)/2^23
  679. if ((U32_RMSU_RegData &0x800000) == 0x800000)
  680. {
  681. //F_AC_V = 0;
  682. if(nun == 1)
  683. {
  684. hlw8110_power_data.F_AC_V[0] = 0;
  685. }
  686. else if(nun == 2)
  687. {
  688. hlw8110_power_data.F_AC_V[1] = 0;
  689. }
  690. else if(nun == 3)
  691. {
  692. hlw8110_power_data.F_AC_V[2] = 0;
  693. }
  694. }
  695. else
  696. {
  697. a = (float)U32_RMSU_RegData;
  698. if(nun == 1)
  699. {
  700. a = a * U16_RMSUC_RegData[0];
  701. }
  702. else if(nun == 2)
  703. {
  704. a = a * U16_RMSUC_RegData[1];
  705. }
  706. else if(nun == 3)
  707. {
  708. a = a * U16_RMSUC_RegData[2];
  709. }
  710. // a = a*U16_RMSUC_RegData;
  711. a = a/0x400000;
  712. a = a/1; // 1 = 电压系数
  713. a = a/100; //计算出a = 22083.12mV,a/100表示220.8312V,电压转换成V
  714. a = a*D_CAL_U; //D_CAL_U是校正系数,默认是1,
  715. // F_AC_V = a;
  716. if(nun == 1)
  717. {
  718. hlw8110_power_data.F_AC_V[0] = a;
  719. }
  720. else if(nun == 2)
  721. {
  722. hlw8110_power_data.F_AC_V[1] = a;
  723. }
  724. else if(nun == 3)
  725. {
  726. hlw8110_power_data.F_AC_V[2] = a;
  727. }
  728. }
  729. }
  730. /*=========================================================================================================
  731. * Function : void Read_HLW8110_PA(void)
  732. * Describe : 读取A通道功率
  733. * Input : none
  734. * Output : none
  735. * Return : none
  736. * Record : 2019/04/03
  737. ==========================================================================================================*/
  738. void Read_HLW8110_PA(unsigned char nun)
  739. {
  740. float a;
  741. float b;
  742. Uart_Read_HLW8110_Reg(REG_POWER_PA_ADDR,4);
  743. bsp_delay_ms(30);
  744. //delay_ms(3);
  745. if ( u8_RxBuf[u8_RX_Length-1] == HLW8110_checkSum_Read(u8_RX_Length) )
  746. {
  747. U32_POWERPA_RegData = (unsigned long)(u8_RxBuf[0]<<24) + (unsigned long)(u8_RxBuf[1]<<16) + (unsigned long)(u8_RxBuf[2]<<8) + (unsigned long)(u8_RxBuf[3]);
  748. //printf("A通道功率寄存器:%lx\n " ,U32_POWERPA_RegData);
  749. }
  750. else
  751. {
  752. //printf("A通道功率寄存器读取出错\r\n");
  753. B_Read_Error = 1;
  754. }
  755. if (B_Read_Error == 1)
  756. {
  757. B_Read_Error = 0;
  758. Uart_Read_HLW8110_Reg(REG_POWER_PA_ADDR,4);
  759. bsp_delay_ms(30);
  760. //delay_ms(3);
  761. if ( u8_RxBuf[u8_RX_Length-1] == HLW8110_checkSum_Read(u8_RX_Length) )
  762. {
  763. U32_POWERPA_RegData = (unsigned long)(u8_RxBuf[0]<<24) + (unsigned long)(u8_RxBuf[1]<<16) + (unsigned long)(u8_RxBuf[2]<<8) + (unsigned long)(u8_RxBuf[3]);
  764. //printf("A通道功率寄存器:%lx\n " ,U32_POWERPA_RegData);
  765. }
  766. else
  767. {
  768. //printf("A通道功率寄存器读取出错\r\n");
  769. B_Read_Error = 1;
  770. }
  771. }
  772. if (U32_POWERPA_RegData > 0x80000000)
  773. {
  774. b = ~U32_POWERPA_RegData;
  775. a = (float)b;
  776. }
  777. else
  778. a = (float)U32_POWERPA_RegData;
  779. //功率需要分正功和负功
  780. //计算,U16_AC_P = (U32_POWERPA_RegData * U16_PowerPAC_RegData)/(2^31*电压系数*电流系数)
  781. //单位为W,比如算出来5000.123,表示5000.123W
  782. if(nun == 1)
  783. {
  784. a = a * U16_PowerPAC_RegData[0];
  785. }
  786. else if(nun == 2)
  787. {
  788. a = a * U16_PowerPAC_RegData[1];
  789. }
  790. else if(nun == 3)
  791. {
  792. a = a * U16_PowerPAC_RegData[2];
  793. }
  794. //a = a*U16_PowerPAC_RegData;
  795. a = a/0x80000000;
  796. a = a/1; // 1 = 电流系数
  797. a = a/1; // 1 = 电压系数
  798. a = a * D_CAL_A_P; //D_CAL_A_P是校正系数,默认是1
  799. //F_AC_P = a; //单位为W,比如算出来5000.123,表示5000.123W
  800. if(nun == 1)
  801. {
  802. hlw8110_power_data.F_AC_P[0] = a;
  803. }
  804. else if(nun == 2)
  805. {
  806. hlw8110_power_data.F_AC_P[1] = a;
  807. }
  808. else if(nun == 3)
  809. {
  810. hlw8110_power_data.F_AC_P[2] = a;
  811. }
  812. }
  813. /*=========================================================================================================
  814. * Function : void void Read_HLW8112_EA(void)
  815. * Describe : 读取A通道有功电量
  816. * Input : none
  817. * Output : none
  818. * Return : none
  819. * Record : 2019/04/03
  820. ==========================================================================================================*/
  821. void Read_HLW8110_EA(unsigned char nun)
  822. {
  823. float a;
  824. Uart_Read_HLW8110_Reg(REG_ENERGY_PA_ADDR,3);
  825. bsp_delay_ms(30);
  826. //delay_ms(3);
  827. if ( u8_RxBuf[u8_RX_Length-1] == HLW8110_checkSum_Read(u8_RX_Length) )
  828. {
  829. U32_ENERGY_PA_RegData = (unsigned long)(u8_RxBuf[0]<<16) + (unsigned long)(u8_RxBuf[1]<<8) + (unsigned long)(u8_RxBuf[2]);
  830. //printf("A通道有功电量寄存器:%lx\n " ,U32_ENERGY_PA_RegData);
  831. }
  832. else
  833. {
  834. //printf("A通道有功电量寄存器读取出错\r\n");
  835. B_Read_Error = 1;
  836. }
  837. Uart_Read_HLW8110_Reg(REG_HFCONST_ADDR,2);
  838. bsp_delay_ms(30);
  839. if ( u8_RxBuf[u8_RX_Length-1] == HLW8110_checkSum_Read(u8_RX_Length) )
  840. {
  841. U16_HFConst_RegData = (unsigned int)(u8_RxBuf[0]<<8) + (unsigned int)(u8_RxBuf[1]);
  842. //printf("HFCONST常数 = :%d\n " ,U16_HFConst_RegData);
  843. }
  844. else
  845. {
  846. //printf("HFCONST常数寄存器读取出错\r\n");
  847. B_Read_Error = 1;
  848. }
  849. //电量计算,电量 = (U32_ENERGY_PA_RegData * U16_EnergyAC_RegData * HFCONST) /(K1*K2 * 2^29 * 4096)
  850. //HFCONST:默认值是0x1000, HFCONST/(2^29 * 4096) = 0x20000000
  851. a = (float)U32_ENERGY_PA_RegData;
  852. if(nun == 1)
  853. {
  854. a = a * U16_EnergyAC_RegData[0];
  855. }
  856. else if(nun == 2)
  857. {
  858. a = a * U16_EnergyAC_RegData[1];
  859. }
  860. else if(nun == 3)
  861. {
  862. a = a * U16_EnergyAC_RegData[2];
  863. }
  864. //a = a*U16_EnergyAC_RegData;
  865. a = a/0x20000000; //电量单位是0.001KWH,比如算出来是2.002,表示2.002KWH
  866. a = a/1; // 1 = 电流系数
  867. a = a/1; // 1 = 电压系数
  868. a = a * D_CAL_A_E; //D_CAL_A_E是校正系数,默认是1
  869. // F_AC_E = a;
  870. //F_AC_BACKUP_E = F_AC_E;
  871. if(nun == 1)
  872. {
  873. hlw8110_power_data.F_AC_E[0] = a;
  874. }
  875. else if(nun == 2)
  876. {
  877. hlw8110_power_data.F_AC_E[1] = a;
  878. }
  879. else if(nun == 3)
  880. {
  881. hlw8110_power_data.F_AC_E[2] = a;
  882. }
  883. }
  884. /*=========================================================================================================
  885. * Function : void Read_HLW8110_PF(void)
  886. * Describe : 读取功率因素
  887. * Input : none
  888. * Output : none
  889. * Return : none
  890. * Record : 2019/03/18
  891. ==========================================================================================================*/
  892. void Read_HLW8110_PF(void)
  893. {
  894. float a;
  895. unsigned long b;
  896. //测量A通道的功率因素,需要发送EA+5A命令
  897. //测量B通道的功率因素,需要发送EA+A5命令
  898. Uart_Read_HLW8110_Reg(REG_PF_ADDR,3);
  899. bsp_delay_ms(30);
  900. if ( u8_RxBuf[u8_RX_Length-1] == HLW8110_checkSum_Read(u8_RX_Length) )
  901. {
  902. b = (unsigned long)(u8_RxBuf[0]<<16) + (unsigned long)(u8_RxBuf[1]<<8) + (unsigned long)(u8_RxBuf[2]);
  903. //printf("A通道功率因素寄存器:%ld\n " ,b);
  904. }
  905. else
  906. {
  907. //printf("读取A通道功率因素寄存器出错\r\n");
  908. B_Read_Error = 1;
  909. }
  910. if (b>0x800000) //为负,容性负载
  911. {
  912. a = (float)(0xffffff-b + 1)/0x7fffff;
  913. }
  914. else
  915. {
  916. a = (float)b/0x7fffff;
  917. }
  918. if (F_AC_P < 0.3) // 小于0.3W,空载或小功率,PF不准
  919. a = 0;
  920. //功率因素*100,最大为100,最小负100
  921. F_AC_PF = a;
  922. }
  923. /*=========================================================================================================
  924. * Function : void Calculate_HLW8110_MeterData(void);
  925. * Describe :
  926. * Input : none
  927. * Output : none
  928. * Return : none
  929. * Record : 2018/05/10
  930. ==========================================================================================================*/
  931. void Calculate_HLW8110_MeterData(unsigned char nun)
  932. {
  933. Check_WriteReg_Success();
  934. Read_HLW8110_IA(nun);
  935. Read_HLW8110_U(nun);
  936. Read_HLW8110_PA(nun);
  937. Read_HLW8110_EA(nun);
  938. // Read_HLW8110_LineFreq();
  939. // Read_HLW8110_Angle();
  940. // Read_HLW8110_PF();
  941. /*
  942. printf("\r\n");
  943. printf("\r\n");
  944. printf("交流测量,uart通讯方式\r\n");
  945. printf("A通道电流转换系数:%x\n " ,U16_RMSIAC_RegData);
  946. printf("B通道电流转换系数:%x\n " ,U16_RMSIBC_RegData);
  947. printf("电压通道转换系数:%x\n " ,U16_RMSUC_RegData);
  948. printf("A通道功率转换系数:%x\n " ,U16_PowerPAC_RegData);
  949. printf("B通道功率转换系数:%x\n " ,U16_PowerPBC_RegData);
  950. printf("视在功率转换系数:%x\n " ,U16_PowerSC_RegData);
  951. printf("A通道电量转换系数:%x\n " ,U16_EnergyAC_RegData);
  952. printf("B通道电量转换系数:%x\n " ,U16_EnergyBC_RegData);
  953. printf("转换系数校验和:%x\n " ,U16_CheckSUM_RegData);
  954. printf("转换系数计算出的校验和:%x\n " ,U16_CheckSUM_Data);
  955. printf("\r\n");//插入换行
  956. printf("A通道电流寄存器:%x\n " ,U32_RMSIA_RegData);
  957. printf("电压寄存器:%x\n " ,U32_RMSU_RegData);
  958. printf("A通道功率寄存器:%x\n " ,U32_POWERPA_RegData);
  959. printf("A通道电量寄存器:%x\n " ,U32_ENERGY_PA_RegData);
  960. printf("\r\n");//插入换行
  961. printf("F_AC_I = %f A \n " ,F_AC_I); //电流
  962. printf("F_AC_V = %f V \n " ,F_AC_V); //电压
  963. printf("F_AC_P = %f W \n " ,F_AC_P); //功率
  964. printf("F_AC_BACKUP_E = %f KWH \n " ,F_AC_BACKUP_E); //电量
  965. printf("F_AC_LINE_Freq = %f Hz \n " ,F_AC_LINE_Freq); //市电线性频率
  966. printf("F_Angle = %f\n " ,F_Angle); //L和N的相角
  967. printf("F_AC_PF = %f\n " ,F_AC_PF); //功率因素
  968. printf("\r\n");//插入换行
  969. printf("\r\n");//插入换行
  970. printf("----------------------------------------------\r\n");
  971. printf("----------------------------------------------\r\n");
  972. */
  973. }
  974. void Read_Power_Data_handle(void)
  975. {
  976. int i = 0;
  977. switch (HLW8110Msg)
  978. {
  979. case HLW8110_int:
  980. if (sTimeout(&SystemTimer, 100)) // 等待1s初始化8110
  981. {
  982. open_first_passageway();
  983. Init_HLW8110(1);
  984. open_second_passageway();
  985. Init_HLW8110(2);
  986. open_third_passageway();
  987. Init_HLW8110(3);
  988. open_first_passageway();
  989. HLW8110Msg++;
  990. }
  991. break;
  992. case HLW8110_1:
  993. if (sTimeout(&SystemTimer, 500)) // 等待5s读取第一路数据
  994. {
  995. Calculate_HLW8110_MeterData(1);
  996. HLW8110Msg++;
  997. }
  998. break;
  999. case HLW8110_2:
  1000. if (sTimeout(&SystemTimer, 10)) // 等待100ms读取第二路数据
  1001. {
  1002. open_second_passageway(); // 打开第二通道
  1003. Calculate_HLW8110_MeterData(2);
  1004. HLW8110Msg++;
  1005. }
  1006. break;
  1007. case HLW8110_3:
  1008. if (sTimeout(&SystemTimer, 10)) // 等待100ms读取第三路数据
  1009. {
  1010. open_third_passageway(); // 打开第三通道
  1011. Calculate_HLW8110_MeterData(3);
  1012. HLW8110Msg++;
  1013. }
  1014. break;
  1015. case HLW8110_IDEL:
  1016. if (sTimeout(&SystemTimer, 2)) //
  1017. {
  1018. open_first_passageway(); // 打开第一通道
  1019. //增加发送数据给zigbee
  1020. //增加电量数据保存
  1021. for(i = 0; i < 3; i++)
  1022. {
  1023. power_data[i*16] = ((long int)hlw8110_power_data.F_AC_V[i] >>24) & 0xFF;
  1024. power_data[i*16+1] = ((long int)hlw8110_power_data.F_AC_V[i] >>16) & 0xFF;
  1025. power_data[i*16+2] = ((long int)hlw8110_power_data.F_AC_V[i] >>8) & 0xFF;
  1026. power_data[i*16+3] = (long int)hlw8110_power_data.F_AC_V[i] & 0xFF;
  1027. power_data[i*16+4] = ((long int)hlw8110_power_data.F_AC_I[i] >>24) & 0xFF;
  1028. power_data[i*16+5] = ((long int)hlw8110_power_data.F_AC_I[i] >>16) & 0xFF;
  1029. power_data[i*16+6] = ((long int)hlw8110_power_data.F_AC_I[i] >>8) & 0xFF;
  1030. power_data[i*16+7] = (long int)hlw8110_power_data.F_AC_I[i] & 0xFF;
  1031. power_data[i*16+8] = ((long int)hlw8110_power_data.F_AC_P[i] >>24) & 0xFF;
  1032. power_data[i*16+9] = ((long int)hlw8110_power_data.F_AC_P[i] >>16) & 0xFF;
  1033. power_data[i*16+10] = ((long int)hlw8110_power_data.F_AC_P[i] >>8) & 0xFF;
  1034. power_data[i*16+11] = (long int)hlw8110_power_data.F_AC_P[i] & 0xFF;
  1035. power_data[i*16+12] = ((long int)hlw8110_power_data.F_AC_E[i] >>24) & 0xFF;
  1036. power_data[i*16+13] = ((long int)hlw8110_power_data.F_AC_E[i] >>16) & 0xFF;
  1037. power_data[i*16+14] = ((long int)hlw8110_power_data.F_AC_E[i] >>8) & 0xFF;
  1038. power_data[i*16+15] = (long int)hlw8110_power_data.F_AC_E[i] & 0xFF;
  1039. }
  1040. user_write_INFO_byte(INFO6_ADDR, power_data, 50);
  1041. HLW8110Msg = HLW8110_1; //返回读取第一路数据
  1042. }
  1043. break;
  1044. case HLW8110_ERR:
  1045. HLW8110Msg++;
  1046. break;
  1047. default:
  1048. HLW8110Msg = HLW8110_ERR; // 开机初始化
  1049. break;
  1050. }
  1051. }