📄 ad_max197.h
字号:
//#include<absacc.h>
#include<math.h>
#include"lcd_12864.h"
#include"da_tlv5614.h"
//说明:如不做成函数形式,只获取AD值,不做处理,速度可达到100K。
#define AD_SAMPLE_HIGH XBYTE[0xfa00]
#define AD_SAMPLE_LOW XBYTE[0xf200]
#define SAMPLE_TIME 400
#define INI_HIGH (65536-SAMPLE_TIME)/256
#define INI_LOW (65536-SAMPLE_TIME)%256
sbit AD_Convert=P1^7;
bit Sample_flag=0;
void Timer_0() interrupt 1
{
// TR0=0;
TH0=INI_HIGH;
TL0=INI_LOW;
Sample_flag=1;
// TR0=1;
}
/****************************************
函数名称:void AD_MAX197(uchar channel,uchar sample_range)
函数功能:采集数据并将转换值的绝对值返回,数据的正负用FLAG标识。
函数说明:此函数为双极性采样,即可采集正负电压,工作方式只可选择 1:-5~5V, 3:-10~10V。
创建日期:07.08.03晚21:00
****************************************/
uint AD_MAX197_Bipolar(uchar channel,uchar sample_range)
//channel为通道选择控制字,sample_range为采样范围控制字(0:0~5V, 1:-5~+5V, 2:0~10V, 3:-10~+10V)
{ bit flag;
uchar AD_CMD, AD_Vph_high=0, AD_Vph_low=0, AD_Vpl_high=0, AD_Vpl_low=0;
uchar high_4,low_8;
uint convert_number,count,rms;
ulong AD_High_rms=0, AD_Low_rms=0, sum_rms,vpp;
Sample_flag=0;
AD_CMD=(sample_range*8+channel)|0X40;
EA=1;
ET0=1;
TMOD=0x01;
TH0=INI_HIGH;
TL0=INI_LOW;
for(count=0;count<1000;count++)
{
TR0=1;
XBYTE[0xfa00]=AD_CMD; //置控制字
while(AD_Convert==1);
high_4=AD_SAMPLE_HIGH; //接收高四位, P2_3=1; P22,P21,P20控制片选选通
low_8=AD_SAMPLE_LOW; //接收低八位, P2_3=0; P22,P21,P20控制片选选通
if( (high_4&0xf0)==0xf0 )
{
high_4=0x0f-(high_4&0x0f);
low_8=0x0100-low_8; //处理采集负电压时得到的补码
if( (high_4 > AD_Vpl_high) || ( (high_4==AD_Vpl_high)&&(low_8 > AD_Vpl_low) ) )
{
AD_Vpl_high = high_4;
AD_Vpl_low = low_8;
} //峰峰值更新
}
else
{
if( (high_4 > AD_Vph_high) || ( (high_4==AD_Vph_high)&&(low_8 > AD_Vph_low) ) )
{
AD_Vph_high = high_4;
AD_Vph_low = low_8;
}
}
AD_High_rms = AD_High_rms + high_4*high_4;
AD_Low_rms = AD_Low_rms + low_8*low_8 + (long)512*high_4*low_8; //有效值计算
// TLV_5614(0,2*high_4*256 + 2*low_8);
//此处512不变成(LONG)型会对均值的计算产生影响??????
// TR0=0;
// Dispnumber(TH0*256+TL0,5,13,1);
// while(1);
while(Sample_flag==0);
}
TR0=0;
vpp=AD_Vph_high * 256 + AD_Vph_low + AD_Vpl_high * 256 + AD_Vpl_low;
//峰峰值处理
AD_High_rms=AD_High_rms/count;
AD_Low_rms =AD_Low_rms /count;
sum_rms=(ulong)(AD_High_rms*65536+AD_Low_rms);
rms=sqrt(sum_rms); //有效值处理
if( (AD_CMD&0x18)==0x08 ) { rms=rms*2; vpp=vpp*2; } //如果选择-5~~+5v量程,应在计算上乘以2
if( (AD_CMD&0x18)==0x18 ) { rms=rms*4; vpp=vpp*4; } //如果选择-10~~+10v量程,应在计算上乘以4
vpp=(uint)(vpp*1.2207);
rms=(uint)(rms*1.2207);
Dispnumber_float(vpp,4,3,13,2);
Dispnumber_float(rms,4,3,13,3);
return convert_number;
}
/****************************************
函数名称:void AD_MAX197_Bipolar(uchar channel,uchar sample_range)
函数功能:计算采样的均值,有效值,峰峰值。
函数说明:此函数为双极性采样,即可采集正负电压,工作方式只可选择 1:-5~5V, 3:-10~10V
创建日期:07。08。05日17:00
****************************************/
/*
void AD_MAX197_Bipolar(uchar channel,uchar sample_range)
{
uchar AD_CMD, AD_Vph_high=0, AD_Vph_low=0, AD_Vpl_high=0, AD_Vpl_low=0;
uchar high_4,low_8;
ulong AD_High_rms=0, AD_Low_rms=0, sum_rms;
long AD_High_ave=0, AD_Low_ave=0, sum_ave;
//每一次进入函数计算注意要将上次计算值清零
uint vpp,count=0, ave, rms;
AD_CMD=(sample_range*8+channel)|0X40;
while(1)
{
XBYTE[0xfa00]=AD_CMD; //置控制字
while(AD_Convert==1);
// AD_Convert=0;
high_4=AD_SAMPLE_HIGH; //接收高四位, P2_3=1; P22,P21,P20控制片选选通
low_8=AD_SAMPLE_LOW; //接收低八位, P2_3=0; P22,P21,P20控制片选选通
if( (high_4&0xf0)==0xf0 )
{
high_4=0x0f-(high_4&0x0f);
low_8=0xff-low_8; //处理采集负电压时得到的补码
AD_High_ave=AD_High_ave - high_4;
AD_Low_ave =AD_Low_ave - low_8;
if( (high_4 > AD_Vpl_high) || ( (high_4==AD_Vpl_high)&&(low_8 > AD_Vpl_low) ) )
{
AD_Vpl_high = high_4;
AD_Vpl_low = low_8;
} //峰峰值更新
}
else
{
AD_High_ave=AD_High_ave + high_4;
AD_Low_ave =AD_Low_ave + low_8;
if( (high_4 > AD_Vph_high) || ( (high_4==AD_Vph_high)&&(low_8 > AD_Vph_low) ) )
{
AD_Vph_high = high_4;
AD_Vph_low = low_8;
}
}
AD_High_rms = AD_High_rms + high_4*high_4;
AD_Low_rms = AD_Low_rms + low_8*low_8 + (long)512*high_4*low_8; //有效值计算
//此处512不变成(LONG)型会对均值的计算产生影响??????
count++;
if(count==2000) break; //采样值不宜超过三千,以防止计算有效值时数据溢出。
}
vpp=AD_Vph_high * 256 + AD_Vph_low + AD_Vpl_high * 256 + AD_Vpl_low;
//峰峰值处理
AD_High_rms=AD_High_rms/count;
AD_Low_rms =AD_Low_rms /count;
sum_rms=(ulong)(AD_High_rms*65536+AD_Low_rms);
rms=sqrt(sum_rms); //有效值处理
sum_ave=AD_High_ave*256+AD_Low_ave;
if(sum_ave<0){ sum_ave=(-1)*sum_ave; Disponechar(1,2,'-');}
else Disponechar(1,2,'+');
ave=sum_ave/count; //均值处理
if( (AD_CMD&0x18)==0x08 ) { ave=ave*2; rms=rms*2; vpp=vpp*2; } //如果选择-5~~+5v量程,应在计算上乘以2
if( (AD_CMD&0x18)==0x18 ) { ave=ave*4; rms=rms*4; vpp=vpp*4; } //如果选择-10~~+10v量程,应在计算上乘以4
vpp=(uint)(vpp*1.2207);
ave=(uint)(ave*1.2207);
rms=(uint)(rms*1.2207);
LcdPrintf(2,1,"vpp:");
LcdPrintf(2,2,"ave:");
LcdPrintf(2,3,"rms:");
Dispnumber_float(vpp,4,3,10,1);
Dispnumber_float(ave,4,3,10,2);
Dispnumber_float(rms,4,3,10,3); //显示
}
*/
/****************************************
函数名称:void AD_MAX197_Polar(uchar channel,uchar sample_range)
函数功能:计算采样的均值,有效值,峰峰值。
函数说明:此函数为单极性采样,即只采集正电压时的算法,工作方式只可选择 0:0~5V, 2:0~10V
创建日期:07。08。04日21:00
****************************************/
/*
void AD_MAX197_Polar(uchar channel,uchar sample_range)
{
uchar AD_CMD, AD_Vph_high=0, AD_Vph_low=0, AD_Vpl_high=255, AD_Vpl_low=255;
uchar high_4,low_8;
ulong AD_High_ave=0, AD_Low_ave=0, AD_High_rms=0, AD_Low_rms=0, sum_ave, sum_rms;
//每一次进入函数计算注意要将上次计算值清零
uint vpp,count=0, ave, rms;
AD_CMD=(sample_range*8+channel)|0X40;
while(1)
{
XBYTE[0xfa00]=AD_CMD; //置控制字
while(AD_Convert==0);
AD_Convert=0;
high_4=XBYTE[0xfa00]; //接收高四位, P2_3=1; P22,P21,P20控制片选选通
low_8=XBYTE[0xf200]; //接收低八位, P2_3=0; P22,P21,P20控制片选选通
AD_High_ave = AD_High_ave + high_4;
AD_Low_ave = AD_Low_ave + low_8; //均值累加计算
if( (high_4 > AD_Vph_high) || ( (high_4==AD_Vph_high)&&(low_8 > AD_Vph_low) ) )
{
AD_Vph_high = high_4;
AD_Vph_low = low_8;
}
if( (high_4 < AD_Vpl_high) || ( (high_4==AD_Vpl_high)&&(low_8 < AD_Vpl_low) ) )
{
AD_Vpl_high = high_4;
AD_Vpl_low = low_8;
} //峰峰值更新
AD_High_rms = AD_High_rms + high_4*high_4;
AD_Low_rms = AD_Low_rms + low_8*low_8 + 512*high_4*low_8; //有效值计算
count++;
if(count==2000) break; //采样值不宜超过两千,以防止计算有效值时数据溢出。
}
vpp=AD_Vph_high * 256 + AD_Vph_low - AD_Vpl_high * 256 - AD_Vpl_low;
//峰峰值处理
AD_High_rms=AD_High_rms/count;
AD_Low_rms =AD_Low_rms /count;
sum_rms=(ulong)(AD_High_rms*65536+AD_Low_rms);
rms=sqrt(sum_rms); //有效值处理
sum_ave=(ulong)(AD_High_ave*256+AD_Low_ave);
ave=sum_ave/count; //均值处理
if(AD_CMD&0x18) { ave=ave*2; rms=rms*2; vpp=vpp*2; } //如果选择10V量程,应在计算上乘以2
vpp=(uint)(vpp*1.2207);
ave=(uint)(ave*1.2207);
rms=(uint)(rms*1.2207);
LcdPrintf(2,1,"vpp:");
LcdPrintf(2,2,"ave:");
LcdPrintf(2,3,"rms:");
Dispnumber_float(vpp,4,3,10,1);
Dispnumber_float(ave,4,3,10,2);
Dispnumber_float(rms,4,3,10,3); //显示
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -