📄 ade7758_dx.c.svn-base
字号:
/*********************************************************************************************************
** 函数名称: Read_ADE7758
** 功能描述: 读ADE7758寄存器内的数据
********************************************************************************************************/
void Read_ADE7758 (uint32 address, uint32 number)
{
uint32 ii;
Clr_Pin(SPI_CLK);
Delay_100us_Stop(1);
Clr_Pin(SEL_ADE7758);
Delay_100us_Stop(1);
SPI_S_Byte(address);
Delay_100us_Stop(1);
for(ii=0;ii<number;ii++) spi_buf[ii] = SPI_R_Byte();
Delay_100us_Stop(1);
Set_Pin(SEL_ADE7758);
Delay_100us_Stop(1);
Set_Pin(SPI_CLK);
Clrwdt();
}
/*********************************************************************************************************
** 函数名称: Write_ADE7758
** 功能描述: 写ADE7758寄存器内的数据
********************************************************************************************************/
void Write_ADE7758 (uint32 address, uint32 number)
{
uint32 ii;
Clr_Pin(SPI_CLK);
Delay_100us_Stop(1);
Clr_Pin(SEL_ADE7758);
Delay_100us_Stop(1);
SPI_S_Byte(address+0x80);
Delay_100us_Stop(1);
for(ii=0;ii<number;ii++) SPI_S_Byte(spi_buf[ii]);
Delay_100us_Stop(1);
Set_Pin(SEL_ADE7758);
Delay_100us_Stop(1);
Set_Pin(SPI_CLK);
Clrwdt();
}
/*********************************************************************************************************
** 函数名称: Initial_ADE7758
** 功能描述: 初始化ADE7758的参数
**
** INPUT:
**
********************************************************************************************************/
void Initial_ADE7758 (void)
{
uint32 ii,phase;
spi_buf[0] = 0x40;
Write_ADE7758(OPMODE,1);
Delay_Ms_Stop(1);
Initial_ADE7758_Noreset();
spi_buf[0] = 0x00;
spi_buf[1] = 0x00;
Write_ADE7758(APCFNUM,2);
Write_ADE7758(VARCFNUM,2);
//----插入标定参数的数据-----
ii = Select_Blank(FINISH_FLAG_ADDR,2);
if (i2c_buf[0]!=0x55 OR i2c_buf[1]!=0x55) ii = 0xEE;
if (ii==0)
{
ii |= Select_Blank(IRMSOS_ADDR,6);
spi_buf[0] = i2c_buf[0];
spi_buf[1] = i2c_buf[1];
Write_ADE7758(AIRMSOS,2);
spi_buf[0] = i2c_buf[2];
spi_buf[1] = i2c_buf[3];
Write_ADE7758(BIRMSOS,2);
spi_buf[0] = i2c_buf[4];
spi_buf[1] = i2c_buf[5];
Write_ADE7758(CIRMSOS,2);
}
if (ii==0)
{
ii |= Select_Blank(IGAIN_ADDR,6);
spi_buf[0] = i2c_buf[0];
spi_buf[1] = i2c_buf[1];
Write_ADE7758(AIGAIN,2);
spi_buf[0] = i2c_buf[2];
spi_buf[1] = i2c_buf[3];
Write_ADE7758(BIGAIN,2);
spi_buf[0] = i2c_buf[4];
spi_buf[1] = i2c_buf[5];
Write_ADE7758(CIGAIN,2);
}
if (ii==0)
{
ii |= Select_Blank(VRMSOS_ADDR,6);
spi_buf[0] = i2c_buf[0];
spi_buf[1] = i2c_buf[1];
Write_ADE7758(AVRMSOS,2);
spi_buf[0] = i2c_buf[2];
spi_buf[1] = i2c_buf[3];
Write_ADE7758(BVRMSOS,2);
spi_buf[0] = i2c_buf[4];
spi_buf[1] = i2c_buf[5];
Write_ADE7758(CVRMSOS,2);
}
if (ii==0)
{
ii |= Select_Blank(VRMSGAIN_ADDR,6);
spi_buf[0] = i2c_buf[0];
spi_buf[1] = i2c_buf[1];
Write_ADE7758(AVRMSGAIN,2);
spi_buf[0] = i2c_buf[2];
spi_buf[1] = i2c_buf[3];
Write_ADE7758(BVRMSGAIN,2);
spi_buf[0] = i2c_buf[4];
spi_buf[1] = i2c_buf[5];
Write_ADE7758(CVRMSGAIN,2);
}
if (ii==0)
{
ii |= Select_Blank(APCFDEN_ADDR,2);
apcfden_buf = (i2c_buf[0]<<8) + i2c_buf[1];
spi_buf[0] = i2c_buf[0];
spi_buf[1] = i2c_buf[1];
Write_ADE7758(APCFDEN,2);
}
if (ii==0)
{
ii |= Select_Blank(WG_ADDR,6);
spi_buf[0] = i2c_buf[0];
spi_buf[1] = i2c_buf[1];
Write_ADE7758(AWG,2);
spi_buf[0] = i2c_buf[2];
spi_buf[1] = i2c_buf[3];
Write_ADE7758(BWG,2);
spi_buf[0] = i2c_buf[4];
spi_buf[1] = i2c_buf[5];
Write_ADE7758(CWG,2);
}
if (ii==0)
{
ii |= Select_Blank(PHCAL_ADDR,3);
spi_buf[0] = i2c_buf[0];
Write_ADE7758(APHCAL,1);
spi_buf[0] = i2c_buf[1];
Write_ADE7758(BPHCAL,1);
spi_buf[0] = i2c_buf[2];
Write_ADE7758(CPHCAL,1);
}
if (ii==0)
{
ii |= Select_Blank(WATTOS_ADDR,6);
spi_buf[0] = i2c_buf[0];
spi_buf[1] = i2c_buf[1];
Write_ADE7758(AWATTOS,2);
spi_buf[0] = i2c_buf[2];
spi_buf[1] = i2c_buf[3];
Write_ADE7758(BWATTOS,2);
spi_buf[0] = i2c_buf[4];
spi_buf[1] = i2c_buf[5];
Write_ADE7758(CWATTOS,2);
}
if (ii==0)
{
ii |= Select_Blank(VARCFDEN_ADDR,2);
varcfden_buf = (i2c_buf[0]<<8) + i2c_buf[1];
spi_buf[0] = i2c_buf[0];
spi_buf[1] = i2c_buf[1];
Write_ADE7758(VARCFDEN,2);
}
if (ii==0)
{
ii |= Select_Blank(VARG_ADDR,6);
spi_buf[0] = i2c_buf[0];
spi_buf[1] = i2c_buf[1];
Write_ADE7758(AVARG,2);
spi_buf[0] = i2c_buf[2];
spi_buf[1] = i2c_buf[3];
Write_ADE7758(BVARG,2);
spi_buf[0] = i2c_buf[4];
spi_buf[1] = i2c_buf[5];
Write_ADE7758(CVARG,2);
}
if (ii==0)
{
ii |= Select_Blank(VAROS_ADDR,6);
spi_buf[0] = i2c_buf[0];
spi_buf[1] = i2c_buf[1];
Write_ADE7758(AVAROS,2);
spi_buf[0] = i2c_buf[2];
spi_buf[1] = i2c_buf[3];
Write_ADE7758(BVAROS,2);
spi_buf[0] = i2c_buf[4];
spi_buf[1] = i2c_buf[5];
Write_ADE7758(CVAROS,2);
}
if (ii==0)
{
ii |= Select_Blank(VAG_ADDR,6);
spi_buf[0] = i2c_buf[0];
spi_buf[1] = i2c_buf[1];
Write_ADE7758(AVAG,2);
spi_buf[0] = i2c_buf[2];
spi_buf[1] = i2c_buf[3];
Write_ADE7758(BVAG,2);
spi_buf[0] = i2c_buf[4];
spi_buf[1] = i2c_buf[5];
Write_ADE7758(CVAG,2);
}
//---------------------------------
for (phase=0;phase<3;phase++)
{
Read_ADE7758 (phase+0x0D,3); //电压
Read_ADE7758 (phase+0x0A,3); //电流
Read_ADE7758 (phase+0x01,2); //有功电量
Read_ADE7758 (phase+0x04,2); //无功电量
Read_ADE7758 (phase+0x07,2); //视在电量
}
Read_ADE7758 (FREQ,2); //电网频率
Read_ADE7758(TEMP,1); //当前温度
//---------------------------------
Read_ADE7758(RSTATUS,3); //Clear all interrupt flags
spi_buf[0] = 0x00;
spi_buf[1] = 0x00;
spi_buf[2] = 0x00;
Write_ADE7758(MASK,3);//
Read_ADE7758(RSTATUS,3); //Clear all interrupt flags
}
/*********************************************************************************************************
** 函数名称: Initial_ADE7758_Noreset
** 功能描述: 初始化ADE7758的参数,但不产生复位信号
**
** INPUT:
**
********************************************************************************************************/
void Initial_ADE7758_Noreset (void)
{
spi_buf[0] = 0x00; //Enable HPE and LPF;
Write_ADE7758(OPMODE,1); //Enable the frequency outputs APCF and VARCF;
//Put ADE7758 in normal operation mode;
spi_buf[0] = 0x00; //Disable digital integrator
Write_ADE7758(GAIN,1); //Disable PGA gain
spi_buf[0] = 0x00; //Phase A is used to be the source of the measurement of the voltage line frequency使用过程中根据实际情况更改
Write_ADE7758(MMODE,1); //Disable PEAK detection
spi_buf[0] = 0x00; //Sample data rate is 26.0ksps
Write_ADE7758(WAVMODE,1); //VARCF is set to Var
spi_buf[0] = 0x3C; //3P4L
Write_ADE7758(COMPMODE,1); //Include all three phases in the APCF and VARCF pulse outputs
//Setting APCF output pin in absolute mode
//Setting VARCF output pin in the unsigned mode
//Disable the no_load threshold
spi_buf[0] = 0xF8;//FREQ NOT PERIOD,DEFAULT 78H;
Write_ADE7758(LCYCMODE,1); //All phases are used for counting the number of zero crossing
//Read-with-reset for all the WATTHR,VARHR and VAHR register
spi_buf[0] = 40;
Write_ADE7758(WDIV,1);
Write_ADE7758(VARDIV,1);
Write_ADE7758(VADIV,1);
}
/*********************************************************************************************************
** 函数名称: Read_Reg
** 功能描述: 读寄存器值累加,然后平均
**
** INPUT:
**
********************************************************************************************************/
uint32 Read_Reg(uint32 reg)
{
uint32 sum = 0;
uint32 temp;
uint32 ii = 128;
Clrwdt();
Delay_Ms_Stop(100);
Clrwdt();
Read_ADE7758(reg,3);
while(ii--)
{
Delay_Ms_Stop(1);
Read_ADE7758(reg,3);
temp = spi_buf[0]*0x10000 + spi_buf[1]*0x100 + spi_buf[2];
if (temp>=0x800000)
{
temp = (-temp) & 0x7FFFFF;
sum -= temp;
}
else sum += temp;
}
if (sum>=0x80000000)
{
sum = -sum;
sum >>= 7;
sum = -sum;
}
else sum >>= 7;
return sum;
}
/*********************************************************************************************************
** 函数名称: Save_Reg
** 功能描述: 保存标定修正值
**
** INPUT:
**
********************************************************************************************************/
void Save_Reg(uint32 data,uint32 spi_reg,uint32 iic_reg)
{
spi_buf[0] = data>>8;
spi_buf[1] = data;
Write_ADE7758(spi_reg,2);
i2c_buf[0] = spi_buf[0];
i2c_buf[1] = spi_buf[1];
Write_2408(iic_reg,2);
}
/*********************************************************************************************************
** 函数名称: Read_Period
** 功能描述: 捕获脉冲输出周期。单位为ms
********************************************************************************************************/
uint32 Read_Period (uint32 type,uint32 num)
{
uint32 sum = 0;
uint32 ii = num;
Clrwdt();
Delay_Ms_Stop(500);
Clrwdt();
if (type)
{
T1CCR = 0x30;
T1IR = 0x20; //clear CR0 interrupt flag
T1TCR = 0x03;
T1TCR = 0x01; //start TIME1
Clrwdt();
while(!(T1IR & 0x20));
T1IR = 0x20; //clear CR0 interrupt flag
T1TCR = 0x03;
T1TCR = 0x01; //start TIME1
Clrwdt();
while(!(T1IR & 0x20));
T1IR = 0x20; //clear CR0 interrupt flag
while(ii--)
{
T1TCR = 0x03;
T1MR0 = 0xFFFFFFFF;
T1TCR = 0x01;
Clrwdt();
while(!(T1IR & 0x20));
T1IR = 0x20; //clear CR0 interrupt flag
sum += T1CR1;
}
}
else
{
T1CCR = 0x06;
T1IR = 0x10; //clear CR0 interrupt flag
T1TCR = 0x03;
T1TCR = 0x01; //start TIME1
Clrwdt();
while(!(T1IR & 0x10));
T1IR = 0x10; //clear CR0 interrupt flag
T1TCR = 0x03;
T1TCR = 0x01;
Clrwdt();
while(!(T1IR & 0x10));
T1IR = 0x10; //clear CR0 interrupt flag
while(ii--)
{
T1TCR = 0x03;
T1MR0 = 0xFFFFFFFF;
T1TCR = 0x01;
Clrwdt();
while(!(T1IR & 0x10));
T1IR = 0x10; //clear CR0 interrupt flag
sum += T1CR0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -