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

📄 ad.#2

📁 ad准确采集
💻 #2
字号:
#include <main.H>
#include <intrins.h>


//#include <C8051F020.H>
//*******************************************************************//
// NOTE:The max value of frequency is                           *//
// gain:1,2,4,8,16,0.5;	 *//
//*******************************************************************//
void SampFunc(long SYSCLK, int totalChannel , long sampleRate , float gain ,   volatile unsigned int  *samples , long numSample)
{
	//unsigned int *samples2;
	static int channel=0;
	volatile int i=0 ;
	for(i=0;i<numSample;i++)
	   samples[i]=0;
//	int j;
    SFRPAGE=0x0;
	AD0INT = 0; // 清除ADC0转换结束标志
    EIE2 &= ~0x02; // 禁止ADC0中断
	Timer3_Init(SYSCLK/sampleRate);         //初始化定时器3以ADC0采样速率溢出
	ADC0_Init(gain);                            //初始化ADC
	SFRPAGE=0x0;
	AD0EN=1;                                //允许ADC
	//EA=1;                                   //允许全局中断

	SFRPAGE=0x01;
	TMR3CN |= 0x04; // 启动定时器3
    //for(i=0 ; i<numSample ; i++)
	//{
		//SFRPAGE=0x01;
		//TMR3CN |= 0x04; // 启动定时器3
        
		//SFRPAGE=0x00;
		//while (AD0INT == 0);                //ADC完成了一次数据转换

		//AD0INT = 0;                         // 清除ADC0转换结束标志
	    
		//samples[i] = ADC0H;
		//samples[i]=(samples[i]<<8)|ADC0L; // 读和存储ADC0值
	//	channel++;
	//	if(channel==totalChannel)
	//	{
	//		channel=0;
	//	}
	//	AMX0SL = channel;
	//}
//		EIE2 &= ~0x02; // 禁止ADC0中断
//		ADC0_DONE = 1; // 设置DONE标志


// 上传采样值到UART0//////?????????
//	LED = 0;                               // 上传其间关LED 灭///////?????????
	//AD0EN = 0;                             // AD采集完NUM_SAMPLES个数据后,关闭ADC0
	//EA=0; 
	//////如何停止定时器3的工作????????
	i=0;
	SFRPAGE=0x0;
	while(1)
	 {
	   
	   //AD0INT = 0; // 清除ADC0转换结束标志
       while (AD0INT == 0);
	   AD0INT == 0;
       samples[i] = ADC0; // 读和存储ADC0值
	   i++;
	   if(i ==numSample)
	     break;
	 }	
    SFRPAGE=0x0;
	EIE2 &= ~0x02; // 禁止ADC0中断
	AD0EN=0;
	//	ADC0_DONE = 1; // 设置DONE标志
	SFRPAGE=0x01;
	TMR3CN &= ~0x04; // 停止定时器3		
	EA=0;    
}


//-----------------------------------------------------------------------------
// 定时器3初始化
//-----------------------------------------------------------------------------
//

// 配置定时器3 自动重装间隔由 <counts> 决定(不产生中断) 使用系统时钟为时基
//
void Timer3_Init (int counts)
{
	SFRPAGE=0x01;
	//TMR3CN = 0x02; // 停止定时器3; 清除TF3;
	                  // 使用系统时钟作为时基
	TMR3CF =0x08; 			  
    TMR3CN =0x00;
	//TMR3RL = -counts; // 初始化重装值
	
	TMR3L = 0xFF; // 立即开始重装
    TMR3H = 0xFF;
	RCAP3 = -counts;       // 初始化重装值
    //RCAP3 = 0x0;
	EIE2 &= ~0x01; // 禁止定时器3中断
    //EIE2 &= ~0x02;
	//TMR3CN |= 0x04; // 启动定时器3
}


//-----------------------------------------------------------------------------
// ADC0初始化
//-----------------------------------------------------------------------------
//
// 配置ADC0 使用定时器3溢出作为转换开始信号,转换结束产生一个中断,
// 使用左对齐输出模式
// 使能ADC转换结束中断中断使能ADC0 但禁止ADC0转换结束中断
//
void ADC0_Init (float gain)
{

//	ADC0CN = 0x45;   // 禁止ADC0;低功耗跟踪方式;
  	                 //当定时器3溢出启动ADC0转换;
					 //ADC0数据左对齐 
    SFRPAGE=0x0;
	ADC0CN = 0x04;   // 禁止ADC0;低功耗跟踪方式;
  	                 //当定时器3溢出启动ADC0转换;
					 //ADC0数据右对齐 
	REF0CN = 0x07; // 使能温度传感器, 片内 VREF,和 VREF 输出缓冲器
	//REF0CN = 0x03;   // 不使能温度传感器,////???????????

	AMX0CF = 0x00; //AIN0.0和AIN0.1为单端输入
	//AMX0SL = 0x00; // 选择AIN0.0作为ADC多路转换输入!
    AMX0SL = 0x01; // 选择AIN0.1作为ADC多路转换输入!

	//ADC0CF = (SYSCLK_AD/2500000/2-1) << 3; // ADC转换时钟2.5MHz

	if(gain==1)   //gain在哪定义的????????????????????????
	{
		ADC0CF&=~0x07;      // PGA增益 = 1
	}else if(gain==2)
	{
		ADC0CF&=~0x07;      // PGA增益 = 2
		ADC0CF|=0x01;
	}else if(gain==4)
	{
		ADC0CF&=~0x07;      // PGA增益 = 4
		ADC0CF|=0x02;
	}else if(gain==8)
	{
		ADC0CF&=~0x07;      // PGA增益 = 8
		ADC0CF|=0x03;
	}else if(gain==16)
	{
		ADC0CF&=~0x07;      // PGA增益 = 16
		ADC0CF|=0x04;
	}else if(gain==0.5)
	{
		ADC0CF&=~0x07;      // PGA增益 = 0.5
		ADC0CF|=0x06;
	}
  
	EIE2 |= 0x02; // 允许ADC0中断
}




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -