📄 nsa_timer_drv.c
字号:
else
{
tDegree.dEMid[i]+=Energy_Reg[i].E;
}
}
}
void SetNewDegree(BYTE i)
{
Energy_Reg[i].Conf.Config=daDegree[tDegree.byIndexMid[i]] |0x000001;
TM_Write_CS5460( WRITE_COM| CONFIG_REG, i, &Energy_Reg[i].Conf.Config );
}
bool Judge_Degree()
{
//判大小 交换 判结束
//置标志
int i;
for( i=0; i<CS_ALL; i+=2 )
{
if( tDegree.bDegreeOK[i] )
{//本路已完成!
continue;
}
if( !tDegree.bDone_Min[i] )
{//先做MIN点
tDegree.bDone_Min[i]=true;
continue;
}
else if( !tDegree.bDone_Max[i] )
{//再做MAX点
tDegree.bDone_Max[i]=true;
continue;
}
else
{//正常只做中间点
if( tDegree.byIndexMin[i]==tDegree.byIndexMid[i]-1 )
{//最后连续三点
if( tDegree.dEMax[i]>=tDegree.dEMid[i] && tDegree.dEMax[i]>=tDegree.dEMin[i] )
{//MAX点最大
tDegree.byIndexMid[i]=tDegree.byIndexMax[i];
SetNewDegree((BYTE)i);
tDegree.bDegreeOK[i]=true;
continue;
}
else if( tDegree.dEMin[i]>=tDegree.dEMid[i] && tDegree.dEMin[i]>=tDegree.dEMax[i] )
{//MIN点最大
tDegree.byIndexMid[i]=tDegree.byIndexMin[i];
SetNewDegree((BYTE)i);
tDegree.bDegreeOK[i]=true;
continue;
}
else
{//MID点最大,正是当前点
tDegree.bDegreeOK[i]=true;
continue;
}
}
//非最后连续三点,中间任意三点
if( (tDegree.dEMin[i]<=tDegree.dEMax[i]) &&
(tDegree.dEMin[i]<=tDegree.dEMid[i]) )
{//MIN点最小:
tDegree.dEMin[i]=tDegree.dEMid[i];
tDegree.byIndexMin[i]=tDegree.byIndexMid[i];
//tDegree.bDone_Min[i]=false;
//tDegree.bDone_Max[i]=false;
//tDegree.dEMin[i]=0;
//tDegree.dEMax[i]=0;
}
else if( (tDegree.dEMax[i]<=tDegree.dEMin[i]) &&
(tDegree.dEMax[i]<=tDegree.dEMid[i]) )
{//MAX点最小:
tDegree.dEMax[i]=tDegree.dEMid[i];
tDegree.byIndexMax[i]=tDegree.byIndexMid[i];
//tDegree.bDone_Min[i]=false;
//tDegree.bDone_Max[i]=false;
//tDegree.dEMin[i]=0;
//tDegree.dEMax[i]=0;
}
else if(1)
{//理论不存在,实际有可能出现的情况,即当前MID点是最小值
//跳出去重做!
tDegree.bDone_Min[i]=false;
tDegree.bDone_Max[i]=false;
tDegree.dEMin[i]=0;
tDegree.dEMax[i]=0;
}
//中间任意三点时
tDegree.byIndexMid[i]=(tDegree.byIndexMin[i]+tDegree.byIndexMax[i])>>1;
tDegree.dEMid[i]=0;
}
}
if( tDegree.bDegreeOK[0] && tDegree.bDegreeOK[2] )
return true;
return false;
}
#define EXP 4
#define TIMES ( 16 )
static bool bStart=false;
void Test_Factor()
{
static bool bDone=false;
static int i=0;
static DWORD dE0=0;
static DWORD dI0=0;
static DWORD dU0=0;
static DWORD dE2=0;
static DWORD dI2=0;
static DWORD dU2=0;
static DWORD dBL0=0;
static DWORD dBL2=0;
static DWORD dIBL0;
static DWORD dIBL2;
static DWORD dUBL0;
static DWORD dUBL2;
if( !bStart )
{
bStart=true;
dE0=0;
dI0=0;
dU0=0;
dE2=0;
dI2=0;
dU2=0;
dBL0=0;
dBL2=0;
dIBL0=0;
dIBL2=0;
dUBL0=0;
dUBL2=0;
return;
}
if(bDone)
return;
if( !Energy_Reg[0].Irms |
!Energy_Reg[0].Vrms |
!Energy_Reg[0].E |
!Energy_Reg[2].Irms |
!Energy_Reg[2].Vrms |
!Energy_Reg[2].E )
{
bStart=false;
return;
}
dI0+=Energy_Reg[0].Irms;
dU0+=Energy_Reg[0].Vrms;
dBL0+=(_Mul_Div_U(Energy_Reg[0].Irms,Energy_Reg[0].Irms,Energy_Reg[0].E))>>2;
dE0+=Energy_Reg[0].E;
dI2+=Energy_Reg[2].Irms;
dU2+=Energy_Reg[2].Vrms;
dE2+=Energy_Reg[2].E;
dBL2+=(_Mul_Div_U(Energy_Reg[2].Irms,Energy_Reg[2].Irms,Energy_Reg[2].E))>>2;
i++;
if( i<TIMES )
return;
dI0>>=EXP;
dU0>>=EXP;
dE0>>=EXP;
dI2>>=EXP;
dU2>>=EXP;
dE2>>=EXP;
dBL0>>=EXP;
dBL2>>=EXP;
/* dIBL0=_Mul_Div_U(0XFFFFFFFFul,010000ul,dI0);
dIBL2=_Mul_Div_U(0XFFFFFFFFul,010000ul,dI2);
dUBL0=_Mul_Div_U(0XFFFFFFFFul,010000ul,dU0);
dUBL2=_Mul_Div_U(0XFFFFFFFFul,010000ul,dU2);
dBL0=_Mul_Div_U(dI0,dU0,dE0);
dBL2=_Mul_Div_U(dI2,dU2,dE2);
*/
bStart=false;
i=0;
//bDone=true;
}
#endif
/////////////////////////////////////////////////////////////////////////////////////////
void Verify_VIgn()//修改增益
{
int i;
for( i=0; i<CS_ALL; i++ )
{
if( Energy_Reg[i].Conf.Vgn>0x550000 || Energy_Reg[i].Conf.Vgn<0x300000 )//钳制在4.0到0.0之间zaken
Energy_Reg[i].Conf.Vgn=0x4d0000;
if( Energy_Reg[i].Conf.Ign>0x620000 || Energy_Reg[i].Conf.Ign<0x400000 )
Energy_Reg[i].Conf.Ign=0x540000;
Energy_Reg[i].Conf.Config=0x020001;
}
}
#define MAX_DELAY_TIME 30000
void Calibrate_Operation()
{
static WORD start=0;
static bool bTemp=false;
static DWORD ddttCount;
bool (* pbFunction)(BYTE);
Energy_Reg[1].dDeltT=0;
switch( gtOp_5460_Flag.wOprateID )
{
case CALIBRATE_DC_OFFSET:
pbFunction=TM_CS_Set_DC_Offset;
break;
case CALIBRATE_AC_OFFSET:
pbFunction=TM_CS_Set_AC_Offset;
break;
case CALIBRATE_AC_GAIN:
pbFunction=TM_CS_Set_AC_Gain;
break;
case CALIBRATE_DEGREE:
//pbFunction=TM_CS_Set_Degree1;
//break;
default:
gtOp_5460_Flag.wOprateID=0;
return;
}
if( start==0 )
{
Read_CS_Config();
bTemp=pbFunction(CS_ALL);
ddttCount=dTCounter;
gtOp_5460_Flag.bCalibrating=true;
gtOp_5460_Flag.wCalibrate_Result=0;
start++;
}
else if( Check_All_Data_Ready() )
{//有校验完成标志
start=0;
Read_CS_Config();
if( Check_Calibrate_Status() )
{//校验正确!
gtOp_5460_Flag.wCalibrate_Result=CALIBRATE_RIGHT;
Clear_CS_Status();
Command_Convert();
if( gtOp_5460_Flag.wOprateID== CALIBRATE_DC_OFFSET )
{//直流偏置校验完,做交流偏置!
gtOp_5460_Flag.wOprateID = CALIBRATE_AC_OFFSET;
return;
}
if( gtOp_5460_Flag.wOprateID== CALIBRATE_AC_GAIN )
{//交流增益校验完!OK!
Verify_VIgn();
gtOp_5460_Flag.wOprateID= 0;
gtOp_5460_Flag.bCalibrating=false;
gtOp_5460_Flag.wCalibrate_Result= CALIBRATE_RIGHT;
gtOp_5460_Flag.bNeed_Show_Gain_OK=true;
return;
}
else
{//偏置校验完!OK!
gtOp_5460_Flag.wOprateID= 0;
gtOp_5460_Flag.bCalibrating=false;
gtOp_5460_Flag.wCalibrate_Result= CALIBRATE_RIGHT;
gtOp_5460_Flag.bNeed_Show_Offset_OK=true;
}
return;
}
else
{//校验出错!
gtOp_5460_Flag.wCalibrate_Result=CALIBRATE_ERROR;
Clear_CS_Status();
return;
}
}
else if( (dTCounter-ddttCount)>MAX_DELAY_TIME )
{//一直无校验完成标志>30秒
Read_CS_Config();
start=0;
gtOp_5460_Flag.wOprateID=0;
gtOp_5460_Flag.bCalibrating=false;
gtOp_5460_Flag.wCalibrate_Result=CALIBRATE_ERROR;
Clear_CS_Status();
return;
}
}
//周期性电能管理操作
// >1.3S调用一次
CS5460_IVE CS5460_ive;
CALING_ENG_DATA Cal_Eng_Data;
DIAN_LIANG tDian_Liang;
#define CYCLE_ENERGY_INTERVAL 1300
#define CYCLE_ENERGY_SAMPLE_MAX 10000
void Use_Raw_Ive()
{
CS5460_ive.BeUsed=false;
}
void Convert_Raw_Ive()
{
int i;
DWORD dWord;
short * pShort;
for( i=0; i<CS_ALL; i++ )
{
CS5460_ive.I[i]=(short)(Energy_Reg[i].Irms>>9); //11
CS5460_ive.U[i]=(short)(Energy_Reg[i].Vrms>>9); //11
dWord=Energy_Reg[i].E>>8; //10
pShort=(short *)&dWord;
CS5460_ive.E[i]=*(++pShort);
}
CS5460_ive.BeUsed=false;
}
#ifdef TEST_TIME
static DWORD dCyclePre=0,dCycleNow=0,dCycleMax=0;
#endif
void Cycle_Energy_Operation()
{
#ifdef CS5460ABS_DEVICE
static DWORD dTCheckCS0,dTCheckCS1;
static WORD wCheck_Err_Counter=0;
//1.关于FLASH的操作
if( gtOp_5460_Flag.bNeed_Save_Config )
{
if( FM_Write_Eng_Conf() )
gtOp_5460_Flag.bNeed_Save_Config=false;
}
if( gtOp_5460_Flag.bNeed_Read_Config )
{
if( FM_Read_Eng_Conf() )
gtOp_5460_Flag.bNeed_Read_Config=false;
}
//2.记录时间,确定是否SPI操作
if( (dTCOUNT1-dTCOUNT0)==0xfffffffff )
{//刚上电情况
dTCOUNT0=dTCounter;
dTCOUNT1=dTCOUNT0;
Energy_Reg[0].dDeltT=0;
Energy_Reg[2].dDeltT=0;
dTCheckCS0=dTCheckCS1=dTCOUNT0;
return;
}
dTCOUNT1=dTCounter;
if( (dTCOUNT1-dTCOUNT0)<CYCLE_ENERGY_INTERVAL )
return;
Energy_Reg[1].dDeltT+=dTCOUNT1-dTCOUNT0;
dTCOUNT0=dTCOUNT1;
//如果连续超过4次配置自检出错,则退出SPI操作,并报错!
if( wCheck_Err_Counter >=4 )
{
////报错!
// return;
}
//3.SPI操作
if( !SYS_LOCK_SPI() )
return;
#ifdef TEST_TIME
dCyclePre=dTCounter;
#endif
if( gtOp_5460_Flag.wOprateID!=0 )
{//校验CS5460
Calibrate_Operation();
wCheck_Err_Counter=0;
dTCheckCS0=dTCheckCS1=dTCounter;
}
else
{//正常运行中
if( gtOp_5460_Flag.bNeed_Download_Config )
{
if(!gtOp_5460_Flag.bNeed_Read_Config)
{
Download_Config();
}
SYS_UNLOCK_SPI();
return;
}
Read_CS_Sample();
if( Check_CS_Status() )
{
//Test_Factor();
Convert_Raw_Ive();
Clear_CS_Status();
Energy_Reg[0].dDeltT=Energy_Reg[1].dDeltT;
Energy_Reg[2].dDeltT=Energy_Reg[1].dDeltT;
Energy_Reg[1].dDeltT=0;
}
else if( Energy_Reg[1].dDeltT>CYCLE_ENERGY_SAMPLE_MAX )
{
gtOp_5460_Flag.bNeed_Read_Config=true;
gtOp_5460_Flag.bNeed_Download_Config=true;
Use_Raw_Ive();
Clear_CS_Status();
Energy_Reg[0].dDeltT=Energy_Reg[1].dDeltT;
Energy_Reg[2].dDeltT=Energy_Reg[1].dDeltT;
Energy_Reg[1].dDeltT=0;
}
//2000,09,15 增加定时检查CS5460的配置
if( (Energy_Reg[0].bUsed==true)
// && (wCheck_Err_Counter<4)
)
{
dTCheckCS1=dTCounter;
if( (dTCheckCS1-dTCheckCS0) > (180000-wCheck_Err_Counter*30000 ) )
{
dTCheckCS0=dTCheckCS1;
if( !TM_Check_CS5460_Config(CS_ALL) )
{
gtOp_5460_Flag.bNeed_Read_Config=true;
gtOp_5460_Flag.bNeed_Download_Config=true;
if( wCheck_Err_Counter < 4 )
wCheck_Err_Counter++;
}
else
{
if( wCheck_Err_Counter > 0 )
wCheck_Err_Counter--;
}
}
}
//定时检查CS5460的配置结束
//保存电能到DS1306的用户RAM去(偏移地址 0xA0)
TM_Write_DS_Array( ENERGY_OFFSET, sizeof(DIAN_LIANG),
(BYTE *)&tDian_Liang);
if( gtOp_5460_Flag.bNeed_Clear_Energy )
{
TM_Clear_Real_Energy();
gtOp_5460_Flag.bNeed_Clear_Energy=false;
}
}//正常运行中结束
SYS_UNLOCK_SPI();
#ifdef TEST_TIME
dCycleNow=dTCounter;
dCycleNow= dCycleNow- dCyclePre;
if(dCycleNow> dCycleMax)
dCycleMax= dCycleNow;
#endif
//4.处理相关量及电能
Deal_Energy();
#else
Deal_Others();
#endif
}
void CS5460A_Operating_Show()
{
if(gtOp_5460_Flag.bNeed_Show_Offset_OK)
{
gtOp_5460_Flag.bNeed_Show_Offset_OK=false;
PopupBox(HWND_NULL,"偏移校验","偏移校验完毕!\n\n先加交流再做增益校验!");
}
if(gtOp_5460_Flag.bNeed_Show_Gain_OK)
{
gtOp_5460_Flag.bNeed_Show_Gain_OK=false;
PopupBox(HWND_NULL,"增益校验","\n增益校验完毕!\n请查看校验结果!");
}
}
void Test_CS5460()
{
bool bTemp;
int i,j;
//initialize CS5460
TM_Initinize_CS5460();
for( i=0; i<3; i++ )
{
bTemp=false;
bTemp=TM_Check_CS5460_Config((BYTE)i);
}
//偏置校验
//bTemp=TM_CS_Set_Dc_Offset(3);
//AC偏置校验
//bTemp=TM_CS_Set_AC_Offset(3);
//增益校验
//bTemp=TM_CS_Set_AC_Gain(3);
//角度校验
for( j=0; j<127; j++ )
{
bTemp=TM_CS_Set_Degree(0,BYUP);
for( i=0; i<3; i++ )
{
Cycle_Energy_Operation();
}
}
//保存CS5460配置信息
bTemp=TM_Save_CS5460_Config(3);
for( i=0; i<3; i++ )
{
bTemp=false;
bTemp=TM_Check_CS5460_Config((BYTE)i);
}
Cycle_Energy_Operation();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -