ad7193切换通道大概需要多久?

按cn0287的设计,打算测量4路pt100热电阻。

测单路时,可以得到较准确的值。

现在想这样测量,某时刻,切换adg738的通道,设置ad7193为单次转换模式,然后读取数据寄存器值;最后关断adg738所有通道,延时一会,切换到下一路温度采集通道...

发现,切换adg738通道后立刻读取ad7193数据寄存器,得到的值为0xFFFFFF;

尝试在adg738切换通道后加延时,结果发现要延时为1秒左右再进行数据采集,才能得到较准确的值。

  • 再说详细一点:

    按cn0287设计的电路,数据采集部分完全是按参考板画的,单片机用的是stm32,通过光耦隔离控制.

    现在板上元件通讯没有问题,可以读取ad7193的内部温度.

    现在正在调试pt100测量部分,ad8063配置能横流电路,输出400uA.外接两线制pt100热电阻.

    如果程序里只选通adg738的一路,比如第二路,ad7193内部配置能8倍增益放大,差分信号输入,无极性,则读取通道1的ad值,通过换算基本上和外加电阻值相等.

    但是我想轮流切换测量4路pt100的温度值;于是程序里改成每1秒钟执行4路pt100温度采集.

    先是只采集第一路温度数据,只不过改成,1秒时钟标志置位后,先把adg738的通道二选通,开始测量第一路温度数据,ad7193配置成单次转换模式,然后读寄存器数据,接下来关断adg738所有通道. 然后等待

    下一次1秒时钟标识被置位,再次采集第一路温度数据...

    结果发现,读取ad7193的数据寄存器为0xFFFFFF.我怀疑是通道切换后,电路还没有稳定,就在adg738打开通道2后,加了个延时,然后再设ad7193为单次转换模式,再读取数据寄存器值.

    结果发现问题依旧,然后加大延时时间,读取值开始变小了些,但仍是偏大.

    然后将延时时间加大至接近1秒,读取ad7193数据寄存器值才基本等于理论值.

  • 0
    •  Analog Employees 
    on Feb 26, 2016 8:33 AM over 4 years ago

    1.方便的话,能否贴出从pt100到AD7193的电路。

    2.能否告知AD7193的Mode和Configuration寄存器中的内容。

  • Configuration寄存器值是:10011B


    Mode寄存器值是:2803FF


    while(1)
        {
            if(flag_1ms == 1)
            {
                flag_1ms = 0;          
                          
                ADG738_Set(0x02);
                for(i = 0; i < 1000; i++)
                    SPI3_Delay();
    
                value_temp1 = AD7193_SingleConversion();
                ADG738_Set(0x00);
    
    //            value_temp2 = AD7193_GetRegisterValue(AD7193_REG_CONF, 3, 1); 
                value_temp2 = AD7193_GetRegisterValue(AD7193_REG_MODE, 3, 1);
              
                usart1_send(0xDD);
                usart1_send(value_temp2 >> 16);
                usart1_send(value_temp2 >> 8);
                usart1_send(value_temp2);
                usart1_send(value_temp1 >> 16);
                usart1_send(value_temp1 >> 8);
                usart1_send(value_temp1);
            }
        }
    
    
    

    value_temp1为读取的ad7193数据寄存器的值,未做任何转换;

    value_temp2为配置寄存器或模式寄存器的值。

    增加SPI3_Delay()函数的调用次数,以增加延时时间,快接近1秒时,才可得到正确的value_temp1值。

    如果需要的话,可以把工程上传过来。

    PT100-41.pdf
  • 0
    •  Analog Employees 
    on Feb 27, 2016 8:57 AM over 4 years ago

    1.根据Configuration寄存器值是:10011B,得到chop disable

    2.Mode寄存器值是:2803FF,得到:single conversion mode, internal 4.92MHz clock, No averaging, Sinc4 digital filter, No clock divived, single conversion mode disable, REJ60 disable, FS=0x3FF(1023)对应下表的Filter Word

    3.根据您的配置参考下表数据的第一行,settling time就是切换一次通道后ADC得到第一个正确结果所需的时间,是852.5ms。您可以只改变FS来减少这个Settling time。

  • 感谢您的回复。

    从官网下载的参考函数,Mode寄存器里是把滤波器输出速率这几位设置为0x60。我刚开始调试时,觉得测量结果有些跳动(可能是电路其他硬件方面引起的),于是就把输出速率给设成最大了。后来给忘了这事了,真是太疏忽了。另外,就是手册看的不够仔细,没有从头到晚好好看。

    另再次请教个问题。现在我想在主循环外,将配configuration寄存器设置为0x10011b,主循环里只有读取configuration寄存器这一语句。结果发现,上电后第一次读取的是0x10011b,再次读取的话,就变成了0x10011a,这样,增益就变成未知的了。

    是否是因为读configuration寄存器而引起了该寄存器值的改变?

    因为我现在是每1秒读ad7193寄存器一次,并进行串口发送。我试了几次,发现开机后前两次发送的是0x10011b,以后再次发送的就是0x10011a了。

    ----------------------------------------------

    也许是我这里stm32定时器用的不对,我再琢磨下...

    --------------------------------------------------

    想了想,configuration寄存器赋值为0x10011a,只是在初始化时执行过,是在主循环之外。程序不太可能跳出while(1)循环,所以还是怀疑是读configration寄存器引起了其值的变化...