Bladeren bron

3相,双火线计量芯片增加校准功能。

liyi 10 maanden geleden
bovenliggende
commit
58c612fbc1

+ 41 - 1
truing_control/PDU-3-ADA/common/common.c

@@ -64,6 +64,16 @@ void read_config_from_eeprom(void)
 #endif				
 				count++;
 			}
+			board->v_k[0] = 3135;
+			board->v_k[1] = 3135;
+			board->v_k[2] = 3135;
+			board->i_k[0] = 10000;
+			board->i_k[1] = 10000;
+			board->i_k[2] = 10000;			
+			
+			board->write_eeprom_page(EEPROM_SET_V_K_ADDR,(uint8_t *)&board->v_k[0], 4*3);
+			board->write_eeprom_page(EEPROM_SET_K_I_ADDR,(uint8_t *)&board->i_k[0], 4*3);
+			
 #else
 
 		for(uint8_t i = 0; i < PT_SUB_COUNT;i++)
@@ -73,13 +83,21 @@ void read_config_from_eeprom(void)
 			board->md_data.rw_data.delay_on	[i+4]  = 	i+1;
 			board->md_data.rw_data.delay_off[i+4]  =  i+1;
 		}
+			board->v_k[0] = 3135;
+			board->v_k[1] = 3135;
+			board->i_k[0] = 10000;
+			board->i_k[1] = 10000;
 
+			board->write_eeprom_page(EEPROM_SET_V_K_ADDR,(uint8_t *)&board->v_k[0], 4*2);
+			board->write_eeprom_page(EEPROM_SET_K_I_ADDR,(uint8_t *)&board->i_k[0], 4*2);
+			
 #endif			
 			board->write_eeprom_page(EEPROM_OTHER_ADDR,(uint8_t *)&board->md_data.rw_data.delay_on[0], sizeof(rw_3_data_t));
 			iic_data chache={0};
 			for(uint8_t i = 0 ; i < MAX_ROW;i++){
 				board->write_eeprom_page(EEPROM_CONSUMER_ADDR +(CONSUM_PAGE*i),(uint8_t*)&chache.data[0],CONSUM_PAGE);
 			}
