⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ad_phase.h

📁 51单片机控ADC(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 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 + -