www.pudn.com > dsPIC33_CDROM.rar > AD3.c, change:2012-10-17,size:2583b


#include "P33FJ32GP204.H" 
//PROTEUS仿真不对! 
//禁止时钟切换,禁止引脚多次配置,振荡引脚,主振荡器为XT 
_FOSC(FCKSM_CSDCMD & IOL1WAY_ON & OSCIOFNC_OFF & POSCMD_XT) 
//使用用户设定的振荡器启动,初始振荡器为带PLL的主(XT,HS或EC)振荡器 
_FOSCSEL(IESO_OFF & FNOSC_PRIPLL); 
_FICD(JTAGEN_OFF & ICS_PGD2); 
#define P1 _LATC4 
unsigned int AD[50][8]; 
unsigned char N=0,N1=0; 
void __attribute__((__interrupt__, auto_psv)) _ADC1Interrupt(void); 
 
int main(void) 
{	//外接4MHz晶振,通过PLL得到总振荡频率80MHz,Fcy=40MHz,Tcy=25ns 
	CLKDIVbits.PLLPRE=0;	// N1=2,此输出为4/2=2MHz,符合0.8MHz~8.0MHz的要求  
	PLLFBDbits.PLLDIV=78; 	// M=80,此输出为2×80≈160MHz,符合100MHz~200MHz的要求 
	CLKDIVbits.PLLPOST=0;	// N2=2,此输出为160/2=80MHz,符合12.5MHz~80MHz的要求 
	while(OSCCONbits.COSC != 0b011);	//等待时钟稳定 
	RCONbits.SWDTEN=0;	//禁止WDT 
//AD转换设置 
	TRISB=0xFFFF; 
	TRISC=0xFFEF; 
  //AD1PCFGL 
  	AD1PCFGL=0xE000;	//AN0-AN12全为模拟脚	 
  //AD1CON1	 
	_AD12B=0;		//10位AD 
	_FORM=0b00;		//AD结果为整数 
	_SSRC=0b010;	//定时器3比较匹配,结束采样立即转换 
	_SIMSAM=1;		//同时采样 
	_ASAM=1;		//转换结束即开始采样 
  //AD1CON2 
  	_VCFG=0;		//AD参考电压为电源电压 
  	_CSCNA=0;		//禁止扫描 
  	_CHPS=0b11;		//同时采样4个通道 
  	_SMPI=1;		//2次采样后中断(共得到8个转换值) 
  	_BUFM=0;		//ADC结果整数格式 
   	_ALTS=1;		//用A、B开关 
  //AD1CON3 
   	_ADRC=0;		//系统时钟作为ADC时钟 
   	_ADCS=4;		//TAD=5×TCY=125ns>117.6ns 
  //AD1CHS0 
  	_CH0NA=0;		//采样多路开关A的CH0的负输入GND 
  	_CH0SA=6;		//采样多路开关A的CH0的正输入为AN6 
  	_CH0NB=0;		//采样多路开关B的CH0的负输入GND 
  	_CH0SB=7;		//采样多路开关B的CH0的正输入为AN7 
  //AD1CHS123 
  	_CH123SB=1;		//B开关同相接法.CH1:AN3,CH2:AN4,CH3:AN5 
  	_CH123NB=0;		//B开关的CH1,CH2,CH3的反相端接VREF-即GND 
  	_CH123SA=0;		//A开关同相接法.CH1:AN0,CH2:AN1,CH3:AN2 
  	_CH123NA=0;		//A开关的CH1,CH2,CH3的反相端接VREF-即GND	 
  //TMR3设置 
  	T3CON=0x0000;	//1:1分频 
  	PR3=9999;		//延时250us 
  	TMR3=0; 
  	_T3IF=0; 
  //ADC中断设置	 
  	_AD1IF=0; 
  	_AD1IE=1; 
  	_AD1IP=6; 
  //总的中断设置	 
  	_IPL=4;		//CPU中断优先级为4 
	_IPL3=0;		//CPU中断优先级≤7 
	_NSTDIS=1;		//禁止嵌套中断 
	_ALTIVT=0;		//使用标准中断向量 
  	T3CONbits.TON=1;	//启动定时器 
  	AD1CON1bits.ADON=1;//启动ADC模块 
	P1=1; 
	while(1);		 
	return(0); 
} 
 
//2次采样,时间间隔为500us,每次采样4个通道,共有8个ADC数据 
void __attribute__((__interrupt__, auto_psv)) _ADC1Interrupt(void) 
{	volatile unsigned int *P=&ADC1BUF0; 
	unsigned char i; 
	P1=~P1; 
	_AD1IF=0; 
	for (i=0;i<8;i++)		//读8个AD结果 
	{	AD[N][i]=*P; 
		P++; 
	} 
	N++; 
	if (N>=50) 
		N=0; 
}