📄 ade7758.c.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 + -