打印

我的AD7190板噪声太大,不知该如何处理?

[复制链接]
7164|26
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mcuatmel|  楼主 | 2012-12-9 14:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
AD7190,24bitAD,现在的现象是不接传感器的状态下,用电池供电,其信号输入端及参考电压端均有100mV上下的干扰,不知是什么原因产生的,也不知该怎么去正理,请高人帮解决下!

相关帖子

沙发
313157950| | 2012-12-13 16:21 | 只看该作者
要是我查,我就从电池开始一点一点往后查,看是什么东西弄出来的波纹。

使用特权

评论回复
板凳
houbo60061| | 2012-12-13 16:27 | 只看该作者
同上

使用特权

评论回复
地板
默雨听风| | 2012-12-17 09:20 | 只看该作者
还有一点要先确认你的示波器是不是本来就有纹波

使用特权

评论回复
5
mcuatmel|  楼主 | 2012-12-17 14:39 | 只看该作者
问题找到:
   如果AD不工作,纹波很小,如果一工作,足有100多mV,所以与AD有关。
我的方案我也有些怀疑:
   称重电桥供电是10V,差动输入给AD,这样任一个信号对地为5V上下,是否这个方案不合适?请指点!
   AD的工作电压是5V。

使用特权

评论回复
6
bruceding| | 2012-12-17 14:59 | 只看该作者
根据ad的datasheet,unbuffered mode 为AVdd+50mv
buffered mode 为AVdd-250mv。

使用特权

评论回复
7
mcuatmel|  楼主 | 2012-12-17 15:11 | 只看该作者
按理说是够用的,因为传感器的最大输出为5V+20mV,所以应该是没问题,但现在是不知为什么出来这么大的噪声。

使用特权

评论回复
8
yxgnba| | 2012-12-18 10:57 | 只看该作者
不接传感器是什么状态,建议把ADC的输入端直接接地试试看。

使用特权

评论回复
9
mcuatmel|  楼主 | 2012-12-25 12:57 | 只看该作者
经过多方测试发现:只要是配置完AD7190,那相应的vref+上就会有噪声。

使用特权

评论回复
10
mamalihui| | 2012-12-25 13:19 | 只看该作者
电路有问题,建议贴电路看看

使用特权

评论回复
11
mcuatmel|  楼主 | 2012-12-28 13:46 | 只看该作者
请看图。

ad.pdf

18.97 KB

使用特权

评论回复
12
mcuatmel|  楼主 | 2012-12-28 13:53 | 只看该作者
有能帮我搞定的可以付费。
要求:
测试桥式称重传感器,10V激励电源,Vref+,Vref-,AIN3,AIN4为一组,Vref2+,Vref2-,AIN1,AIN2为一组,用成两组,不同Vref这样的方式。

使用特权

评论回复
13
mcuatmel|  楼主 | 2012-12-28 14:02 | 只看该作者
现在的现象是无论我采用什么样的方式在Vref+上都会有200mV的噪声,这个解决不掉,差动和单端的,都会有。
现在测试用单端的情况,把参考接到电源上,这样情况下,得到的结果的低8位会跳满,可以在0x632-0x752之间。

使用特权

评论回复
14
mcuatmel|  楼主 | 2012-12-28 14:45 | 只看该作者
这个是相关程序
void ad_delay(void)
{
        u8 i;
        i=10;
        while (i--);
}
//读写均有8位或24位情况,所以各操作独立
void AD_Read(u8 readlong)
{
        u8 i,j,temp1;
        for (i=readlong;i>0;i--)
        {
                temp1=0;
                for (j=0;j<8;j++)
                {
                        AD_SCLK_L;
                        temp1<<=1;
                        ad_delay();
                        if (GPIO_ReadInputDataBit(GPIOB,AD_MISO)>0)
                                temp1++;
                        AD_SCLK_H;
                        ad_delay();
                }
                g_ADReadBuf[i-1]=temp1;
        }
}
void AD_Write(u8 BtLong,u8 * wrdata)
{
        u8 i,j,temp1;
       
        for (i=BtLong;i>0;i--)
        {
                temp1=*(wrdata+i-1);
                for (j=0;j<8;j++)
                {
                        if (temp1&0x80)
                                AD_MOSI_H;
                        else
                                AD_MOSI_L;
                        ad_delay();
                        AD_SCLK_L;
                        ad_delay();
                        AD_SCLK_H;
                        temp1<<=1;
                }
        }
}
void AD_Reset(void)
{
        u8 ad_buf[3];
        ad_buf[0]=0xff;
        ad_buf[1]=0xff;
        ad_buf[2]=0xff;
        AD_Write(3,ad_buf);                 
        AD_Write(3,ad_buf);       
}
/*********************************************************************/
/*函数名称:AD_ch1_Init(u8 refdata)                                  */
/*功  能:AD 通道1初始化                                           */
/*入口参数:refdata:转换的速度                                      */
/*出口参数:无                                                       */
/*********************************************************************/
void AD_ch1_Init(u8 refdata)
{
        u8 i,ad_buf[3];
        ad_buf[0] = 0x10;       //写0x10到通讯寄存器, 以控制下一操作是写配置寄存器
        AD_Write(1,ad_buf);                 
        g_sysdelay1=0;         
        while(g_sysdelay1<2);
        ad_buf[2] = 0x00;       //数据高位
        ad_buf[1] = 0x10;       //数据中位  
        ad_buf[0] = 0x08;       //数据低位  
        AD_Write(3,ad_buf);                //写入配置寄存器
        while (GPIO_ReadInputDataBit(GPIOB,AD_MISO)==Bit_SET);

        ad_buf[0] = 0x08;       //写0x08到通讯寄存器,以控制下一操作为写模式寄存器
        AD_Write(1,ad_buf);                 
        g_sysdelay1=0;         
        for (i=0;i<200;i++)
                ad_delay();
        while(g_sysdelay1<2);
        ad_buf[2]=0x88;         //内部零点校准
        ad_buf[1]=0x00;
        ad_buf[0]=0x01;
        AD_Write(3,ad_buf);                 
        for (i=0;i<200;i++)
                ad_delay();
        while (GPIO_ReadInputDataBit(GPIOB,AD_MISO)==Bit_SET);

        ad_buf[0] = 0x08;       //写0x08到通讯寄存器,以控制下一操作为写模式寄存器
        AD_Write(1,ad_buf);                 
        g_sysdelay1=0;         
        for (i=0;i<200;i++)
                ad_delay();
        while(g_sysdelay1<2);
        ad_buf[2]=0xA8;         //内部满量程校准
        ad_buf[1]=0x00;
        ad_buf[0]=0x01;
        AD_Write(3,ad_buf);                 
        for (i=0;i<200;i++)
                ad_delay();
        while (GPIO_ReadInputDataBit(GPIOB,AD_MISO)==Bit_SET);

        ad_buf[0] = 0x08;       //写0x08到通讯寄存器,以控制下一操作为写模式寄存器
        AD_Write(1,ad_buf);                 
        g_sysdelay1=0;         
        while(g_sysdelay1<2);
        if (refdata==1)
        {
                ad_buf[2] = 0x08;       //内部4.92MHz,MCLK2引脚三态
                ad_buf[1] = 0x00;       //波波器最大值,单周期转换无效,sinc3无效,校验位无效
                ad_buf[0] = 0x10;       //波波器值=16,输出数据速率300Hz
        }
        else if (refdata==2)
        {
                ad_buf[2] = 0x08;       //内部4.92MHz,MCLK2引脚三态
                ad_buf[1] = 0x00;       //波波器最大值,单周期转换无效,sinc3无效,校验位无效
                ad_buf[0] = 0x20;       //波波器值=32,输出数据速率150Hz
        }
        else if (refdata==3)
        {
                ad_buf[2] = 0x08;       //内部4.92MHz,MCLK2引脚三态
                ad_buf[1] = 0x00;       //波波器最大值,单周期转换无效,sinc3无效,校验位无效
                ad_buf[0] = 0x50;       //波波器值=80,输出数据速率60Hz
        }
        else if (refdata==4)
        {
                ad_buf[2] = 0x08;       //内部4.92MHz,MCLK2引脚三态
                ad_buf[1] = 0x00;       //波波器最大值,单周期转换无效,sinc3无效,校验位无效
                ad_buf[0] = 0x60;       //波波器值=96,输出数据速率50Hz
        }
        AD_Write(3,ad_buf);                //写入模式寄存器
        while (GPIO_ReadInputDataBit(GPIOB,AD_MISO)==Bit_SET);

        ad_buf[0] = 0x50;
        AD_Write(1,ad_buf);                //准备读配置寄存器
        for (i=0;i<200;i++)
                ad_delay();
        AD_Read(3);                        //读配置寄存器

        ad_buf[0] = 0x5c;
        AD_Write(1,ad_buf);//写命令到通讯寄存器,以决定下一操作为读数据寄存器
        while (GPIO_ReadInputDataBit(GPIOB,AD_MISO)==Bit_SET);
}

使用特权

评论回复
15
gregy_cn| | 2013-2-18 20:30 | 只看该作者
本帖最后由 gregy_cn 于 2013-2-18 20:35 编辑

Σ-Δ的ADC工作时会不停的切换+Vref、-Vref(常常为地)和输入给积分器,这个模块开关使用多是CMOS模拟开关(NMOS管和PMOS管并联而成),由于2个管子的寄生电容不对称,会出现“电荷注入”。如果LZ使用示波器观察,应该在Vref上看到向下冲(多是下冲,也可能个别的上冲)的波形。
如果是这个现象说明LZ的电压参考源输出强度不够(带载能力不足或者响应速度不佳),可以考虑在参考基准输出增加一级BUFFER。
同理输入也一样,必要时增加BUFFER。
推荐BUFFER的响应频率至少是ADC开关频率的10倍以上。

增加了器件温漂和时漂控制就会麻烦一些,毕竟使用24Bit了,还是称重用的,可能年漂移都出12位了。

使用特权

评论回复
16
摸摸| | 2013-2-19 01:17 | 只看该作者
200mV觉得很大了
http://www.tudou.com/programs/view/-cPRwN42MZ4/
这个视频是我当年做个一个24位ADC测试的。用的是LTC2400,效果并不是很差,不多好象很多人也说LTC2400做不好。
我这里没有输入电压驱动,是直进的,基准是AD586KR。
AD7190没做过。可否看下LZ的电路?

使用特权

评论回复
17
摸摸| | 2013-2-19 01:23 | 只看该作者
翻到11楼看了你的图,觉得你的图有点奇怪,你可以先看看我视频里的效果,觉得可以的话加我旺旺说。ID:tr_edl

使用特权

评论回复
18
孤独泪| | 2013-2-21 15:49 | 只看该作者
为什么需要用10V的激励源.我也在用AD7190,没感觉有什么问题,不过这个恶芯片的性价比一般。

使用特权

评论回复
19
lhkjg| | 2013-2-26 16:07 | 只看该作者
在参考电源上先上一个胆电容看看有无改善

使用特权

评论回复
20
LG2012GG| | 2013-2-26 21:30 | 只看该作者
应该在输入端加接一个电阻到地吧

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

512

主题

1456

帖子

2

粉丝