Przeglądaj źródła

4路板处理计量芯片重启问题

liyi 1 rok temu
rodzic
commit
3766b2fe17

+ 19 - 14
truing_control/PDU-AC_ADA_NEW_6/hardware/electricity/electricity.c

@@ -49,7 +49,26 @@ static void read_ele(uint8_t channel)
 	if(channel < RelaySlaveChaNum)
 	{
 		select_channel(channel);
+
 		Calculate_HLW8110_MeterData();
+		if(F_AC_V > 20 && F_AC_LINE_Freq < 1.0)
+		{
+			reinit_hlw8110();
+			Calculate_HLW8110_MeterData();
+		}
+		if(F_AC_V < 1.0)
+		{
+			F_AC_V = 0.0;
+			F_AC_I = 0.0;
+			F_AC_P = 0.0;
+			F_AC_LINE_Freq = 0.0;
+			F_AC_PF = 0.0;
+		}else if(F_AC_PF < 0.1 || F_AC_PF > 1 || F_AC_P < 1)
+		{
+			F_AC_I = 0.0;
+			F_AC_P = 0.0;
+			F_AC_PF = 0.0;
+		}
 		board->md_data.r_data.ac_ele.ele_info[channel].voltage = F_AC_V * 1000;
 		board->md_data.r_data.ac_ele.ele_info[channel].current = F_AC_I * 1000;
 		board->md_data.r_data.ac_ele.ele_info[channel].power = F_AC_P * 1000;
@@ -58,20 +77,6 @@ static void read_ele(uint8_t channel)
 		elec[channel] += F_AC_E;
 		board->md_data.r_data.ac_ele.ele_info[channel].consumer = board->ele_restore[channel] + (uint32_t)(elec[channel] * 1000);
 		
-		
-		if(F_AC_V < 1.0)
-		{
-			board->md_data.r_data.ac_ele.ele_info[channel].voltage = 0;
-			board->md_data.r_data.ac_ele.ele_info[channel].current = 0;
-			board->md_data.r_data.ac_ele.ele_info[channel].power = 0;
-			board->md_data.r_data.ac_ele.ele_info[channel].factor = 0;
-			board->md_data.r_data.ac_ele.ele_info[channel].freq = 0;
-		}else if(F_AC_PF < 0.1 || F_AC_PF > 1 || F_AC_P < 1)
-		{
-			board->md_data.r_data.ac_ele.ele_info[channel].current = 0;
-			board->md_data.r_data.ac_ele.ele_info[channel].power = 0;
-			board->md_data.r_data.ac_ele.ele_info[channel].factor = 0;
-		}
 	}
 }
 

+ 101 - 0
truing_control/PDU-AC_ADA_NEW_6/hardware/hlw8110/Hlw8110.c

@@ -428,6 +428,107 @@ void Init_HLW8110(void)
 	}
 }
 
+void re_check_write_reg_success(void)
+{
+	Uart_Read_HLW8110_Reg(REG_SYSCON_ADDR,2);
+	DelayNms(10);
+	eMBPoll();
+	if ( u8_RxBuf[u8_RX_Length-1] == HLW8110_checkSum_Read(u8_RX_Length) )
+	{
+		U16_Check_SysconReg_Data =  (u8_RxBuf[0]<<8) + (u8_RxBuf[1]); 
+//		printf("写入的SysconReg寄存器:%lx\n " ,U16_Check_SysconReg_Data);
+		if(U16_Check_SysconReg_Data == 0x0a04)
+		{
+		}else
+		{
+			B_Read_Error = 1;
+		}
+		
+	}
+	else
+	{
+//		printf("SysconReg寄存器读取出错\r\n");
+		B_Read_Error = 1;
+	}
+	
+	Uart_Read_HLW8110_Reg(REG_EMUCON_ADDR,2);
+	DelayNms(10);
+	eMBPoll();
+	if ( u8_RxBuf[u8_RX_Length-1] == HLW8110_checkSum_Read(u8_RX_Length) )
+	{
+		U16_Check_EmuconReg_Data =  (u8_RxBuf[0]<<8) + (u8_RxBuf[1]); 
+//		printf("写入的EmuconReg寄存器:%lx\n " ,U16_Check_EmuconReg_Data);
+		
+		if(U16_Check_EmuconReg_Data == 0x0001)
+		{
+		}else
+		{
+			B_Read_Error = 1;
+		}
+	}
+	else
+	{
+//		printf("EmuconReg寄存器读取出错\r\n");
+		B_Read_Error = 1;
+	}
+	
+	
+	Uart_Read_HLW8110_Reg(REG_EMUCON2_ADDR,2);
+	DelayNms(10);
+	eMBPoll();
+	if ( u8_RxBuf[u8_RX_Length-1] == HLW8110_checkSum_Read(u8_RX_Length) )
+	{
+		U16_Check_Emucon2Reg_Data =  (u8_RxBuf[0]<<8) + (u8_RxBuf[1]); 
+//		printf("写入的Emucon2Reg寄存器寄存器:%lx\n " ,U16_Check_Emucon2Reg_Data);
+		if(U16_Check_Emucon2Reg_Data == 0x0065)
+		{
+		}else
+		{
+			B_Read_Error = 1;
+		}
+	}
+	else
+	{
+//		printf("Emucon2Reg寄存器读取出错\r\n");
+		B_Read_Error = 1;
+	}
+	
+}
+
+void reinit_hlw8110()
+{
+	for(int i = 0 ; i < 50 ;i++)
+	{
+		Uart_HLW8110_WriteREG_EN();
+		DelayNms(10);
+		eMBPoll();
+		Uart_HLW8110_Set_Channel_A();
+		DelayNms(10);
+		eMBPoll();
+		Uart_Write_HLW8110_Reg(REG_SYSCON_ADDR,2,0x0a04);
+		DelayNms(10);
+		eMBPoll();
+		Uart_Write_HLW8110_Reg(REG_EMUCON_ADDR,2,0x0001);
+		DelayNms(10);
+		eMBPoll();
+		Uart_Write_HLW8110_Reg(REG_EMUCON2_ADDR,2,0x0065);
+		DelayNms(10);
+		eMBPoll();
+		Uart_HLW8110_WriteREG_DIS();
+		B_Read_Error = 0;
+		re_check_write_reg_success();
+		if(B_Read_Error)
+		{
+			eMBPoll();
+			DelayNms(100);
+		}else
+		{
+			break;
+		}
+	}
+}
+
+
 
 uint8_t Check_WriteReg_Sucess_Addr(uint8_t addr,uint8_t readlen, uint16_t value)
 {

+ 1 - 1
truing_control/PDU-AC_ADA_NEW_6/hardware/hlw8110/Hlw8110.h

@@ -76,5 +76,5 @@ void Calculate_HLW8110_MeterData(void);
 
 void Init_HLW8112(void);
 void HLW8112_Measure(void);
-
+void reinit_hlw8110(void);
 #endif