+			
 			board->write_eeprom_page(EEPROM_DEVICES_ADDR,(uint8_t *)&board->md_data.r_data.dev_info,EEPROM_DEVICES_LENTH);
 		}
 		{
@@ -114,7 +132,29 @@ void read_config_from_eeprom(void)
 					board->check_threshold(THRESHOLD_IN,0);
 			#else
 					board->check_threshold(THRESHOLD_IN,0);
-			#endif			
+			#endif	
+
+
+#if (AC_3_3 || AC_3_4)
+			board->read_eeprom_page(EEPROM_SET_V_K_ADDR,(uint8_t *)&board->v_k[0], 4*3);
+			board->read_eeprom_page(EEPROM_SET_K_I_ADDR,(uint8_t *)&board->i_k[0], 4*3);
+			for(int i = 0;i < 3;i++)
+			{
+				//3135 voltage Calibrate value
+				board->v_k[i] =  board->v_k[i] > 10000 ? 3135 : board->v_k[i];
+				board->v_k[i] =  board->i_k[i] > 10000 ? 10000 : board->i_k[i];
+			}
+#else
+			board->read_eeprom_page(EEPROM_SET_V_K_ADDR,(uint8_t *)&board->v_k[0], 4*2);
+			board->read_eeprom_page(EEPROM_SET_K_I_ADDR,(uint8_t *)&board->i_k[0], 4*2);
+			for(int i = 0;i < 2;i++)
+			{
+				board->v_k[i] =  board->v_k[i] > 10000 ? 3135 : board->v_k[i];
+				board->v_k[i] =  board->i_k[i] > 10000 ? 10000 : board->i_k[i];
+			}
+#endif			
+			
+			
 
 			for(uint8_t i = 0 ; i < RelaySlaveChaNum;i++)
 			{

+ 16 - 5
truing_control/PDU-3-ADA/common/common.h

@@ -106,12 +106,12 @@
 #define  CHANNEL_CONTROL_LENTH           (9)
 
 
+#define SET_V_K_VALUE                    (START_R_REGISTER + 350)
+#define SET_V_K_VALUE_LEN								 (3)
 
 
-
-
-
-
+#define SET_I_K_VALUE											(START_R_REGISTER + 360)
+#define SET_I_K_VALUE_LEN								 (3)
 
 
 
@@ -284,6 +284,15 @@
 #define EEPROM_CONSUMER_ADDR                  (3072)
 #define EEPROM_CONSUMER_ADDR_LEN              (CONSUM_PAGE*MAX_ROW)
 
+#define EEPROM_SET_V_K_ADDR        								 (6144)
+#define EEPROM_SET_V_K_LEN              					 (3*4)
+
+#define EEPROM_SET_K_I_ADDR												 (6176)
+#define EEPROM_SET_K_I_LEN                         (3*4)
+
+
+
+
 
 #define THRESHOLD_IN             							0
 #define THRESHOLD_OUT            							1
@@ -638,7 +647,9 @@ typedef struct {
 		uint8_t  handle_input_pt[1];
 	#endif
 #endif
-
+	uint32_t  v_k[3];
+	uint32_t  i_k[3];
+	
 	void (*open)(uint8_t channel);
 	void (*close)(uint8_t channel);
 	void (*read_ele)(uint8_t channel);

+ 16 - 1
truing_control/PDU-3-ADA/hardware/electricity/electricity.c

@@ -22,6 +22,9 @@ extern float   F_AC_E;
 extern float   F_AC_PF;		
 extern float   F_AC_PS;
 
+extern uint8_t voltage_flag;
+
+
 float elec[RelaySlaveChaNum] = {0.0};
 
 void electricity_init(void)
@@ -51,7 +54,19 @@ static void read_ele(uint8_t channel)
 	if(channel < RelaySlaveChaNum)
 	{
 		select_channel(channel);
-
+#if (AC_3_3 || AC_3_4)
+		
+		voltage_flag = channel;
+#else
+		if(channel >= PT_SUB_COUNT)
+		{
+			voltage_flag = 1;
+		}else
+		{
+			voltage_flag = 0;
+		}
+		
+#endif
 		Calculate_HLW8110_MeterData();
 		if(F_AC_V > 20 && F_AC_LINE_Freq < 1.0)
 		{

+ 136 - 18
truing_control/PDU-3-ADA/hardware/hlw8110/Hlw8110.c

@@ -13,6 +13,7 @@
 #include "uart.h"
 #include "Timer.h"
 #include "mb.h"
+#include "common.h"
 #if HLW8110
 
 #define HIGH	1
@@ -95,6 +96,9 @@ float 	F_AC_E_B;												// B通
 float   F_AC_BACKUP_E_B;								// B通道电量备份	
 float   F_AC_LINE_Freq;     						// 市电线性频率
 
+uint8_t voltage_flag = 0;
+
+
 void Clear_RxBuf(void)
 {
 	unsigned char i;
@@ -616,7 +620,7 @@ void Check_WriteReg_Success(void)
 void Read_HLW8110_IA(void)
 {	
 	float a;
-	
+	board_t *board = get_board();
 	Uart_Read_HLW8110_Reg(REG_RMSIA_ADDR,3);
 	//DelayNms(10);
 	for(uint8_t i = 0;i < 5;i++)
@@ -651,7 +655,22 @@ void Read_HLW8110_IA(void)
 		a = (float)U32_RMSIA_RegData;
 		a = a * U16_RMSIAC_RegData;
 		a  = a/0x800000;                     //电流计算出来的浮点数单位是mA,比如5003.12 
-		a = a/1;  								// 1 = 电流系数
+		 
+		//a = a/1;  								// 1 = 电流系数
+#if (AC_3_3 || AC_3_4)		
+		a /= ((float)board->i_k[voltage_flag]/10000.0);
+#else
+		if(voltage_flag == 1)
+		 {
+			a /= ((float)board->i_k[1]/10000.0);
+		 }else
+		 {
+			a /= ((float)board->i_k[0]/10000.0);
+		 }
+#endif		 
+		 
+		 
+		 
 		a = a/1000;              //a= 5003ma,a/1000 = 5.003A,单位转换成A
 		a = a * D_CAL_A_I;				//D_CAL_A_I是校正系数,默认是1
 		F_AC_I = a;
@@ -662,6 +681,7 @@ void Read_HLW8110_IA(void)
 void Read_HLW8110_U(void)
 {
 	float a;
+	board_t *board = get_board();
 	
 	Uart_Read_HLW8110_Reg(REG_RMSU_ADDR,3);
 	for(uint8_t i = 0;i < 5;i++)
@@ -698,8 +718,20 @@ void Read_HLW8110_U(void)
   a =  (float)U32_RMSU_RegData;
   a = a*U16_RMSUC_RegData;  
   a = a/0x400000;       
-  a = a/1;  						// 1 = 电压系数
-	a= a * 3.189;
+  //a = a/0.31163;  						// 1 = 电压系数
+	// a= a * 3.189;
+		
+#if (AC_3_3 || AC_3_4)		
+		a /= ((float)board->v_k[voltage_flag]/10000.0);
+#else
+		if(voltage_flag == 1)
+		 {
+			a /= ((float)board->v_k[1]/10000.0);
+		 }else
+		 {
+			a /= ((float)board->v_k[0]/10000.0);
+		 }
+#endif		 
   a = a/100;    				//计算出a = 22083.12mV,a/100表示220.8312V,电压转换成V
   a = a*D_CAL_U;				//D_CAL_U是校正系数,默认是1,		
   F_AC_V = a;
@@ -711,7 +743,7 @@ void Read_HLW8110_PA(void)
 {
 	float a;
 	float b;
-	
+	board_t *board = get_board();
 	Uart_Read_HLW8110_Reg(REG_POWER_PA_ADDR,4);
 	for(uint8_t i = 0;i < 5;i++)
 	{
@@ -749,10 +781,40 @@ void Read_HLW8110_PA(void)
 	//单位为W,比如算出来5000.123,表示5000.123W
 	
     a = a*U16_PowerPAC_RegData;
-    a = a/0x80000000;             
-    a = a/1;  										// 1 = 电流系数
-		a = a * 3.189;
-    a = a/1;  										// 1 = 电压系数
+    a = a/0x80000000;  
+	 
+    //a = a/1;  										// 1 = 电流系数
+#if (AC_3_3 || AC_3_4)		
+		a /= ((float)board->i_k[voltage_flag]/10000.0);
+#else
+		if(voltage_flag == 1)
+		 {
+			a /= ((float)board->i_k[1]/10000.0);
+		 }else
+		 {
+			a /= ((float)board->i_k[0]/10000.0);
+		 }
+#endif		 
+	 
+	 
+	 
+//		a = a/0.31163;  
+	 //a = a * 3.189;
+    //a = a/1;  										// 1 = 电压系数
+#if (AC_3_3 || AC_3_4)		
+		 a /= ((float)board->v_k[voltage_flag]/10000.0);
+#else
+		if(voltage_flag == 1)
+		 {
+			a /= ((float)board->v_k[1]/10000.0);
+		 }else
+		 {
+			a /= ((float)board->v_k[0]/10000.0);
+		 }
+#endif			
+
+		
+		
     a = a * D_CAL_A_P;						//D_CAL_A_P是校正系数,默认是1
     F_AC_P = a;									//单位为W,比如算出来5000.123,表示5000.123W
 
@@ -769,7 +831,7 @@ void Read_HLW8110_PSA(void)
 {
 	float a;
 	float b;
-	
+	board_t *board = get_board();
 	Uart_Read_HLW8110_Reg(REG_POWER_PAS_ADDR,4);
 	for(uint8_t i = 0;i < 5;i++)
 	{
@@ -808,10 +870,40 @@ void Read_HLW8110_PSA(void)
 	
     a = a*U16_PowerPAC_RegData;
     a = a/0x80000000;             
-    a = a/1;  										// 1 = 电流系数
-		a = a * 3.189;
-    a = a/1;  										// 1 = 电压系数
-    a = a * D_CAL_A_P;						//D_CAL_A_P是校正系数,默认是1
+    //a = a/1;  										// 1 = 电流系数
+		//a = a * 3.189;
+	 
+#if (AC_3_3 || AC_3_4)		
+		 a /= ((float)board->i_k[voltage_flag]/10000.0);
+#else
+		if(voltage_flag == 1)
+		 {
+			a /= ((float)board->i_k[1]/10000.0);
+		 }else
+		 {
+			a /= ((float)board->i_k[0]/10000.0);
+		 }
+#endif			
+	 
+	 
+    //a = a/1;  										// 1 = 电压系数
+		//a = a/0.31163; 
+
+
+#if (AC_3_3 || AC_3_4)		
+		 a /= ((float)board->v_k[voltage_flag]/10000.0);
+#else
+		if(voltage_flag == 1)
+		 {
+			a /= ((float)board->v_k[1]/10000.0);
+		 }else
+		 {
+			a /= ((float)board->v_k[0]/10000.0);
+		 }
+#endif			
+
+
+	 a = a * D_CAL_A_P;						//D_CAL_A_P是校正系数,默认是1
     F_AC_PS = a;									//单位为W,比如算出来5000.123,表示5000.123W
 
 }
@@ -819,6 +911,7 @@ void Read_HLW8110_PSA(void)
 void Read_HLW8110_EA(void)
 {
 	float a;
+	board_t *board = get_board();
 	Uart_Read_HLW8110_Reg(REG_ENERGY_PA_ADDR,3); 
 	for(uint8_t i = 0;i < 5;i++)
 	{
@@ -860,10 +953,35 @@ void Read_HLW8110_EA(void)
 	a =  (float)U32_ENERGY_PA_RegData;	
   a = a*U16_EnergyAC_RegData;
   a = a/0x20000000;             //电量单位是0.001KWH,比如算出来是2.002,表示2.002KWH    
-  a = a/1;  										// 1 = 电流系数
-	a= a * 3.189;
-  a = a/1;  										// 1 = 电压系数
-  a = a * D_CAL_A_E;     				//D_CAL_A_E是校正系数,默认是1
+  //a = a/1;  										// 1 = 电流系数
+#if (AC_3_3 || AC_3_4)		
+		 a /= ((float)board->i_k[voltage_flag]/10000.0);
+#else
+		if(voltage_flag == 1)
+		 {
+			a /= ((float)board->i_k[1]/10000.0);
+		 }else
+		 {
+			a /= ((float)board->i_k[0]/10000.0);
+		 }
+#endif			
+	
+	//a= a * 3.189;
+  //a = a/1;  										// 1 = 电压系数
+  //a = a/0.31163;  
+#if (AC_3_3 || AC_3_4)		
+		 a /= ((float)board->v_k[voltage_flag]/10000.0);
+#else
+		if(voltage_flag == 1)
+		 {
+			a /= ((float)board->v_k[1]/10000.0);
+		 }else
+		 {
+			a /= ((float)board->v_k[0]/10000.0);
+		 }
+#endif		
+	
+	a = a * D_CAL_A_E;     				//D_CAL_A_E是校正系数,默认是1
   F_AC_E = a;
 	F_AC_BACKUP_E = F_AC_E;
 		

+ 23 - 0
truing_control/PDU-3-ADA/modbus/BARE/port/port.c

@@ -646,6 +646,29 @@ eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs, eMBRegi
 									data.start_addr = (rom_start+(start*4));
 									board->q_cache.en_queue(&data);										
 								}
+							}else if(usAddress >= SET_V_K_VALUE && usAddress <= (SET_V_K_VALUE + SET_V_K_VALUE_LEN))
+							{
+								uint16_t rom_start = 0;
+								start = usAddress - SET_V_K_VALUE;
+								base = (uint32_t*)(&board->v_k[0]) + start;
+								memcpy(base,&usRegHoldBuf[WiRegIndex],2*WusNRegs);
+								rom_start = EEPROM_SET_V_K_ADDR;
+								data.lenth =WusNRegs*2;
+								data.start_addr = (rom_start+(start*4));
+								memcpy(&data.data,&usRegHoldBuf[WiRegIndex],2*WusNRegs);
+								board->q_cache.en_queue(&data);
+								
+							}else if(usAddress >= SET_I_K_VALUE && usAddress <= (SET_I_K_VALUE + SET_I_K_VALUE_LEN))
+							{
+								uint16_t rom_start = 0;
+								start = usAddress - SET_I_K_VALUE;
+								base = (uint32_t*)(&board->i_k[0]) + start;
+								memcpy(base,&usRegHoldBuf[WiRegIndex],2*WusNRegs);
+								rom_start = EEPROM_SET_K_I_ADDR;
+								data.lenth =WusNRegs*2;
+								data.start_addr = (rom_start+(start*4));
+								memcpy(&data.data,&usRegHoldBuf[WiRegIndex],2*WusNRegs);
+								board->q_cache.en_queue(&data);								
 							}
 						}
 						break;

+ 2 - 2
truing_control/PDU-3-ADA/user/board_cfg.h

@@ -25,8 +25,8 @@
 
 
 #define   AC_3_3                      0
-#define  	AC_3_2											1
-#define   AC_3_4                      0
+#define  	AC_3_2											0
+#define   AC_3_4                      1