本帖最后由 gyd1126 于 2017-4-24 23:53 编辑
请教大神
我现在用79F6488调一个项目,在AD这里遇到这样的问题。
我打开了AD中断,如果一直检测固定的AD输入通道,则AD检测没问题,AD转换率也正确。但是我在AD中断里改变了AD检测通道的话,就不正常了,AD检测值为0,而且中断速率也完全不对,中断特别快。
我的相关代码如下:
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++;
}
}
如果在切换AD通道是去掉 ADCON &= ~BIT(7); //关AD 这一句,则中断速率正常,而且有AD值,但是AD值不正确,通道间相互干扰。如果在AD中断里不改变通道,但每次中断后都先关AD,再使能AD,也会出现同样的问题。所以问题可能就出在关AD上,但是不关AD,转换值
也不对啊。
请教一下,有没有人有这方面经验呀?现在不知道怎么处理了,又必须要同时检测2个通道以上。
好尴尬,刚发帖出来,然后又有点思路试了一下,然后问题解决了。都怪中颖的datasheet上没有写清楚。
首次使能AD后,AD中断转换值是不准的,但是4次转换后就基本准确了,所以切换通道必须等4次转换后取值。
结贴。
|