📄 ad_phase.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 VREF 4096
//uchar AD_Convert=0;
sbit AD_Convert=P1^7;
uchar AD_CMD=0x48;
//void Dispnumber(uint number,uchar j,uchar x,uchar y);
//void Disponechar(unsigned char x,unsigned char y, char character);
//void Dispnumber_long(ulong number,uchar j,uchar x,uchar y);
/****************************************
函数名称:void AD_MAX197(uchar channel,uchar sample_range)
函数功能:采集数据并将转换值的绝对值返回,数据的正负用FLAG标识。
函数说明:此函数为双极性采样,即可采集正负电压,工作方式只可选择 1:-5~5V, 3:-10~10V。
创建日期:07.08.03晚21:00
****************************************/
uint AD_Phase()
//channel为通道选择控制字,sample_range为采样范围控制字(0:0~5V, 1:-5~+5V, 2:0~10V, 3:-10~+10V)
{
uchar high_4;
TMOD=0x01;
TCON=0x00;
TH0=0;
TL0=0;
while(1)
{
XBYTE[0xfa00]=AD_CMD; //置控制字
while(AD_Convert==1);
high_4=AD_SAMPLE_HIGH; //接收高四位, P2_3=1; P22,P21,P20控制片选选通
if( (high_4&0xf0)==0xf0 )
{
XBYTE[0xfa00]=AD_CMD; //置控制字
while(AD_Convert==1);
high_4=AD_SAMPLE_HIGH; //接收高四位, P2_3=1; P22,P21,P20控制片选选通
if( (high_4&0xf0)!=0xf0 ) {TR0=1; break;}
}
}
while(1)
{
XBYTE[0xfa00]=AD_CMD+1; //置控制字
while(AD_Convert==1);
high_4=AD_SAMPLE_HIGH; //接收高四位, P2_3=1; P22,P21,P20控制片选选通
if( (high_4&0xf0)!=0xf0 ) {TR0=0; break;}
}
return (TH0*256+TL0);
}
/****************************************
函数名称: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); //显示
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -