搜索
bottom↓
回复: 5

求助:LGT 模拟比较器使用ADC通道输出不正常

[复制链接]

出0入0汤圆

发表于 2012-7-20 09:52:43 | 显示全部楼层 |阅读模式
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();
        }
}

出0入0汤圆

 楼主| 发表于 2012-7-22 13:20:05 | 显示全部楼层
使用mcugreen网站上提供的例程也是一样,设置ADC2通道,无论ADC2为什么值,ACO都是'1'.
大家的模拟比较器都是正常的吗?厂家有没有什么建议?

出0入0汤圆

发表于 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;
}

出0入0汤圆

发表于 2012-7-23 14:14:19 | 显示全部楼层
仁兄是否考虑了ADC的输入阻抗为20k的因素。当你输入大于1.1V时,由于ADC内部输入阻抗的原因,实际的比较电压会偏低。


考虑输入阻抗因素!

出0入0汤圆

 楼主| 发表于 2012-7-23 21:30:25 | 显示全部楼层
logicgreen 发表于 2012-7-23 14:14
仁兄是否考虑了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);
                  
        }
}

出0入0汤圆

 楼主| 发表于 2012-7-25 14:06:31 | 显示全部楼层
希望是个例吧。反正我换了两个芯片还是一样。
而且ADC都要加电压跟随器的话,不如直接把AIN0接到一个模拟开关上,还节省空间。
Anyway,LGT性价比还是很高的。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-5 11:14

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表