📄 ade7758_dx.c.svn-base
字号:
}
return sum/num;
}
/*********************************************************************************************************
** 函数名称: Select_Blank
** 功能描述: 在三组校表数据中选择正确的数据
**
** INPUT:
** OUTPUT:
********************************************************************************************************/
uint32 Select_Blank (uint32 addr,uint32 num)
{
uint8 bak1[16],bak2[16];
uint32 ii = 0;
uint32 retdata = 0;
Read_2408(addr+BANK1,num);
memcpy(bak1,i2c_buf,num);
Read_2408(addr+BANK2,num);
memcpy(bak2,i2c_buf,num);
Read_2408(addr,num);
if (memcmp(bak1,bak2,num) OR memcmp(bak1,i2c_buf,num) OR memcmp(bak2,i2c_buf,num))
{
if (memcmp(bak1,bak2,num)) ii += 1;
if (memcmp(bak1,i2c_buf,num)) ii += 2;
if (memcmp(bak2,i2c_buf,num)) ii += 4;
switch (ii)
{
case 0:
case 1:
case 2:
case 4:
break;
case 3:
case 5:
break;
case 6:
memcpy(i2c_buf,bak1,num);
break;
case 7:
retdata = 0xEE;
break;
default:break;
}
}
return retdata;
}
/*********************************************************************************************************
** 函数名称: Read_Now_Data
** 功能描述: 读ADE7758内的实时数据
**
** INPUT:
** OUTPUT: now_data[]
********************************************************************************************************/
void Read_Now_Data(void)
{
uint32 phase;
fp64 ww;
uint64 ii;
uint32 voltage,current[4],power[3];
uint32 bianbi;
uint32 xiangxian;
fp64 watt,va;
uint16 temp_75;
static uint8 mmode;
uint8 vartest[3];
uint32 mean_factor;
uint32 num;
uint8 calculate_F_flag;
vartest[0]=0x00;
vartest[1]=0x00;
vartest[2]=0x00;
comvar_buf[0]=0x00;
comvar_buf[1]=0x00;
comvar_buf[2]=0x00;
//----------------------------------------
bianbi = prog_data[I_BIANBI]*0x100 + prog_data[I_BIANBI+1];
//bianbi = 1;
if (bianbi>10000) bianbi = 1;
if ((apcfden_buf<0x100) OR (apcfden_buf>0xFFF))
{
ii = Select_Blank(APCFDEN_ADDR,2);
if (ii==0) apcfden_buf = (i2c_buf[0]<<8) + i2c_buf[1];
else apcfden_buf = 0x1000;
}
if ((varcfden_buf<0x100) OR (varcfden_buf>0xFFF))
{
ii = Select_Blank(VARCFDEN_ADDR,2);
if (ii==0) varcfden_buf = (i2c_buf[0]<<8) + i2c_buf[1];
else varcfden_buf = 0x1000;
}
//-----------------------------------------
for (phase=0;phase<3;phase++)
{
calculate_F_flag=1;///
Read_ADE7758 (phase+0x0D,3); //电压
ii = spi_buf[0]*0x10000 + spi_buf[1]*0x100 + spi_buf[2];
if (ii>=0x800000) ii = -ii;
ww = ii & 0xFFFFFF;
ww = (220*ww*10000)/Voltage_AD_Ref;
ii = ww;
vol[phase] = ii;
if(ii>3000000) ii=2200000;
voltage = ii;
Write_Array(ad_data+phase*33,ii,4); ///0x010800=264.00V
if(Array_BCDtoHEX(ad_data+phase*33,3)>vol_high_limit)//电压越上极限
{
//comvar_buf[0]=bitset(comvar_buf[0],phase,1);
vartest[0]=bitset(vartest[0],phase,1);
comvar_buf[0]=vartest[0];
}
else if(Array_BCDtoHEX(ad_data+phase*33,3)>vol_high)//电压越上限
{
//comvar_buf[0]=bitset(comvar_buf[0],phase+4,1);
vartest[0]=bitset(vartest[0],phase+4,1);
comvar_buf[0]=vartest[0];
}
else if(Array_BCDtoHEX(ad_data+phase*33,3)<vol_low_limit)//电压越下极限
{
//comvar_buf[1]=bitset(comvar_buf[1],phase,1);
vartest[1]=bitset(vartest[1],phase,1);
vartest[1]=bitset(vartest[1],phase,1);
comvar_buf[1]=vartest[1];
}
/*end*/
//---------------
Read_ADE7758 (phase+0x0A,3); //电流
ii = spi_buf[0]*0x10000 + spi_buf[1]*0x100 + spi_buf[2];
if (ii>=0x800000) ii = -ii;
ww = ii & 0xFFFFFF;
if(state_ade7758 & 0x020000)
{
ww=0;
}
ww = bianbi*(15*ww*1000)/Current_AD_Ref;
ii = ww;
if(ii<1350) calculate_F_flag=0;// 9%Ib
if(ii>65000*(bianbi)) ii=60000*bianbi;//电流上限制
current[phase] = ii;
Write_Array(ad_data+phase*33+4,ii,4);
//-------------
num = (prog_data[I_LOW_LIMIT]*0x100 + prog_data[I_LOW_LIMIT+1]) * 100;
if (num > Array_BCDtoHEX(ad_data+phase*33+4,3))
{
vartest[1]=bitset(vartest[1],phase+4,1);
vartest[1]=bitset(vartest[1],phase+4,1);
comvar_buf[1]=vartest[1];
}
//---------------
Read_ADE7758 (phase+0x01,2); //有功电量
ii = spi_buf[0]*0x100 + spi_buf[1];
xiangxian = 0;
if (ii>=0x8000)
{ii = -ii; xiangxian = 1;}
ww = ii & 0xFFFF;
ww = bianbi*ww*((POWER_DIV*(1000))/(4*APCF_CONST*(fp64)apcfden_buf))/10;
watt = ww;
if ((float_dl[phase][0]>=1) OR (float_dl[phase][0]<0)) float_dl[phase][0] = 0;
ww += float_dl[phase][0];
ii = ww;
float_dl[phase][0] = ww - ii;
Write_Array(ad_data+phase*33+23,ii,3);
//---------------
Read_ADE7758 (phase+0x04,2); //无功电量
ii = spi_buf[0]*0x100 + spi_buf[1];
if (ii>=0x8000)
{
ii = -ii;
if (xiangxian==0) ad_data[phase*33+32] = 4;
else ad_data[phase*33+32] = 3;
}
else
{
if (xiangxian==0) ad_data[phase*33+32] = 1;
else ad_data[phase*33+32] = 2;
}
ww = ii & 0xFFFF;
ww = bianbi*ww*((POWER_DIV*(1000))/(4*VARCF_CONST*(fp32)varcfden_buf))/10;
if ((float_dl[phase][1]>=1) OR (float_dl[phase][1]<0)) float_dl[phase][1] = 0;
ww += float_dl[phase][1];
ii = ww;
float_dl[phase][1] = ww - ii;
Write_Array(ad_data+phase*33+26,ii,3);
//---------------
Read_ADE7758 (phase+0x07,2); //视在电量
ii = spi_buf[0]*0x100 + spi_buf[1];
ww = ii;
ww = bianbi*ww*((POWER_DIV*(1000))/(4*VARCF_CONST*(fp32)varcfden_buf))/10;
va = ww;
if ((float_dl[phase][2]>=1) OR (float_dl[phase][2]<0)) float_dl[phase][2] = 0;
ww += float_dl[phase][2];
ii = ww;
float_dl[phase][2] = ww - ii;
Write_Array(ad_data+phase*33+29,ii,3);
//-----------------
if (va<1E-30) {watt = 0; va = 1;}
if (watt>va) watt = va;
ww = watt*10000/va; //功率因数
ii = ww;
if(ii==10000) ii=9999;
if(calculate_F_flag==0) ii=0;
Write_Array(ad_data+phase*33+8,ii,3);
if(ii<power_low)///var is bigger than low_limit
{
//comvar_buf[1]=(comvar_buf[1])|(bitset(comvar_buf[1],(4+phase),1));
vartest[2]=bitset(vartest[2],(4+phase),1);
comvar_buf[2]=vartest[2];
}
else if(ii>power_high)
{
//comvar_buf[1]=(comvar_buf[1])|(bitset(comvar_buf[1],(4+phase),1));
vartest[2]=bitset(vartest[2],phase,1);
comvar_buf[2]=vartest[2];
}
//-----------------
ww = current[phase]; //视在功率
ww *= voltage;
ww /= 10000*1000;
ii = ww;//4173
Write_Array(ad_data+phase*33+19,ii,4);
//-----------------
watt = ww*(watt/va); //有功功率
ii = watt;
active_power[phase]=ii;
Write_Array(ad_data+phase*33+11,ii,4);
//------------------
va = sqrt(fabs(ww*ww-watt*watt));//无功功率
ii = va;
reactive_power[phase]=ii;
Write_Array(ad_data+phase*33+15,ii,4);
}//phase
//------------------ //N 线电流
ww = fabs((fp32)current[0]-(fp32)current[1]) * fabs((fp32)current[0]-(fp32)current[1]);
ww += fabs((fp32)current[2]-(fp32)current[1]) * fabs((fp32)current[2]-(fp32)current[1]);
ww += fabs((fp32)current[0]-(fp32)current[2]) * fabs((fp32)current[0]-(fp32)current[2]);
ww = sqrt(ww/2);
ii = ww;
current[3] = ii;
Write_Array(ad_data+99,ii,4);
//-----------------
Read_ADE7758 (FREQ,2); //电网频率
ii = (spi_buf[0]&0x0F)*0x100 + spi_buf[1];
if (ii == 0) ii = 1;
ii = 1000000000/(ii*96);
//if ((ii<4500) OR (ii>5500))
if ((ii<4500) OR (ii>7500))
{
if (++mmode>3) mmode = 0;
spi_buf[0] = mmode;
Write_ADE7758(MMODE,1);
///ii = 1000000000/5000/96;
ii = 1000000000/2083/96;///5000Hz
}
Write_Array(ad_data+103,ii,2);
//----------------- //总有功功率
memset(ad_data+108,0,4);
for(phase=0;phase<3;phase++) Array_Add_BCD(ad_data+108,ad_data+phase*33+11,4);
//----------------- //总无功功率
memset(ad_data+112,0,4);
for(phase=0;phase<3;phase++) Array_Add_BCD(ad_data+112,ad_data+phase*33+15,4);
//----------------- //总视在功率
memset(ad_data+116,0,4);
for(phase=0;phase<3;phase++) Array_Add_BCD(ad_data+116,ad_data+phase*33+19,4);
//----------------- //总功率因数
ww = Array_BCDtoHEX(ad_data+108,4);
ii = Array_BCDtoHEX(ad_data+116,4);
if (ii == 0) ii = 1;
ww = ww*10000/ii;
ii = ww;
if(ii>=10000) ii=9999;
mean_factor=ii;//9000
Write_Array(ad_data+105,ii,3);
//----------------- //三相电流不平衡率
ww = (current[0]+current[1]+current[2])*3;
if (ww < 1E-30) ww = 1;
ww = current[3]*10000/ww;
ii = ww;
Write_Array(ad_data+122,ii,2);
//---------------- //当前温度
Read_tcn75(TEMP75,2);
ad_data[121] = i2c_buf[0]<<1;///1B 80=27.5 degree
ad_data[121]+= i2c_buf[1]>>7;
temp_75 = ad_data[121]/2*100;///2750
ad_data[121] = (uint16)(temp_75)%100;
ad_data[120] = (uint16)(temp_75)/100;
//-------------------
ii = (vol[0]>vol[1]) ? vol[0]:vol[1]; //三相电压不平衡率
ii = (ii>vol[2]) ? ii:vol[2];
ww = ii;
ii = (vol[0]<vol[1]) ? vol[0]:vol[1];
ii = (ii<vol[2]) ? ii:vol[2];
ww = (ww-ii)*10000/ww;
ii = ww;
if (ii>=10000) ii = 9999;
Write_Array(ad_data+124,ii,2);
//-------------------
ii = ad_data[32];///quadrant of phase A b c
if (ad_data[65]==ad_data[98]) ii = ad_data[65];
state_buf[0] &= 0xCE;///11001110
//comvar_buf[0] &= 0x7F;//无功感性
switch (ii)
{
case 1:
break;
case 2:
state_buf[0] |= 0x11;///容性 反有功
//comvar_buf[0] |= 0x80;//无功容性
break;
case 3:
state_buf[0] |= 0x30;///反无功 反有功
break;
case 4:
state_buf[0] |= 0x21;///容性 反无功
//comvar_buf[0] |= 0x80;//无功容性
break;
default:break;
}
//-------------------
new_power_flag = TRUE;
}
/*********************************************************************************************************
** 函数名称: Adjust_ADE7758_Key
** 功能描述: 调整ADE7758的参数,达到校表的目的,用按键的方式校表
**
** INPUT:
**
********************************************************************************************************/
void Adjust_ADE7758_Key (void)
{
uint32 phase;
uint32 reg1,reg2;
uint32 temp;
fp32 ww;
//--------------------
spi_buf[0] = 0x40; //software reset
Write_ADE7758(OPMODE,1);
Delay_Ms_Stop(1);
spi_buf[0] = 0x00; //Enable HPE and LPF;
Write_ADE7758(OPMODE,1); //Enable the frequency outputs APCF and VARCF;
Delay_Ms_Stop(1); //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
//---------------
i2c_buf[0] = 0xAA;
i2c_buf[1] = 0xAA;
Write_2408(FINISH_FLAG_ADDR,2); //写校表开始标志
Lcd_On(0);
/**************
**名称: 标定电流
**第一步:去除偏移
** 测试条件:三相电压200V;三相电流0A;三相功率因数1.0
**第二步:调整增益
** 测试条件:三相电压200V;三相电流1.5A;三相功率因数1.0
****************/
//------------------
//理论显示 0.00000A
//------------------
Beep(1000);
Xiao_Biao11();
//显示电流 1步
while(key_z != KEY4) {;Process_PCF8574();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -