#define ATT7022b
#include <includes.h>
#include <math.h>
/////////宏定义/////////////////////////////////////////////////////
#define PSet 330 //校准用实际功率值(功率因数为1.0)
#define USet 220 //校准用实际电压
#define ISet 15 //校准用实际电流(放大10倍)
#define PhSet 165
/////////变量定义及初始化(IO口)/////////////////////////////////////////////////////
sbit RST = P2^0;
sbit SIG = P2^1;
sbit DOUT = P2^2; //SPI串行数据输出口,单片机输入口
sbit DIN = P2^3; //SPI串行数据输入口,单片机输出口
sbit CS = P2^5; //SPI使能,低电平有效,单片机输出口
sbit SCLK = P2^4; //SPI时钟,单片机输出口
///////////定义共用体//////////////////////////////////////////////
float ErP,ErQ; //定义有功电能和无功电能
Uint32 PaG,UaG,PhaG,IaG,PbG,UbG,PhbG,IbG,PcG,UcG,PhcG,IcG;//功率、电压、电流和相位增益
/////////函数声明/////////////////////////////////////////////////////////////
void FunDly(Uint32);
Uint32 FunATTR(Uint8 rcmd); //读ATT7022B24位寄存器
void FunATTW(Uint8 wcmd, Uint32 dat); //写ATT7022B 24位寄存器
Uint32 FunPg(Uint32 rP); //求取功率校表参数
Uint32 FunUg(Uint32 rP); //求取电压校表参数
Uint32 FunIg(Uint32 rP); //求取电流校表参数
Uint32 FunPhg(Uint32 rP); //求取相位校表参数
void FunUAd(void); //自动校表三相电压参数
void FunPAd(void); //自动校表三相功率参数
void FunIAd(void); //自动校表三相电流参数
void FunPhAd(void); //自动校表三相相位参数
void FunInitATT(void); //初始化ATT7022B
void FunAdjP(void); //校表参数初始化函数
void FunATTDa(void); //读ATT7022B参数输出寄存器数据
//void FunR7022Er(void); //计算读出当电能数据
/*---------------------延时函数----------------------------*/
void FunDly(Uint32 num)
{
Uint32 i;
for (i=0;i<num;i++) { ; }
}
///////////////////////////////////////////////////////////////
//函数功能说明:Uint32 FunPg(Uint32 rP),功率增益校正函数
//输入参数说明:SPI口读出的功率有效值寄存器的值
//输出参数说明:功率校表参数
Uint32 FunPg(Uint32 rP)
{
float P,PG1,err;
Uint32 PG;
if(rP> 0x800000) //如果T大于2^23
{
P = rP - 16777216;
}// if(Data > 0x800000) end
P = rP >> 8;
err = (P-PSet) / PSet;
PG1=-err/(1+err);
if(PG1>=0)
{
PG=PG1*8388608;
}
else
PG= 16777216 + PG1*8388608;
return PG;
}
/////////////////////////////////////////////////////////////////////////////////////////////
//函数功能说明:void FunPAd(void),三相功率增益同时校正函数
//输入参数说明:无
//输出参数说明:无
//函数调用说明;直接调用void FunATTW(Uint8 wcmd, Uint32 dat)、Uint32 FunATTR(Uint8 rcmd)、
//void FMWriteB(Uint8, Uint8, Uint8, Uint8 *, Uint16和void FMReadB(Uint8, Uint8, Uint8, Uint8 *, Uint16);
/////////////////////////////////////////////////////////////////////////////////////////////
void FunPAd(void)
{
Uint32 rPA,rPB,rPC;
FunATTW(0xC6, 0x000000);
FunDly(80000); //更新时间1/3秒左右,第一次上电要650ms才能有正确值
rPA = FunATTR(rPa); //读取A相功率计量寄存器
rPB = FunATTR(rPb); //读取B相功率计量寄存器
rPC = FunATTR(rPc); //读取C相功率计量寄存器
PaG=FunPg(rPA); //求取A相功率校表参数
PbG=FunPg(rPB); //求取B相功率校表参数
PcG=FunPg(rPC); //求取C相功率校表参数
/////////////往铁存中写参数///////////////////////////////
/////////////xie A xiang canchu ///////////////////////////
FunATTW(0xC9, 0x000000); //允许写校表参数
FunATTW(PgA0, PaG); //写A相校表参数
FunATTW(PgA1, PaG);
//FunATTW(0xC9, 0x000001); //禁止写校表参数
////////////////////////////////////////
/////////////xie B xiang canchu ///////////////////////////
//FunATTW(0xC9, 0x000000);
FunATTW(PgB0, PbG); //写B相校表参数
FunATTW(PgB1, PbG);
//FunATTW(0xC9,0x000001);
/////////////xie C xiang canchu ///////////////////////////
//FunATTW(0xC9, 0x000000);
FunATTW(PgC0, PcG); //写C相校表参数
FunATTW(PgC1, PcG);
FunATTW(0xC9,0x000001);
FMWriteB(FMB, 0xfed0, (Uint8 *)&PaG, 4); //把A相功率增益(共用体中的DA.ld[4])写进铁存0x00、0x01、0x02、0x03中
FMWriteB(FMB, 0xfed4, (Uint8 *)&PbG, 4); //把B相功率增益(共用体中的DA.ld[4])写进铁存0x04、0x05、0x06、0x07中
FMWriteB(FMB, 0xfed8, (Uint8 *)&PcG, 4); //把C相功率增益(共用体中的DA.ld[4])写进铁存0x08、0x09、0x0A、0x0B中
}
///////////////////////////////////////////////////////////////
//函数功能说明:Uint32 FunUg(Uint32 rU),电压增益校正函数
//输入参数说明:SPI口读出的电压有效值寄存器的值
//输出参数说明:电压校表参数
////////////////////////////////////////////////////////////////////
Uint32 FunUg(Uint32 rU)
{
float U,UG1;
Uint32 UG;
U = (rU >> 13);
UG1 = (USet/U)-1;
if(UG1 >= 0)
{
UG = UG1*8388608;
}
else
UG = 16777216 + UG1*8388608;
return UG;
}
//////////////////////////////////////////////////////////////////////////////////
////////函数功能说明:void FunUAd(void),三相电压同时校正函数
//输入参数说明:无
//输出参数说明:无
//函数调用说明;直接调用void FunATTW(Uint8 wcmd, Uint32 dat)、Uint32 FunATTR(Uint8 rcmd)、
//void FMWriteB(Uint8, Uint8, Uint8, Uint8 *, Uint16和void FMReadB(Uint8, Uint8, Uint8, Uint8 *, Uint16);
///////////三相电压同时校正/////////////////////////////////////////
void FunUAd(void)
{
Uint32 rUA,rUB,rUC;
FunATTW(0xC6, 0x000000);
FunDly(80000); //更新时间1/3秒左右,第一次上电要650ms才能有正确值
rUA = FunATTR(rUa); //读取A相电压计量寄存器
rUB = FunATTR(rUb); //读取B相电压计量寄存器
rUC = FunATTR(rUc); //读取C相电压计量寄存器
UaG = FunUg(rUA); //求取A相电压校表参数
UbG = FunUg(rUB); //求取B相电压校表参数
UcG = FunUg(rUC); //求取C相电压校表参数
////////////往铁存中写参数///////////////////////////////
/////////////xie A xiang canchu ///////////////////////////
FunATTW(0xC9, 0x000000);
FunATTW(UgA, UaG); //写A相电压校表参数
//FunATTW(0xC9,0x000001);
////////////////////////////////////////
/////////////xie B xiang canchu ///////////////////////////
//FunATTW(0xC9, 0x000000);
FunATTW(UgB, UbG); //写B相电压校表参数
//FunATTW(0xC9,0x000001);
/////////////xie C xiang canchu ///////////////////////////
//FunATTW(0xC9, 0x000000); //允许写校表参数
FunATTW(UgC, UcG); //写C相电压校表参数
FunATTW(0xC9,0x000001);
FMWriteB(FMB, 0xfedc, (Uint8 *)&UaG, 4); //把A相电压增益(共用体中的DA.ld[4])写进铁存0x0C、0x0D、0x0E、0x0F中
FMWriteB(FMB, 0xfee0, (Uint8 *)&UbG, 4); //把B相电压增益(共用体中的DA.ld[4])写进铁存0x0010、0x0011、0x0012、0x0013中
FMWriteB(FMB, 0xfee4, (Uint8 *)&UcG, 4); //把C相电压增益(共用体中的DA.ld[4])写进铁存
}
///////////////////////////////////////////////////////////////
//函数功能说明:Uint32 FunIg(Uint32 rI),电压增益校正函数
//输入参数说明:SPI口读出的电流有效值寄存器的值
//输出参数说明:电流校表参数
////////////////////////////////////////////////////////////////////
Uint32 FunIg(Uint32 rI)
{
float I,IG1;
Uint32 IG;
I = rI >> 13;
IG1 = (ISet/I/10)-1; //Iar已放大10倍,故除已10
if(IG1 >= 0)
{
IG = IG1*8388608;
}
else
IG= 16777216 + IG1*8388608;
return IG;
}
//函数功能说明:void FunIAd(void),三相相电流校正函数
//输入参数说明:无
//输出参数说明:无
//函数调用说明;直接调用void FunATTW(Uint8 wcmd, Uint32 dat)、Uint32 FunATTR(Uint8 rcmd)、
//void FMWriteB(Uint8, Uint8, Uint8, Uint8 *, Uint16和void FMReadB(Uint8, Uint8, Uint8, Uint8 *, Uint16);
///////////三相相电流校正/////////////////////////////////////////
void FunIAd(void)
{
Uint32 xdata rIB,rIA,rIC;
FunATTW(0xC6, 0x000000);
FunDly(80000); //更新时间1/3秒左右,第一次上电要650ms才能有正确值
rIA = FunATTR(rIa); //读取A相电流计量寄存器
rIB = FunATTR(rIb); //读取B相电流计量寄存器
rIC = FunATTR(rIc); //读取C相电流计量寄存器
IaG = FunIg(rIA); //求取A相电流校表参数
IbG = FunIg(rIB); //求取B相电流校表参数
IcG = FunIg(rIC); //求取C相电流校表参数
/////////////往铁存中写参数///////////////////////////////
/////////////xie A xiang canchu ///////////////////////////
FunATTW(0xC9, 0x000000);
FunATTW(IgA, IaG); //写A相电压校表参数
//FunATTW(0xC9,0x000001);
////////////////////////////////////////
/////////////xie B xiang canchu ///////////////////////////
//FunATTW(0xC9, 0x000000);
FunATTW(IgB, IbG); //写B相电流校表参数
//FunATTW(0xC9,0x000001);
/////////////xie C xiang canchu ///////////////////////////
//FunATTW(0xC9, 0x000000);
FunATTW(IgC, IcG);
FunATTW(0xC9,0x000001);
FMWriteB(FMB, 0xfee8, (Uint8 *)&IaG, 4); //把A相电流增益(共用体中的DA.ld[4])写进铁存0x18、0x19、0x1A、0x1B中
FMWriteB(FMB, 0xfeeC, (Uint8 *)&IbG, 4); //把B相电流增益(共用体中的DA.ld[4])写进铁存0x1C、0x1D、0x1E、0x1F中
FMWriteB(FMB, 0xfef0, (Uint8 *)&IcG, 4); //把C相电流增益(共用体中的DA.ld[4])写进铁存0x20、0x21、0x22、0x23中
}
///////////////////////////////////////////////////////////////
//函数功能说明:Uint32 FunPhg(Uint32 rPh),电压增益校正函数
//输入参数说明:SPI口读出的功率有效值寄存器的值
//输出参数说明:相位校表参数
////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
Uint32 FunPhg(Uint32 rPh)
{
//Sint16 PhSet=165;
float err,theta,Ph;
Uint32 PhG;
if(rPh > 0x800000) //如果T大于2^23
{
rPh = rPh - 16777216;
}// if(Data > 0x800000) end
Ph = (rPh) / 256;
err = (Ph-PhSet) / PhSet;
theta = acos((1+err)*0.5)- 1.0472;
if(theta>=0)
{
PhG=theta*8388608;
}
else
PhG= 16777216 + theta*8388608;
return PhG;
}
////////////////////////////////////////////////////////////////////////////
//函数功能说明:void FunPhAd(void),相位校正函数
//输入参数说明:无
//输出参数说明:无
//函数调用说明;直接调用void FunATTW(Uint8 wcmd, Uint32 dat)、Uint32 FunATTR(Uint8 rcmd)、
//void FMWriteB(Uint8, Uint8, Uint8, Uint8 *, Uint16和void FMReadB(Uint8, Uint8, Uint8, Uint8 *, Uint16);
///////////三相相位校正/////////////////////////////////////
void FunPhAd(void)
{
Uint32 xdata rPA,rPB,rPC;
FunATTW(0xC6, 0x000000);
FunDly(80000); //更新时间1/3秒左右,第一次上电要650ms才能有正确值
rPA = FunATTR(rPa); //读取A相功率计量寄存器(功率因数为0.5L)
rPB = FunATTR(rPb); //读取B相功率计量寄存器(功率因数为0.5L)
rPC = FunATTR(rPc); //读取C相功率计量寄存器(功率因数为0.5L)
PhaG = FunPhg(rPA); //求取A相相位校表参数
PhbG = FunPhg(rPB); //求取B相相位校表参数
PhcG = FunPhg(rPC); //求取C相相位校表参数
/////////////往铁存中写参数///////////////////////////////
/////////////xie A xiang canchu ///////////////////////////
FunATTW(0xC9, 0x000000);
FunATTW(PhA0, PhaG); //写A相相位增益校表参数
FunATTW(PhA1, PhaG);
FunATTW(PhA2, PhaG);
FunATTW(PhA3, PhaG);
FunATTW(PhA4, PhaG);
//FunATTW(0xC9,0x000001);
////////////////////////////////////////
/////////////xie B xiang canchu ///////////////////////////
//FunATTW(0xC9, 0x000000);
FunATTW(PhB0, PhbG); //写B相相位增益校表参数
FunATTW(PhB1, PhbG);
FunATTW(PhB2, PhbG);
FunATTW(PhB3, PhbG);
FunATTW(PhB4, PhbG);
//FunATTW(0xC9,0x000001);
/////////////xie C xiang canchu ///////////////////////////
//FunATTW(0xC9, 0x000000); //写C相相位增益校表参数
FunATTW(PhC0, PhcG);
FunATTW(PhC1, PhcG);
FunATTW(PhC2, PhcG);
FunATTW(PhC3, PhcG);
FunATTW(PhC4, PhcG);
FunATTW(0xC9,0x000001);
FMWriteB(FMB, 0xfef4, (Uint8 *)&PhaG, 4); //把A相相位增益(共用体中的DA.ld[4])写进铁存0x24、0x25、0x26、0x27中
FMWriteB(FMB, 0xfef8, (Uint8 *)&PhbG, 4); //把B相相位增益(共用体中的DA.ld[4])写进铁存中0x28、0x29、0x2A、0x2B中
FMWriteB(FMB, 0xfefc, (Uint8 *)&PhcG, 4); //把C相相位增益(共用体中的DA.ld[4])写进铁存中0x2C、0x2D、0x2E、0x2F中
}
//=================================================================
//函数功能说明: void FunInitATT(void),ATT7022B完成初始化
//输入参数说明: RST高低电平
//输出参数说明:无
//其它说明;调用延时函数void FunDly1(Uint16 num);
//=================================================================
void FunInitATT(void)
{
RST = 0;
FunDly(700); //100us的低电平
RST = 1;
FunDly(1000); //延时1000uS,等待ATT7022B完成初始化
while(SIG); //检测到SIG为低时送校表数据
}
////校表参数初始化函数///////////////////////////////////////////////////////////////////////////////////
void FunAdjP(void)
{
Uint32 Word1;
union UniTempDa
{
Uint32 BWord;
Uint8 BAry[4];
}TempDa;
TempDa.BWord = 0;
Word1 = 0;
FunATTW(0xC9, 0x000000); //允许写校表参数
FunATTW(UADCPg, 0x465504); //电压通道增益
FunATTW(HFst, 0x000072); //设置HFConst,对应电压输入通道取样电压为0.5,电流输入通道取样电压是0.1
FunATTW(Ist, 0x00087e); //设置启动电流
FMReadB(FMB, 0xfed0, (Uint8 *)&TempDa.BAry, 4); //从铁存中读取A相功率增益存于共用体DA1.ld1[4]中
PaG = TempDa.BWord;
FunATTW(PgA0, PaG); //写A相校表参数
FunATTW(PgA1, PaG);
TempDa.BWord = 0;
FMReadB(FMB, 0xfed4, (Uint8 *)&TempDa.BAry, 4); //从铁存中读取B相功率增益存于共用体TempDa.BAry[4]中
PbG = TempDa.BWord;
FunATTW(PgB0, PbG); //写B相校表参数
FunATTW(PgB1, PbG);
TempDa.BWord = 0;
FMReadB(FMB, 0xfed8, TempDa.BAry, 4); //从铁存中读取C相功率增益存于共用体TempDa.BAry[4]
PcG = TempDa.BWord;
FunATTW(PgC0, PcG); //写C相校表参数
FunATTW(PgC1, PcG);
TempDa.BWord = 0;
FMReadB(FMB, 0xfedc, TempDa.BAry, 4); //从铁存中读取A相电压增益存于共用体TempDa.BAry[4]
UaG = TempDa.BWord;
FunATTW(UgA, UaG); //写A相电压校表参数
TempDa.BWord = 0;
FMReadB(FMB, 0xfee0, TempDa.BAry, 4); //从铁存中读取B相电压增益存于共用体TempDa.BAry[4]
UbG = TempDa.BWord;
FunATTW(UgB, UbG); //写B相电压校表参数
TempDa.BWord = 0;
FMReadB(FMB, 0xfee4, TempDa.BAry, 4); //从铁存中读取C相电压增益存于共用体TempDa.BAry[4]
UcG = TempDa.BWord;
FunATTW(UgC, UcG); //写C相电压校表参数
TempDa.BWord = 0;
FMReadB(FMB, 0xfee8, TempDa.BAry, 4); //从铁存中读取A相电流增益存于共用体TempDa.BAry[4]
IaG = TempDa.BWord;
FunATTW(IgA, IaG); //写A相电压校表参数
TempDa.BWord = 0;
FMReadB(FMB, 0xfeec, TempDa.BAry, 4); //从铁存中读取C相电流增益存于共用体TempDa.BAry[4]
IbG = TempDa.BWord;
FunATTW(IgB, IbG); //写B相电流校表参数
TempDa.BWord = 0;
FMReadB(FMB, 0xfef0, TempDa.BAry, 4); //从铁存中读取A相相位增益存于共用体TempDa.BAry[4]
IcG = TempDa.BWord;
FunATTW(IgC, IcG);
TempDa.BWord = 0;
FMReadB(FMB, 0xfef4, TempDa.BAry, 4); //从铁存中读取B相电流增益存于共用体TempDa.BAry[4]
PhaG = TempDa.BWord;
FunATTW(PhA0, PhaG); //写A相相位增益校表参数
FunATTW(PhA1, PhaG);
FunATTW(PhA2, PhaG);
FunATTW(PhA3, PhaG);
FunATTW(PhA4, PhaG);
TempDa.BWord = 0;
FMReadB(FMB, 0xfef8, TempDa.BAry, 4); //从铁存中读取B相相位增益存于共用体TempDa.BAry[4]
PhbG = TempDa.BWord;
FunATTW(PhB0, PhbG); //写B相相位增益校表参数
FunATTW(PhB1, PhbG);
FunATTW(PhB2, PhbG);
FunATTW(PhB3, PhbG);
FunATTW(PhB4, PhbG);
TempDa.BWord = 0;
FMReadB(FMB, 0xfefc, TempDa.BAry, 4); //从铁存中读取C相相位增益存于共用体TempDa.BAry[4]
PhcG = TempDa.BWord;
FunATTW(PhC0, PhcG);
FunATTW(PhC1, PhcG);
FunATTW(PhC2, PhcG);
FunATTW(PhC3, PhcG);
FunATTW(PhC4, PhcG);
FunATTW(0xC9, 0x000001); //禁止写校表参数
}
//=================================================================
//函数功能说明: Uint32 FunATTR(Uint8 rcmd),SPI读操作
//输入参数说明:Uint8 rcmd,rcmd为8字节命令
//输出参数说明:Uint32 iRet,iRet为24位数据
//=================================================================
Uint32 FunATTR(Uint8 rcmd)
{
Uint8 i;
Uint32 iRet;
CS = HIGH;
SCLK = LOWV;
CS = LOWV; //使能SPI
for (i=0; i<8; i++) //通过SPI发送一个字节的命令字
{
SCLK = 1;
if ((rcmd & 0x80)!=0) //判断要写入的字节最高位是否为1,是1写1,不是1写0 ,再左移数据,循环写8次
{
DIN = 1;
}//if ((rcmd & 0x80)!=0)end
else
{
DIN = 0;
}//else end
NOP;NOP;NOP;
SCLK=0;
rcmd = rcmd << 1;
} // for (i=0; i<8; i++)end
DIN = 0;
FunDly(3); //延时3us
iRet = 0;
for(i=0;i<24;i++) //输入0xfe前7位,并输出一个字节的8b循环;
{
iRet = iRet<<1; //先循环要返回的内容(左移一位)
SCLK=1; //拉高时钟总线;
NOP;NOP;NOP;
if(DOUT == 1) //要读的内容位为1,则写1,否则写0;//这里的DOUT始终为1,所以iRet始终是FFFF
{
iRet = iRet|0x01;
}//if(DOUT==1) end
//NOP;NOP;NOP;
SCLK=0; //拉低时钟总线;
}//for(i=0;i<24;i++) end
CS = HIGH; //关闭SPI
return(iRet); //返回数据
}
//=================================================================
//函数功能说明: Uint32 FunATTW(Uint8 wcmd, Uint32 dat),SPI写操作
//输入参数说明:Uint8 wcmd为8字节命令, Uint32 dat为24字节的数据
//输出参数说明:无
//其它说明:调用NOP函数
//=================================================================
void FunATTW(unsigned char wcmd, unsigned long dat)
{
Uint8 i;
CS = HIGH;
SCLK = LOWV;
CS = LOWV; //使能SPI
wcmd = wcmd | 0x80; //最高位置位,表示为写操作
for(i=0; i<8; i++) //通过SPI发送一个字节的命令字
{
SCLK=1;
if((wcmd & 0x80)!=0) //判断要写入的字节最高位是否为1,是1写1,不是1写0 ,再左移数据,循环写8次
{
DIN = 1;
} //if((wcmd & 0x80)!=0) end
else
{
DIN=0;
}
NOP;NOP;NOP;
SCLK=0;
wcmd = wcmd << 1;
}//for(i=0; i<8; i++) end
DIN = 0;
NOP; //写入数据不需要等待
NOP;
for(i=0;i<24;i++) //输入24位参数
{
SCLK=1; //拉高时钟总线;
NOP;NOP;NOP;
if(dat & 0x800000) //要写的内容位为1,则写1,否则写0,高位在前进行发送;
{
DIN = 1;
}// if(dat & 0x800000) end
else
{
DIN = 0;
}// else end
SCLK=0; //拉低时钟总线;
dat = dat << 1;
}//for(i=0;i<24;i++) end
DIN = 0;
CS = HIGH; //关闭SPI
}
////////////////////////////////////////////////////////////////////////////////////////////////////////
//=================================================================
//函数功能说明: FunATTDa(void),读ATT7022B计量寄存器的参数
//输入参数说明: 校表参数
//输出参数说明:无
//其它说明: 调用SPI写操作函数Uint32 FunATTW(Uint8 wcmd, Uint32 dat)和Uint32 FunATTR(Uint8 rcmd)函数
//=================================================================
void FunATTDa(void)
{
Uint32 rDaPA,rDaQA,rDaFa,rDaPB,rDaQB,rDaFb,rDaPC,rDaQC,rDaFc,rDaPt,rDaQt;
FunATTW(0xC6, 0x000000); //设置可以读出计量寄存器的参数
FunDly(80000); //更新时间1/3秒左右,第一次上电要650ms才能有正确值
/////////////读取并计算A相电压值///////////////////////////////////
StcSam.PaA.U = (Uint16)((FunATTR(rUa) >> 13) * 10); //放大10倍
/////////////读取并计算B相电压值///////////////////////////////////
StcSam.PaB.U = (Uint16)((FunATTR(rUb) >> 13) * 10);
/////////////读取并计算C相电压值///////////////////////////////////
StcSam.PaC.U = (Uint16)((FunATTR(rUc) >> 13) * 10);
/////////////读取并计算A相电流值///////////////////////////////////
StcSam.PaA.I = (Uint16)((FunATTR(rIa) >> 13) * 10);
/////////////读取并计算B相电流值///////////////////////////////////
StcSam.PaB.I = (Uint16)((FunATTR(rIb) >> 13) * 10);
/////////////读取并计算C相电流值///////////////////////////////////
StcSam.PaC.I = (Uint16)((FunATTR(rIc) >> 13) * 10);
/////////////读取并计算合相有功功率//////////////////////////////////
rDaPt = FunATTR(rPt);
if(rDaPt > 0x800000) //如果T大于2^23
{
rDaPt = rDaPt - 16777216; //////
}// if(Data > 0x800000) end
StcSam.P = (Uint32)((rDaPt >> 6) * 10);
/////////////读取并计算A相有功功率//////////////////////////////////
rDaPA = FunATTR(rPa);
if(rDaPA > 0x800000) //如果T大于2^23
{
rDaPA = rDaPA - 16777216; //////
}// if(Data > 0x800000) end
StcSam.PaA.P = (Uint32)((rDaPA >> 8) * 10);
/////////////读取并计算B相有功功率//////////////////////////////////
rDaPB = FunATTR(rPb);
if(rDaPB > 0x800000) //如果T大于2^23
{
rDaPB = rDaPB- 16777216; //TT = T-2^24;
}// if(Data > 0x800000) end
StcSam.PaB.P = (Uint32)((rDaPB >> 8) * 10);
/////////////读取并计算C相有功功率//////////////////////////////////
rDaPC = FunATTR(rPc);
if(rDaPC > 0x800000) //如果T大于2^23
{
rDaPC = rDaPC - 16777216; //TT = T-2^24;
}// if(Data > 0x800000) end
StcSam.PaC.P = (Uint32)((rDaPC >> 8) * 10);
/////////////读取读取并计算合相无功功率///////////////////////////
rDaQt = FunATTR(rQt);
if(rDaQt> 0x800000) //如果T大于2^23
{
rDaQt = 16777216 - rDaQt;
}// if(Data > 0x800000) end
StcSam.Q = (Uint32)((rDaQt >> 6) * 10);
//////////////无功功率方向///////////////////////////////////////
StcSam.FgLCQ = FunATTR(rPFg); //有功和无功功率方向寄存器,Bit0-3:分别表示A、B、C、合相的有功功率方向,0为正,1为负
/////////////读取读取并计算A相无功功率///////////////////////////
rDaQA = FunATTR(rQa);
if(rDaQA> 0x800000) //如果T大于2^23
{
rDaQA = 16777216 - rDaQA;
}// if(Data > 0x800000) end
StcSam.PaA.Q = (Uint32)((rDaQA >> 8) * 10);
///////////读取读取并计算B相无功功率///////////////////////////
rDaQB = FunATTR(rQb);
if(rDaQB > 0x800000) //如果T大于2^23
{
rDaQB= 16777216 - rDaQB;
}// if(Data > 0x800000) end
StcSam.PaB.Q = (Uint32)((rDaQB >> 8) * 10);
///////////读取并计算C相无功功率///////////////////////////
rDaQC = FunATTR(rQc);
if(rDaQC > 0x800000) //如果T大于2^23
{
rDaQC =16777216- rDaQC;
}// if(Data > 0x800000) end
StcSam.PaC.Q = (Uint32)((rDaQC >> 8) * 10);
///////////读取并计算A相功率因数///////////////////////////////
rDaFa = FunATTR(rPfa);
if(rDaFa > 0x800000) //如果PF大于2^23
{
rDaFa = 16777216-rDaFa; //PFF = 2^24-PF;
}
StcSam.PaA.PF = (Uint8)((rDaFa >> 23) * 100);
///////////读取并计算B相功率因数///////////////////////////////
rDaFb = FunATTR(rPfb);
if(rDaFb> 0x800000) //如果PF大于2^23
{
rDaFb = 16777216-rDaFb; //PFF = 2^24-PF;
}
StcSam.PaB.PF = (Uint8)((rDaFb >> 23) * 100);
///////////读取并计算C相功率因数///////////////////////////////
rDaFc = FunATTR( rPfc);
if(rDaFc > 0x800000) //如果PF大于2^23
{
rDaFc = 16777216-rDaFc; //PFF = 2^24-PF;
}
StcSam.PaC.PF = (Uint8)((rDaFc >> 23) * 100);
}
//======================================================================================
//函数功能说明:void FunR7022Er(void)读ATT7022B有功和无功参数输出寄存器
//输入参数说明:无
//输出参数说明:无
//其它说明:直接调用函数SPI读操作函数Uint32 FunATTR(Uint8 rcmd)
//======================================================================================
/*
void FunR7022Er(void)
{
Uint32 rDaEpt2,rDaEqt2;
static Uint32 Ept2,Eqt2;
///////////读取并计算合相有功电能//////////////////////////////
rDaEpt2 = FunATTR(rEpt2); //读取有功能量寄存器
FMReadB(FMB, 0x00, 0x30,DA1.ld1 , 4); //利用共用体DA1读取铁存中上次累加的有功能量值
Ept2 = UniDa.BWord;
Ept2 = Ept2 + rDaEpt2; //有功能量累加
UniDa.BWord = Ept2;
FMWriteB(FMB, 0x00, 0x30, UniDa.DaAr, 4); //利用共用体DA向铁存中存有功能量值,存于0x30、0x31、0x32、0x33中
ErP = UniDa.BWord; //有功能量的单位是1/3200kwh
///////////读取并计算合相无功电能//////////////////////////////
rDaEqt2 = FunATTR(rEqt2); //读取无功能量寄存器
//FMReadB(FMB, 0x00, 0x34,DA1.ld1 , 4); //利用共用体DA1读取铁存中上次累加的无功能量值
Eqt2 = UniDa.BWord;
Eqt2 = Eqt2 + rDaEqt2; //无功能量累加
UniDa.BWord = Eqt2;
FMWriteB(FMB, 0x00, 0x34, UniDa.DaAr, 4); //利用共用体DA向铁存中存有功能量值,存于0x34、0x35、0x36、0x37中
ErQ = UniDa.BWord; //无功能量的单位是1/3200kwh
}
*/
////////////////////////////////////////////////////////////////////////////////////////////////////////////