📄 nsa_timer_drv.c
字号:
//byWhich_CS: 3(全部Three)
bool TM_CS_Set_DC_Offset(BYTE byWhich_CS)
{
DWORD dWord;
BYTE i;
if( byWhich_CS!=CS_ALL )
return false;
for(i=0; i<CS_ALL; i++)
{
//Send soft RESET command
dWord=0x80;
TM_Write_CS5460(WRITE_COM|CONFIG_REG,i,&dWord);
}
//Wait for 10 XIN cycles
for ( dWord =0; dWord<0x1000; dWord++ );
for( i=0; i<CS_ALL; i++)
{
dWord=0xffffff;
TM_Write_CS5460( WRITE_COM| STATUS_REG, i, &dWord );
if(i==1)
TM_Write_CS5460( CALIBRATE| OFF_CALIB| CHANNEL_I_V, i, &dWord );
else
TM_Write_CS5460( CALIBRATE| OFF_CALIB| CHANNEL_I_V, i, &dWord );
}
return true;
}
//偏置校验
//byWhich_CS: 3(全部Three)
bool TM_CS_Set_AC_Offset(BYTE byWhich_CS)
{
DWORD dWord;
BYTE i;
if( byWhich_CS!=CS_ALL )
return false;
for( i=0; i<CS_ALL; i++)
{
dWord=0;
TM_Write_CS5460( WRITE_COM|IACOFF_REG, i, &dWord);
TM_Write_CS5460( WRITE_COM|VACOFF_REG, i, &dWord);
dWord=0x400000;
TM_Write_CS5460( WRITE_COM|IGN_REG, i, &dWord);
TM_Write_CS5460( WRITE_COM|VGN_REG, i, &dWord);
dWord=0xffffff;
TM_Write_CS5460( WRITE_COM| STATUS_REG, i, &dWord );
if(i==1)
TM_Write_CS5460( CALIBRATE| R_AC| OFF_CALIB| CHANNEL_I_V, i, &dWord );
else
TM_Write_CS5460( CALIBRATE| R_AC| OFF_CALIB| CHANNEL_I_V, i, &dWord );
}
return true;
}
//增益校验
//3
bool TM_CS_Set_AC_Gain(BYTE byWhich_CS)
{
DWORD dWord;
BYTE i;
if( byWhich_CS!=CS_ALL )
return false;
for( i=0; i<CS_ALL; i++)
{
TM_Read_CS5460( E_REG, i, &dWord );
TM_Read_CS5460( STATUS_REG, i, &dWord );
//if( (dWord&0x800000)==0 ) return false;
dWord=0x400000;
TM_Write_CS5460( WRITE_COM|IGN_REG, i, &dWord);//1.00增益倍数
TM_Write_CS5460( WRITE_COM|VGN_REG, i, &dWord);
dWord=0xffffff;
TM_Write_CS5460( WRITE_COM| STATUS_REG, i, &dWord);
//if(i==1)
// TM_Write_CS5460( CALIBRATE| R_AC| GAIN_CALIB| CHANNEL_V, i, &dWord );
//else //for PST642
TM_Write_CS5460( CALIBRATE| R_AC| GAIN_CALIB| CHANNEL_I_V, i, &dWord );
}
return true;
}
//角度校验
//Special Bits in some Register
#define BYUP 0x0
#define BYDOWN 0xff
#define BASE_DEGREE 0x60000
bool TM_CS_Set_Degree(BYTE byWhich_CS,BYTE byOprate)
{
//static DWORD dConfig0=0;
DWORD dWord,dTempWord;
//读取CS5460状态
//TM_Read_CS5460( STATUS_REG, byWhich_CS, &Energy_Reg[byWhich_CS].Status );
//清除状态标志
//dWord=0xffffff;
//TM_Write_CS5460( WRITE_COM| STATUS_REG, byWhich_CS, &dWord);
TM_Read_CS5460( CONFIG_REG, byWhich_CS, &dWord );
dTempWord=dWord&0xfe0000;
switch( byOprate )
{
case BYUP:
if(dTempWord<0xfe0000)
dTempWord+=BASE_DEGREE;
break;
case BYDOWN:
if(dTempWord>0x10000)
dTempWord-=BASE_DEGREE;
break;
default:
break;
}
dTempWord|=( dWord&0x01ffff );
TM_Write_CS5460( WRITE_COM| CONFIG_REG, byWhich_CS, &dTempWord );
//重新设置转换
dWord=0xffffff;
//TM_Write_CS5460( CONVERT, byWhich_CS, &dWord);
return true;
}
//保存CS5460配置信息
//3
bool TM_Save_CS5460_Config(BYTE byWhich_CS)
{
BYTE i;
if( byWhich_CS!=CS_ALL )
return false;
for( i=0; i<3; i++)
{
if( CrcOk( (BYTE *)&Energy_Reg[i].Conf, sizeof(CONFIG_5460)-2 ) )
{ //CRC校验正确
TM_Write_CS5460( WRITE_COM|CONFIG_REG, i, &Energy_Reg[i].Conf.Config);
TM_Write_CS5460( WRITE_COM|IOFF_REG, i, &Energy_Reg[i].Conf.Ioff);
TM_Write_CS5460( WRITE_COM|IGN_REG, i, &Energy_Reg[i].Conf.Ign);
TM_Write_CS5460( WRITE_COM|VOFF_REG, i, &Energy_Reg[i].Conf.Voff);
TM_Write_CS5460( WRITE_COM|VGN_REG, i, &Energy_Reg[i].Conf.Vgn);
TM_Write_CS5460( WRITE_COM|IACOFF_REG, i, &Energy_Reg[i].Conf.Iacoff);
TM_Write_CS5460( WRITE_COM|VACOFF_REG, i, &Energy_Reg[i].Conf.Vacoff);
TM_Write_CS5460( WRITE_COM|POFF_REG, i, &Energy_Reg[i].Conf.Poff);
Energy_Reg[i].bUsed=true;
}
else
return false;
}
return true;
}
void Read_CS_Config()
{
BYTE i;
for( i=0; i<CS_ALL; i++ )
{
TM_Read_CS5460( CONFIG_REG, i, &Energy_Reg[i].Conf.Config);
TM_Read_CS5460( IOFF_REG, i, &Energy_Reg[i].Conf.Ioff);
TM_Read_CS5460( IGN_REG, i, &Energy_Reg[i].Conf.Ign);
TM_Read_CS5460( VOFF_REG, i, &Energy_Reg[i].Conf.Voff);
TM_Read_CS5460( VGN_REG, i, &Energy_Reg[i].Conf.Vgn);
TM_Read_CS5460( IACOFF_REG, i, &Energy_Reg[i].Conf.Iacoff);
TM_Read_CS5460( VACOFF_REG, i, &Energy_Reg[i].Conf.Vacoff);
TM_Read_CS5460( POFF_REG, i, &Energy_Reg[i].Conf.Poff);
TM_Read_CS5460( E_REG, i, &Energy_Reg[i].E );
TM_Read_CS5460( STATUS_REG, i, &Energy_Reg[i].Status );
}
}
bool Check_CS_Status()
{
int i;
for( i=0; i<CS_ALL; i++ )
{
//if MATH,IOR,VOR,IROR,VROR,EOR
if(i==1)
{ //Only care about MATH,VOR,VROR
if( (Energy_Reg[i].Status&0x080000)!=0 )
return false;
}
else
{
if( (Energy_Reg[i].Status&0x080000)!=0 ) //Change to only about MATH,EOR etc
return false;
}
if( (Energy_Reg[i].Status&0x0800000)==0 )
return false;
}
return true;
}
bool Check_Calibrate_Status()
{
int i;
//为了通用硬件,必须返回true!
return true;
for( i=0; i<CS_ALL; i++ )
{
//if MATH,IOR,VOR,IROR,VROR,EOR
if(i==1)
{ //Only care about MATH,VOR,VROR
if( (Energy_Reg[i].Status&0x080000)!=0 )
return false;
}
else
{
if( (Energy_Reg[i].Status&0x080000)!=0 ) //Change to only about MATH,EOR etc
return false;
}
if( (Energy_Reg[i].Status&0x800000)==0 )
return false;
}
return true;
}
bool Check_All_Data_Ready()
{
BYTE i;
DWORD dWord;
for( i=0; i<CS_ALL; i++ )
{
TM_Read_CS5460( STATUS_REG, i, &dWord );
if( (dWord&0x800000)==0 )
return false;
}
return true;
}
void Clear_CS_Status()
{
BYTE i;
DWORD dWord;
for( i=0; i<CS_ALL; i++ )
{
dWord=0xffffff;
TM_Write_CS5460( WRITE_COM| STATUS_REG, i, &dWord);
}
}
//设置转换
void Command_Convert()
{
BYTE i;
DWORD dWord;
for( i=0; i<CS_ALL; i++)
{
dWord=0xffffff;
TM_Write_CS5460( CONVERT, i, &dWord);
}
}
void Read_CS_Sample()
{
BYTE i;
for( i=0; i<CS_ALL; i++)
{
//读取CS5460电能
TM_Read_CS5460( E_REG, i, &Energy_Reg[i].E );
//读取CS5460其他电量
TM_Read_CS5460( P_REG, i, &Energy_Reg[i].P );
TM_Read_CS5460( IRMS_REG, i, &Energy_Reg[i].Irms );
TM_Read_CS5460( VRMS_REG, i, &Energy_Reg[i].Vrms );
TM_Read_CS5460( MASK_REG, i, &Energy_Reg[i].Mask );
//读取CS5460状态
TM_Read_CS5460( STATUS_REG, i, &Energy_Reg[i].Status );
}
}
//校验运行中CS5460配置信息
//3
bool TM_Check_CS5460_Config(BYTE byWhich_CS)
{
static ENERGY_REG Eng_Reg[3];
BYTE i;
if( byWhich_CS!=CS_ALL )
return false;
//CS5460配置信息(初始化)在Energy_Reg[i].Conf中
for( i=0; i<CS_ALL; i++ )
{
//获取CS5460当前信息
TM_Read_CS5460( CONFIG_REG, i, &Eng_Reg[i].Conf.Config );
TM_Read_CS5460( IOFF_REG, i, &Eng_Reg[i].Conf.Ioff );
TM_Read_CS5460( IGN_REG, i, &Eng_Reg[i].Conf.Ign );
TM_Read_CS5460( VOFF_REG, i, &Eng_Reg[i].Conf.Voff );
TM_Read_CS5460( VGN_REG, i, &Eng_Reg[i].Conf.Vgn );
TM_Read_CS5460( IACOFF_REG, i, &Eng_Reg[i].Conf.Iacoff );
TM_Read_CS5460( VACOFF_REG, i, &Eng_Reg[i].Conf.Vacoff );
TM_Read_CS5460( POFF_REG, i, &Eng_Reg[i].Conf.Poff );
CrcMake( (BYTE *)&Eng_Reg[i].Conf, sizeof(CONFIG_5460)-sizeof(WORD) ); //Waaa 0916
if( Eng_Reg[i].Conf.wCRC != Energy_Reg[i].Conf.wCRC )
return false;
}
return true;
}
//实际保存能量清0
void TM_Clear_Real_Energy()
{
BYTE i;
BYTE *pb=(BYTE*)&tDian_Liang;
for( i=0; i<sizeof(DIAN_LIANG); i++ )
{
*pb++=0;
}
TM_Write_DS_Array( (char)(ENERGY_OFFSET), sizeof(DIAN_LIANG) ,
(BYTE *)&tDian_Liang );
}
//读取CS5460状态
//3
bool TM_Read_CS5460_Status(BYTE byWhich_CS)
{
BYTE i;
if( byWhich_CS!=CS_ALL ) return false;
for( i=0; i<3; i++ )
TM_Read_CS5460( STATUS_REG, i, &Energy_Reg[i].Status );
return true;
}
void Deal_Energy();
void Convert_Raw_Ive();
//define for Degree Calibrate
#ifdef TEST_CS5460ABS
#define MAX_INDEX 32
const DWORD daDegree[MAX_INDEX+1]={\
0x7e0000,0x780000,0x700000,0x680000,0x600000,0x580000,0x500000,0x480000,\
0x400000,0x380000,0x300000,0x280000,0x200000,0x180000,0x100000,0x080000,\
0x0,\
0xf80000,0xf00000,0xe80000,0xe00000,0xd80000,0xd00000,0xc80000,0xc00000,\
0xb80000,0xb00000,0xa80000,0xa00000,0x980000,0x900000,0x880000,0x800000};
typedef struct tagCALIBRATEDEGREETEMP
{
BYTE byIndexMax[CS_ALL];
BYTE byIndexMid[CS_ALL];
BYTE byIndexMin[CS_ALL];
DWORD dEMax[CS_ALL];
DWORD dEMid[CS_ALL];
DWORD dEMin[CS_ALL];
bool bDone_Max[CS_ALL];
bool bDone_Mid[CS_ALL];
bool bDone_Min[CS_ALL];
bool bDegreeOK[CS_ALL];
}CALIBRATEDEGREETEMP;
static CALIBRATEDEGREETEMP tDegree;
bool TM_CS_Set_Degree1(BYTE which_cs)
{
int i;
for( i=0; i<CS_ALL; i+=2 )
{
if(!tDegree.bDone_Min[i])
{
Energy_Reg[i].Conf.Config=daDegree[tDegree.byIndexMin[i]]|0x000001;
}
else if(!tDegree.bDone_Max[i])
{
Energy_Reg[i].Conf.Config=daDegree[tDegree.byIndexMax[i]] |0x000001;
}
else
{
Energy_Reg[i].Conf.Config=daDegree[tDegree.byIndexMid[i]] |0x000001;
}
TM_Write_CS5460( WRITE_COM| CONFIG_REG, (BYTE)i, &Energy_Reg[i].Conf.Config );
}
//重新设置转换
Command_Convert();
return true;
}
////////////////////////// for every step/////////////////////////
#define INDEXSTART 0x28ul
#define INDEXEND 0x58ul
static DWORD dIndex=INDEXSTART;
static DWORD dE[CS_ALL][128];
DWORD Get_dDegree(DWORD dIn)
{
// 40,60, 7f, 0,1f, 3f
//128: 0 ~ 3f , 40 ~ 7f
if(dIn<=0x3f)
{
return ( (dIn+0x40ul)<<17 );
}
else if(dIn<0x80)
{
return ( (dIn-0x40ul)<<17 );
}
else
{
return (0x0ul);
}
}
bool TM_CS_Set_Degree2(BYTE which_cs)
{
int i;
for( i=0; i<CS_ALL; i+=2 )
{
Energy_Reg[i].Conf.Config= Get_dDegree(dIndex) | 0x000001 ;
TM_Write_CS5460( WRITE_COM| CONFIG_REG, (BYTE)i, &Energy_Reg[i].Conf.Config );
}
//重新设置转换
Command_Convert();
return true;
}
void Record_P2(void)
{
int i;
for (i=0; i<CS_ALL ; i+=2 )
{
dE[i][dIndex]+=Energy_Reg[i].E;
}
}
DWORD dET[3],dINdex[3];
bool Judge_Degree2()
{
int i,j;
if( dIndex<INDEXSTART )
{
dIndex=INDEXSTART;
return false;
}
if( dIndex<INDEXEND )
{
dIndex++;
return false;
}
for(i=0;i<3;i+=2)
{
dET[i]=0;
dINdex[i]=0;
for ( j=INDEXSTART; j<INDEXEND; j++ )
{
if( dE[i][j]>dET[i] )
{
dET[i]=dE[i][j];
dINdex[i]=j;
}
}
Energy_Reg[i].Conf.Config= Get_dDegree(dINdex[i]) |0x000001;
TM_Write_CS5460( WRITE_COM| CONFIG_REG, (BYTE)i, &Energy_Reg[i].Conf.Config );
}
return true;
}
void InitDegreeCalibrateBuffer2()
{
int i,j;
dIndex=INDEXSTART;
for( i=0; i<CS_ALL; i++)
{
dET[i]=0;
dINdex[i]=0x40;
for( j=INDEXSTART; j<INDEXEND; j++ )
{
dE[i][j]=0;
}
}
}
void InitDegreeCalibrateBuffer()
{
int i;
BYTE *pby=(BYTE *)&tDegree;
for( i=0; i<sizeof(CALIBRATEDEGREETEMP); i++)
{
*(pby++)=0;
}
for( i=0; i<CS_ALL; i++ )
{
tDegree.byIndexMax[i]=MAX_INDEX;
tDegree.byIndexMid[i]=MAX_INDEX/2;
}
}
void Record_P()
{
int i;
for( i=0; i<CS_ALL; i+=2 )
{
if( !tDegree.bDone_Min[i] )
{
tDegree.dEMin[i]+=Energy_Reg[i].E;
}
else if( !tDegree.bDone_Max[i] )
{
tDegree.dEMax[i]+=Energy_Reg[i].E;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -