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

📄 ade7758.c.svn-base

📁 一个基于UCOS/2操作系统开发的实际产品(电力负控)的代码
💻 SVN-BASE
字号:
/****************************************Copyright (c)**************************************************
**                               江苏高科电力自动化设备有限公司
**                                        开发部 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
         
#include "Includes.h"


/*********************************************************************************************************
** Function name:			ADE7758&SPI0 &INT0 Init
**
** Descriptions:			Initialize the ADE7758&SPI0
********************************************************************************************************/
        void ADE7758Init(void)
{   uint32	sret,i;
    uint8   sb,sc1,sc2,scr,scv;
    
    
	PINSEL0 = (PINSEL0 & 0xffff00ff) | 0x5500;          /* 选择管脚为P0.4-P0.7为SPI0 */
    PINSEL1 = (PINSEL1 & 0xfffffffc) | 0x01;            /* 选择管脚为P0.16为 INT0 */
    PINSEL1 = (PINSEL1 & 0xffffffc3) | 0x00;            /* 选择管脚为P0.18 ADE7758 片选线*/
    IO0DIR  = IO0DIR   | 0x00060050;
    //VICIntSelect =  1 << 0x0e;

    sret=S0PSR;
    sret=S0PSR;
    S0PCCR = 0x08;                                      /* 分频值 */
    S0PCR  = 0x28;                                      /* 不允许中断、高位在前、主机、高有效、第二个时钟采样*/
    sret=S0PSR;
    if(sret&0x80)sret=S0PDR;

    for(i=0;i<16;i++)
       {IO0SET  = 1 << 18;
        IO0CLR  = 1 << 18;
        sb=ADE_ReadReg(0x14);
        ADE_WriteReg(0x14,0x55);
        sc1=ADE_ReadReg(0x14);
        ADE_WriteReg(0x14,sb);
        sc2=ADE_ReadReg(0x14);
        scr=ADE_ReadReg(0x7e);
        scv=ADE_ReadReg(0x7f);
        if((sc2==sb)&&(sc1==0x55)&&(scv>0x01))break;
        }
    if(i<0x08) 
      {DispStr(ADEOkStr,0,3,0);
       ADEData.InitOk=1;
      }
     else
      {DispStr(ADEErrStr,0,3,0);
       ADEData.InitOk=0;
      }

    if(ADEData.InitOk==1)
      {ADE_InitModeReg(&ADEData);
	   ADE_InitGainReg(&ADEData);
	   ADE_InitCalReg(&ADEData);
       ADEData.Wave.RPoint=64;

       T1IR = 0xffffffff;
       T1TCR = 0x01;
       T1TC = 0;

       ADE_ReadRealData(&ADEData);
      }

}

/*******************************************************
* 名称: ADE_InitModeReg
* 功能: 初始化ADE7758模式寄存器
* 入口参数: ADEDataDef *ADEData
* 出口参数: 无
*******************************************************/

void ADE_InitModeReg(ADEDataDef * Data)
{

    do                                  //设置OPMODE  
      ADE_WriteReg(0x13,0x00);
     while(ADE_ReadReg(0x13)!=0x00);

    do                                  //设置MMODE  
      ADE_WriteReg(0x14,0xfc);
     while(ADE_ReadReg(0x14)!=0xfc);

    do                                  //设置WAVEMODE  
      ADE_WriteReg(0x15,0x60);
     while(ADE_ReadReg(0x15)!=0x60);

    do                                  //设置COMPMODE  
      ADE_WriteReg(0x16,0x1c);
     while(ADE_ReadReg(0x16)!=0x1c);

    do                                  //设置OPMODE  
      ADE_WriteReg(0x17,0x78);
     while(ADE_ReadReg(0x17)!=0x78);

    do                                  //设置Mask  
      ADE_WriteReg(0x18,0x010000);
     while(ADE_ReadReg(0x18)!=0x010000);


    ADEData.Wave.Ri=0;
    ADEData.Wave.RStep=0;
    ADEData.Wave.ROk=0;
    ADE_ReadReg(0x1a);
}

/*******************************************************
* 名称: ADE_InitGainReg
* 功能: 初始化ADE7758信号放大寄存器
* 入口参数: ADEDataDef *ADEData
* 出口参数: 无
*******************************************************/

void ADE_InitGainReg(ADEDataDef *ADEData)
{
	(*ADEData).Gain.gain = 0x00;		 //??
	ADE_WriteReg(0x23,(*ADEData).Gain.gain);

	(*ADEData).Gain.AVRmsGain = 0;
	ADE_WriteReg(0x24,(*ADEData).Gain.AVRmsGain);
	
	(*ADEData).Gain.BVRmsGain = 0;
	ADE_WriteReg(0x25,(*ADEData).Gain.BVRmsGain);

	(*ADEData).Gain.CVRmsGain = 0;
	ADE_WriteReg(0x26,(*ADEData).Gain.CVRmsGain);

	(*ADEData).Gain.AIGain = 0;
	ADE_WriteReg(0x27,(*ADEData).Gain.AIGain);

	(*ADEData).Gain.BIGain = 0;
	ADE_WriteReg(0x28,(*ADEData).Gain.BIGain);

	(*ADEData).Gain.CIGain = 0;
	ADE_WriteReg(0x29,(*ADEData).Gain.CIGain);

	(*ADEData).Gain.AWG = 0X0F35;
	ADE_WriteReg(0x2A,(*ADEData).Gain.AWG);

	(*ADEData).Gain.BWG = 0X0F35;
	ADE_WriteReg(0x2B,(*ADEData).Gain.BWG);

	(*ADEData).Gain.CWG = 0X0F35;
	ADE_WriteReg(0x2C,(*ADEData).Gain.CWG);

	(*ADEData).Gain.AVARG = 0X0F35;
	ADE_WriteReg(0x2D,(*ADEData).Gain.AVARG);

	(*ADEData).Gain.BVARG = 0X0F35;
	ADE_WriteReg(0x2E,(*ADEData).Gain.BVARG);

	(*ADEData).Gain.CVARG = 0X0F35;
	ADE_WriteReg(0x2F,(*ADEData).Gain.CVARG);

	(*ADEData).Gain.AVAG = 0;
	ADE_WriteReg(0x30,(*ADEData).Gain.AVAG);

	(*ADEData).Gain.BVAG = 0;
	ADE_WriteReg(0x31,(*ADEData).Gain.BVAG);

	(*ADEData).Gain.CVAG = 0;
	ADE_WriteReg(0x32,(*ADEData).Gain.CVAG);
 
}

/*******************************************************
* 名称: ADE_InitCalReg
* 功能: 初始化ADE7758信号校准寄存器
* 入口参数: ADEDataDef *ADEData
* 出口参数: 无
*******************************************************/

void ADE_InitCalReg(ADEDataDef *ADEData)
{
	(*ADEData).Cal.AVRmsOS = 0X00;
	ADE_WriteReg(0x33,(*ADEData).Cal.AVRmsOS);

	(*ADEData).Cal.BVRmsOS = 0X00;
	ADE_WriteReg(0x34,(*ADEData).Cal.BVRmsOS);

	(*ADEData).Cal.CVRmsOS = 0X00;
	ADE_WriteReg(0x35,(*ADEData).Cal.CVRmsOS);

	(*ADEData).Cal.AIRmsOS = 0X00;
	ADE_WriteReg(0x36,(*ADEData).Cal.AIRmsOS);

	(*ADEData).Cal.BIRmsOS = 0X00;
	ADE_WriteReg(0x37,(*ADEData).Cal.BIRmsOS);

	(*ADEData).Cal.CIRmsOS = 0X00;
	ADE_WriteReg(0x38,(*ADEData).Cal.CIRmsOS);

	(*ADEData).Cal.AWattOS = 0X00;
	ADE_WriteReg(0x39,(*ADEData).Cal.AWattOS);

	(*ADEData).Cal.BWattOS = 0X00;
	ADE_WriteReg(0x3A,(*ADEData).Cal.BWattOS);

	(*ADEData).Cal.CWattOS = 0X00;
	ADE_WriteReg(0x3B,(*ADEData).Cal.CWattOS);

	(*ADEData).Cal.AVAROS = 0X00;
	ADE_WriteReg(0x3C,(*ADEData).Cal.AVAROS);

	(*ADEData).Cal.BVAROS = 0X00;
	ADE_WriteReg(0x3D,(*ADEData).Cal.BVAROS);

	(*ADEData).Cal.CVAROS = 0X00;
	ADE_WriteReg(0x3E,(*ADEData).Cal.CVAROS);

	(*ADEData).Cal.APHCal = 0X00;
	ADE_WriteReg(0x3F,(*ADEData).Cal.APHCal);

	(*ADEData).Cal.BPHCal = 0X00;
	ADE_WriteReg(0x40,(*ADEData).Cal.BPHCal);

	(*ADEData).Cal.CPHCal = 0X00;
	ADE_WriteReg(0x41,(*ADEData).Cal.CPHCal);

	/*
    (*ADEData).Cal.Wdiv = 10;
	ADE_WriteReg(0x42,(*ADEData).Cal.Wdiv);

	(*ADEData).Cal.VARdiv = 10;
	ADE_WriteReg(0x43,(*ADEData).Cal.VARdiv);

	(*ADEData).Cal.VAdiv = 10;
	ADE_WriteReg(0x44,(*ADEData).Cal.VAdiv);
    */

	(*ADEData).Cal.ApcfNum = 0X00;
	ADE_WriteReg(0x45,(*ADEData).Cal.ApcfNum);
 	
	(*ADEData).Cal.ApcfDen = 0x0fff;
	ADE_WriteReg(0x46,(*ADEData).Cal.ApcfDen);

	(*ADEData).Cal.VarCFNum = 0X00;
	ADE_WriteReg(0x47,(*ADEData).Cal.VarCFNum);

	(*ADEData).Cal.VarCFDen = 0X0fff;
	ADE_WriteReg(0x48,(*ADEData).Cal.VarCFDen);

}

