求助:LGT 模拟比较器使用ADC通道输出不正常
LGT8f08A,供电3.3V. AVRStudio4.19+winavr2010现象:配置为AIN0(1.1V)与ADC0(2.2V)比较,读ACO总是‘1’。只有ADC0=3.3V时 ,读ACO才能为‘0’。
使用内部1.25V与ADC0比较,也是如此。
如果配置为AIN0与AIN1比较,则ACO能正确输出。
请问有没有人遇到类似的情况?请教大概是哪里出了问题?
配置通道的函数为:
void AC_ChannelSel(AC_MUX_SEL AC_Channel)
{
if (AC_Channel >= AC_ADC0)
{
ADCSRA = ADCSRA & (~(1 << ADEN));
ADCSRB |= (1 << ACME);
PRR &= ~(1<< PRADC);
ADMUX = (ADMUX & 0xe0) | (AC_Channel - AC_ADC0);
}
else
{
if(!ADCSRA & (1 << ADEN))
AC_MUXDIS();
}
}
使用mcugreen网站上提供的例程也是一样,设置ADC2通道,无论ADC2为什么值,ACO都是'1'.
大家的模拟比较器都是正常的吗?厂家有没有什么建议? 没看明白你的函数是AC比较功能
你试试下面这个函数
u8 DrvAC_Comp(u8 mode, u8 channel)
{
unsigned char temp;
DIDR1 = 0xFF;
ACSR = 0;
ACSR |= 1 << ACD //AC_DIS();
if(mode == AC_AIN0_AIN1)
{
ADCSRB &= ~(1 << ACME);
ACSR &= ~(1 << ACBG);
}
else if(mode == AC_AIN0_ADC)
{
ADCSRA &= ~(1 << ADEN); //close ADC
ADCSRB |= (1 << ACME); //AC multiplexer enable
ADMUX = channel;
}
else if(mode == AC_BGR_AIN1)
{
ACSR |= (1 << ACBG);
}
else if(mode == AC_BGR_ADC)
{
ADCSRA = 0; //close ADC
ADMUX = channel;
ADCSRB = 0x40; //AC multiplexer enable
ACSR |= (1 << ACBG);
}
temp = ACSR;
ACSR &= ~(1 << ACD) //AC_EN();
Delay_ms(1);
ACSR |= 1 << ACI //AC_CLRINT();
NOP();
NOP();
NOP();
if((ACSR >> ACO) & 0x01) //AC_ACO()
temp = 1;
else
temp = 0;
return temp;
}
仁兄是否考虑了ADC的输入阻抗为20k的因素。当你输入大于1.1V时,由于ADC内部输入阻抗的原因,实际的比较电压会偏低。
考虑输入阻抗因素! logicgreen 发表于 2012-7-23 14:14 static/image/common/back.gif
仁兄是否考虑了ADC的输入阻抗为20k的因素。当你输入大于1.1V时,由于ADC内部输入阻抗的原因,实际的比较电 ...
谢谢LS二位。但是不行。使用LM358做电压跟随器输入,AIN0引脚电压1.90V; AIN2电压3.0V。串口输出'H"。测试程序如下:
u8 DrvAC_Comp(u8 mode, u8 channel)
{
unsigned char temp;
ACSR = 0;
ACSR |= 1 << ACD ; //AC_DIS();
if(mode == AC_AIN0_AIN1)
{
ADCSRB &= ~(1 << ACME);
ACSR &= ~(1 << ACBG);
}
else if(mode == AC_AIN0_ADC)
{
ADCSRA &= ~(1 << ADEN); //close ADC
ADCSRB |= (1 << ACME); //AC multiplexer enable
ADMUX = channel;
}
else if(mode == AC_BGR_AIN1)
{
ACSR |= (1 << ACBG);
}
else if(mode == AC_BGR_ADC)
{
ADCSRA = 0; //close ADC
ADMUX = channel;
ADCSRB = 0x40; //AC multiplexer enable
ACSR |= (1 << ACBG);
}
temp = ACSR;
ACSR &= ~(1 << ACD); //AC_EN();
mdelay_ms(2);
ACSR |= 1 << ACI ; //AC_CLRINT();
NOP();
NOP();
NOP();
if((ACSR >> ACO) & 0x01) //AC_ACO()
temp = 1;
else
temp = 0;
return temp;
}
int main(void)
{
volatile u8 temp=0;
SYSCLK_Init();
USART_Init();
AC_ON();
while(1)
{
temp = DrvAC_Comp(AC_AIN0_ADC,2);
if (temp)
USART_Send_Byte('H');
else
USART_Send_Byte('L');
mdelay_s(7);
}
} 希望是个例吧。反正我换了两个芯片还是一样。
而且ADC都要加电压跟随器的话,不如直接把AIN0接到一个模拟开关上,还节省空间。
Anyway,LGT性价比还是很高的。
页:
[1]