真正的ATT7022C软件校表C程序

来源:本站
导读:目前正在解读《真正的ATT7022C软件校表C程序》的相关信息,《真正的ATT7022C软件校表C程序》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《真正的ATT7022C软件校表C程序》的详细说明。
简介:这里给大家分享了一个真正的ATT7022C软件校表C程序。

#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程序》最后刷新时间 2024-03-14 01:02:34,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《真正的ATT7022C软件校表C程序》该内容的真实性请自行鉴别。