相关代码如下:
void ADC_init(void)
{
REGCON = 0X03; //3.3V VDDR
//参考电压、输入通道
ADCH = (3<<6); //Vref = 0.4VDDR
//根据ADC输入口配置相应IO
ADCH |= BIT(4); //P16 for AN3
ADCH |= BIT(5); //P10 for AVDD ref
ADCH |= BIT(0); //P11 P12
//设置ADC时钟
ADT = 0XF4; //adcclk=1Mhz,转换率250hz
ADCDS = 0X00; //双极性输出
ADCON = 0x00; //内部基准电压
PGAM = 0;
ChangeAdcChanle(0);
ADCON |= BIT(7); //ADC EN
ADC_IE(1);
}
u8 xdata g_AdcChsBuff[3]; //ADC输入通道及增益
#define ADC_INPUT(PGA_GAIN,INPUT_CHS) (u8)((PGA_GAIN<<4)|INPUT_CHS)
g_AdcChsBuff[0] = ADC_INPUT(PGA_GAIN_1X,ADC_CHS_AN3);
g_AdcChsBuff[1] = ADC_INPUT(PGA_GAIN_1X,ADC_CHS_Vref_P);
g_AdcChsBuff[2] = ADC_INPUT(PGA_GAIN_32X,ADC_CHS_AIN0);
//切换AD通道
void ChangeAdcChanle(u8 chanle)
{
u8 tmp;
ADCON &= ~BIT(7); //关AD
tmp = PGAM & 0x0f;
PGAM = (g_AdcChsBuff[chanle]&0xf0)|tmp;
tmp = ADCON & 0xf0;
ADCON = (g_AdcChsBuff[chanle]&0x0f) | tmp;
ADCON |= BIT(7); //启动转换
}
//AD中断
void ADC_ISR(void) interrupt ADC_INT
{
if(ADCON&BIT(6))
{
ADCON &= ~BIT(6); //ADCIF
//adc_value = ADDL; //
((u8 *)&adc_value)[0] = ADDH;
((u8 *)&adc_value)[1] = ADDM;
if(adcChsIndex >=3)
adcChsIndex =0;
g_ADC_res[adcChsIndex] = adc_value;
if(++adcChsIndex >= 3)
adcChsIndex = 0;
ChangeAdcChanle(adcChsIndex);
ADCIsrCnt++;
}
}
|