⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ade7758.c

📁 ADI公司的ADE7758全部使用原代码(包括校验)
💻 C
📖 第 1 页 / 共 5 页
字号:
		temp3=temp3&0x0000007f;
		adeburnparm.BWATVARVA_PH=temp3;		
	}

	temp1=watvarvavaltestpf05.CW_VAL_TEST_PF05;
	temp2=temp1*2;	
	temp1=watvarvavaltest.CW_VAL_TEST;
	temp3=temp2-temp1;
	if(temp3<0)
	{
		temp3=0-temp3;
		fz1=(float)temp3;
		fm=1.732;
		fm=fm*temp1;
		fz2=fz1/fm;
		acsinval=asin(fz2);
		acsinval=acsinval*2654.71;
		temp3=acsinval;
		temp3=temp3&0x0000007f;
		adeburnparm.CWATVARVA_PH=temp3;
	}
	else
	{
		fz1=(float)temp3;
		fm=1.732;
		fm=fm*temp1;
		fz2=fz1/fm;
		acsinval=asin(fz2);
		acsinval=acsinval*1327.35;
		temp3=acsinval;
		temp3=0-temp3;
		temp3=temp3&0x0000007f;
		adeburnparm.CWATVARVA_PH=temp3;		
	}
}	
void MakeWat_Os(void)//获取WAT偏移量
{
	int32 temp1,temp2;
	uint32 tempa;
	float fzItest,fzImin,fz,fz1,fz2;

	//5A
	if(wpd800_cfg.Wpd_Param.bIRating==0x00)
	{
		fzItest=2;
		fzImin=0.32;
		fz=-2.005;
	}
	//1A
	else
	{
		fzItest=0.5;
		fzImin=0.08;
		fz=-8.0184;
	}	
	temp1=watvarvavalmin.AW_VAL_MIN;
	fz1=fzItest*temp1;
	temp2=watvarvavaltest.AW_VAL_TEST;
	fz2=fzImin*temp2;
	fz1=fz1-fz2;
	fz1=fz1*fz;
	temp1=fz1;
	tempa=temp1&0x00000fff;
	adeburnparm.AWAT_OS=tempa;
	temp1=watvarvavalmin.BW_VAL_MIN;
	fz1=fzItest*temp1;
	temp2=watvarvavaltest.BW_VAL_TEST;
	fz2=fzImin*temp2;
	fz1=fz1-fz2;
	fz1=fz1*fz;
	temp1=fz1;
	tempa=temp1&0x00000fff;
	adeburnparm.BWAT_OS=tempa;
	temp1=watvarvavalmin.CW_VAL_MIN;
	fz1=fzItest*temp1;
	temp2=watvarvavaltest.CW_VAL_TEST;
	fz2=fzImin*temp2;
	fz1=fz1-fz2;
	fz1=fz1*fz;
	temp1=fz1;
	tempa=temp1&0x00000fff;
	adeburnparm.CWAT_OS=tempa;
}
void MakeVar_Os(void)//获取VAR偏移量
{
	int32 temp1,temp2;
	uint32 tempa;
	float fzItest,fzImin,fz,fz1,fz2;

	//5A
	if(wpd800_cfg.Wpd_Param.bIRating==0x00)
	{
		fzItest=2;
		fzImin=0.32;
		fz=-2.5864;
	}
	//1A
	else
	{
		fzItest=0.5;
		fzImin=0.08;
		fz=-10.3455;
	}		
	temp1=watvarvavalmin.AVAR_VAL_MIN;
	fz1=fzItest*temp1;
	temp2=watvarvavaltest.AVAR_VAL_TEST;
	fz2=fzImin*temp2;
	fz1=fz1-fz2;
	fz1=fz1*fz;
	temp1=fz1;
	tempa=temp1&0x00000fff;
	adeburnparm.AVAR_OS=tempa;
	temp1=watvarvavalmin.BVAR_VAL_MIN;
	fz1=fzItest*temp1;
	temp2=watvarvavaltest.BVAR_VAL_TEST;
	fz2=fzImin*temp2;
	fz1=fz1-fz2;
	fz1=fz1*fz;
	temp1=fz1;
	tempa=temp1&0x00000fff;
	adeburnparm.BVAR_OS=tempa;
	temp1=watvarvavalmin.CVAR_VAL_MIN;
	fz1=fzItest*temp1;
	temp2=watvarvavaltest.CVAR_VAL_TEST;
	fz2=fzImin*temp2;
	fz1=fz1-fz2;
	fz1=fz1*fz;
	temp1=fz1;
	tempa=temp1&0x00000fff;
	adeburnparm.CVAR_OS=tempa;
}
void ReadVal_Rms(void)//读取效验用UI有效值的平均值
{
	uint8 tempia[32],tempib[32],tempic[32],tempua[32],tempub[32],tempuc[32];
	uint8 *pia,*pib,*pic,*pua,*pub,*puc,i;
	uint32 uitemp1,uitemp2,uitemp3,uitemp4,ia,ib,ic,ua,ub,uc;

	pia=&tempia[0];
	pib=&tempib[0];
	pic=&tempic[0];
	pua=&tempua[0];
	pub=&tempub[0];
	puc=&tempuc[0];	
	
	ReadAde3byte(aderegaddr[RSTATUS_R24U],(uint32 *)&(runaderegval.RSTATUS_VAL_R24U));
	runaderegval.LCYCMODE_VAL_RW8U=0x38;
	runaderegval.MASK_VAL_RW24U=0x000e00;
	WriteAde1byte((aderegaddr[LCYCMODE_RW8U])|0x80,runaderegval.LCYCMODE_VAL_RW8U);//0x38
	WriteAde3byte((aderegaddr[MASK_RW24U])|0x80,runaderegval.MASK_VAL_RW24U);//0x000e00
	while(booleint3==FALSE);
	booleint3=FALSE;
	ReadAde3byte(aderegaddr[RSTATUS_R24U],(uint32 *)&(runaderegval.RSTATUS_VAL_R24U));

	for(i=0;i<10;i++)
	{
		DelayAdeNS(2);				
		DelayAdeNS(2);				
		while(booleint3==FALSE);

		adecmdwrite(aderegaddr[AIRMS_R24U]);
		DelayAdeNS(2);				
		*pia++=adereadvalue();
		*pia++=adereadvalue();
		*pia++=adereadvalue();
		IO1SET = ADECS_SET;		
		adecmdwrite(aderegaddr[BIRMS_R24U]);
		DelayAdeNS(2);				
		*pib++=adereadvalue();
		*pib++=adereadvalue();
		*pib++=adereadvalue();
		IO1SET = ADECS_SET;		
		adecmdwrite(aderegaddr[CIRMS_R24U]);
		DelayAdeNS(2);				
		*pic++=adereadvalue();
		*pic++=adereadvalue();
		*pic++=adereadvalue();
		IO1SET = ADECS_SET;
		adecmdwrite(aderegaddr[AVRMS_R24U]);
		DelayAdeNS(2);				
		*pua++=adereadvalue();
		*pua++=adereadvalue();
		*pua++=adereadvalue();
		IO1SET = ADECS_SET;
		adecmdwrite(aderegaddr[BVRMS_R24U]);
		DelayAdeNS(2);				
		*pub++=adereadvalue();
		*pub++=adereadvalue();
		*pub++=adereadvalue();
		IO1SET = ADECS_SET;
		adecmdwrite(aderegaddr[CVRMS_R24U]);
		DelayAdeNS(2);				
		*puc++=adereadvalue();
		*puc++=adereadvalue();
		*puc++=adereadvalue();
		IO1SET = ADECS_SET;

		DelayAdeNS(2);				
		DelayAdeNS(2);						
		booleint3=FALSE;	
		ReadAde3byte(aderegaddr[RSTATUS_R24U],(uint32 *)&(runaderegval.RSTATUS_VAL_R24U));		
	}
	WriteAde3byte((aderegaddr[MASK_RW24U])|0x80,0x00);
	booleint3=FALSE;	
	ReadAde3byte(aderegaddr[RSTATUS_R24U],(uint32 *)&(runaderegval.RSTATUS_VAL_R24U));

	pia=&tempia[0];
	pib=&tempib[0];
	pic=&tempic[0];
	pua=&tempua[0];
	pub=&tempub[0];
	puc=&tempuc[0];
	ia=0;
	ib=0;
	ic=0;
	ua=0;
	ub=0;
	uc=0;
	for(i=0;i<10;i++){
		uitemp1=*pia++;
		uitemp2=*pia++;
		uitemp3=*pia++;
		uitemp4=(uitemp1<<16)|(uitemp2<<8)|(uitemp3);
		ia=ia+uitemp4;		
		uitemp1=*pib++;
		uitemp2=*pib++;
		uitemp3=*pib++;
		uitemp4=(uitemp1<<16)|(uitemp2<<8)|(uitemp3);
		ib=ib+uitemp4;	
		uitemp1=*pic++;
		uitemp2=*pic++;
		uitemp3=*pic++;
		uitemp4=(uitemp1<<16)|(uitemp2<<8)|(uitemp3);
		ic=ic+uitemp4;	
		uitemp1=*pua++;
		uitemp2=*pua++;
		uitemp3=*pua++;
		uitemp4=(uitemp1<<16)|(uitemp2<<8)|(uitemp3);
		ua=ua+uitemp4;	
		uitemp1=*pub++;
		uitemp2=*pub++;
		uitemp3=*pub++;
		uitemp4=(uitemp1<<16)|(uitemp2<<8)|(uitemp3);
		ub=ub+uitemp4;	
		uitemp1=*puc++;
		uitemp2=*puc++;
		uitemp3=*puc++;
		uitemp4=(uitemp1<<16)|(uitemp2<<8)|(uitemp3);
		uc=uc+uitemp4;	
	}		
	uirmsval.IA_RMS=ia/10;
	uirmsval.IB_RMS=ib/10;
	uirmsval.IC_RMS=ic/10;
	uirmsval.UA_RMS=ua/10;
	uirmsval.UB_RMS=ub/10;
	uirmsval.UC_RMS=uc/10;
}
void WriteUI_Os(void)//从参数区写UI偏移量到ADE7758
{
	runaderegval.AIRMSOS_VAL_RW12S=adeburnparm.IA_RMS_OS;
	runaderegval.BIRMSOS_VAL_RW12S=adeburnparm.IB_RMS_OS;
	runaderegval.CIRMSOS_VAL_RW12S=adeburnparm.IC_RMS_OS;
	runaderegval.AVRMSOS_VAL_RW12S=adeburnparm.UA_RMS_OS;
	runaderegval.BVRMSOS_VAL_RW12S=adeburnparm.UB_RMS_OS;
	runaderegval.CVRMSOS_VAL_RW12S=adeburnparm.UC_RMS_OS;
	WriteAde2byte((aderegaddr[AIRMSOS_RW12S])|0x80,runaderegval.AIRMSOS_VAL_RW12S);
	WriteAde2byte((aderegaddr[BIRMSOS_RW12S])|0x80,runaderegval.BIRMSOS_VAL_RW12S);
	WriteAde2byte((aderegaddr[CIRMSOS_RW12S])|0x80,runaderegval.CIRMSOS_VAL_RW12S);
	WriteAde2byte((aderegaddr[AVRMSOS_RW12S])|0x80,runaderegval.AVRMSOS_VAL_RW12S);
	WriteAde2byte((aderegaddr[BVRMSOS_RW12S])|0x80,runaderegval.BVRMSOS_VAL_RW12S);
	WriteAde2byte((aderegaddr[CVRMSOS_RW12S])|0x80,runaderegval.CVRMSOS_VAL_RW12S);
}
void WriteUI_Gain(void)//从参数区写UI增益到ADE7758
{
	runaderegval.AIGAIN_VAL_RW12S=adeburnparm.IA_RMS_GAIN;
	runaderegval.BIGAIN_VAL_RW12S=adeburnparm.IB_RMS_GAIN;
	runaderegval.CIGAIN_VAL_RW12S=adeburnparm.IC_RMS_GAIN;
	runaderegval.AVRMSGAIN_VAL_RW12S=adeburnparm.UA_RMS_GAIN;
	runaderegval.BVRMSGAIN_VAL_RW12S=adeburnparm.UB_RMS_GAIN;
	runaderegval.CVRMSGAIN_VAL_RW12S=adeburnparm.UC_RMS_GAIN;
	WriteAde2byte((aderegaddr[AIGAIN_RW12S])|0x80,runaderegval.AIGAIN_VAL_RW12S);
	WriteAde2byte((aderegaddr[BIGAIN_RW12S])|0x80,runaderegval.BIGAIN_VAL_RW12S);
	WriteAde2byte((aderegaddr[CIGAIN_RW12S])|0x80,runaderegval.CIGAIN_VAL_RW12S);
	WriteAde2byte((aderegaddr[AVRMSGAIN_RW12S])|0x80,runaderegval.AVRMSGAIN_VAL_RW12S);
	WriteAde2byte((aderegaddr[BVRMSGAIN_RW12S])|0x80,runaderegval.BVRMSGAIN_VAL_RW12S);
	WriteAde2byte((aderegaddr[CVRMSGAIN_RW12S])|0x80,runaderegval.CVRMSGAIN_VAL_RW12S);
}
void ClaerUI_Gain(void)
{
	WriteAde2byte((aderegaddr[AIGAIN_RW12S])|0x80,0x00);
	WriteAde2byte((aderegaddr[BIGAIN_RW12S])|0x80,0x00);
	WriteAde2byte((aderegaddr[CIGAIN_RW12S])|0x80,0x00);
	WriteAde2byte((aderegaddr[AVRMSGAIN_RW12S])|0x80,0x00);
	WriteAde2byte((aderegaddr[BVRMSGAIN_RW12S])|0x80,0x00);
	WriteAde2byte((aderegaddr[CVRMSGAIN_RW12S])|0x80,0x00);
}
void ClaerUI_Os(void)
{
	WriteAde2byte((aderegaddr[AIRMSOS_RW12S])|0x80,0x00);
	WriteAde2byte((aderegaddr[BIRMSOS_RW12S])|0x80,0x00);
	WriteAde2byte((aderegaddr[CIRMSOS_RW12S])|0x80,0x00);
	WriteAde2byte((aderegaddr[AVRMSOS_RW12S])|0x80,0x00);
	WriteAde2byte((aderegaddr[BVRMSOS_RW12S])|0x80,0x00);
	WriteAde2byte((aderegaddr[CVRMSOS_RW12S])|0x80,0x00);
}
void GetUI_Rms_Test(void)//取得UI标准输入量下的UI有效值
{
	uirmsvaltest.IA_RMS_TEST=uirmsval.IA_RMS;
	uirmsvaltest.IB_RMS_TEST=uirmsval.IB_RMS;
	uirmsvaltest.IC_RMS_TEST=uirmsval.IC_RMS;
	uirmsvaltest.UA_RMS_TEST=uirmsval.UA_RMS;
	uirmsvaltest.UB_RMS_TEST=uirmsval.UB_RMS;
	uirmsvaltest.UC_RMS_TEST=uirmsval.UC_RMS;
}
void GetUI_Rms_Min(void)//取得UI最小输入量下的UI有效值
{
	uirmsvalmin.IA_RMS_MIN=uirmsval.IA_RMS;
	uirmsvalmin.IB_RMS_MIN=uirmsval.IB_RMS;
	uirmsvalmin.IC_RMS_MIN=uirmsval.IC_RMS;
	uirmsvalmin.UA_RMS_MIN=uirmsval.UA_RMS;
	uirmsvalmin.UB_RMS_MIN=uirmsval.UB_RMS;
	uirmsvalmin.UC_RMS_MIN=uirmsval.UC_RMS;
}
void MakeUI_Gain(void)//获取UI增益量
{
	float fz,fm;
	int32 temp1,temp2;
	uint32 tempa,tempIexp,tempUexp;

	//5A
	if(wpd800_cfg.Wpd_Param.bIRating==0x00) tempIexp=177372;
	//1A
	if(wpd800_cfg.Wpd_Param.bIRating==0x01) tempIexp=150822;
	//100V
	if(wpd800_cfg.Wpd_Param.bURating==0x00) tempUexp=749591;
	//400V
	if(wpd800_cfg.Wpd_Param.bURating==0x01) tempUexp=710012;

	temp1=uirmsvaltest.IA_RMS_TEST;
	temp2=tempIexp-temp1;
	fz=(float)temp2;
	fz=fz*4096;
	fm=(float)temp1;
	fz=fz/fm;
	temp1=fz;	
	tempa=temp1&0x00000fff;
	adeburnparm.IA_RMS_GAIN=tempa;

	temp1=uirmsvaltest.IB_RMS_TEST;
	temp2=tempIexp-temp1;
	fz=(float)temp2;
	fz=fz*4096;
	fm=(float)temp1;
	fz=fz/fm;
	temp1=fz;	
	tempa=temp1&0x00000fff;
	adeburnparm.IB_RMS_GAIN=tempa;

	temp1=uirmsvaltest.IC_RMS_TEST;
	temp2=tempIexp-temp1;
	fz=(float)temp2;
	fz=fz*4096;
	fm=(float)temp1;
	fz=fz/fm;
	temp1=fz;	
	tempa=temp1&0x00000fff;
	adeburnparm.IC_RMS_GAIN=tempa;

	temp1=uirmsvaltest.UA_RMS_TEST;
	temp2=tempUexp-temp1;
	fz=(float)temp2;
	fz=fz*4096;
	fm=(float)temp1;
	fz=fz/fm;
	temp1=fz;	
	tempa=temp1&0x00000fff;
	adeburnparm.UA_RMS_GAIN=tempa;

	temp1=uirmsvaltest.UB_RMS_TEST;
	temp2=tempUexp-temp1;
	fz=(float)temp2;
	fz=fz*4096;
	fm=(float)temp1;
	fz=fz/fm;
	temp1=fz;	
	tempa=temp1&0x00000fff;
	adeburnparm.UB_RMS_GAIN=tempa;
	
	temp1=uirmsvaltest.UC_RMS_TEST;
	temp2=tempUexp-temp1;
	fz=(float)temp2;
	fz=fz*4096;
	fm=(float)temp1;
	fz=fz/fm;
	temp1=fz;	
	tempa=temp1&0x00000fff;
	adeburnparm.UC_RMS_GAIN=tempa;		
}		
void MakeUI_Os(void)//获取UI偏移量
{
	float fz1,fz2,fm;
	uint32 temp1,temp2;
	int32 tempa;
	uint16 tempItest,tempImin,tempUtest,tempUmin;

	if(wpd800_cfg.Wpd_Param.bIRating==0x00)
	{
		tempItest=20;	
		tempImin=4;	
		fm=-65510;
	}
	else
	{
		tempItest=5;	
		tempImin=1;	
		fm=-4094.36;	
	}
	temp1=uirmsvalmin.IA_RMS_MIN;
	temp2=temp1*tempItest;
	fz1=(float)temp2;
	fz1=fz1*temp2;	
	fz1=fz1/100;
	temp1=uirmsvaltest.IA_RMS_TEST;
	temp2=temp1*tempImin;
	fz2=(float)temp2;
	fz2=fz2*temp2;	
	fz2=fz2/10000;
	fz1=fz1-fz2;
	fz1=fz1/fm;
	tempa=fz1;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -