|
說起ADE7758的電力參數(shù)采集芯片,應(yīng)用很多,早幾年用他做了一個產(chǎn)品,
看了現(xiàn)在好像還有人在用,
現(xiàn)在把自己用的源代碼發(fā)上來,希望對大家有幫助,
- #include<reg52.h>
- #include<stdio.h>
- #include<ABSACC.H>
- #include<Hardware.H>
- #include<ExTimer.H>
- #include<12864.H>
- #include<MATH.H>
- #include<Alarm.H>
- #include<ADC.H>
- #include<LC.H>
- /*
- static unsigned char IE_COPY=0; //進(jìn)入中斷之后保存IE 全局變量
- static unsigned char Com_Counter=6;
- static unsigned char Capture_1H=0;
- static unsigned char Capture_1L=0;
- static unsigned char Capture_2H=0;
- static unsigned char Capture_2L=0;
- static unsigned char Capture_Couter=0;
- static unsigned int T;
- static unsigned int Number_Fre;
- static unsigned int Max,Min,Speed_Filter[10];
- static unsigned long Capture_Result;
- static unsigned long Accelaration;
- */
- /*ADC模擬量數(shù)據(jù)修正設(shè)置數(shù)據(jù)定義,位于XRAM.是EEPROM 的映射*/
- #define BV_Offset 0x00C2//電池偏移
- #define BV_Gain 0x00C3//電池增益
- #define ET_Offset 0x00C4//水溫偏移
- #define ET_Gain 0x00C5//水溫增益
- #define OP_Offset 0x00C6//油壓偏移
- #define OP_Gain 0x00C7//油壓增益
- #define FL_Offset 0x00C8//油量偏移
- #define FL_Gain 0x00C9//油量增益
- #define OV_Offset 0x00CA//電壓偏移
- #define OV_Gain 0x00CB//電壓增益
- #define OC_Offset 0x00CC//電流偏移
- #define OC_Gain 0x00CD//電流增益
- #define PF_Offset 0x00CE//功率因數(shù)偏移
- #define PF_Gain 0x00CF//功率因數(shù)增益
- /*ADC 采集的模擬量數(shù)據(jù) 全局變量*/
- volatile unsigned int idata BatteryVoltage=0;
- volatile unsigned int idata ETVoltage=0;
- volatile unsigned int idata OPVoltage=0;
- volatile unsigned int idata FLVoltage=0;
- /*ADE 采集的模擬量數(shù)據(jù) 全局變量*/
- volatile unsigned int idata GenVoltageL1=0;
- volatile unsigned int idata GenVoltageL2=0;
- volatile unsigned int idata GenVoltageL3=0;
- volatile unsigned int idata GenVoltageL12=0;
- volatile unsigned int idata GenVoltageL23=0;
- volatile unsigned int idata GenVoltageL31=0;
- volatile unsigned long idata GenCurrentC1=0;
- volatile unsigned long idata GenCurrentC2=0;
- volatile unsigned long idata GenCurrentC3=0;
- volatile unsigned int idata GenKwL1=0;
- volatile unsigned int idata GenKwL2=0;
- volatile unsigned int idata GenKwL3=0;
- volatile unsigned int idata GenKvarL1=0;
- volatile unsigned int idata GenKvarL2=0;
- volatile unsigned int idata GenKvarL3=0;
- volatile unsigned long idata GenKvaL1=0;
- volatile unsigned long idata GenKvaL2=0;
- volatile unsigned long idata GenKvaL3=0;
- volatile unsigned int idata GenFrequency;
- volatile unsigned int idata GenPF1=0;
- volatile unsigned int idata GenPF2=0;
- volatile unsigned int idata GenPF3=0;
- volatile unsigned long idata GenSpeed;
- unsigned char idata ad_x=0;
- volatile unsigned int value_ET=0;
- volatile unsigned int value_OP=0;
- volatile unsigned int value_FL=0;
- /*定時器2 的變量定義*/
- unsigned char bdata mask;
- sbit Freq_BIT=mask^0;
- sbit INT0_BIT=mask^1;
- /*定義可位尋址的寄存器,用于緩沖*/
- /*離散輸入緩沖*/
- extern unsigned char bdata DI_BUF;
- /*離散輸出緩沖*/
- extern unsigned char bdata DO_BUF;
- /*現(xiàn)場操作模式緩沖*/
- extern unsigned char bdata LC_Model_BUF;
- /*--------------------------------------------------------------*/
- /*偏移、增益修正公共函數(shù)*/
- unsigned int AD_OffsetGain(unsigned int DataInput,unsigned int Gain,unsigned int Offset)
- {
- unsigned long Data;
- /*偏移修正*/
- Data=XWORD[Offset];//讀取偏移設(shè)置數(shù)據(jù)
- /*偏移量計算*/
- if (Data>=100)
- {
- //BV_Offset>=100,正偏移,修正單位1/LSB(0.1V/LSB)。
- DataInput=(DataInput+(Data-100)); //屏蔽正負(fù)標(biāo)志,計算真實的正偏移量
- }
- else
- {
- //BV_Offset<100,負(fù)偏移,修正單位1/LSB(0.1V/LSB)。
-
- //判斷是否大于要修正的負(fù)偏移量
- if (DataInput>(100-Data))
- {
- DataInput=(DataInput-(100-Data)); //小于100,計算真實的負(fù)偏移量
- }
- else
- {
- //小于要修正的偏移量
- DataInput=0;
- }
- }
- /*增益修正*/
- Data=XWORD[Gain];//讀取增益設(shè)置數(shù)據(jù)
- /*增益計算*/
- //Gain,正負(fù)增益,修正單位0.001/LSB。
- Data=(Data*DataInput)/1000;
-
- return Data;
- }
- /*--------------------------------------------------------------*/
- /*軟件延時函數(shù)*/
- void AD_Delay(unsigned int Delay)
- {
- unsigned int i; //時間倍數(shù)。
- for(; Delay>0; Delay--)
- {
- for(i=0; i<100; i++)
- {
- } //時間倍數(shù)循環(huán)。
- }
- }
- /*--------------------------------------------------------------*/
- /*Timer2 中斷服務(wù)程序*/
- void Timer2_Sev(void)
- {
- //初始化T2
- TF2=0;
-
- RCAP2L = 0x00;
- RCAP2H = 0x00;
- TL2 = 0x00;
- TH2 = 0x00;
-
- TR2 = 0; //關(guān)閉T2
- ET2 =0;
- EX0=0;
-
- GenFrequency=0;
-
- INT0_BIT=1;
- Freq_BIT=0;
- }
- /*--------------------------------------------------------------*/
- /*INT0 中斷服務(wù)程序*/
- void Int0_Sev(void)
- {
- if (Freq_BIT==0)
- {
- //AD_Delay(10);
- //while (INT0==1);
-
- TL2 = 0x00;
- TH2 = 0x00;
- TR2=1; //T2
- ET2=1; //使能中斷
- Freq_BIT=1;
-
- //nPEN=0;
- //AD_Delay(20);
- //while (INT0==0);
-
- }
- else
- {
- //AD_Delay(10);
- //while (INT0==1);
-
- TR2=0;
- ET2=0;
- EX0=0;
-
- GenFrequency=(((TH2*256)+TL2)/73.67);
-
- //nPEN=1;
- Freq_BIT=0;
- INT0_BIT=1;
-
- }
- }
- /*--------------------------------------------------------------*/
- /*發(fā)電機電壓數(shù)據(jù)采集*/
- void ADE_GenVoltage(void)
- {
- unsigned char Mask;
- unsigned int i;
- Power_Measure_Write(LCYCMODE,0x38);//ZXSEL Bit3=1,Bit4=1,Bit5=1,選擇PhaseA、B、C。
- Power_Measure_Write(MASK,0xFC0); //ZXA=1,ZXB=1,ZXC=1,選擇PhaseA、B、C過零交點標(biāo)志。
- //循環(huán)檢測三相
- Power_Measure_Write(ZXTOUT,0x0FFF); //將過零溢出時間。
- Power_Measure_Read(RSTATUS); //復(fù)位狀態(tài)標(biāo)志寄存器。
- Mask=0;
- i=0;
- while (Mask==0)//等待結(jié)束標(biāo)志位
- {
- //判斷A相是否有過零標(biāo)志位***************************************************
- if ((Power_Measure_Read(STATUS)&0x0200)==0x0200)
- {
- //A相有過零標(biāo)志位
- GenCurrentC1=Power_Measure_Read(AIRMS)/10;//讀取ADE7758的電流數(shù)據(jù)
- GenVoltageL1=Power_Measure_Read(AVRMS)/4700; //讀取ADE7758的電壓數(shù)據(jù)
- Mask=1; //標(biāo)志結(jié)束
- }
- //A相檢測采集過程中是否有線電壓過零交變故障標(biāo)志位
- if ((Power_Measure_Read(STATUS)&0x0040)==0x0040)
- {
- //A相采集過程中有線電壓過零交變故障標(biāo)志
- //dengzhen
- GenVoltageL1=0; //不讀取ADE7758的數(shù)據(jù)
- Mask=1; //標(biāo)志結(jié)束
- }
- if (i==0x30)
- {
- GenVoltageL3=0; //不讀取ADE7758的數(shù)據(jù)
- Mask=1; //標(biāo)志結(jié)束
- }
- else
- {
- i++;
- }
- }
- if (Dianji_flag==1)//啟動成功后采集后兩相發(fā)電電壓
- {
- Power_Measure_Write(ZXTOUT,0x0FFF); //將過零溢出時間。
- Power_Measure_Read(RSTATUS); //復(fù)位狀態(tài)標(biāo)志寄存器。
- Mask=0;
- i=0;
- while (Mask==0)//等待結(jié)束標(biāo)志位
- {
- //判斷B相是否有過零標(biāo)志位***************************************************
- if ((Power_Measure_Read(STATUS)&0x0400)==0x0400)
- {
- //B相有過零標(biāo)志位
- GenCurrentC2=Power_Measure_Read(BIRMS)/10;//讀取ADE7758的電流數(shù)據(jù)
- GenVoltageL2=Power_Measure_Read(BVRMS)/4700; //讀取ADE7758的電壓數(shù)據(jù)
- Mask=1; //標(biāo)志結(jié)束
- }
- //B相檢測采集過程中是否有線電壓過零交變故障標(biāo)志位
- if((Power_Measure_Read(STATUS)&0x0080)==0x0080)
- {
- //B相采集過程中有線電壓過零交變故障標(biāo)志
- //dengzhen
- GenVoltageL2=0; //不讀取ADE7758的數(shù)據(jù)
- Mask=1; //標(biāo)志結(jié)束
- }
-
- if (i==0x30)
- {
- GenVoltageL3=0; //不讀取ADE7758的數(shù)據(jù)
- Mask=1; //標(biāo)志結(jié)束
- }
- else
- {
- i++;
- }
- }
- Power_Measure_Write(ZXTOUT,0x0FFF); //將過零溢出時間。
- Power_Measure_Read(RSTATUS); //復(fù)位狀態(tài)標(biāo)志寄存器。
- Mask=0;
- i=0;
- while (Mask==0)//等待結(jié)束標(biāo)志位
- {
- //判斷C相是否有過零標(biāo)志位***************************************************
- if ((Power_Measure_Read(STATUS)&0x0800)==0x0800)
- {
- //C相有過零標(biāo)志位
- GenCurrentC3=Power_Measure_Read(CIRMS)/10; //讀取ADE7758的電流數(shù)據(jù)
- GenVoltageL3=Power_Measure_Read(CVRMS)/4700; //讀取ADE7758的電壓數(shù)據(jù)
- Mask=1; //標(biāo)志結(jié)束
- }
- //C相檢測采集過程中是否有線電壓過零交變故障標(biāo)志位
- if ((Power_Measure_Read(STATUS)&0x0100)==0x0100)
- {
- //C相采集過程中有線電壓過零交變故障標(biāo)志
- //dengzhen
- GenVoltageL3=0; //不讀取ADE7758的數(shù)據(jù)
- Mask=1; //標(biāo)志結(jié)束
- }
-
- if (i==0x30)
- {
- GenVoltageL3=0; //不讀取ADE7758的數(shù)據(jù)
- Mask=1; //標(biāo)志結(jié)束
- }
- else
- {
- i++;
- }
- }
- }
- /*廠方修正*/
- GenVoltageL1=AD_OffsetGain(GenVoltageL1,0x00E5,0x00E4);
- GenVoltageL2=AD_OffsetGain(GenVoltageL2,0x00E7,0x00E6);
- GenVoltageL3=AD_OffsetGain(GenVoltageL3,0x00E9,0x00E8);
- /*用戶修正*/
- GenVoltageL1=AD_OffsetGain(GenVoltageL1,OV_Gain,OV_Offset);
- GenVoltageL2=AD_OffsetGain(GenVoltageL2,OV_Gain,OV_Offset);
- GenVoltageL3=AD_OffsetGain(GenVoltageL3,OV_Gain,OV_Offset);
- //======================================
- //判斷A相電壓是否小于15伏
-
- if (GenVoltageL1<10)
- {
- //A相電壓小于10伏
-
- GenVoltageL1=0;
- GenVoltageL2=0;
- GenVoltageL3=0; //將三相相電壓強制為0V
-
- GenVoltageL12=0;
- GenVoltageL23=0;
- GenVoltageL31=0; //將三相線電壓強制為0V
- }
- else
- {
-
- //A相電壓衐大于10伏
- //計算各相線電壓
-
- GenVoltageL12= sqrt(((GenVoltageL1*1.5)*(GenVoltageL1*1.5))+((GenVoltageL2*0.866)*(GenVoltageL2*0.866)));
- GenVoltageL23= sqrt(((GenVoltageL2*1.5)*(GenVoltageL2*1.5))+((GenVoltageL3*0.866)*(GenVoltageL3*0.866)));
- GenVoltageL31= sqrt(((GenVoltageL3*1.5)*(GenVoltageL3*1.5))+((GenVoltageL1*0.866)*(GenVoltageL1*0.866)));
-
- }
- }
- /*--------------------------------------------------------------*/
- /*發(fā)電機電壓數(shù)據(jù)采集*/
- /*
- void VoltageDroop(void)
- {
- unsigned int Data;
- //非通用修正 20061010
- Data=XWORD[0x00AC];
- Data=GenCurrentC1*100/Data;
- GenVoltageL1=GenVoltageL1+(GenVoltageL1*(Data*0.03)/100);
- GenVoltageL12=GenVoltageL12+(GenVoltageL12*(Data*0.03)/100);
- Data=XWORD[0x00AC];
- Data=GenCurrentC2*100/Data;
- GenVoltageL2=GenVoltageL2+(GenVoltageL2*(Data*0.03)/100);
- GenVoltageL23=GenVoltageL23+(GenVoltageL23*(Data*0.03)/100);
- Data=XWORD[0x00AC];
- Data=GenCurrentC3*100/Data;
- GenVoltageL3=GenVoltageL3+(GenVoltageL3*(Data*0.03)/100);
- GenVoltageL31=GenVoltageL31+(GenVoltageL31*(Data*0.03)/100);
- }
- */
- /*--------------------------------------------------------------*/
- /*發(fā)電機電流數(shù)據(jù)采集*/
- void ADE_GenCurrent(void)
- {
- //判斷A相電壓是否大于80伏
- if (GenVoltageL1>70)
- {
- //CT比例
- GenCurrentC1=GenCurrentC1/(10000/XWORD[0x00AC]);
- GenCurrentC2=GenCurrentC2/(10000/XWORD[0x00AC]);
- GenCurrentC3=GenCurrentC3/(10000/XWORD[0x00AC]);
- //廠方修正
- GenCurrentC1=AD_OffsetGain(GenCurrentC1,0x00EB,0x00EA);
- GenCurrentC2=AD_OffsetGain(GenCurrentC2,0x00ED,0x00EC);
- GenCurrentC3=AD_OffsetGain(GenCurrentC3,0x00EF,0x00EE);
- //用戶修正
- GenCurrentC1=AD_OffsetGain(GenCurrentC1,OC_Gain,OC_Offset);
- GenCurrentC2=AD_OffsetGain(GenCurrentC2,OC_Gain,OC_Offset);
- GenCurrentC3=AD_OffsetGain(GenCurrentC3,OC_Gain,OC_Offset);
-
- if ((GenCurrentC1/10)<(XWORD[0x00AC]*0.01))
- {
- //C1小于3A,三相電流為0
- GenCurrentC1=0;
- }
- if ((GenCurrentC2/10)<(XWORD[0x00AC]*0.01))
- {
- //C1小于3A,三相電流為0
- GenCurrentC2=0;
- }
- if ((GenCurrentC3/10)<(XWORD[0x00AC]*0.01))
- {
- //C1小于3A,三相電流為0
- GenCurrentC3=0;
- }
- }
- else
- {
- //相電壓小于150V
- GenCurrentC1=0;
- GenCurrentC2=0;
- GenCurrentC3=0;
- }
- //dengzhen 20101026
- if (GenCurrentC1>54000)
- {
- GenCurrentC1=54000;
- GenCurrentC2=54000;
- GenCurrentC3=54000;
- }
- }
- /*--------------------------------------------------------------*/
- /*發(fā)電機頻率數(shù)據(jù)采集*/
- void ADE_GenFrequency(void)
- {
- ////////////////////////////////////////////////guoyajun-08.7.24/////////////////////////////////////////
- if(XWORD[0x00F7]==0) //==0 >220V ==1>110V //電網(wǎng)選擇
- {
- ////燃油閥門
- if((GenVoltageL1<15)||((DO_BUF&0x02)==0x00))
- GenFrequency=0; //將頻率數(shù)據(jù)強制為0;
- else if(GenVoltageL1<180) //頻率在40赫茲內(nèi)使用電壓計算頻率
- GenFrequency=(GenVoltageL1*10)/4.4;
- else
- {
- Power_Measure_Write(LCYCMODE,0x38);//ZXSEL Bit3=1,Bit4=1,Bit5=1,選擇PhaseA、B、C。
- GenFrequency=(Power_Measure_Read(FREQ)*0.625); //讀取ADE7758的頻率數(shù)
- }
- }
- else //110v //電網(wǎng)選擇
- {
- if((GenVoltageL1<15)||((DO_BUF&0x02)==0x00))
- GenFrequency=0; //將頻率數(shù)據(jù)強制為0;
- else if(GenVoltageL1<74) //頻率在40赫茲內(nèi)使用電壓計算頻率
- GenFrequency=(GenVoltageL1*10)/1.83; ////燃油閥門
- else
- {
- Power_Measure_Write(LCYCMODE,0x38);//ZXSEL Bit3=1,Bit4=1,Bit5=1,選擇PhaseA、B、C。
- GenFrequency=(Power_Measure_Read(FREQ)*0.625); //讀取ADE7758的頻率數(shù)
- }
- }
- }
- /*--------------------------------------------------------------*/
- /*發(fā)電機視在功率數(shù)據(jù)采集*/
- void ADE_GenKVA(void)
- {
- unsigned long VData;
- VData=GenVoltageL1;
- VData=VData*GenCurrentC1;
- /*
- SBUF=GenVoltageL1>>8; while (TI==0){};TI=0;
- SBUF=GenVoltageL1; while (TI==0){};TI=0;
- SBUF=VData>>24; while (TI==0){};TI=0;
- SBUF=VData>>16; while (TI==0){};TI=0;
- SBUF=VData>>8; while (TI==0){};TI=0;
- SBUF=VData; while (TI==0){};TI=0;
- SBUF=0xAA; while (TI==0){};TI=0;
- SBUF=0x55; while (TI==0){};TI=0;
- */
- if((VData%100)>=500)
- {
- VData=(VData/1000)+1;
- }
- else
- {
- VData=VData/1000;
- }
- GenKvaL1=VData;
- if (GenKvaL1>29999) GenKvaL1=29999;
- VData=GenVoltageL2;
- VData=VData*GenCurrentC2;
- if((VData%100)>=500)
- {
- VData=(VData/1000)+1;
- }
- else
- {
- VData=VData/1000;
- }
- GenKvaL2=VData;
- if (GenKvaL2>29999) GenKvaL2=29999;
- VData=GenVoltageL3;
- VData=VData*GenCurrentC3;
- if((VData%100)>=500)
- {
- VData=(VData/1000)+1;
- }
- else
- {
- VData=VData/1000;
- }
- GenKvaL3=VData;
- if (GenKvaL3>29999) GenKvaL3=29999;
- }
- /*--------------------------------------------------------------*/
- /*發(fā)電機功率因數(shù)數(shù)據(jù)采集*/
- void ADE_GenPF(void)
- {
- unsigned long Data;
- unsigned char Mask;
- unsigned char i;
- /*ADE配置*/
- Power_Measure_Write(LCYCMODE,0xBF);
- Power_Measure_Write(LINECYC ,20);
- Power_Measure_Write(MASK,0x1000); //LENERGY=1
- Power_Measure_Read(RSTATUS); //復(fù)位狀態(tài)標(biāo)志寄存器。
- Mask=0;
- i=0;
- while (Mask==0)//等待結(jié)束標(biāo)志位
- {
- //判斷是否有計量完畢標(biāo)志位***************************************************
- if ((Power_Measure_Read(STATUS)&0x1000)==0x1000)
- {
- //
- Data=Power_Measure_Read(AWATTHR)*100/Power_Measure_Read(AVAHR);
- GenPF1=Data;
- Data=Power_Measure_Read(BWATTHR)*100/Power_Measure_Read(BVAHR);
- GenPF2=Data;
- Data=Power_Measure_Read(CWATTHR)*100/Power_Measure_Read(CVAHR);
- GenPF3=Data;
- Mask=1; //標(biāo)志結(jié)束
- }
- if (i==0x40)
- {
- GenPF1=100; //不讀取ADE7758的數(shù)據(jù)
- GenPF2=100; //不讀取ADE7758的數(shù)據(jù)
- GenPF3=100; //不讀取ADE7758的數(shù)據(jù)
- Mask=1; //標(biāo)志結(jié)束
- }
- else
- {
- i++;
- }
- }
- GenPF1=AD_OffsetGain(GenPF1,PF_Gain,PF_Offset);
- GenPF2=AD_OffsetGain(GenPF2,PF_Gain,PF_Offset);
- GenPF3=AD_OffsetGain(GenPF3,PF_Gain,PF_Offset);
- //====================================
- if (GenPF1>110)
- {
- if (GenPF1>120) GenPF1=0;
- else GenPF1=110;
- }
- if (GenPF1<30) GenPF1=000;
- if (GenCurrentC1==0) GenPF1=100;
- //====================================
- if (GenPF2>110)
- {
- if (GenPF2>120) GenPF2=0;
- else GenPF2=110;
- }
- if (GenPF2<30) GenPF2=000;
- if (GenCurrentC2==0) GenPF2=100;
- //====================================
- if (GenPF3>110)
- {
- if (GenPF3>120) GenPF3=0;
- else GenPF3=110;
- }
- if (GenPF3<30) GenPF3=000;
- if (GenCurrentC3==0) GenPF3=100;
- }
- /*--------------------------------------------------------------*/
- /*發(fā)電機有功功率數(shù)據(jù)采集*/
- void ADE_GenKW(void)
- {
- if (GenCurrentC1!=0)
- {
- GenKwL1=GenKvaL1*GenPF1/100;
- GenKwL2=GenKvaL2*GenPF2/100;
- GenKwL3=GenKvaL3*GenPF3/100;
- /*
- SBUF=GenKvaL1>>8; while (TI==0){};TI=0;
- SBUF=GenKvaL1; while (TI==0){};TI=0;
- SBUF=GenPF1>>8; while (TI==0){};TI=0;
- SBUF=GenPF1; while (TI==0){};TI=0;
- SBUF=GenKwL1>>8; while (TI==0){};TI=0;
- SBUF=GenKwL1; while (TI==0){};TI=0;
- SBUF=0x0D; while (TI==0){};TI=0;
- SBUF=0x0A; while (TI==0){};TI=0;
- */
- }
- else
- {
- GenKwL1=0;GenKwL2=0;GenKwL3=0;
- }
- /*用戶修正*/
- /* GenKwL1=AD_OffsetGain(GenKwL1,Kw_Gain,Kw_Offset);
- GenKwL2=AD_OffsetGain(GenKwL2,Kw_Gain,Kw_Offset);
- GenKwL3=AD_OffsetGain(GenKwL3,Kw_Gain,Kw_Offset);
- */
- }
- /*--------------------------------------------------------------*/
- /*發(fā)電機無功功率數(shù)據(jù)采集*/
- void ADE_GenKVAR(void)
- {
- if (GenCurrentC1!=0)
- {
- if (10000>(GenPF1*GenPF1))
- {
- GenKvarL1=GenKvaL1*(sqrt(10000-GenPF1*GenPF1))/100;
- }
- if (10000>(GenPF2*GenPF2))
- {
- GenKvarL2=GenKvaL2*(sqrt(10000-GenPF2*GenPF2))/100;
- }
- if (10000>(GenPF3*GenPF3))
- {
- GenKvarL3=GenKvaL3*(sqrt(10000-GenPF3*GenPF3))/100;
- }
- }
- else
- {
- GenKvarL1=0;GenKvarL2=0;GenKvarL3=0;
- }
- }
- /*--------------------------------------------------------------*/
- /*蓄電池電壓數(shù)據(jù)采集在通道3*/
- void ADC_BV(void)
- {
- unsigned int Data;
- unsigned Count;
-
- Data=0;
-
- for (Count=0;Count<10;Count++)
- {
- Data=Data+(ADC_Read(0x06)/2.687);
- }
-
- //硬件計算
- BatteryVoltage=(Data/10);
-
- /*偏移、增益修正公共函數(shù)*/
- BatteryVoltage=AD_OffsetGain(BatteryVoltage,BV_Gain,BV_Offset);
- }
- /*
- 上海耀通電子儀表公司:銷售負(fù)責(zé)人:姚先生 經(jīng)理
- 聯(lián)系電話:021-69625513
- 電阻溫度傳感器:306J
- 溫度 電阻 AD電壓
- 40 287 395
- 60 134
- 80 69
- 95 44.3
- 100 38.5
- 120 22.7
- */
- //AD采樣電壓值,溫度
- unsigned int code Tempreture_Div[13][2]=
- {
- {468,0},
- {458,10},
- //{453,13},
- //{450,16},
- {446,20},
- //{431,26},
- {422,28},
- //{405,33},
- {397,37},
- // {378,43},
- {365,46},
- // {348,52},
- {328,58},
- {300,67},
- {265,80},
- //{246,84},
- //{242,86},
- //{233,88},
- {227,90}, //阻值41.8
- //{222,95}, //阻值39 // 電壓值為:0.39v // (1.8/1024)* 222 = 0.39V // 0.39v/(1.8/1024)= 222
- {218,100}, //阻值36.9
- //{214,105},
- {210,110},
- {201,120}
- };
- /*--------------------------------------------------------------*/
- /*發(fā)動機溫度數(shù)據(jù)采集在通道1*/
- void ADC_ET(void)
- {
- unsigned int Data;
- unsigned Count;
- Data=0;
- for (Count=0;Count<20;Count++)
- {
- //Data=Data+(207-ADC_Read(0x02)*0.49);
- Data=Data+ADC_Read(0x02);
- }
- //硬件計算
- ETVoltage=(Data/20);
- if(ETVoltage>470) //判斷是否接有溫度傳感器
- {
- ETVoltage=0;
- return;
- }
- if((ETVoltage<=Tempreture_Div[0][0])&&(ETVoltage>=Tempreture_Div[1][0])) //0--10
- {
- Data=(Tempreture_Div[0][0]-ETVoltage)*10/(Tempreture_Div[0][0]-Tempreture_Div[1][0])+Tempreture_Div[0][1];
- }
- else if((ETVoltage<=Tempreture_Div[1][0])&&(ETVoltage>=Tempreture_Div[2][0])) //10--20
- {
- Data=(Tempreture_Div[1][0]-ETVoltage)*10/(Tempreture_Div[1][0]-Tempreture_Div[2][0])+Tempreture_Div[1][1];
- }
- else if((ETVoltage<=Tempreture_Div[2][0])&&(ETVoltage>=Tempreture_Div[3][0])) //20--28
- {
- Data=(Tempreture_Div[2][0]-ETVoltage)*8/(Tempreture_Div[2][0]-Tempreture_Div[3][0])+Tempreture_Div[2][1];
- }
- else if((ETVoltage<=Tempreture_Div[3][0])&&(ETVoltage>=Tempreture_Div[4][0])) //28--37
- {
- Data=(Tempreture_Div[3][0]-ETVoltage)*9/(Tempreture_Div[3][0]-Tempreture_Div[4][0])+Tempreture_Div[3][1];
- }
- else if((ETVoltage<=Tempreture_Div[4][0])&&(ETVoltage>=Tempreture_Div[5][0])) //37--46
- {
- Data=(Tempreture_Div[4][0]-ETVoltage)*9/(Tempreture_Div[4][0]-Tempreture_Div[5][0])+Tempreture_Div[4][1];
- }
- else if((ETVoltage<=Tempreture_Div[5][0])&&(ETVoltage>=Tempreture_Div[6][0])) //46--58
- {
- Data=(Tempreture_Div[5][0]-ETVoltage)*12/(Tempreture_Div[5][0]-Tempreture_Div[6][0])+Tempreture_Div[5][1];
- }
- else if((ETVoltage<=Tempreture_Div[6][0])&&(ETVoltage>=Tempreture_Div[7][0])) //58--67
- {
- Data=(Tempreture_Div[6][0]-ETVoltage)*9/(Tempreture_Div[6][0]-Tempreture_Div[7][0])+Tempreture_Div[6][1];
- }
- else if((ETVoltage<=Tempreture_Div[7][0])&&(ETVoltage>=Tempreture_Div[8][0])) //67--80
- {
- Data=(Tempreture_Div[7][0]-ETVoltage)*13/(Tempreture_Div[7][0]-Tempreture_Div[8][0])+Tempreture_Div[7][1];
- }
- else if((ETVoltage<=Tempreture_Div[8][0])&&(ETVoltage>=Tempreture_Div[9][0])) //80--90
- {
- Data=(Tempreture_Div[8][0]-ETVoltage)*10/(Tempreture_Div[8][0]-Tempreture_Div[9][0])+Tempreture_Div[8][1];
- }
- else if((ETVoltage<=Tempreture_Div[9][0])&&(ETVoltage>=Tempreture_Div[10][0])) //90--100
- {
- Data=(Tempreture_Div[9][0]-ETVoltage)*10/(Tempreture_Div[9][0]-Tempreture_Div[10][0])+Tempreture_Div[9][1];
- }
- else if((ETVoltage<=Tempreture_Div[10][0])&&(ETVoltage>=Tempreture_Div[11][0])) //100--110
- {
- Data=(Tempreture_Div[10][0]-ETVoltage)*10/(Tempreture_Div[10][0]-Tempreture_Div[11][0])+Tempreture_Div[10][1];
- }
- else if((ETVoltage<=Tempreture_Div[11][0])&&(ETVoltage>=Tempreture_Div[12][0])) //110--120
- {
- Data=(Tempreture_Div[11][0]-ETVoltage)*10/(Tempreture_Div[11][0]-Tempreture_Div[12][0])+Tempreture_Div[11][1];
- }
- else
- {
- ETVoltage=0;
- return;
- }
- ETVoltage=Data;
- ETVoltage=AD_OffsetGain(ETVoltage,ET_Gain,ET_Offset);
- }
- /*******************************************
- 機油壓力傳感器:303J
- 壓力(mpa) 電阻(歐姆)
- 0 20 258
- 0.1 36 16 336
- 0.2 50 14 400
- 0.3 65 15 465.63
- 0.4 80 15
- 0.5 95 15
- */
- /*發(fā)動機油壓數(shù)據(jù)采集在通道0*/
- void ADC_OP(void)
- {
- unsigned int Data;
- unsigned Count;
- Data=0;
- for (Count=0;Count<20;Count++)
- {
- Data=Data+(ADC_Read(0x00)*0.164-46);
- if ((ADC_Read(0x00)*0.164-46)<=00) Data=0;
- }
- //硬件計算
- OPVoltage=(Data/20);
- /*偏移、增益修正公共函數(shù)*/
- OPVoltage=AD_OffsetGain(OPVoltage,OP_Gain,OP_Offset);
- if(OPVoltage<5||OPVoltage>100)
- OPVoltage=0;
- }
- /*油溫檢測---與水溫相同*/
- void ADC_FL(void)
- {
- unsigned int Data;
- unsigned Count;
- Data=0;
-
- for (Count=0;Count<20;Count++)
- {
- Data=Data+ADC_Read(0x04);
- }
- FLVoltage=(Data/20);
- if(FLVoltage>470) //判斷是否接有溫度傳感器
- {
- FLVoltage=0;
- return;
- }
- if((FLVoltage<=Tempreture_Div[0][0])&&(FLVoltage>=Tempreture_Div[1][0])) //0--10
- {
- Data=(Tempreture_Div[0][0]-FLVoltage)*10/(Tempreture_Div[0][0]-Tempreture_Div[1][0])+Tempreture_Div[0][1];
- }
- else if((FLVoltage<=Tempreture_Div[1][0])&&(FLVoltage>=Tempreture_Div[2][0])) //10--20
- {
- Data=(Tempreture_Div[1][0]-FLVoltage)*10/(Tempreture_Div[1][0]-Tempreture_Div[2][0])+Tempreture_Div[1][1];
- }
- else if((FLVoltage<=Tempreture_Div[2][0])&&(FLVoltage>=Tempreture_Div[3][0])) //20--28
- {
- Data=(Tempreture_Div[2][0]-FLVoltage)*8/(Tempreture_Div[2][0]-Tempreture_Div[3][0])+Tempreture_Div[2][1];
- }
- else if((FLVoltage<=Tempreture_Div[3][0])&&(FLVoltage>=Tempreture_Div[4][0])) //28--37
- {
- Data=(Tempreture_Div[3][0]-FLVoltage)*9/(Tempreture_Div[3][0]-Tempreture_Div[4][0])+Tempreture_Div[3][1];
- }
- else if((FLVoltage<=Tempreture_Div[4][0])&&(FLVoltage>=Tempreture_Div[5][0])) //37--46
- {
- Data=(Tempreture_Div[4][0]-FLVoltage)*9/(Tempreture_Div[4][0]-Tempreture_Div[5][0])+Tempreture_Div[4][1];
- }
- else if((FLVoltage<=Tempreture_Div[5][0])&&(FLVoltage>=Tempreture_Div[6][0])) //46--58
- {
- Data=(Tempreture_Div[5][0]-FLVoltage)*12/(Tempreture_Div[5][0]-Tempreture_Div[6][0])+Tempreture_Div[5][1];
- }
- else if((FLVoltage<=Tempreture_Div[6][0])&&(FLVoltage>=Tempreture_Div[7][0])) //58--67
- {
- Data=(Tempreture_Div[6][0]-FLVoltage)*9/(Tempreture_Div[6][0]-Tempreture_Div[7][0])+Tempreture_Div[6][1];
- }
- else if((FLVoltage<=Tempreture_Div[7][0])&&(FLVoltage>=Tempreture_Div[8][0])) //67--80
- {
- Data=(Tempreture_Div[7][0]-FLVoltage)*13/(Tempreture_Div[7][0]-Tempreture_Div[8][0])+Tempreture_Div[7][1];
- }
- else if((FLVoltage<=Tempreture_Div[8][0])&&(FLVoltage>=Tempreture_Div[9][0])) //80--90
- {
- Data=(Tempreture_Div[8][0]-FLVoltage)*10/(Tempreture_Div[8][0]-Tempreture_Div[9][0])+Tempreture_Div[8][1];
- }
- else if((FLVoltage<=Tempreture_Div[9][0])&&(FLVoltage>=Tempreture_Div[10][0])) //90--100
- {
- Data=(Tempreture_Div[9][0]-FLVoltage)*10/(Tempreture_Div[9][0]-Tempreture_Div[10][0])+Tempreture_Div[9][1];
- }
- else if((FLVoltage<=Tempreture_Div[10][0])&&(FLVoltage>=Tempreture_Div[11][0])) //100--110
- {
- Data=(Tempreture_Div[10][0]-FLVoltage)*10/(Tempreture_Div[10][0]-Tempreture_Div[11][0])+Tempreture_Div[10][1];
- }
- else if((FLVoltage<=Tempreture_Div[11][0])&&(FLVoltage>=Tempreture_Div[12][0])) //110--120
- {
- Data=(Tempreture_Div[11][0]-FLVoltage)*10/(Tempreture_Div[11][0]-Tempreture_Div[12][0])+Tempreture_Div[11][1];
- }
- else
- {
- FLVoltage=0;
- return;
- }
- FLVoltage=Data;
-
- //偏移、增益修正公共函數(shù)
- FLVoltage=AD_OffsetGain(FLVoltage,FL_Gain,FL_Offset);
- }
- //---------------捕獲中斷
- /*
- void Capture_Fuc() interrupt 6
- {
- if(Capture_Couter==0)
- {
- Capture_1H=CCAP0H;
- Capture_1L=CCAP0L;
- Capture_Couter=Capture_Couter+1;
- }
- else
- {
- Capture_2H=CCAP0H;
- Capture_2L=CCAP0L;
- CCON=0X00;
- Capture_Couter++;
- EA=0;
- }
- CCF0=0;//清除中斷標(biāo)志
- }
- //mpu頻率檢測函數(shù)
- unsigned long Speed_Capture()
- {
- unsigned char Count0;
- unsigned char sample_counter;
- char cha_zhi;
- /////////////////////////////////////////////////////////////////////////
- CMOD=0;
- CCON=0; //0X40啟動計數(shù)器 //0X00關(guān)閉計數(shù)器
- CCAPM0=0X21;//上升沿下降沿捕獲,開捕獲中斷
- IE_COPY=IE; //保存IE
- for(sample_counter=0;sample_counter<10;sample_counter++)
- {
- /////////////////////////////////////////////////////////////////////////
- CH=0;
- CL=0;
- T=5000;
- Capture_Couter=0;
- IE=0XC0; //只打開捕獲中斷
- CCON=0X40;//啟動計數(shù)器
- ///////////////////////////////////等待捕獲中斷///////////////////////////
- while(T--)
- {
- if(Capture_Couter==2)
- {
- EA=0;
- Capture_Result=(Capture_2H-Capture_1H)*256+(Capture_2L-Capture_1L);
- Capture_Result=1843200/Capture_Result;
- Speed_Filter[sample_counter]=Capture_Result;
- CCON=0;
- break;
- }
- if(T==1)
- {
- IE=IE_COPY; //保存IE
- return 0;
- }
- }
- }
- Accelaration=0;
- Max=Min=Speed_Filter[0];
- for(Count0=0;Count0<10;Count0++)
- {
- if(Max>Speed_Filter[Count0])
- Max=Speed_Filter[Count0];
- else if(Speed_Filter[Count0]<Min)
- Min=Speed_Filter[Count0];
- Accelaration+=Speed_Filter[Count0];
- }
- Capture_Result=(Accelaration-Max-Min)>>3;
- cha_zhi=Capture_Result-Number_Fre;
- cha_zhi=fabs(cha_zhi);
- if(cha_zhi>20)
- {
- Com_Counter--;
- if(Com_Counter==0)
- {
- Com_Counter=6;
- Number_Fre=Capture_Result;
- }
- Capture_Result=Number_Fre;
- }
- else
- {
- Com_Counter=6;
- }
- IE=IE_COPY; //保存IE
- return Capture_Result;
- }
- //=====================================================================
- /*發(fā)動機轉(zhuǎn)速數(shù)據(jù)采集*/
- void ADC_GenSpeed(void)
- {
- unsigned long frequency=0;
- // dengzhen 20100621
- if(XWORD[0x00AD]<2) //飛輪齒數(shù)為0
- {
- if(GenFrequency==0)
- GenSpeed=0; //飛輪齒數(shù)為零且發(fā)電頻率為零將速度設(shè)置為零
- else
- GenSpeed=GenFrequency*3; //飛輪齒數(shù)為零且發(fā)電頻率不為零使用頻率換算轉(zhuǎn)速
- }
- if(XWORD[0x00AD]>2) //飛輪齒數(shù)不為0
- {
- //frequency=Speed_Capture();
- if(frequency<31) //mpu頻率低于31Hz 轉(zhuǎn)速強制為0
- {
- GenSpeed=0;
- }
- else
- {
- GenSpeed=frequency*60/XWORD[0x00AD];
- if(GenSpeed>4000) GenSpeed=0;
- }
- }
- }
- ////////////////////////////////////////////////數(shù)據(jù)采集/////////////////////////////////////////////////
- // ============= AD數(shù)據(jù)軟件濾波 =====================
- void filter_ET(unsigned int Temp1)
- {
- unsigned int new_value;
-
- new_value = Temp1;
- if ( ( new_value - value_ET > 3 ) || ( value_ET - new_value > 3 ))
- {
- ETVoltage = value_ET;
- }
- else
- {
- ETVoltage = new_value;
- }
- }
- void filter_OP(unsigned int Temp1)
- {
- unsigned int new_value;
-
- new_value = Temp1;
- if ( ( new_value - value_OP > 3 ) || ( value_OP - new_value > 3 ))
- {
- OPVoltage = value_OP;
- }
- else
- {
- OPVoltage = new_value;
- }
- }
- void filter_FL(unsigned int Temp1)
- {
- unsigned int new_value;
-
- new_value = Temp1;
- if ( ( new_value - value_FL > 3 ) || ( value_FL - new_value > 3 ))
- {
- FLVoltage = value_FL;
- }
- else
- {
- FLVoltage = new_value;
- }
- }
- //------------數(shù)據(jù)采集--------------------//
- void ADC_Collection(void)
- {
- /*各種數(shù)據(jù)采集*/
- ADE_GenVoltage(); //發(fā)電機組各相的相電壓、線電壓
- ADE_GenCurrent(); //發(fā)電機組各相電流
- if (Dianji_flag==1) //啟動成功后采集
- {
- ADE_GenPF(); //功率因數(shù)
- ADE_GenKVA(); //發(fā)電機組各相的視在功率
- ADE_GenKW(); //發(fā)電機組各相的有功功率
- ADE_GenKVAR(); //發(fā)電機組各相的無功功率
- }
- ad_x++;
- if(ad_x==3)
- {
- ADC_BV(); //蓄電池組的電壓
- ADC_ET(); //發(fā)動機溫度
- value_ET=ETVoltage;
- ADC_OP(); //發(fā)動機油壓
- value_OP=OPVoltage;
- ADC_FL(); //燃油容量
- value_FL=FLVoltage;
- }
- if(ad_x==6)
- {
- ADC_ET();
- filter_ET(ETVoltage);
- ADC_OP();
- filter_OP(OPVoltage);
-
- ADC_FL();
- filter_FL(FLVoltage);
- ad_x=0;
- }
-
- ADE_GenFrequency(); //發(fā)電機組的頻率(使用ADE7758)的數(shù)據(jù)
- ADC_GenSpeed(); //if((LC_Model_BUF&0x04)==0x04) //發(fā)電機組的轉(zhuǎn)速
- }
- //-----------end-------------//
復(fù)制代碼
|
評分
-
查看全部評分
|