#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); //初始化ATT7022Bvoid 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}*/ ////////////////////////////////////////////////////////////////////////////////////////////////////////////
导读:目前正在解读《真正的ATT7022C软件校表C程序》的相关信息,《真正的ATT7022C软件校表C程序》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《真正的ATT7022C软件校表C程序》的详细说明。
简介:这里给大家分享了一个真正的ATT7022C软件校表C程序。
提醒:《真正的ATT7022C软件校表C程序》最后刷新时间 2024-03-14 01:02:34,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《真正的ATT7022C软件校表C程序》该内容的真实性请自行鉴别。