電源控制說明:
VCC: 由電網電源,6v電池和3.6V電池匯流提供
供mcu等電網掉電后需要工作的器件電源使用(此處僅用作mcu電源)。
VSWO: 由MCU的VD(電網,6V電池,3.6V電池匯流)與mcu的VBAT(3.6V電池)匯流提供
供mcu的reset,8025t電源,按鍵等需要低功耗喚醒等位置使用。
1.RESET電路
2.8025T電源
3. 按鍵喚醒部分
4.上蓋、端蓋檢測部分
VCC_OP: 電網電源 (電池不供電)
供停電后不需供電的外圍電路:
1 通訊部分: 485 、 載波、無線等
2 指示燈:
3 液晶背光:
4 光耦:
5 繼電器部分:
6.esam可控電源。
7.紅外發射在電網電源在線時使用vcc_op。
VD:由電網電源和6V電池匯流而成。供給DVCC,可控的紅外電源VCC_IR使用。
DVCC: 由VD生成(選配VCC一般不采用),ctrl_dvcc=1時,dvcc=3.3V;ctrl_dvcc=0時,dvcc關斷.
1. 計量電源
2. flash電源
需要進行計量/保存flash時打開。上電后必須使能ctrl_dvcc;掉電后在全失壓檢測時打開ctrl_dvcc一次
VCC_IR: 紅外收發管的電源,由ctrl_WAKE控制打開關閉.
打開條件: 紅外喚醒
AD_3.6V: 3.6V電池提供給mcu的Vbat。
VDD:電網電源通過穩壓得到通常=5.3V
6V_5V:6V電池通過LDO后的電源,通常=5.0V。
電路原理圖如下:
單片機源程序如下:
- #include "RN7302_Demo.h"
- __no_init sDl645StruDataComm_TypeDef Dl645RN7302DataComm;
- __no_init sDl645FrontTmp_TypeDef Dl645FrontTmp;
- __no_init sDl645Front_TypeDef Dl645Front;
- __no_init sDl645Eg_TypeDef Dl645Eg;
- __no_init sDl645FirmParaFile_TypeDef Dl645FirmPara;
-
- //底層函數
- u8 fnSpi2_ReadByte(void)
- {
- u8 i,temp=0;
- for(i=0;i<8;i++)
- {
- temp<<=1;
- PinWrite_ADSCLK(1);
- PinWrite_ADSCLK(1);
- fnDelay2us();
- fnDelay2us();
- fnDelay2us();
- fnDelay2us();
- PinWrite_ADSCLK(0);
- PinWrite_ADSCLK(0);
- fnDelay2us();
- fnDelay2us();
- fnDelay2us();
- fnDelay2us();
- if (PinRead_ADSDI()){temp=temp+0x1;}
- fnDelay2us();
- fnDelay2us();
- fnDelay2us();
- }
- return temp;
- }
- //////////////////////////////////////////////////////////////////////////
- void fnSpi2_WriteByte(u8 Dat)
- {
- u8 i;
- for(i=0;i<8;i++)
- {
- PinWrite_ADSCLK(1);
- PinWrite_ADSCLK(1);
- fnDelay2us();
- fnDelay2us();
- if(Dat & 0x80)
- {
- PinWrite_ADSDO(1);
- PinWrite_ADSDO(1);
- fnDelay2us();
- fnDelay2us();
- fnDelay2us();
- }
- else
- {
- PinWrite_ADSDO(0);
- PinWrite_ADSDO(0);
- fnDelay2us();
- fnDelay2us();
- fnDelay2us();
- }
- PinWrite_ADSCLK(0);
- PinWrite_ADSCLK(0);
- fnDelay2us();
- fnDelay2us();
- fnDelay2us();
- Dat <<= 1;
- }
- PinWrite_ADSDO(1);
- PinWrite_ADSDO(1);
- fnDelay2us();
- fnDelay2us();
- fnDelay2us();
- }
- //存儲器寫入函數
- ErrorStatus fnMemory_Write(u32 Dst , u8 *Src , u32 DatLen)
- {
- ErrorStatus err;
- if( (FM24C_START_ADDR <= Dst) &&
- ( (Dst + DatLen) < (FM24C_START_ADDR + FM24C_SIZE) ) )
- {
- #if !DL645SOFT_DEBUG
- err = fnFM24CXX_Write(Dst- FM24C_START_ADDR , Src , DatLen , 3);
- if(err==ERROR) Dl645Bkgrd.PubData.EventErr[5]=BKGRD_EVENTERR_INTERMEMORY;
- else Dl645Bkgrd.PubData.EventErr[5]=BKGRD_EVENTERR_OK;
- #endif
- }
- else if( (AT45DB_START_ADDR <= Dst) &&
- ( (Dst + DatLen) < (AT45DB_START_ADDR + AT45DB_SIZE) ) )
- {
- #if !DL645SOFT_DEBUG
- err = fnAT45DBXX_Write( Dst - AT45DB_START_ADDR , Src , DatLen , 3);
- if(err==ERROR) Dl645Bkgrd.PubData.EventErr[5]=BKGRD_EVENTERR_INTERMEMORY;
- else Dl645Bkgrd.PubData.EventErr[5]=BKGRD_EVENTERR_OK;
- #endif
- }
- else
- {
- err = ERROR;
- Dl645Bkgrd.PubData.EventErr[5]=BKGRD_EVENTERR_INTERMEMORY;
- }
- return(err);
- }
- //存儲器讀取函數
- ErrorStatus fnMemory_Read(u8 *Dst , u32 Src , u32 DatLen)
- {
- ErrorStatus err;
- if( (FM24C_START_ADDR <= Src) &&
- ( (Src + DatLen) < (FM24C_START_ADDR + FM24C_SIZE) ) )
- {
- #if !DL645SOFT_DEBUG
- err = fnFM24CXX_Read(Dst , Src - FM24C_START_ADDR , DatLen , 3);
- if(err==ERROR) Dl645Bkgrd.PubData.EventErr[5]=BKGRD_EVENTERR_INTERMEMORY;
- else Dl645Bkgrd.PubData.EventErr[5]=BKGRD_EVENTERR_OK;
- #endif
- }
- else if( (AT45DB_START_ADDR <= Src) &&
- ( (Src + DatLen) < (AT45DB_START_ADDR + AT45DB_SIZE) ) )
- {
- #if !DL645SOFT_DEBUG
- err = fnAT45DBXX_Read(Dst , Src - AT45DB_START_ADDR , DatLen , 3);
- if(err==ERROR) Dl645Bkgrd.PubData.EventErr[5]=BKGRD_EVENTERR_INTERMEMORY;
- else Dl645Bkgrd.PubData.EventErr[5]=BKGRD_EVENTERR_OK;
- #endif
- }
- else
- {
- err = ERROR;
- }
- return(err);
- }
-
- // 文件操作函數
- ErrorStatus fnDl645File_Read(u8 FileId , u32 OffAddr , void *Dst , u32 Len)
- {
- if(FileId >= Dl645FileId_Max) return(ERROR);
- if( (OffAddr + Len) > Dl645FileInfo[FileId].Len) return(ERROR);
- return(fnMemory_Read(Dst , Dl645FileInfo[FileId].StartAddr + OffAddr , Len) );
- }
- ErrorStatus fnDl645File_Write(u8 FileId , u32 OffAddr , void *Src , u32 Len)
- {
- if(FileId >= Dl645FileId_Max) return(ERROR);
- if( (OffAddr + Len) > Dl645FileInfo[FileId].Len) return(ERROR);
- return(fnMemory_Write(Dl645FileInfo[FileId].StartAddr + OffAddr , Src , Len) );
- }
- ErrorStatus fnRN7302_Write(u16 wReg,u8 *pBuf,u8 DatLen)
- {
- u8 i,temp,chksum,Repeat;
- ErrorStatus err = SUCCESS;
- if( (DatLen == 0) || (DatLen > 4) ) return(ERROR);
- for( Repeat =3; Repeat != 0 ; Repeat--)
- {
- PinWrite_ADCS(0);
- NOP();
- temp = (u8)(wReg & 0x00ff);
- chksum = temp;
- fnSpi2_WriteByte( temp); //first write hight Addr
- temp = (((u8)(wReg >> 4)) & 0xf0) + 0x80;
- chksum += temp;
- fnSpi2_WriteByte( temp);
-
- for(i = DatLen; i > 0;i-- )
- {
- fnSpi2_WriteByte(pBuf[i-1]); // first write high data
- chksum +=pBuf[i-1];
- }
- chksum = ~chksum;
- fnSpi2_WriteByte(chksum);
- // PinWrite_ADCS(1);
- // NOP();
- //讀WData寄存器檢查-----------------------
- // PinWrite_ADCS(0);
- // NOP();
-
- fnSpi2_WriteByte( 0x8D);
- chksum = 0x8D;
- temp = ( (u8)(0x018D >> 4) & 0xf0);
- fnSpi2_WriteByte( temp );
- chksum += temp;
- for(i = 3 ; i > 0 ; i--)
- {
- temp = fnSpi2_ReadByte();
- if(DatLen >= i)
- {
- if(temp != pBuf[i - 1])
- {
- err = ERROR;
- break;
- }
- }
- chksum += temp;
- }
- if(err == SUCCESS)
- {
- chksum = ~chksum;
- temp = fnSpi2_ReadByte();
- if(temp != chksum) err = ERROR;
- }
-
- PinWrite_ADCS(1);
- if(err == SUCCESS) break;
- fnDelay2us();
- fnDelay2us();
- }
- PinWrite_ADSDO(1);
- PinWrite_ADSCLK(1);
- return(err);
- }
- ErrorStatus fnRN7302_Read(u16 wReg,u8 *pBuf,u8 DatLen)
- {
- u8 i,temp,chksum,Repeat;
- ErrorStatus err = SUCCESS;
- if(DatLen == 0) return(ERROR);
- for( Repeat=3; Repeat != 0 ; Repeat--)
- {
- PinWrite_ADCS(0);
- fnDelay2us();
- temp = (u8)(wReg & 0x00ff);
- chksum = temp;
- fnSpi2_WriteByte( temp); //first write hight Addr
- temp = ((u8)(wReg >> 4))& 0xf0;
- chksum += temp;
- fnSpi2_WriteByte( temp);
-
- for(i = DatLen; i > 0;i--)
- {
- pBuf[i-1] = fnSpi2_ReadByte();
- chksum += pBuf[i-1];
- }
- chksum = ~chksum;
- if(fnSpi2_ReadByte()!=chksum) err = ERROR;
- // PinWrite_ADCS(1);
- //---讀RData寄存器檢查------------------------------------
- if(err != SUCCESS) continue;
-
- fnSpi2_WriteByte( 0x8c);//讀上一次SPI 讀出的數據
- chksum = 0x8c;
- temp = ( (u8)(0x018C >> 4) & 0xf0);
- fnSpi2_WriteByte( temp );
- chksum += temp;
- for(i = 4 ; i > 0 ; i--)
- {
- temp = fnSpi2_ReadByte();
- if(DatLen >= i)
- {
- if(temp != pBuf[i - 1])
- {
- err = ERROR;
- break;
- }
- }
- chksum += temp;
- }
- if(err == SUCCESS)
- {
- chksum = ~chksum;
- temp = fnSpi2_ReadByte();
- if(temp != chksum) err = ERROR;
- }
-
- PinWrite_ADCS(1);
- if(err == SUCCESS) break;
- fnDelay2us();
- fnDelay2us();
- }
- PinWrite_ADCS(1);
- PinWrite_ADSDO(1);
- PinWrite_ADSCLK(1);
- return(err);
- }
- void fnRN7302_Init(void)
- {
- Dl645RN7302DataComm.ucTemp8 = 0xe5; // 寫使能位
- fnRN7302_Write(0x0180,Dl645RN7302DataComm.ucTempBuf,1);
-
- Dl645RN7302DataComm.ucTemp8 = 0xA2; // 切換到EMM模式
- fnRN7302_Write(WMSW,Dl645RN7302DataComm.ucTempBuf,1);
-
- Dl645RN7302DataComm.ucTemp8 = 0xfa; // 寫使能位
- fnRN7302_Write(0x0182,Dl645RN7302DataComm.ucTempBuf,1);
- SystemDelay(10);
- Dl645RN7302DataComm.ucTemp8 = 0xe5; // 寫使能位
- fnRN7302_Write(0x0180,Dl645RN7302DataComm.ucTempBuf,1);
-
- Dl645RN7302DataComm.ucTemp8 = 0xA2; // 切換到EMM模式
- fnRN7302_Write(WMSW,Dl645RN7302DataComm.ucTempBuf,1);
-
- Dl645RN7302DataComm.ucTempBuf[0] = 0x77; // 計量控制位
- Dl645RN7302DataComm.ucTempBuf[1] = 0x77;
- Dl645RN7302DataComm.ucTempBuf[2] = 0x77;
- fnRN7302_Write(0x0162,Dl645RN7302DataComm.ucTempBuf,3);
-
- Dl645RN7302DataComm.wTemp16 = Dl645FirmPara.HFConst1;
- fnRN7302_Write(HFCONST1,Dl645RN7302DataComm.ucTempBuf,2);
-
- // 電壓增益初始化
- fnRN7302_Write(GSUA,(u8 *)&Dl645FirmPara.VGain[0],2);
- fnRN7302_Write(GSUB,(u8 *)&Dl645FirmPara.VGain[1],2);
- fnRN7302_Write(GSUC,(u8 *)&Dl645FirmPara.VGain[2],2);
-
- // 電流增益初始化
- fnRN7302_Write(GSIA,(u8 *)&Dl645FirmPara.IGain[0],2);
- fnRN7302_Write(GSIB,(u8 *)&Dl645FirmPara.IGain[1],2);
- fnRN7302_Write(GSIC,(u8 *)&Dl645FirmPara.IGain[2],2);
- fnRN7302_Write(GSIN,(u8 *)&Dl645FirmPara.IGain[3],2);
-
- // 通道相位校正
- fnRN7302_Write(PRTH1L,(u8 *)&Dl645FirmPara.PRth[0],2);
- fnRN7302_Write(PRTH1H,(u8 *)&Dl645FirmPara.PRth[1],2);
- fnRN7302_Write(PRTH2L,(u8 *)&Dl645FirmPara.PRth[2],2);
- fnRN7302_Write(PRTH2H,(u8 *)&Dl645FirmPara.PRth[3],2); // 通道相位分段參數
-
-
- // 通道相位校正
- fnRN7302_Write(PHSIA,(u8 *)&Dl645FirmPara.PHSI[0],3);
- fnRN7302_Write(PHSIB,(u8 *)&Dl645FirmPara.PHSI[1],3);
- fnRN7302_Write(PHSIC,(u8 *)&Dl645FirmPara.PHSI[2],3);
-
- fnRN7302_Write(PA_PHS,(u8 *)&Dl645FirmPara.P_PHS[0],2);
- fnRN7302_Write(PB_PHS,(u8 *)&Dl645FirmPara.P_PHS[1],2);
- fnRN7302_Write(PC_PHS,(u8 *)&Dl645FirmPara.P_PHS[2],2);
-
- fnRN7302_Write(GPA,(u8 *)&Dl645FirmPara.PGain[0],2);
- fnRN7302_Write(GPB,(u8 *)&Dl645FirmPara.PGain[1],2);
- fnRN7302_Write(GPC,(u8 *)&Dl645FirmPara.PGain[2],2);
-
- fnRN7302_Write(GQA,(u8 *)&Dl645FirmPara.PGain[0],2);
- fnRN7302_Write(GQB,(u8 *)&Dl645FirmPara.PGain[1],2);
- fnRN7302_Write(GQC,(u8 *)&Dl645FirmPara.PGain[2],2);
-
- fnRN7302_Write(GSA,(u8 *)&Dl645FirmPara.PGain[0],2);
- fnRN7302_Write(GSB,(u8 *)&Dl645FirmPara.PGain[1],2);
- fnRN7302_Write(GSC,(u8 *)&Dl645FirmPara.PGain[2],2);
-
- // 通道功率OFFSET校正
- fnRN7302_Write(PA_OS,(u8 *)&Dl645FirmPara.UI_Offset[0],2);
- fnRN7302_Write(PB_OS,(u8 *)&Dl645FirmPara.UI_Offset[1],2);
- fnRN7302_Write(PC_OS,(u8 *)&Dl645FirmPara.UI_Offset[2],2);
-
- fnRN7302_Write(IStart_PS,(u8 *)&Dl645FirmPara.NOLOAD,2);
- fnRN7302_Write(ZXOT,(u8 *)&Dl645FirmPara.ZEROSTAR,2);
-
- Dl645RN7302DataComm.ucTemp8 = 0x42;
- fnRN7302_Write(0x0184,Dl645RN7302DataComm.ucTempBuf,1);
- Dl645RN7302DataComm.ucTemp8 = 0;
- fnRN7302_Write(0x0185,Dl645RN7302DataComm.ucTempBuf,1);
- Dl645RN7302DataComm.ucTemp8 = 0;
- fnRN7302_Write(0x0184,Dl645RN7302DataComm.ucTempBuf,1);
-
- Dl645RN7302DataComm.ucTempBuf[0] = 0x10;
- Dl645RN7302DataComm.ucTempBuf[1] = 0x32;
- Dl645RN7302DataComm.ucTempBuf[2] = 0x07;
- fnRN7302_Write(CFCFG,Dl645RN7302DataComm.ucTempBuf,3);
- Dl645RN7302DataComm.ucTempBuf[0] = 0x40; // 計量控制位 默認值 400000
- Dl645RN7302DataComm.ucTempBuf[1] = 0x00;
- Dl645RN7302DataComm.ucTempBuf[2] = 0x00;
- fnRN7302_Write(0x0161,Dl645RN7302DataComm.ucTempBuf,3);
-
-
- Dl645RN7302DataComm.ucTemp8 = 0x10; // 清空采樣數據緩存區
- fnRN7302_Write(0x0163,Dl645RN7302DataComm.ucTempBuf,1);
-
- Dl645RN7302DataComm.ucTemp8 = 0xDC; // 寫保護
- fnRN7302_Write(0x0180,Dl645RN7302DataComm.ucTempBuf,1);
- Dl645FirmPara.FractionP=0x04;
- Dl645FirmPara.FractionI=0x04;
- Dl645FirmPara.FractionU=0x02;
- }
- void fnDl645Front_Exec(void)
- {
- //讀電壓電流
- for(i=0;i<4;i++)
- {
- Dl645FrontTmp.UI[i] = 0 ;
- fnRN7302_Read( 0x000b+i , (u8 *)&Dl645FrontTmp.UI[i] , 4 ) ;
-
- }
- for(i=0;i<3;i++)
- {
- Dl645FrontTmp.UI[i+4] = 0 ;
- fnRN7302_Read( 0x0007+i , (u8 *)&Dl645FrontTmp.UI[i+4] , 4 ) ;
-
- }
-
- //讀功率
- for(i=0;i<12;i++)
- {
- Dl645FrontTmp.Pw[i] = 0 ;
- fnRN7302_Read(0x0014+i,(u8 *)&Dl645FrontTmp.Pw[i],4);
- if((Dl645FrontTmp.Pw[i]<30)&&(Dl645FrontTmp.Pw[i]>-30))
- Dl645FrontTmp.Pw[i]=0;
- }
-
- //讀功率方向
- fnRN7302_Read(PQSign,(u8 *)&Dl645FrontTmp.PDirect,2);
-
- //讀電壓電流角度值
- for(i=0;i<5;i++)
- {
- Dl645FrontTmp.Angle[i] = 0 ;
- fnRN7302_Read(YUB+i,(u8 *)&Dl645FrontTmp.Angle[i],3);
- Dl645Front.PubData.Angle[i] = fnHexToBcd_u16((u16)(((float)Dl645FrontTmp.Angle[i]/16777216)*3600));
- }
-
- //功率計算
- for(j=0;j<3;j++)
- {
-
- for(i=0;i<3;i++)
- {
- Dl645Front.PubData.Pw[j*4+i+1]=fnDFConver_Hex32ToDF09((s32)((Dl645FrontTmp.Pw[j*4+i])/((Dl645FirmPara.PRmsConst))));//計算{Pa Pb Pc}、{Qa Qb Qc}、{Sa Sb Sc}
- }
- }
- Tempw = (s32)((Dl645FrontTmp.Pw[3])/((Dl645FirmPara.PRmsConst))) ;
- Dl645Front.PubData.Pw[0]=fnDFConver_Hex32ToDF09(Tempw);
- Tempq = (s32)((Dl645FrontTmp.Pw[7])/((Dl645FirmPara.PRmsConst))) ;
- Dl645Front.PubData.Pw[4]=fnDFConver_Hex32ToDF09(Tempq);
- // 計算總視在功率
- Tempws = (s32)sqrt((float)Tempw*(float)Tempw+(float)Tempq*(float)Tempq);
- Dl645Front.PubData.Pw[8] = fnDFConver_Hex32ToDF09(Tempws);//計算P、Q
-
- //功率因數計算
- //總功率因數
- Dl645Front.PubData.Pf[0]=fnDFConver_Bcd16To16((s16)((1000*(double)(Tempw))/(Tempws)));
-
- //電壓電流計算
- for(i=0;i<3;i++)
- {
- Dl645Front.PubData.U[i]=0x7fff&(fnDFConver_Bcd16To16((s16)(Dl645FrontTmp.UI[i+4]/(10*(Dl645FirmPara.VRmsConst))))); //電壓
- }
-
-
- TempIa = (s32)(Dl645FrontTmp.UI[0]/(Dl645FirmPara.IRmsConst));
- TempIb = (s32)(Dl645FrontTmp.UI[1]/(Dl645FirmPara.IRmsConst));
- TempIc = (s32)(Dl645FrontTmp.UI[2]/(Dl645FirmPara.IRmsConst));
- Dl645Front.PubData.I[0] = fnDFConver_Bcd32To32(TempIa);
- Dl645Front.PubData.I[1] = fnDFConver_Bcd32To32(TempIb);
- Dl645Front.PubData.I[2] = fnDFConver_Bcd32To32(TempIc);
- Dl645Front.PubData.I[3] = fnDFConver_Bcd32To32((s32)(Dl645FrontTmp.UI[3]/(Dl645FirmPara.IRmsConst)));
- if(Dl645FrontTmp.PDirect&0x0001) Dl645Front.PubData.I[0] |= 0x80000000;
- if(Dl645FrontTmp.PDirect&0x0002) Dl645Front.PubData.I[1] |= 0x80000000;
- if(Dl645FrontTmp.PDirect&0x0004) Dl645Front.PubData.I[2] |= 0x80000000;
-
- //頻率計算
- if((Dl645FrontTmp.Frequency>1638400)||(Dl645FrontTmp.Frequency<1092266)) //when 50HZ is 5120 ;+- 20% frequence is 6144 and 4096
- Dl645FrontTmp.Frequency=1310720;
- Dl645Front.PubData.Frequency=fnHexToBcd_u16((u16)(65536000/(Dl645FrontTmp.Frequency/100)));
-
- //轉換功率方向
- Dl645Front.PubData.PDirect = ( (Dl645FrontTmp.PDirect << 1) & 0xee) | ( (Dl645FrontTmp.PDirect >> 3) & 0x11);
-
- if(Dl645Bkgrd.PriPara.WireMode==0x01) //三相三線
- {
- Dl645Front.PubData.Angle[3]=0;
- Dl645Front.PubData.Angle[6]=0;
- }
-
-
- //從RN8302讀出的即為脈沖數//{P,Q,Ps},{Pa,Qa,Psa},{Pb,Qb,Psb},{Pc,Qc,Psc}{Fp,Fq}{Fpa,Fqa}{Fpb,Fqb}{Fpc,Fqc}
- /*讀電能寄存器*/
- for(i=0;i<3;i++)
- {
- Dl645FrontTmp.Pulse[(i+1)*3] = 0;
- fnRN7302_Read(EPA+i,(u8 *)&Dl645FrontTmp.Pulse[(i+1)*3],3); //有功
- Dl645FrontTmp.Pulse[(i+1)*3+1] = 0;
- fnRN7302_Read(EQA+i,(u8 *)&Dl645FrontTmp.Pulse[(i+1)*3+1],3); //無功
- Dl645FrontTmp.Pulse[(i+1)*3+2] = 0;
- fnRN7302_Read(ESA+i,(u8 *)&Dl645FrontTmp.Pulse[(i+1)*3+2],3); //視在有功
- Dl645FrontTmp.Pulse[14+i*2] =0;
- fnRN7302_Read(FEPA+i,(u8 *)&Dl645FrontTmp.Pulse[14+i*2],3); //基波有功
- Dl645FrontTmp.Pulse[15+i*2] = 0;
- fnRN7302_Read(FEQA+i,(u8 *)&Dl645FrontTmp.Pulse[15+i*2],3); //基波無功
- }
- Dl645FrontTmp.Pulse[0] = 0;
- fnRN7302_Read(EPT,(u8 *)&Dl645FrontTmp.Pulse[0],3); //總有功
- Dl645FrontTmp.Pulse[1] = 0;
- fnRN7302_Read(EQT,(u8 *)&Dl645FrontTmp.Pulse[1],3); //總無功
- Dl645FrontTmp.Pulse[2] = 0;
- fnRN7302_Read(EST,(u8 *)&Dl645FrontTmp.Pulse[2],3); //總視在
- Dl645FrontTmp.Pulse[12] =0;
- fnRN7302_Read(FEPT,(u8 *)&Dl645FrontTmp.Pulse[12],3); //總基波有功
- Dl645FrontTmp.Pulse[13] =0;
- fnRN7302_Read(FEQT,(u8 *)&Dl645FrontTmp.Pulse[13],3); //總基波無功
-
- for(i=0;i<20;i++)//電能高頻脈沖轉換成低頻脈沖
- {
- Dl645FrontTmp.Pulse_Eg[i]+=Dl645FrontTmp.Pulse[i];
- }
- }
- void fnDl645Energy_Exec(void)
- {
- u8 Ep[20];
- if( !(Dl645FrontTmp.Pulse_Eg[0] | Dl645FrontTmp.Pulse_Eg[1] | Dl645FrontTmp.Pulse_Eg[2] | Dl645FrontTmp.Pulse_Eg[3] |
- Dl645FrontTmp.Pulse_Eg[4] | Dl645FrontTmp.Pulse_Eg[5] | Dl645FrontTmp.Pulse_Eg[6] | Dl645FrontTmp.Pulse_Eg[7] |
- Dl645FrontTmp.Pulse_Eg[8] | Dl645FrontTmp.Pulse_Eg[9] | Dl645FrontTmp.Pulse_Eg[10] | Dl645FrontTmp.Pulse_Eg[11] |
- Dl645Eg.PubPara.fMinute) )
- {
- return;
- }
- //Dl645Eg.PubPara.PPlsDeltaE為脈沖數,如脈沖數為800,因電能小數為2位,故此值為8
- for(i = 0 ; i < 12 ; i++)
- {
- Ep[i] = 0;
-
- if(Dl645FrontTmp.Pulse_Eg[i])
- {
- Dl645Eg.PriData.PieceEg[i] += Dl645FrontTmp.Pulse_Eg[i];
- Dl645FrontTmp.Pulse_Eg[i] = 0;
-
- switch(i % 3)
- {
- case 0:
- if(Dl645Eg.PubPara.PPlsDeltaE == 0) break;
- while (Dl645Eg.PriData.PieceEg[i] >= Dl645Eg.PubPara.PPlsDeltaE)//需按電能小數位數進行計算
- {
- Ep[i]++;
- Dl645Eg.PriData.PieceEg[i] -= Dl645Eg.PubPara.PPlsDeltaE;
- }
- break;
- case 1:
- if(Dl645Eg.PubPara.QPlsDeltaE == 0) break;
- while (Dl645Eg.PriData.PieceEg[i] >= Dl645Eg.PubPara.QPlsDeltaE)//需按電能小數位數進行計算
- {
- Ep[i]++;
- Dl645Eg.PriData.PieceEg[i] -= Dl645Eg.PubPara.QPlsDeltaE;
- }
- break;
- default:
- if(Dl645Eg.PubPara.PsPlsDeltaE == 0) break;
- while (Dl645Eg.PriData.PieceEg[i] >= Dl645Eg.PubPara.PsPlsDeltaE)//需按電能小數位數進行計算
- {
- Ep[i]++;
- Dl645Eg.PriData.PieceEg[i] -= Dl645Eg.PubPara.PsPlsDeltaE;
- }
- break;
- }
- }
- }
- for(i = 0 ; i < 8 ; i++)
- {
- Ep[i+12] = 0;
-
- if(Dl645FrontTmp.Pulse_Eg[i+12])
- {
- Dl645Eg.PriData.PieceEg[i+12] += Dl645FrontTmp.Pulse_Eg[i+12];
- Dl645FrontTmp.Pulse_Eg[i+12] = 0;
-
- switch((i+12) % 2)
- {
- case 0:
- if(Dl645Eg.PubPara.PPlsDeltaE == 0) break;
- while (Dl645Eg.PriData.PieceEg[i+12] >= Dl645Eg.PubPara.PPlsDeltaE)//需按電能小數位數進行計算
- {
- Ep[i+12]++;
- Dl645Eg.PriData.PieceEg[i+12] -= Dl645Eg.PubPara.PPlsDeltaE;
- }
- break;
- default :
- if(Dl645Eg.PubPara.QPlsDeltaE == 0) break;
- while (Dl645Eg.PriData.PieceEg[i+12] >= Dl645Eg.PubPara.QPlsDeltaE)//需按電能小數位數進行計算
- {
- Ep[i+12]++;
- Dl645Eg.PriData.PieceEg[i+12] -= Dl645Eg.PubPara.QPlsDeltaE;
- }
- break;
- }
- }
- }
- }
- // RxFrm為通訊數據指針,指到07協議的第1個68數據,為sFrmDl645B_TypeDef類型指針
- //校表進行增益校準和相位校準,可選擇進行相位分段校準
- // 校表部分程序
- eDL645B_ErrInfo_TypeDef fnDl645_PutParaVar(sFrmDl645B_TypeDef *RxFrm)
- {
- u8 i,j,k;
- u32 DITemp=0x0;
- u8 UnConst[6],InConst[6],ImaxConst[6];
- u16 nItem,tempconst,tempub,tempib;
- u16 temphfconst;
- u32 tempus,tempis;
- sDF10 ConstE;
- ErrorStatus err;
- u16 tempuc=0,tempud=0;
- u32 tempic=0,tempid=0;
- float ADErr;
- u32 temppw[2];
- i=RxFrm->UDat.DI3;
- RxFrm->UDat.DI3=0;
- memcpy(&DITemp , &RxFrm->UDat.DI0 , 4);
- RxFrm->UDat.DI3=i;
-
- if((DITemp==0xFE0001)||(DITemp==0xFE0002)||(DITemp==0xFE0003))
- {
- if(RxFrm->Len != (12 + 5*sizeof(u16) ) ) return(DL645B_ERRINFO_DATA);
- fnDl645File_Write(Dl645FileId_GeneralPara , Dl645FileItemInfoOffAddr_GeneralPara_OutputPara + 16 + (5*sizeof(u16)) * (RxFrm->UDat.DI0 - 1) , &RxFrm->UDat.Dat[8] , 5*sizeof(u16) );
- memset(&Dl645Output.PriPara,0,sizeof(Dl645Output.PriPara) - 2);
- return(DL645B_ERRINFO_OK);
- }
- if(DITemp==0x00f91201)
- {
- if((RxFrm->UDat.Dat[0] == 0x03)&&(RxFrm->UDat.Dat[1] == 0x43)&&(RxFrm->UDat.Dat[2] == 0x56)&&(RxFrm->UDat.Dat[3] == 0x98)) ;
- else return(DL645B_ERRINFO_PSW);
- }
- else if(DITemp==0x001503) ;
- else
- {
- if(!(Dl645Bkgrd.PubData.MtSta.MtSta3.StaBit.PrgEnable) ) return(DL645B_ERRINFO_PSW);
- err = fnDl645Secret_Verify(0x04 , RxFrm->UDat.Dat[0] , &RxFrm->UDat.Dat[1]);
- if(err != SUCCESS) return(DL645B_ERRINFO_PSW);
- }
- switch(DITemp)
- {
- case 0x00f81000: //電流電壓功率初校,HFCONST等參數設置
- if(RxFrm->Len != (12+48)) return(DL645B_ERRINFO_DATA);
-
- memcpy(&tempconst , &(RxFrm->UDat.Dat[8]) , 2);
- memcpy(&temphfconst , &(RxFrm->UDat.Dat[10]) , 2);
- memcpy(&tempub , &(RxFrm->UDat.Dat[12]) , 2);
- memcpy(&tempus , &(RxFrm->UDat.Dat[14]) , 4);
- memcpy(&tempib , &(RxFrm->UDat.Dat[18]) , 2);
- memcpy(&tempis , &(RxFrm->UDat.Dat[20]) , 4);
-
-
- Dl645FirmPara.ConstE=tempconst*10L;
- Dl645RN7302DataComm.ucTemp8 = 0xe5; // 寫使能位
- fnRN7302_Write(0x0180,Dl645RN7302DataComm.ucTempBuf,1);
- Dl645FirmPara.HFConst1 = temphfconst;
- fnRN7302_Write(HFCONST1,(u8 *)&Dl645FirmPara.HFConst1,2);
- fnDl645File_Write(Dl645FileId_FirmPara,26,(u8 *)&Dl645FirmPara.HFConst1,2);
-
- for(i=0;i<3;i++) //
- {
- memcpy(&temppw[0] , &(RxFrm->UDat.Dat[32+4*i]) , 4);
- temppw[1] = tempus/tempub;
- temppw[1] = (temppw[1] *temppw[0])/10;
- fnRN7302_Read( 0x0007+ i , (u8 *)&temppw[0] , 4 ) ;
- ADErr=((float)temppw[0]-(float)temppw[1])/temppw[1];
- ADErr=(-ADErr/(1+ADErr));
- if(ADErr>0) Dl645FirmPara.VGain[i]=(u16)(ADErr*32768);
- else Dl645FirmPara.VGain[i] = (u16)(65535 + ADErr*32768);
- fnRN7302_Write(GSUA+i,(u8 *)&Dl645FirmPara.VGain[i],2);
- fnRN7302_Read( GSUA+i , Dl645RN7302DataComm.ucTempBuf , 2 ) ;
- }
- fnDl645File_Write(Dl645FileId_FirmPara,42,(u8 *)&Dl645FirmPara.VGain[0],6);
-
- for(i=0;i<3;i++) //電流增益校正
- {
- memcpy(&temppw[0] , &(RxFrm->UDat.Dat[44+4*i]) , 4);
- temppw[1] = tempis/tempib;
- temppw[1] = (temppw[1] *temppw[0])/10;
- fnRN7302_Read( 0x000B+ i , (u8 *)&temppw[0] , 4 ) ;
- ADErr=((float)temppw[0]-(float)temppw[1])/temppw[1];
- ADErr=((-ADErr)/(1+ADErr));
- if(ADErr>0) Dl645FirmPara.IGain[i]=(u16)(ADErr*32768);
- else Dl645FirmPara.IGain[i] = (u16)(65535 + ADErr*32768);
- fnRN7302_Write(GSIA+i,(u8 *)&Dl645FirmPara.IGain[i],2);
- }
- fnDl645File_Write(Dl645FileId_FirmPara,48,(u8 *)&Dl645FirmPara.IGain[0],8);
-
-
- tempconst = fnHexToBcd_u16(tempconst) ;
- ConstE.Dat0 = (((u8)(tempconst & 0x000f))<<4)&0xf0;
- ConstE.Dat1 = (tempconst & 0x0ff0)>>4;
- ConstE.Dat2 = (u8)((tempconst & 0xf000)>>12);
-
-
- fnDl645File_Write(Dl645FileId_HighPara , Dl645FileItemInfoOffAddr_HighPara_PConstE , (u8 *)&ConstE , 3);
- fnDl645File_Write(Dl645FileId_HighPara , Dl645FileItemInfoOffAddr_HighPara_QConstE , (u8 *)&ConstE , 3);
-
- i=Dl645FirmPara.FractionI;
- B=1;
- while(i--)
- {
- B*=10;
- }
- B = B/1000;
- Dl645FirmPara.IRmsConst=((float)tempis/((float)tempib*B));
- fnDl645File_Write(Dl645FileId_FirmPara,10,(u8 *)&Dl645FirmPara.IRmsConst,4);
-
- i=Dl645FirmPara.FractionU;
- B=1;
- while(i--)
- {
- B*=10;
- }
- B = B/100;
- Dl645FirmPara.VRmsConst=((float)tempus/(tempub*B));
- fnDl645File_Write(Dl645FileId_FirmPara,30,(u8 *)&Dl645FirmPara.VRmsConst,4);
-
- Dl645FirmPara.NOLOAD = (u16)((tempis*0.0003)/16);
- Dl645FirmPara.ZEROSTAR=(u16)((tempis*0.005)/4096);
- fnRN7302_Write(IStart_PS,(u8 *)&Dl645FirmPara.NOLOAD,2);
- fnRN7302_Write(ZXOT,(u8 *)&Dl645FirmPara.ZEROSTAR,2);
- fnDl645File_Write(Dl645FileId_FirmPara,18,(u8 *)&Dl645FirmPara.NOLOAD,4);
-
- // 功率系數計算
- Dl645FirmPara.PRmsConst=(u32)((float)tempus*(float)tempis/((float)tempub*(float)tempib*838.8608));
- fnDl645File_Write(Dl645FileId_FirmPara,36,(u8 *)&Dl645FirmPara.PRmsConst,4);
-
- memcpy(&tempub , &(RxFrm->UDat.Dat[24]) , 2);
- memcpy(&tempib , &(RxFrm->UDat.Dat[26]) , 2);
-
- Dl645FirmPara.PRth[0] = tempub;
- Dl645FirmPara.PRth[1] = tempib;
-
- fnRN7302_Write(PRTH1L,(u8 *)&Dl645FirmPara.PRth[0],2);
- fnRN7302_Write(PRTH1H,(u8 *)&Dl645FirmPara.PRth[1],2);
-
- memcpy(&tempub , &(RxFrm->UDat.Dat[28]) , 2);
- memcpy(&tempib , &(RxFrm->UDat.Dat[30]) , 2);
-
- Dl645FirmPara.PRth[2] = tempub;
- Dl645FirmPara.PRth[3] = tempib;
-
- fnRN7302_Write(PRTH2L,(u8 *)&Dl645FirmPara.PRth[2],2);
- fnRN7302_Write(PRTH2H,(u8 *)&Dl645FirmPara.PRth[3],2);
- fnDl645File_Write(Dl645FileId_FirmPara,70,(u8 *)&Dl645FirmPara.PRth[0],8);
-
- Dl645RN7302DataComm.ucTemp8 = 0xDC; // 寫保護
- fnRN7302_Write(0x0180,Dl645RN7302DataComm.ucTempBuf,1);
- Dl645FirmPara.ChkSum1 = 0;
- SystemDelay(10);
- fnRN7302_Read( CheckSum1 , (u8 *)&Dl645FirmPara.ChkSum1 , 3 ) ;
- fnDl645File_Write(Dl645FileId_FirmPara,22,(u8 *)&Dl645FirmPara.ChkSum1,3);
- break;
- case 0x00f81100: //功率相位校準
- if((RxFrm->Len != (12+18))&&(RxFrm->Len != (12+20))&&(RxFrm->Len != (12+5))) return(DL645B_ERRINFO_DATA);
- if(RxFrm->Len == (12+5))
- {
- memcpy(&tempis , &(RxFrm->UDat.Dat[9]) , 4);
- Dl645RN7302DataComm.ucTemp8 = 0xe5; // 寫使能位
- fnRN7302_Write(0x0180,Dl645RN7302DataComm.ucTempBuf,1);
- if(tempis > 0x7fffffff) ADErr=-(float)(0xffffffff - tempis)/100000;
- else ADErr=(float)tempis/100000;
- ADErr = (asin(-ADErr/1.732))*57.29578/0.017578; // 弧度轉成角度
- if(Dl645FirmPara.PRth[0]==0 && Dl645FirmPara.PRth[1]==0 && Dl645FirmPara.PRth[2]==0 && Dl645FirmPara.PRth[3]==0)
- {
- if(ADErr == 0) Dl645FirmPara.PHSI[RxFrm->UDat.Dat[8]] = 0x808080;
- else if(ADErr>0) Dl645FirmPara.PHSI[RxFrm->UDat.Dat[8]] = 0x808080 - (u8)ADErr;
- else {ADErr = -ADErr;Dl645FirmPara.PHSI[RxFrm->UDat.Dat[8]] = 0x808080 + (u8)ADErr;}
- }
- else
- {
- if(ADErr == 0) Dl645FirmPara.PHSI[RxFrm->UDat.Dat[8]] = (Dl645FirmPara.PHSI[RxFrm->UDat.Dat[8]]&0x00ff00ff)|0x8000;
- else if(ADErr>0) Dl645FirmPara.PHSI[RxFrm->UDat.Dat[8]] = Dl645FirmPara.PHSI[RxFrm->UDat.Dat[8]] - (((u32)((u8)ADErr)<<8)&0x0000ff00);
- else {ADErr = -ADErr;Dl645FirmPara.PHSI[RxFrm->UDat.Dat[8]] = Dl645FirmPara.PHSI[RxFrm->UDat.Dat[8]] + (((u32)((u8)ADErr)<<8)&0x0000ff00);}
- }
- fnRN7302_Write(PHSIA+RxFrm->UDat.Dat[8],(u8 *)&Dl645FirmPara.PHSI[RxFrm->UDat.Dat[8]],3);
- }
- else
- {
- memcpy(&tempis , &(RxFrm->UDat.Dat[8]) , 4);
- memcpy(&tempus , &(RxFrm->UDat.Dat[12]) , 4);
-
- Dl645FirmPara.PRmsConst=((float)tempus*100/(tempis/10));
-
- fnDl645File_Write(Dl645FileId_FirmPara,36,(u8 *)&Dl645FirmPara.PRmsConst,4);
-
- Dl645RN7302DataComm.ucTemp8 = 0xe5; // 寫使能位
- fnRN7302_Write(0x0180,Dl645RN7302DataComm.ucTempBuf,1);
- if((RxFrm->Len == (12+18)))
- {
- tempangle[0] =0;
-
- for(i=0;i<2;i++)
- {
- fnRN7302_Read( YUB+i , Dl645RN7302DataComm.ucTempBuf , 3 ) ;
- temppw[0] =Dl645RN7302DataComm.lTemp32 & 0x00ffffff;
- tempangle[i+1] = (u16)(((float)temppw[0]/16777216)*36000);
- }
-
- for(i=0;i<3;i++)
- {
- memcpy(&tempangle[i+3] , &(RxFrm->UDat.Dat[20+2*i]) , 2);
- fnRN7302_Read( YIA+i , Dl645RN7302DataComm.ucTempBuf , 3 ) ;
- temppw[0] =Dl645RN7302DataComm.lTemp32 & 0x00ffffff;
- ADErr = ((((float)temppw[0]/16777216)*36000-(float)(tempangle[i+3]+tempangle[i]))/1.7578);
- if(Dl645FirmPara.PRth[0]==0 && Dl645FirmPara.PRth[1]==0 && Dl645FirmPara.PRth[2]==0 && Dl645FirmPara.PRth[3]==0)
- {
- if(ADErr>0) Dl645FirmPara.PHSI[i] = 0x808080 - (u8)ADErr;
- else {ADErr = -ADErr;Dl645FirmPara.PHSI[i] = 0x808080 + (u8)ADErr;}
- }
- else
- {
- if(ADErr>0) Dl645FirmPara.PHSI[i] = Dl645FirmPara.PHSI[i] - (((u32)((u8)ADErr)<<8)&0x0000ff00);
- else {ADErr = -ADErr;Dl645FirmPara.PHSI[i] = Dl645FirmPara.PHSI[i] + (((u32)((u8)ADErr)<<8)&0x0000ff00);}
- }
- fnRN7302_Write(PHSIA+i,(u8 *)&Dl645FirmPara.PHSI[i],3);
- }
- }
- else
- {
- for(i=0;i<3;i++)
- {
- fnRN7302_Read( 0x0014+i , Dl645RN7302DataComm.ucTempBuf , 4 ) ;
- temppw[0] =Dl645RN7302DataComm.lTemp32;
-
- memcpy(&temppw[1] , &(RxFrm->UDat.Dat[16 + 4*i]) , 4);
- temppw[1] = (u32)(((float)tempus/(float)tempis)*(float)temppw[1]);
- ADErr=((float)temppw[0]-(float)temppw[1])/(float)temppw[1];
- ADErr = (asin(-ADErr/1.732))*57.29578/0.017578; // 弧度轉成角度
- if(Dl645FirmPara.PRth[0]==0 && Dl645FirmPara.PRth[1]==0 && Dl645FirmPara.PRth[2]==0 && Dl645FirmPara.PRth[3]==0)
- {
- if(ADErr>0) Dl645FirmPara.PHSI[i] = 0x808080 - (u8)ADErr;
- else {ADErr = -ADErr;Dl645FirmPara.PHSI[i] = 0x808080 + (u8)ADErr;}
- }
- else
- {
- if(ADErr>0) Dl645FirmPara.PHSI[i] = Dl645FirmPara.PHSI[i] - (((u32)((u8)ADErr)<<8)&0x0000ff00);
- else {ADErr = -ADErr;Dl645FirmPara.PHSI[i] = Dl645FirmPara.PHSI[i] + (((u32)((u8)ADErr)<<8)&0x0000ff00);}
- }
- fnRN7302_Write(PHSIA+i,(u8 *)&Dl645FirmPara.PHSI[i],3);
- }
- }
- }
- fnDl645File_Write(Dl645FileId_FirmPara,56,(u8 *)&Dl645FirmPara.PHSU[0],14);
-
- Dl645RN7302DataComm.ucTemp8 = 0xDC; // 寫保護
- fnRN7302_Write(0x0180,Dl645RN7302DataComm.ucTempBuf,1);
- Dl645FirmPara.ChkSum1 = 0;
- SystemDelay(10);
- fnRN7302_Read( CheckSum1 , (u8 *)&Dl645FirmPara.ChkSum1 , 3 ) ;
- fnDl645File_Write(Dl645FileId_FirmPara,22,(u8 *)&Dl645FirmPara.ChkSum1,3);
- break;
- case 0x00f81102: //功率相位校準分段1
- if((RxFrm->Len != (12+10))&&(RxFrm->Len != (12+20))&&(RxFrm->Len != (12+5))) return(DL645B_ERRINFO_DATA);
- if(Dl645FirmPara.PRth[0]==0 && Dl645FirmPara.PRth[1]==0 && Dl645FirmPara.PRth[2]==0 && Dl645FirmPara.PRth[3]==0) return(DL645B_ERRINFO_DATA);
- Dl645RN7302DataComm.ucTemp8 = 0xe5; // 寫使能位
- fnRN7302_Write(0x0180,Dl645RN7302DataComm.ucTempBuf,1);
- if(RxFrm->Len == (12+10))
- {
- tempangle[0] =0;
- for(i=0;i<2;i++)
- {
- fnRN7302_Read( YUB+i , Dl645RN7302DataComm.ucTempBuf , 3 ) ;
- temppw[0] =Dl645RN7302DataComm.lTemp32 & 0x00ffffff;
- tempangle[i+1] = (u16)(((float)temppw[0]/16777216)*36000);
- }
-
- for(i=0;i<3;i++)
- {
- memcpy(&tempangle[i+3] , &(RxFrm->UDat.Dat[12+2*i]) , 2);
- fnRN7302_Read( YIA+i , Dl645RN7302DataComm.ucTempBuf , 3 ) ;
- //fnRN7302_Read( YIA+i , (u8 *)&temppw[0] , 3 ) ;
- temppw[0] =Dl645RN7302DataComm.lTemp32 & 0x00ffffff;
- ADErr = ((((float)temppw[0]/16777216)*36000-(tempangle[i+3]+tempangle[i]))/1.7578);
- if(ADErr>0) Dl645FirmPara.PHSI[i] = ((Dl645FirmPara.PHSI[i]&0xffff00)|0x000080) - (u8)ADErr;
- else {ADErr = -ADErr;Dl645FirmPara.PHSI[i] = ((Dl645FirmPara.PHSI[i]&0xffff00)|0x000080) + (u8)ADErr;}
- fnRN7302_Write(PHSIA+i,(u8 *)&Dl645FirmPara.PHSI[i],3);
- }
- }
- else if(RxFrm->Len == (12+20))
- {
- memcpy(&tempis , &(RxFrm->UDat.Dat[8]) , 4);
- memcpy(&tempus , &(RxFrm->UDat.Dat[12]) , 4);
-
- for(i=0;i<3;i++)
- {
- fnRN7302_Read( 0x0014+i , Dl645RN7302DataComm.ucTempBuf , 4 ) ;
- temppw[0] =Dl645RN7302DataComm.lTemp32;
-
- memcpy(&temppw[1] , &(RxFrm->UDat.Dat[16 + 4*i]) , 4);
- temppw[1] = (u32)(((float)tempus/(float)tempis)*(float)temppw[1]);
- ADErr=((float)temppw[0]-(float)temppw[1])/(float)temppw[1];
- ADErr = (asin(-ADErr/1.732))*57.29578/0.017578; // 弧度轉成角度
- if(ADErr>0) Dl645FirmPara.PHSI[i] = ((Dl645FirmPara.PHSI[i]&0xffff00)|0x000080) - (u8)ADErr;
- else {ADErr = -ADErr;Dl645FirmPara.PHSI[i] = ((Dl645FirmPara.PHSI[i]&0xffff00)|0x000080) + (u8)ADErr;}
- fnRN7302_Write(PHSIA+i,(u8 *)&Dl645FirmPara.PHSI[i],3);
- }
- }
- else
- {
- memcpy(&tempis , &(RxFrm->UDat.Dat[9]) , 4);
- Dl645RN7302DataComm.ucTemp8 = 0xe5; // 寫使能位
- fnRN7302_Write(0x0180,Dl645RN7302DataComm.ucTempBuf,1);
- if(tempis > 0x7fffffff) ADErr=-(float)(0xffffffff - tempis)/100000;
- else ADErr=(float)tempis/100000;
- ADErr = (asin(-ADErr/1.732))*57.29578/0.017578; // 弧度轉成角度
- if(ADErr>0) Dl645FirmPara.PHSI[RxFrm->UDat.Dat[8]] = ((Dl645FirmPara.PHSI[RxFrm->UDat.Dat[8]]&0xffff00)|0x000080) - (u8)ADErr;
- else {ADErr = -ADErr;Dl645FirmPara.PHSI[RxFrm->UDat.Dat[8]] = ((Dl645FirmPara.PHSI[RxFrm->UDat.Dat[8]]&0xffff00)|0x000080) + (u8)ADErr;}
- fnRN7302_Write(PHSIA+RxFrm->UDat.Dat[8],(u8 *)&Dl645FirmPara.PHSI[RxFrm->UDat.Dat[8]],3);
- }
- fnDl645File_Write(Dl645FileId_FirmPara,56,(u8 *)&Dl645FirmPara.PHSU[0],14);
- Dl645RN7302DataComm.ucTemp8 = 0xDC; // 寫保護
- fnRN7302_Write(0x0180,Dl645RN7302DataComm.ucTempBuf,1);
- Dl645FirmPara.ChkSum1 = 0;
- SystemDelay(10);
- fnRN7302_Read( CheckSum1 , (u8 *)&Dl645FirmPara.ChkSum1 , 3 ) ;
- fnDl645File_Write(Dl645FileId_FirmPara,22,(u8 *)&Dl645FirmPara.ChkSum1,3);
- break;
- case 0x00f81103:
- if((RxFrm->Len != (12+10))&&(RxFrm->Len != (12+20))&&(RxFrm->Len != (12+5))) return(DL645B_ERRINFO_DATA);
- if(Dl645FirmPara.PRth[0]==0 && Dl645FirmPara.PRth[1]==0 && Dl645FirmPara.PRth[2]==0 && Dl645FirmPara.PRth[3]==0) return(DL645B_ERRINFO_DATA);
- Dl645RN7302DataComm.ucTemp8 = 0xe5; // 寫使能位
- fnRN7302_Write(0x0180,Dl645RN7302DataComm.ucTempBuf,1);
- if(RxFrm->Len == (12+10))
- {
- tempangle[0] =0;
- for(i=0;i<2;i++)
- {
- fnRN7302_Read( YUB+i , Dl645RN7302DataComm.ucTempBuf , 3 ) ;
- temppw[0] =Dl645RN7302DataComm.lTemp32 & 0x00ffffff;
- tempangle[i+1] = (u16)(((float)temppw[0]/16777216)*36000);
- }
- for(i=0;i<3;i++)
- {
- memcpy(&tempangle[i+3] , &(RxFrm->UDat.Dat[12+2*i]) , 2);
- fnRN7302_Read( YIA+i , Dl645RN7302DataComm.ucTempBuf , 3 ) ;
- temppw[0] =Dl645RN7302DataComm.lTemp32 & 0x00ffffff;
- ADErr = ((((float)temppw[0]/16777216)*36000-(tempangle[i+3]+tempangle[i]))/1.7578);
- if(ADErr>0) Dl645FirmPara.PHSI[i] = ((Dl645FirmPara.PHSI[i]&0x00ffff)|0x800000) - (((u32)((u8)ADErr)*65536)&0x00ff0000);
- else {ADErr = -ADErr;Dl645FirmPara.PHSI[i] = ((Dl645FirmPara.PHSI[i]&0x00ffff)|0x800000) + (((u32)((u8)ADErr)*65536)&0x00ff0000);}
- fnRN7302_Write(PHSIA+i,(u8 *)&Dl645FirmPara.PHSI[i],3);
- }
- }
- else if((RxFrm->Len == (12+20)))
- {
- memcpy(&tempis , &(RxFrm->UDat.Dat[8]) , 4);
- memcpy(&tempus , &(RxFrm->UDat.Dat[12]) , 4);
-
- for(i=0;i<3;i++)
- {
- fnRN7302_Read( 0x0014+i , Dl645RN7302DataComm.ucTempBuf , 4 ) ;
- temppw[0] =Dl645RN7302DataComm.lTemp32;
-
- memcpy(&temppw[1] , &(RxFrm->UDat.Dat[16 + 4*i]) , 4);
- temppw[1] = (u32)(((float)tempus/(float)tempis)*(float)temppw[1]);
- ADErr=((float)temppw[0]-(float)temppw[1])/(float)temppw[1];
- ADErr = (asin(-ADErr/1.732))*57.29578/0.017578; // 弧度轉成角度
- if(ADErr>0) Dl645FirmPara.PHSI[i] = ((Dl645FirmPara.PHSI[i]&0x00ffff)|0x800000) - (((u32)((u8)ADErr)*65536)&0x00ff0000);
- else {ADErr = -ADErr;Dl645FirmPara.PHSI[i] = ((Dl645FirmPara.PHSI[i]&0x00ffff)|0x800000) + (((u32)((u8)ADErr)*65536)&0x00ff0000);}
- fnRN7302_Write(PHSIA+i,(u8 *)&Dl645FirmPara.PHSI[i],3);
- }
- }
- else
- {
- memcpy(&tempis , &(RxFrm->UDat.Dat[9]) , 4);
- Dl645RN7302DataComm.ucTemp8 = 0xe5; // 寫使能位
- fnRN7302_Write(0x0180,Dl645RN7302DataComm.ucTempBuf,1);
- if(tempis > 0x7fffffff) ADErr=-(float)(0xffffffff - tempis)/100000;
- else ADErr=(float)tempis/100000;
- ADErr = (asin(-ADErr/1.732))*57.29578/0.017578; // 弧度轉成角度
- if(ADErr>0) Dl645FirmPara.PHSI[RxFrm->UDat.Dat[8]] = ((Dl645FirmPara.PHSI[RxFrm->UDat.Dat[8]]&0x00ffff)|0x800000) - (((u32)((u8)ADErr)*65536)&0x00ff0000);
- else {ADErr = -ADErr;Dl645FirmPara.PHSI[RxFrm->UDat.Dat[8]] = ((Dl645FirmPara.PHSI[RxFrm->UDat.Dat[8]]&0x00ffff)|0x800000) + (((u32)((u8)ADErr)*65536)&0x00ff0000);}
- fnRN7302_Write(PHSIA+RxFrm->UDat.Dat[8],(u8 *)&Dl645FirmPara.PHSI[RxFrm->UDat.Dat[8]],3);
- }
- fnDl645File_Write(Dl645FileId_FirmPara,56,(u8 *)&Dl645FirmPara.PHSU[0],14);
-
- Dl645RN7302DataComm.ucTemp8 = 0xDC; // 寫保護
- fnRN7302_Write(0x0180,Dl645RN7302DataComm.ucTempBuf,1);
- Dl645FirmPara.ChkSum1 = 0;
- SystemDelay(10);
- fnRN7302_Read( CheckSum1 , (u8 *)&Dl645FirmPara.ChkSum1 , 3 ) ;
- fnDl645File_Write(Dl645FileId_FirmPara,22,(u8 *)&Dl645FirmPara.ChkSum1,3);
- break;
- case 0x00f81501: // 誤差校正功率增益
- if(RxFrm->Len != (12+5)) return(DL645B_ERRINFO_DATA);
- if(RxFrm->UDat.Dat[8]>0x03) return(DL645B_ERRINFO_DATA);
- memcpy(&tempis , &(RxFrm->UDat.Dat[9]) , 4);
- Dl645RN7302DataComm.ucTemp8 = 0xe5; // 寫使能位
- fnRN7302_Write(0x0180,Dl645RN7302DataComm.ucTempBuf,1);
- if(tempis > 0x7fffffff) ADErr=-(float)(0xffffffff - tempis)/100000;
- else ADErr=(float)tempis/100000;
- ADErr=((-ADErr)/(1+ADErr));
- if(ADErr>=0) Dl645FirmPara.PGain[RxFrm->UDat.Dat[8]]=(u16)(ADErr*32768);
- else Dl645FirmPara.PGain[RxFrm->UDat.Dat[8]] = (u16)(65535 + ADErr*32768);
- fnRN7302_Write(GPA+RxFrm->UDat.Dat[8],(u8 *)&Dl645FirmPara.PGain[RxFrm->UDat.Dat[8]],2);
- fnRN7302_Write(GQA+RxFrm->UDat.Dat[8],(u8 *)&Dl645FirmPara.PGain[RxFrm->UDat.Dat[8]],2);
- fnRN7302_Write(GSA+RxFrm->UDat.Dat[8],(u8 *)&Dl645FirmPara.PGain[RxFrm->UDat.Dat[8]],2);
- Dl645RN7302DataComm.ucTemp8 = 0xDC; // 寫保護
- fnRN7302_Write(0x0180,Dl645RN7302DataComm.ucTempBuf,1);
- fnDl645File_Write(Dl645FileId_FirmPara,98,(u8 *)&Dl645FirmPara.PGain[0],6);
- Dl645FirmPara.ChkSum1 = 0;
- SystemDelay(10);
- fnRN7302_Read( CheckSum1 , (u8 *)&Dl645FirmPara.ChkSum1 , 3 ) ;
- fnDl645File_Write(Dl645FileId_FirmPara,22,(u8 *)&Dl645FirmPara.ChkSum1,3);
- break;
- case 0x00f81600:
- if((RxFrm->Len != (12 + 1)) && (RxFrm->UDat.Dat[8] != 0x5A)) return(DL645B_ERRINFO_DATA);
- Dl645RN7302DataComm.ucTemp8 = 0xe5; // 寫使能位
- fnRN7302_Write(0x0180,Dl645RN7302DataComm.ucTempBuf,1);
- for(i=0;i<3;i++)
- {
- Dl645FirmPara.VGain[i]=0;
- fnRN7302_Write(GSUA+i,(u8 *)&Dl645FirmPara.VGain[i],2);
- Dl645FirmPara.IGain[i]=0;
- fnRN7302_Write(GSIA+i,(u8 *)&Dl645FirmPara.IGain[i],2);
- }
- for(i=0;i<2;i++)
- {
- Dl645FirmPara.PHSU[i]=0x80;
- fnRN7302_Write(PHSUB+i,(u8 *)&Dl645FirmPara.PHSU[i],1);
- }
- for(i=0;i<3;i++)
- {
- Dl645FirmPara.PHSI[i]=0x808080;
- fnRN7302_Write(PHSUB+i,(u8 *)&Dl645FirmPara.PHSI[i],3);
- }
- for(i=0;i<3;i++)
- {
- Dl645FirmPara.P_PHS[i]=0;
- fnRN7302_Write(PA_PHS+i,(u8 *)&Dl645FirmPara.P_PHS[i],2);
- }
- for(i=0;i<3;i++)
- {
- Dl645FirmPara.P_PHS[i]=0;
- fnRN7302_Write(PA_PHS+i,(u8 *)&Dl645FirmPara.P_PHS[i],2);
- }
- for(i=0;i<3;i++)
- {
- Dl645FirmPara.PGain[i]=0;
- fnRN7302_Write(GPA+i,(u8 *)&Dl645FirmPara.PGain[i],2);
- fnRN7302_Write(GQA+i,(u8 *)&Dl645FirmPara.PGain[i],2);
- fnRN7302_Write(GSA+i,(u8 *)&Dl645FirmPara.PGain[i],2);
- }
- Dl645FirmPara.PRth[0] = 0x0;
- Dl645FirmPara.PRth[1] = 0x0;
- Dl645FirmPara.PRth[2] = 0x0;
- Dl645FirmPara.PRth[3] = 0x0;
- fnRN7302_Write(PRTH1L,(u8 *)&Dl645FirmPara.PRth[0],2);
- fnRN7302_Write(PRTH1H,(u8 *)&Dl645FirmPara.PRth[1],2);
- fnRN7302_Write(PRTH2L,(u8 *)&Dl645FirmPara.PRth[2],2);
- fnRN7302_Write(PRTH2H,(u8 *)&Dl645FirmPara.PRth[3],2);
-
- Dl645RN7302DataComm.ucTemp8 = 0xDC; // 寫保護
- fnRN7302_Write(0x0180,Dl645RN7302DataComm.ucTempBuf,1);
- fnDl645File_Write(Dl645FileId_FirmPara,42,(u8 *)&Dl645FirmPara.VGain[0],6);
- fnDl645File_Write(Dl645FileId_FirmPara,48,(u8 *)&Dl645FirmPara.IGain[0],8);
- fnDl645File_Write(Dl645FileId_FirmPara,56,(u8 *)&Dl645FirmPara.PHSU[0],14);
- fnDl645File_Write(Dl645FileId_FirmPara,70,(u8 *)&Dl645FirmPara.PRth[0],8);
- fnDl645File_Write(Dl645FileId_FirmPara,92,(u8 *)&Dl645FirmPara.P_PHS[0],12);
- fnDl645File_Write(Dl645FileId_FirmPara,98,(u8 *)&Dl645FirmPara.PGain[0],6);
- Dl645FirmPara.ChkSum1 = 0;
- SystemDelay(10);
- fnRN7302_Read( CheckSum1 , (u8 *)&Dl645FirmPara.ChkSum1 , 3 ) ;
- fnDl645File_Write(Dl645FileId_FirmPara,22,(u8 *)&Dl645FirmPara.ChkSum1,3);
- break;
- }
- }
復制代碼
只有一個c文件,不完整,求大家補全:
RN7302_Demo_V1.1.rar
(6.25 KB, 下載次數: 375)
|