todd_xu 发表于 2012-7-20 09:52:43

求助: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();
        }
}

todd_xu 发表于 2012-7-22 13:20:05

使用mcugreen网站上提供的例程也是一样,设置ADC2通道,无论ADC2为什么值,ACO都是'1'.
大家的模拟比较器都是正常的吗?厂家有没有什么建议?

jianghu-00091 发表于 2012-7-23 10:57:31

没看明白你的函数是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;
}

logicgreen 发表于 2012-7-23 14:14:19

仁兄是否考虑了ADC的输入阻抗为20k的因素。当你输入大于1.1V时,由于ADC内部输入阻抗的原因,实际的比较电压会偏低。


考虑输入阻抗因素!

todd_xu 发表于 2012-7-23 21:30:25

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);
                  
        }
}

todd_xu 发表于 2012-7-25 14:06:31

希望是个例吧。反正我换了两个芯片还是一样。
而且ADC都要加电压跟随器的话,不如直接把AIN0接到一个模拟开关上,还节省空间。
Anyway,LGT性价比还是很高的。
页: [1]
查看完整版本: 求助:LGT 模拟比较器使用ADC通道输出不正常