说起ADE7758的电力参数采集芯片,应用很多,早几年用他做了一个产品,
看了现在好像还有人在用,
现在把自己用的源代码发上来,希望对大家有帮助,
- #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; //进入中断之后保存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模拟量数据修正设置数据定义,位于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//功率因数偏移
- #define PF_Gain 0x00CF//功率因数增益
- /*ADC 采集的模拟量数据 全局变量*/
- 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 采集的模拟量数据 全局变量*/
- 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;
- /*现场操作模式缓冲*/
- extern unsigned char bdata LC_Model_BUF;
- /*--------------------------------------------------------------*/
- /*偏移、增益修正公共函数*/
- unsigned int AD_OffsetGain(unsigned int DataInput,unsigned int Gain,unsigned int Offset)
- {
- unsigned long Data;
- /*偏移修正*/
- Data=XWORD[Offset];//读取偏移设置数据
- /*偏移量计算*/
- if (Data>=100)
- {
- //BV_Offset>=100,正偏移,修正单位1/LSB(0.1V/LSB)。
- DataInput=(DataInput+(Data-100)); //屏蔽正负标志,计算真实的正偏移量
- }
- else
- {
- //BV_Offset<100,负偏移,修正单位1/LSB(0.1V/LSB)。
-
- //判断是否大于要修正的负偏移量
- if (DataInput>(100-Data))
- {
- DataInput=(DataInput-(100-Data)); //小于100,计算真实的负偏移量
- }
- else
- {
- //小于要修正的偏移量
- DataInput=0;
- }
- }
- /*增益修正*/
- Data=XWORD[Gain];//读取增益设置数据
- /*增益计算*/
- //Gain,正负增益,修正单位0.001/LSB。
- Data=(Data*DataInput)/1000;
-
- return Data;
- }
- /*--------------------------------------------------------------*/
- /*软件延时函数*/
- void AD_Delay(unsigned int Delay)
- {
- unsigned int i; //时间倍数。
- for(; Delay>0; Delay--)
- {
- for(i=0; i<100; i++)
- {
- } //时间倍数循环。
- }
- }
- /*--------------------------------------------------------------*/
- /*Timer2 中断服务程序*/
- void Timer2_Sev(void)
- {
- //初始化T2
- TF2=0;
-
- RCAP2L = 0x00;
- RCAP2H = 0x00;
- TL2 = 0x00;
- TH2 = 0x00;
-
- TR2 = 0; //关闭T2
- ET2 =0;
- EX0=0;
-
- GenFrequency=0;
-
- INT0_BIT=1;
- Freq_BIT=0;
- }
- /*--------------------------------------------------------------*/
- /*INT0 中断服务程序*/
- 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;
-
- }
- }
- /*--------------------------------------------------------------*/
- /*发电机电压数据采集*/
- 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过零交点标志。
- //循环检测三相
- Power_Measure_Write(ZXTOUT,0x0FFF); //将过零溢出时间。
- Power_Measure_Read(RSTATUS); //复位状态标志寄存器。
- Mask=0;
- i=0;
- while (Mask==0)//等待结束标志位
- {
- //判断A相是否有过零标志位***************************************************
- if ((Power_Measure_Read(STATUS)&0x0200)==0x0200)
- {
- //A相有过零标志位
- GenCurrentC1=Power_Measure_Read(AIRMS)/10;//读取ADE7758的电流数据
- GenVoltageL1=Power_Measure_Read(AVRMS)/4700; //读取ADE7758的电压数据
- Mask=1; //标志结束
- }
- //A相检测采集过程中是否有线电压过零交变故障标志位
- if ((Power_Measure_Read(STATUS)&0x0040)==0x0040)
- {
- //A相采集过程中有线电压过零交变故障标志
- //dengzhen
- GenVoltageL1=0; //不读取ADE7758的数据
- Mask=1; //标志结束
- }
- if (i==0x30)
- {
- GenVoltageL3=0; //不读取ADE7758的数据
- Mask=1; //标志结束
- }
- else
- {
- i++;
- }
- }
- if (Dianji_flag==1)//启动成功后采集后两相发电电压
- {
- Power_Measure_Write(ZXTOUT,0x0FFF); //将过零溢出时间。
- Power_Measure_Read(RSTATUS); //复位状态标志寄存器。
- Mask=0;
- i=0;
- while (Mask==0)//等待结束标志位
- {
- //判断B相是否有过零标志位***************************************************
- if ((Power_Measure_Read(STATUS)&0x0400)==0x0400)
- {
- //B相有过零标志位
- GenCurrentC2=Power_Measure_Read(BIRMS)/10;//读取ADE7758的电流数据
- GenVoltageL2=Power_Measure_Read(BVRMS)/4700; //读取ADE7758的电压数据
- Mask=1; //标志结束
- }
- //B相检测采集过程中是否有线电压过零交变故障标志位
- if((Power_Measure_Read(STATUS)&0x0080)==0x0080)
- {
- //B相采集过程中有线电压过零交变故障标志
- //dengzhen
- GenVoltageL2=0; //不读取ADE7758的数据
- Mask=1; //标志结束
- }
-
- if (i==0x30)
- {
- GenVoltageL3=0; //不读取ADE7758的数据
- Mask=1; //标志结束
- }
- else
- {
- i++;
- }
- }
- Power_Measure_Write(ZXTOUT,0x0FFF); //将过零溢出时间。
- Power_Measure_Read(RSTATUS); //复位状态标志寄存器。
- Mask=0;
- i=0;
- while (Mask==0)//等待结束标志位
- {
- //判断C相是否有过零标志位***************************************************
- if ((Power_Measure_Read(STATUS)&0x0800)==0x0800)
- {
- //C相有过零标志位
- GenCurrentC3=Power_Measure_Read(CIRMS)/10; //读取ADE7758的电流数据
- GenVoltageL3=Power_Measure_Read(CVRMS)/4700; //读取ADE7758的电压数据
- Mask=1; //标志结束
- }
- //C相检测采集过程中是否有线电压过零交变故障标志位
- if ((Power_Measure_Read(STATUS)&0x0100)==0x0100)
- {
- //C相采集过程中有线电压过零交变故障标志
- //dengzhen
- GenVoltageL3=0; //不读取ADE7758的数据
- Mask=1; //标志结束
- }
-
- if (i==0x30)
- {
- GenVoltageL3=0; //不读取ADE7758的数据
- Mask=1; //标志结束
- }
- 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)));
-
- }
- }
- /*--------------------------------------------------------------*/
- /*发电机电压数据采集*/
- /*
- 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);
- }
- */
- /*--------------------------------------------------------------*/
- /*发电机电流数据采集*/
- 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;
- }
- }
- /*--------------------------------------------------------------*/
- /*发电机频率数据采集*/
- void ADE_GenFrequency(void)
- {
- ////////////////////////////////////////////////guoyajun-08.7.24/////////////////////////////////////////
- if(XWORD[0x00F7]==0) //==0 >220V ==1>110V //电网选择
- {
- ////燃油阀门
- if((GenVoltageL1<15)||((DO_BUF&0x02)==0x00))
- GenFrequency=0; //将频率数据强制为0;
- else if(GenVoltageL1<180) //频率在40赫兹内使用电压计算频率
- 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的频率数
- }
- }
- else //110v //电网选择
- {
- if((GenVoltageL1<15)||((DO_BUF&0x02)==0x00))
- GenFrequency=0; //将频率数据强制为0;
- else if(GenVoltageL1<74) //频率在40赫兹内使用电压计算频率
- 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的频率数
- }
- }
- }
- /*--------------------------------------------------------------*/
- /*发电机视在功率数据采集*/
- 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;
- }
- /*--------------------------------------------------------------*/
- /*发电机功率因数数据采集*/
- 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); //复位状态标志寄存器。
- Mask=0;
- i=0;
- while (Mask==0)//等待结束标志位
- {
- //判断是否有计量完毕标志位***************************************************
- 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; //标志结束
- }
- if (i==0x40)
- {
- GenPF1=100; //不读取ADE7758的数据
- GenPF2=100; //不读取ADE7758的数据
- GenPF3=100; //不读取ADE7758的数据
- Mask=1; //标志结束
- }
- 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;
- }
- /*--------------------------------------------------------------*/
- /*发电机有功功率数据采集*/
- 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);
- */
- }
- /*--------------------------------------------------------------*/
- /*发电机无功功率数据采集*/
- 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;
- }
- }
- /*--------------------------------------------------------------*/
- /*蓄电池电压数据采集在通道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);
-
- /*偏移、增益修正公共函数*/
- BatteryVoltage=AD_OffsetGain(BatteryVoltage,BV_Gain,BV_Offset);
- }
- /*
- 上海耀通电子仪表公司:销售负责人:姚先生 经理
- 联系电话: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}
- };
- /*--------------------------------------------------------------*/
- /*发动机温度数据采集在通道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
- */
- /*发动机油压数据采集在通道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);
- /*偏移、增益修正公共函数*/
- 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;
-
- //偏移、增益修正公共函数
- 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;//清除中断标志
- }
- //mpu频率检测函数
- unsigned long Speed_Capture()
- {
- unsigned char Count0;
- unsigned char sample_counter;
- char cha_zhi;
- /////////////////////////////////////////////////////////////////////////
- CMOD=0;
- CCON=0; //0X40启动计数器 //0X00关闭计数器
- 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;//启动计数器
- ///////////////////////////////////等待捕获中断///////////////////////////
- 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;
- }
- //=====================================================================
- /*发动机转速数据采集*/
- void ADC_GenSpeed(void)
- {
- unsigned long frequency=0;
- // dengzhen 20100621
- if(XWORD[0x00AD]<2) //飞轮齿数为0
- {
- if(GenFrequency==0)
- GenSpeed=0; //飞轮齿数为零且发电频率为零将速度设置为零
- else
- GenSpeed=GenFrequency*3; //飞轮齿数为零且发电频率不为零使用频率换算转速
- }
- if(XWORD[0x00AD]>2) //飞轮齿数不为0
- {
- //frequency=Speed_Capture();
- if(frequency<31) //mpu频率低于31Hz 转速强制为0
- {
- GenSpeed=0;
- }
- else
- {
- GenSpeed=frequency*60/XWORD[0x00AD];
- if(GenSpeed>4000) GenSpeed=0;
- }
- }
- }
- ////////////////////////////////////////////////数据采集/////////////////////////////////////////////////
- // ============= AD数据软件滤波 =====================
- 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;
- }
- }
- //------------数据采集--------------------//
- void ADC_Collection(void)
- {
- /*各种数据采集*/
- ADE_GenVoltage(); //发电机组各相的相电压、线电压
- ADE_GenCurrent(); //发电机组各相电流
- if (Dianji_flag==1) //启动成功后采集
- {
- ADE_GenPF(); //功率因数
- ADE_GenKVA(); //发电机组各相的视在功率
- ADE_GenKW(); //发电机组各相的有功功率
- ADE_GenKVAR(); //发电机组各相的无功功率
- }
- ad_x++;
- if(ad_x==3)
- {
- ADC_BV(); //蓄电池组的电压
- ADC_ET(); //发动机温度
- value_ET=ETVoltage;
- ADC_OP(); //发动机油压
- 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(); //发电机组的频率(使用ADE7758)的数据
- ADC_GenSpeed(); //if((LC_Model_BUF&0x04)==0x04) //发电机组的转速
- }
- //-----------end-------------//
复制代码
|