/*******************************************************
* 名称: ADE_ReadRealData
* 功能: 读取ADE7758 实时数据
* 入口参数: ADEDataDef *ADEData
* 出口参数: 无
*******************************************************/

void ADE_ReadRealData(ADEDataDef *Data)
{
    ADEData.Real.RTime=T1TC;
    T1TC = 0;
    ADEData.Real.AP=ADE_ReadReg(0x01);
    ADEData.Real.BP=ADE_ReadReg(0x02);
    ADEData.Real.CP=ADE_ReadReg(0x03);
    ADEData.Real.AQ=ADE_ReadReg(0x04);
    ADEData.Real.BQ=ADE_ReadReg(0x05);
    ADEData.Real.CQ=ADE_ReadReg(0x06);
    ADEData.Real.AS=ADE_ReadReg(0x07);
    ADEData.Real.BS=ADE_ReadReg(0x08);
    ADEData.Real.CS=ADE_ReadReg(0x09);
    ADEData.Real.AI=ADE_ReadReg(0x0a);
    ADEData.Real.BI=ADE_ReadReg(0x0b);
    ADEData.Real.CI=ADE_ReadReg(0x0c);
    ADEData.Real.AV=ADE_ReadReg(0x0d);
    ADEData.Real.BV=ADE_ReadReg(0x0e);
    ADEData.Real.CV=ADE_ReadReg(0x0f);
    ADEData.Real.F =ADE_ReadReg(0x10);
    ADEData.Real.Tn=ADE_ReadReg(0x11);
    ADEData.Real.ROk=1;
}

/*******************************************************
* 名称: ADE_ReadWaveData
* 功能: 读取ADE7758 波形数据
* 入口参数: ADEDataDef *ADEData
            uint8 rs: 读取通道 AI BI CI Av BV CV
            uint8 rn: 读取数据个数 <140
            uint8 rp:数据速率 64=64点  128=128点
* 出口参数: 无
*******************************************************/

void ADE_ReadWaveData(void)
{

  for(;;)
     {while((ADE_ReadR24(0x1a)&0x10000)==0x00)
         {IO0SET  = 1 << 18;
          IO0CLR  = 1 << 18;
         }
      ADEData.Wave.Data[ADEData.Wave.Ri]=ADE_ReadR24(0x12)>>8;
      if (--ADEData.Wave.Ri==0)
         return;
     }
}

/****************************************************************************************
** 函数名称 : FFT()
** 函数功能 : 快速傅立叶变换  //for voltage 16bit
** pdataR   : 采样的数据
** HamoData : 变换后的值
****************************************************************************************/
void ADE_FFT16(int16 *pdataR,int16 *HamoData)
{
/*
    
    unsigned int m,n;
    long int tmp1;
    long int tmp2;   
    long int tmp;     
    int dataR,dataI;
                              
	for (m=1;m<33;m++)      // 1-20 hamonic 
	{
    	tmp1=0;
    	tmp2=0;  
        	
    	for(n=0;n<64;n++)
    	{                                                   
    		tmp=(long)sintbl[(m*n+16)%64]*pdataR[n];
        	tmp1+=tmp>>20;
        	tmp=(long)sintbl[(m*n)%64]*pdataR[n];
			tmp2+=tmp>>20;
        }
        dataR=tmp1;
        dataI=tmp2;     
        
        tmp1=(long)dataR*dataR;
        tmp1>>=1;
                   
        tmp2=(long)dataI*dataI;
        tmp2>>=1;    
      
        tmp=tmp1+tmp2; 
        tmp=sqrt(tmp);
  		HamoData[m-1]=tmp;	  
   	
        }
*/
}

