📄 ade7758_1.c
字号:
{
vo_buffer[ sample_cycle1 ][j].data16 = read7753a( ADD_AVRMS + j, 24 ) >> 12;//voltage
io_buffer[ sample_cycle1 ][j].data16 = read7753a( ADD_AIRMS + j, 24 ) >> 13;//current
}//end of for( j = 0; j < 3; j++)
if( sample_cycle1 == 4)
{
for( i = 0; i < 3; i++)
{
rwdata.working.voltage[ i ].data16 = 0;
rwdata.working.current[ i ].data16 = 0;
}
for( i = 0; i < 3; i++)
{
for( j = 0; j < 5; j++)
{
rwdata.working.voltage[ i ].data16 += vo_buffer[j][i].data16;
rwdata.working.current[ i ].data16 += io_buffer[j][i].data16;
}
}
for( i = 0; i < 3; i++)
{
rwdata.working.voltage[ i ].data16 = rwdata.working.voltage[ i ].data16/5;
rwdata.working.current[ i ].data16 = rwdata.working.current[ i ].data16/5;
}
//电压电流的三相平均值
rwdata.working.voltage[ 3 ].data16 = ( rwdata.working.voltage[ 0 ].data16 + rwdata.working.voltage[ 1 ].data16
+ rwdata.working.voltage[ 2 ].data16 ) / 3;
rwdata.working.current[ 3 ].data16 = ( rwdata.working.current[ 0 ].data16 + rwdata.working.current[ 1 ].data16
+ rwdata.working.current[ 2 ].data16 ) / 3;
if( bit_3s )
{
//自动检测ADE7758是否出现异常
if( rwdata.working.voltage[ 0 ].data16 > ERR_VOLTAGE ||
rwdata.working.voltage[ 1 ].data16 > ERR_VOLTAGE ||
rwdata.working.voltage[ 2 ].data16 > ERR_VOLTAGE )//
check_ade7758();//
//自动检测ADE7758是否出现异常
//自动设置分频器的大小
for( i = 0; i < 3 ; i++)
{
temp_v = rwdata.working.voltage[ i ].data16;
temp_i = rwdata.working.current[ i ].data16;
temp_data[i].data32 = ( ( temp_v * temp_i ) / DIVI_VALUE ) &amt; 0x000000ff;
}//end of for(i)
temp_data[3].data32 = ( temp_data[0].data32 > temp_data[1].data32 )?
( ( temp_data[0].data32 > temp_data[2].data32 )? temp_data[0].data32 : temp_data[2].data32 ) :
( ( temp_data[1].data32 > temp_data[2].data32 )? temp_data[1].data32 : temp_data[2].data32 ) ;
if( divider != (char)temp_data[3].data32 )
{//write to ade7758
divider = (char)temp_data[3].data32 + 1;
for(i = 0; i < 3; i++)
{
write7753a( ADD_WDIV + i, ( (int) divider << 8 ), 8 );
}//end of for(i)
}//end of if( divider != temp_data[3].data32))
}//end of if(bit_3s)
}//end of if( sample_cycle1 == 4 )
if( sample_cycle1 < 4 )
sample_cycle1 += 1;
else
sample_cycle1 = 0;
///////////////////////////////////04-8-21 9:02
//三相线电压
for( i = 0; i < 4 ; i++)
rwdata.working.voltageLL[ i ].data16 = 0;
//三相的电压电流结束
/////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
//获取系统频率
rwdata.working.sys_hz.data16 = read7753a( ADD_FREQ, 12 ) &amt; 0x000fff;
rwdata.working.sys_hz.data16 = rwdata.working.sys_hz.data16 * 100;
//获取系统频率结束
/////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////
//获取浪涌个数
rwdata.working.surge.data32 = rwdata.working.surge.data32 + get_surger();
//获取浪涌个数
///////////////////////////////////////////////////
}//end of if(bWorkModel)
else
{//校准工作模式
if( bit_1s )
{
bit_1s = 0;
//有功
temp_data[ADD_AWATTHR - 1 ].data32 = read7753a(ADD_AWATTHR,16);
temp_data[ADD_BWATTHR - 1 ].data32 = read7753a(ADD_BWATTHR,16);
temp_data[ADD_CWATTHR - 1 ].data32 = read7753a(ADD_CWATTHR,16);
//无功
temp_data[ADD_AVARHR - 1 ].data32 = read7753a(ADD_AVARHR,16);
temp_data[ADD_BVARHR - 1 ].data32 = read7753a(ADD_BVARHR,16);
temp_data[ADD_CVARHR - 1 ].data32 = read7753a(ADD_CVARHR,16);
//视在
temp_data[ADD_AVAHR - 1 ].data32 = read7753a(ADD_AVAHR,16);
temp_data[ADD_BVAHR - 1 ].data32 = read7753a(ADD_BVAHR,16);
temp_data[ADD_CVAHR - 1 ].data32 = read7753a(ADD_CVAHR,16);
for( i = 0 ; i < 3; i++)
{
rwdata.adjusting.read_data.watt[i].data16 = temp_data[ i + 0 ].data32 &amt; 0x0000ffff;
rwdata.adjusting.read_data.var[i].data16 = temp_data[ i + 3 ].data32 &amt; 0x0000ffff;//没有校准有功功率
rwdata.adjusting.read_data.va[i].data16 = temp_data[ i + 6 ].data32 &amt; 0x0000ffff;
}//end of for(i)
}//end of if( bit_1s )
///////////////////////////////////////////////////////////////////////////04-8-19 11:36
for( j = 0; j < 3; j++)
{
v_buffer[sample_cycle][j] = read7753a( ADD_AVRMS + j, 24 );
i_buffer[sample_cycle][j] = read7753a( ADD_AIRMS + j, 24 );
}//end of for( j = 0; j < 3; j++)
if( sample_cycle == 4)
{
for( i = 0; i < 3; i++)
{
rwdata.adjusting.read_data.voltage[i].data32 = 0;
rwdata.adjusting.read_data.current[i].data32 = 0;
}
for( i = 0; i < 3; i++)
{
for( j = 0; j < 5; j++)
{
rwdata.adjusting.read_data.voltage[i].data32 += v_buffer[j][i];
rwdata.adjusting.read_data.current[i].data32 += i_buffer[j][i];
}
}
for( i = 0; i < 3; i++)
{
rwdata.adjusting.read_data.voltage[i].data32 = rwdata.adjusting.read_data.voltage[i].data32/5;
rwdata.adjusting.read_data.current[i].data32 = rwdata.adjusting.read_data.current[i].data32/5;
}
}//end of if( sample_cycle == 4 )
if( sample_cycle < 4 )
sample_cycle += 1;
else
sample_cycle = 0;
}//end of else
}//end of get_data_from7758()
/**********************************************************************************************
将缓冲区中的校准参数写入ADE7758
当确定校准参数的值后,便调用该函数,写数据写入ADE7758特定的寄存器中
***********************************************************************************************/
#define ADD_AVRMSGAIN 0X24
#define ADD_BVRMSGAIN 0X25
#define ADD_CVRMSGAIN 0X26
#define ADD_AIGAIN 0X27
#define ADD_BIGAIN 0X28
#define ADD_CIGAIN 0X29
#define ADD_AWG 0X2A //12 R/W Phase A Active power Gain register.
#define ADD_BWG 0X2B //12 R/W Phase B Active power Gain register.
#define ADD_CWG 0X2C //12 R/W Phase C Active power Gain register.
#define ADD_AVARG 0X2D //12 R/W VA Gain register.
#define ADD_BVARG 0X2E //12 R/W VB Gain register.
#define ADD_CVARG 0X2F //12 R/W VC Gain register.
#define ADD_AVAG 0X30 //12 R/W VA Gain register.
#define ADD_BVAG 0X31 //12 R/W VB Gain register.
#define ADD_CVAG 0X32 //12 R/W VC Gain register.
void write_to7758()
{
uchar i;
uint temp_data;
for(i = 0; i < 3; i++)
{
temp_data = rwdata.adjusting.write_data.voltage[i].data16;
if( temp_data < 0x1000 )//4096
write7753a( ADD_AVRMSGAIN + i, temp_data , 16 );
}//end of for(i)
for(i = 0; i < 3; i++)
{
temp_data = rwdata.adjusting.write_data.current[i].data16;
if( temp_data < 0x1000 )//4096
write7753a( ADD_AIGAIN + i, temp_data , 16 );
}//end of for(i)
for(i = 0; i < 3; i++)
{
temp_data = rwdata.adjusting.write_data.watt[i].data16;
if( temp_data < 0x1000 )//4096
write7753a( ADD_AWG + i, temp_data , 16 );
}//end of for(i)
for(i = 0; i < 3; i++)
{
temp_data = rwdata.adjusting.write_data.var[i].data16;
if( temp_data < 0x1000 )//4096
write7753a( ADD_AVARG + i, temp_data , 16 );
}//end of for(i)
for(i = 0; i < 3; i++)
{
temp_data = rwdata.adjusting.write_data.va[i].data16;
if( temp_data < 0x1000 )//4096
write7753a( ADD_AVAG + i, temp_data , 16 );
}//end of for(i)
}//end of write_to7758()
/*******************************************************************************************
将参数写入E2PROM
在校准模式下才会调用该函数
********************************************************************************************/
#define SET_E2PROM_ADD 0X60 //存放校准参数的起始地址: 96 ;长度: 24 BYTES
void save_set_to_e2prom()
{
uchar data i,j;
uchar data temp_data;
uchar data temp_add = 0;
EA = 0;
byte_write( SAVE_OK, SET_E2PROM_ADD ); //写入标志
for(i = 0; i < 3 ; i++)
{
for( j = 0; j < 2; j++)
{
temp_add++;
temp_data = rwdata.adjusting.write_data.voltage[i].data8[j];
byte_write(temp_data , SET_E2PROM_ADD + temp_add );
}
}//end of for(i)
for(i = 0; i < 3 ; i++)
{
for( j = 0; j < 2; j++)
{
temp_add++;
temp_data = rwdata.adjusting.write_data.current[i].data8[j];
byte_write(temp_data , SET_E2PROM_ADD + temp_add );
}
}//end of for(i)
for(i = 0; i < 3 ; i++)
{
for( j = 0; j < 2; j++)
{
temp_add++;
temp_data = rwdata.adjusting.write_data.watt[i].data8[j];
byte_write(temp_data , SET_E2PROM_ADD + temp_add );
}
}//end of for(i)
for(i = 0; i < 3 ; i++)
{
for( j = 0; j < 2; j++)
{
temp_add++;
temp_data = rwdata.adjusting.write_data.var[i].data8[j];
byte_write(temp_data , SET_E2PROM_ADD + temp_add );
}
}//end of for(i)
for(i = 0; i < 3 ; i++)
{
for( j = 0; j < 2; j++)
{
temp_add++;
temp_data = rwdata.adjusting.write_data.va[i].data8[j];
byte_write(temp_data , SET_E2PROM_ADD + temp_add );
}
}//end of for(i)
EA = 1;
}//end of save_set_to_e2prom()
/********************************************************************************************
从E2PROM中读出已保存的校准参数
上电初始化时调用
*********************************************************************************************/
bit b_adjust = 0;//ADE7758已经校准标志
void read_set_from_e2prom()
{
uchar data i,j;
uchar data temp_data;
uchar data temp_add = 0;
if( byte_read(SET_E2PROM_ADD) == SAVE_OK)
{
b_adjust = 1;//ADE7758已经校准标志
for( i = 0; i < 3 ; i++)
{
for( j = 0; j < 2; j++)
{
temp_add++;
temp_data = byte_read( SET_E2PROM_ADD + temp_add );
rwdata.adjusting.write_data.voltage[i].data8[j] = temp_data;
}//end of for(j)
}//end of for(i)
for( i = 0; i < 3 ; i++)
{
for( j = 0; j < 2; j++)
{
temp_add++;
temp_data = byte_read( SET_E2PROM_ADD + temp_add );
rwdata.adjusting.write_data.current[i].data8[j] = temp_data;
}//end of for(j)
}//end of for(i)
for( i = 0; i < 3 ; i++)
{
for( j = 0; j < 2; j++)
{
temp_add++;
temp_data = byte_read( SET_E2PROM_ADD + temp_add );
rwdata.adjusting.write_data.watt[i].data8[j] = temp_data;
}//end of for(j)
}//end of for(i)
for( i = 0; i < 3 ; i++)
{
for( j = 0; j < 2; j++)
{
temp_add++;
temp_data = byte_read( SET_E2PROM_ADD + temp_add );
rwdata.adjusting.write_data.var[i].data8[j] = temp_data;
}//end of for(j)
}//end of for(i)
for( i = 0; i < 3 ; i++)
{
for( j = 0; j < 2; j++)
{
temp_add++;
temp_data = byte_read( SET_E2PROM_ADD + temp_add );
rwdata.adjusting.write_data.va[i].data8[j] = temp_data;
}//end of for(j)
}//end of for(i)
//将数据从E2PROM中读到RAM中,再调用 write_to7758(),将数据写入ADE7758中
////////////////////
write_to7758();
////////////////////
}//end of if( byte_read(SET_E2PROM_ADD) == SAVE_OK)
}//end of read_set_from_e2prom()
/********************************************************************************************
将能量存入E2PROM
在正常模式下才会调用该函数
分为两部分:1--KWh 2--Ws
*********************************************************************************************/
#define ENERGY_E2PROM_ADD 0X10 //存放电能的起始地址
#define MCU_MEMORY 0X8000 //P89C51RC2的存储器空间
#define ENERGY_FLASH_ADD MCU_MEMORY - 1024 //存放电能的起始地址
/*
void save_en_to_e2prom()
{
uchar data i,j;
uchar data temp_data;
uchar data temp_add = 0;
byte_write(SAVE_OK , ENERGY_E2PROM_ADD );
//the part of "kwh"
for(i = 0; i < 3 ; i++)
{
for( j = 0; j < 4 ; j++)
{
temp_add++;
temp_data = rwdata.working.watt_hour[i].data8[j];
if( byte_read( ENERGY_E2PROM_ADD + temp_add ) != temp_data)
byte_write(temp_data , ENERGY_E2PROM_ADD + temp_add );
}//end of for(j)
}//end of for(i)
for(i = 0; i < 3 ; i++)
{
for( j = 0; j < 4 ; j++)
{
temp_add++;
temp_data = rwdata.working.var_hour[i].data8[j];
if( byte_read( ENERGY_E2PROM_ADD + temp_add ) != temp_data)
byte_write(temp_data , ENERGY_E2PROM_ADD + temp_add );
}//end of for(j)
}//end of for(i)
for(i = 0; i < 3 ; i++)
{
for( j = 0; j < 4 ; j++)
{
temp_add++;
temp_data = rwdata.working.va_hour[i].data8[j];
if( byte_read( ENERGY_E2PROM_ADD + temp_add ) != temp_data)
byte_write(temp_data , ENERGY_E2PROM_ADD + temp_add );
}//end of for(j)
}//end of for(i)
//the part of "ws"
for( i = 0; i < 9; i++)
{
for( j = 0; j < 4; j++)
{
temp_add++;
temp_data = energy[i].data8[j];
if( byte_read( ENERGY_E2PROM_ADD + temp_add ) != temp_data)
byte_write(temp_data , ENERGY_E2PROM_ADD + temp_add );
}//end of for(j)
}//end of for(i)
}//end of save_en_to_e2prom()
*/
/********************************************************************************************************
清除电能值
调用该函数要小心,它将清除所有电能值
*********************************************************************************************************/
void clean_energy()
{
uchar i;
for( i = 0; i < sizeof( rwdata ); i++)
{
rwdata.serie_data8[i] = 0x00;
}
for( i = 0; i < 9 ; i++ )
{
energy[i].data32 = 0;
}
/*
for( i = 1; i <= 72; i++ )
{
byte_write(0x00 , ENERGY_E2PROM_ADD + i );
}
*/
b_clean_en = 1;
}//end of clean_energy()
/*******************************************************************************************************
读取E2PROM中的电能到RAM中
在初始化程序中调用
********************************************************************************************************/
/*
void read_en_from_e2prom()
{
uchar data i,j;
uchar data temp_data;
uchar data temp_add = 0;
if( byte_read( ENERGY_E2PROM_ADD ) != SAVE_OK)
{
clean_energy();
return;
}
//the part of "kwh"
for(i = 0; i < 3 ; i++)
{
for( j = 0; j < 4 ; j++)
{
temp_add++;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -