HLW8110.c 43 KB

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