Explorar el Código

单相交流控制板增加电压电流校准。

liyi hace 11 meses
padre
commit
fde09fdfd7

+ 20 - 0
truing_control/PDU-AC_ADA_NEW_6/common/common.c

@@ -52,6 +52,16 @@ void read_config_from_eeprom(void)
 			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->v_k[0] = 3135;
+			board->v_k[1] = 3135;
+			
+			board->i_k[0] = 10000;
+			board->i_k[1] = 10000;		
+			board->write_eeprom_page(EEPROM_K_V_ADDR,(uint8_t *)&board->v_k[0],EEPROM_K_V_LEN);
+			
+			board->write_eeprom_page(EEPROM_K_I_ADDR,(uint8_t *)&board->i_k[0],EEPROM_K_I_LEN);
+				
 			board->write_eeprom_page(EEPROM_DEVICES_ADDR,(uint8_t *)&board->md_data.r_data.dev_chn,EEPROM_DEVICES_LENTH);
 		}
 		{
@@ -80,6 +90,16 @@ void read_config_from_eeprom(void)
 				board->check_threshold(THRESHOLD_OUT,i);
 			}
 			
+			board->read_eeprom_page(EEPROM_K_V_ADDR,(uint8_t *)&board->v_k[0],EEPROM_K_V_LEN);
+			
+			board->read_eeprom_page(EEPROM_K_I_ADDR,(uint8_t *)&board->i_k[0],EEPROM_K_I_LEN);
+			
+			for(int i =0 ;i < 2;i++)
+			{
+				board->v_k[i] = board->v_k[i] > 10000 ?  3135 : board->v_k[i];
+				board->i_k[i] = board->i_k[i] > 10000 ?  10000 : board->i_k[i];
+			}
+			
 			iic_data chache={0};
 			for(uint8_t i = 0 ; i < MAX_ROW;i++)
 			{

+ 19 - 0
truing_control/PDU-AC_ADA_NEW_6/common/common.h

@@ -61,6 +61,11 @@
 
 #define CLEAR_CONSUMER_ALL                 (5128)
 
+#define SET_PT_KV													(5129)
+#define SET_PT_KV_LEN                     (2)
+
+#define SET_PT_KI                         (5131)
+#define SET_PT_KI_LEN                     (2)
 
 #define TOTAL_THR                           (5200)
 #define TOTAL_THR_LEN                       (16)
@@ -242,10 +247,12 @@
 #define EEPROM_DEVICES_LENTH                  (2)
 
 
+
 #define EEPROM_STATUS_ADDR                    (64)			// one page
 #define EEPROM_STATUS_LENTH                   (16*2)
 
 
+
 #define EEPROM_OTHER_ADDR                     (128)
 #define EEPROM_OTHER_LENTH                    (32*30)   // 30 page    
 
@@ -263,6 +270,16 @@
 #define EEPROM_CONSUMER_ADDR                  (3072)
 #define EEPROM_CONSUMER_ADDR_LEN              (CONSUM_PAGE*MAX_ROW)
 
+#define EEPROM_K_V_ADDR                        (6144)
+#define EEPROM_K_V_LEN                         (4)
+
+#define EEPROM_K_I_ADDR												 (6176)
+#define EEPROM_K_I_LEN                         (4)
+
+
+
+
+
 
 #define THRESHOLD_IN             							0
 #define THRESHOLD_OUT            							1
@@ -681,6 +698,8 @@ typedef struct {
 	//uint16_t  relay_zero_limit_counter[3];
 	consumer_data con_da;
 	uint32_t ele_restore[MAX_CHANNEL];
+	uint16_t    v_k[2];
+	uint16_t    i_k[2];
 	uint8_t   haddr;
 	uint8_t   detection_1_value;
 	uint32_t  detection_1_count;

+ 13 - 0
truing_control/PDU-AC_ADA_NEW_6/hardware/electricity/electricity.c

@@ -18,6 +18,8 @@ extern float   F_AC_LINE_Freq;
 extern float   F_AC_E;													
 extern float   F_AC_PF;		
 
+extern uint8_t flag_value;
+
 extern uint32_t adc_Avg_value[ADC_CH_N];
 
 float elec[RelaySlaveChaNum] = {0.0};
@@ -48,6 +50,17 @@ static void read_ele(uint8_t channel)
 
 	if(channel < RelaySlaveChaNum)
 	{
+#if SURPPORT_2_PT
+		if( channel >= PT_SUB_COUNT)
+		{
+			flag_value = 1;
+		}else
+		{
+			flag_value = 0;
+		}
+#else
+		flag_value = 0;
+#endif
 		select_channel(channel);
 
 		Calculate_HLW8110_MeterData();

+ 44 - 13
truing_control/PDU-AC_ADA_NEW_6/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
@@ -94,6 +95,8 @@ float 	F_AC_E_B;												// B通
 float   F_AC_BACKUP_E_B;								// B通道电量备份	
 float   F_AC_LINE_Freq;     						// 市电线性频率
 
+uint8_t flag_value = 0;
+
 void Clear_RxBuf(void)
 {
 	unsigned char i;
@@ -615,7 +618,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++)
@@ -650,7 +653,10 @@ 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 = 电流系数
+		if(flag_value)
+			a = a/((float)board->i_k[1]/10000.0);  								// 1 = 电流系数
+		else
+			a = a/((float)board->i_k[0]/10000.0);
 		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;
@@ -661,7 +667,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++)
 	{
@@ -697,8 +703,12 @@ 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;
+	if(flag_value)
+			a = a/((float)board->v_k[1]/10000.0);  								// 1 = 电流系数
+	else
+		  a = a/((float)board->v_k[0]/10000.0);
+  //a = a/0.31163;  						// 1 = 电压系数
+	//a= a * 3.189;
   a = a/100;    				//计算出a = 22083.12mV,a/100表示220.8312V,电压转换成V
   a = a*D_CAL_U;				//D_CAL_U是校正系数,默认是1,		
   F_AC_V = a;
@@ -710,7 +720,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,9 +759,19 @@ void Read_HLW8110_PA(void)
 	
     a = a*U16_PowerPAC_RegData;
     a = a/0x80000000;             
-    a = a/1;  										// 1 = 电流系数
-		a = a * 3.189;
-    a = a/1;  										// 1 = 电压系数
+	  if(flag_value)
+			a = a/((float)board->i_k[1]/10000.0);  								// 1 = 电流系数
+		else
+		  a = a/((float)board->i_k[0]/10000.0);    
+	 //a = a/1;  										// 1 = 电流系数
+		//a = a/0.31163; 
+	 //a = a * 3.189;
+   // a = a/0.31163;  										// 1 = 电压系数
+	  if(flag_value)
+			a = a/((float)board->v_k[1]/10000.0);  								// 1 = 电压系数
+		else
+		  a = a/((float)board->v_k[0]/10000.0);
+	
     a = a * D_CAL_A_P;						//D_CAL_A_P是校正系数,默认是1
     F_AC_P = a;									//单位为W,比如算出来5000.123,表示5000.123W
 
@@ -761,6 +781,7 @@ void Read_HLW8110_PA(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++)
 	{
@@ -802,10 +823,20 @@ 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
+	
+	  if(flag_value)
+			a = a/((float)board->i_k[1]/10000.0);  								// 1 = 电流系数
+		else
+		  a = a/((float)board->i_k[0]/10000.0);    
+  //a = a/1;  										// 1 = 电流系数
+	//a= a * 3.189;
+  //a = a/0.31163;  										// 1 = 电压系数
+	  if(flag_value)
+			a = a/((float)board->v_k[1]/10000.0);  								// 1 = 电压系数
+		else
+		  a = a/((float)board->v_k[0]/10000.0);  
+		
+	a = a * D_CAL_A_E;     				//D_CAL_A_E是校正系数,默认是1
   F_AC_E = a;
 	F_AC_BACKUP_E = F_AC_E;
 		

+ 22 - 0
truing_control/PDU-AC_ADA_NEW_6/modbus/BARE/port/port.c

@@ -410,6 +410,28 @@ eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs, eMBRegi
 									elec[i] = 0.0;
 									board->ele_restore[i] = 0;									
 								}
+							}else if((usAddress >= SET_PT_KV) && (usAddress <= (SET_PT_KV + SET_PT_KV_LEN)))
+							{
+								start = usAddress - SET_PT_KV;
+								base = (uint16_t*)(&board->v_k[0]);
+								base+=start;
+								memcpy(base,&usRegHoldBuf[WiRegIndex],2*WusNRegs);
+								data.lenth =WusNRegs*2;
+								memcpy(&data.data,&usRegHoldBuf[WiRegIndex],2*WusNRegs);
+								uint16_t rom_start = EEPROM_K_V_ADDR;
+								data.start_addr = (rom_start+(start*2));
+								board->q_cache.en_queue(&data);
+							}else if((usAddress >= SET_PT_KI) && (usAddress <= (SET_PT_KI + SET_PT_KI_LEN)))
+							{
+								start = usAddress - SET_PT_KI;
+								base = (uint16_t*)(&board->i_k[0]);
+								base+=start;
+								memcpy(base,&usRegHoldBuf[WiRegIndex],2*WusNRegs);
+								data.lenth =WusNRegs*2;
+								memcpy(&data.data,&usRegHoldBuf[WiRegIndex],2*WusNRegs);
+								uint16_t rom_start = EEPROM_K_I_ADDR;
+								data.start_addr = (rom_start+(start*2));
+								board->q_cache.en_queue(&data);								
 							}
 						}
 						break;