/****************************************************************************************
** 函数名称 : CurFFT()
** 函数功能 : 快速傅立叶变换//for current 24bit
** pdataR   : 采样的数据
** HamoData : 变换后的值
****************************************************************************************/
void ADE_FFT32(int32 *pdataR,int32 *HamoData)
{
/*    
    unsigned int m,n;
    long int tmp1;
    long int tmp2;   
    long int tmp;     
    int dataR,dataI;
                              
	for (m=1;m<33;m++)      // 1-20 hamonic 
	{
    	tmp1=0;
    	tmp2=0;  
        	
    	for(n=0;n<64;n++)
    	{                                                   
    		tmp=(long)sintbl[(m*n+16)%64]*pdataR[n];
        	tmp1+=tmp>>20;
        	tmp=(long)sintbl[(m*n)%64]*pdataR[n];
			tmp2+=tmp>>20;
        }
        dataR=tmp1;
        dataI=tmp2;     
        
        tmp1=(long)dataR*dataR;
        tmp1>>=1;
                   
        tmp2=(long)dataI*dataI;
        tmp2>>=1;    
      
        tmp=tmp1+tmp2; 
        tmp=sqrt(tmp);
  		HamoData[m-1]=tmp;	  
        }
*/
}

/*******************************************************
* 名称: ADE_ReadReg
* 功能: 读取ADE7758寄存器数据
* 入口参数: uint8 RegNo
* 出口参数: uint32 RetData
*******************************************************/

uint32 ADE_ReadReg(uint8 RegNo)
{
 uint32 rdata;
 uint8  rsize,i;
 rsize=ADE_RegSize[RegNo];
 if(rsize==0x00)
   {
    ADEData.ErrCode=UNDEFREG;
    return 0;
   }
    
 S0PDR=RegNo;
 for(i=0;i<0x80&&(!(S0PSR&0x80));i++);
 S0PDR=0x00;
 for(i=0;i<0x80&&(!(S0PSR&0x80));i++);
 rdata=S0PDR;
 if(rsize==8)return rdata;
 if(rsize==7)
   {rdata&=0x7f;
    return rdata;
   }

 rdata<<=8;
 S0PDR=0x00;
 for(i=0;i<0x80&&(!(S0PSR&0x80));i++);
 rdata+=S0PDR;
 if(rsize==0x10)return rdata;
 if(rsize==0x0c)
   {rdata&=0x0fff;
    return rdata;
   }
 
 rdata<<=8;
 S0PDR=0x00;
 for(i=0;i<0x80&&(!(S0PSR&0x80));i++);
 rdata+=S0PDR;
 return rdata;
}


  /*******************************************************
* 名称: ADE_ReadReg
* 功能: 读取ADE7758寄存器数据
* 入口参数: uint8 RegNo
* 出口参数: uint32 RetData
*******************************************************/

uint32 ADE_ReadR24(uint8 RegNo)
{
 uint32 rdata;
 uint8  i;
    
 S0PDR=RegNo;
 for(i=0;i<0x80&&(!(S0PSR&0x80));i++);
 S0PDR=0x00;
 for(i=0;i<0x80&&(!(S0PSR&0x80));i++);
 rdata=S0PDR<<16;

 S0PDR=0x00;
 for(i=0;i<0x80&&(!(S0PSR&0x80));i++);
 rdata+=S0PDR<<8;

 S0PDR=0x00;
 for(i=0;i<0x80&&(!(S0PSR&0x80));i++);
 rdata+=S0PDR;
 return rdata;
}
/*******************************************************
* 名称: ADE_WriteReg
* 功能: 写入ADE7758寄存器数据
* 入口参数: uint8 RegNo,RegData
* 出口参数: 无
*******************************************************/

void ADE_WriteReg(uint8 RegNo,uint32 RegData)
{
 uint8  rsize,i;
 rsize=ADE_RegSize[RegNo];
 if(rsize==0x00)
   {
    ADEData.ErrCode=UNDEFREG;
    return ;
   }
 
 if(rsize<=0x08)
   {S0PDR=RegNo|0x80;
    for(i=0;i<0x80&&(!(S0PSR&0x80));i++);
    S0PDR=RegData&0xff;
    for(i=0;i<0x80&&(!(S0PSR&0x80));i++);
    return;
   }

 if(rsize<=0x10)
   {S0PDR=RegNo|0x80;
    for(i=0;i<0x80&&(!(S0PSR&0x80));i++);
    S0PDR=(RegData>>8)&0xff;
    for(i=0;i<0x80&&(!(S0PSR&0x80));i++);
    S0PDR=RegData&0xff;
    for(i=0;i<0x80&&(!(S0PSR&0x80));i++);
    return;
   }

 if(rsize<=0x18)
   {S0PDR=RegNo|0x80;
    for(i=0;i<0x80&&(!(S0PSR&0x80));i++);
    S0PDR=(RegData>>16)&0xff;
    for(i=0;i<0x80&&(!(S0PSR&0x80));i++);
    S0PDR=(RegData>> 8)&0xff;
    for(i=0;i<0x80&&(!(S0PSR&0x80));i++);
    S0PDR=RegData&0xff;
    for(i=0;i<0x80&&(!(S0PSR&0x80));i++);
    return;
   }

}

⌨️ 快捷键说明

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