This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] ADS122U04:ADS122U04连续转换模式输出零

Guru**** 2528390 points
Other Parts Discussed in Thread: ADS122U04

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/745350/ads122u04-ads122u04-continuous-conversion-mode-outputs-zeros

器件型号:ADS122U04

我的应用包括采用3.3V 数字和模拟电源的 ADS122U04。 AIN0和 AIN1连接在2K 欧姆的电流感应电阻器上、该电阻器将测量来自光测量器的电流。 但是、我现在在没有连接光电元件的情况下进行测试、因此输入应为零伏。 我希望测量一些零偏移和噪声。

我想配置连续的转换流。 但出于某种原因、只有第一个转换结果为数字、之后的所有转换返回000000。

下面是我在 PC 上运行的用于配置和读取 ADC 的代码:

var sp = new System.IO.Ports.SerialPort ("COM6"、115200);
SP.Open();
           

//复位:
字节[] ResetMessage =新字节[]{0x55、0x06};
SP.Write (ResetMessage、0、ResetMessage.Length);

字节[]配置=新字节[]{0x08、0x08、0x50、0x01、0x00}; //增益16、20SPS 连续、计数/反相、自动输出。

byte[] msg =新字节[]{0x55、0x00、0x00};


            int i;
            对于(i=0;i < configuration.Length;i++)
            {
                MSG[1]=(字节)(0x40 |(字节)未选中(I << 1));
                MSG[2]=配置[i];
                console.WriteLine ("正在发送配置"+ msg[0].ToString ("X2")+ msg[1].ToString ("X2")+"=>"+ msg[2].ToString ("X2"));
                SP.Write (msg、0、msg.Length);
                System.Threading.Thread.Sleep (10);
            }

           //发送开始
            byte[] StartMessage =新字节[]{ 0x55,0x08 };
            SP.Write (StartMessage、0、StartMessage.Length);

           while (真)
            {
                未选中
                {
                   字节序列=(字节) sp.ReadByte();
                    uINT ADC =(uint)(sp.ReadByte()+( sp.ReadByte()<<8)+(sp.ReadByte()<<16)));
                    字节 SEQ2 =(字节) sp.ReadByte();
                    UINT ADC2 =(uint)(((int) 0xFF000000 + sp.ReadByte ()+(sp.ReadByte ()<< 8)+(sp.ReadByte ()<< 16));
                    
                    if ((seq ==(byte)(~SEQ2)))&&
                        (ADC ==(uint)(~ADC2))//检查第二个四个字节是否为前四个字节的反相位。
                    {
                        console.WriteLine (seq.ToString ("X2")+"+ ADC.ToString ("X6"));
                    }

}}//永久重复

这是输出:

大家好!
 发送配置5540=>08
 发送配置5542=>08
 发送配置5544=>50
 发送配置5546=>01
 发送配置5548=>00
发送开始消息。
01 FCD147
02 000000
03 000000
04 000000
05 000000
06 000000
07 000000
08 000000
09 000000
0A 000000
0b 000000
0C 000000
0D 000000
0E 000000
0f 000000
10 000000
11 000000
(笑声)

是否知道转换失败的原因?

我尝试在单次模式下进行配置、这有时会产生非零转换结果。 但我发现结果取决于我的"开始"请求的时间。 如果我在上一次转换完成并由 PC 代码解析后不久发送另一个开始、我将获得一个连续的零流、就像我在连续转换模式中所做的那样。 如果我加上15ms 或更长的延迟、我将获得具有正零偏移的噪声数据、例如:


1E 0007EA
1F 0007E3
20 000809
21 0007D0
22 0007E8.
23 0007A4
24 00080D
25 000803
26 0007F1
27 0007A4
280007EF
29 0007E9
2A 000809
2B 0007D4
2C 000807
2D 0008BF
2E 000701
2F 0007EF
30 0007E5
31 0008CB
32 0008B2
33 0007A4
34 000813

但是、如果我增加"启动"消息之间的延迟、则零偏移以及转换之间的延迟会随之改变。 在转换之间间隔100ms 时、我得到一个较大的负偏移:


10 FFD4C1
11 FFD847
12 FFD309
13 FFD676
14 FFD679
15 FFD4C1
16 FFD67B
17 FFD4C0
18 FFD4BC
19 FFD668
1A FFD67B
1b FFD4BD
1C FFD4B4
1D FFD66E
1E FFD4B9
1F FFD667
20 FFD4B3
21 FFD4AF
22 FFD66B
23 FFD67A
24 FFD4BA

ADC 结果似乎取决于转换的时序。 这不是我所期待的... 我希望结果与时间无关。 有什么想法我做了什么错?

感谢您的任何建议

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、user5870291、

    欢迎来到 E2E 论坛! 在 while 环路中、您将持续读取缓冲区、但20sps 的数据仅每50ms 可用一次。 因此、当使用自动数据读取模式时、您必须确保在读取缓冲区之前有新内容、否则您将看到一个空的缓冲区(全0)。 请注意、在转换过程中发送 START 命令将重新启动转换、从而使输出数据的时间更长。

    有多种方法可以解决这个问题。 一种方法是延迟缓冲区的读数、以便在两次读取之间等待50ms。 另一种方法是使用 GPIO2并将其设置为 DRDY 模式、然后触发中断(或轮询微控制器的输入引脚)、以便在 DRDY 从高电平转换为低电平后捕获新数据。 另一种替代方法是监控 UART 中断状态、查找 RX 缓冲区中可用的新数据。

    最后一种方法是不使用自动模式、而是使用 RDATA 命令手动读取数据。 因此、您可能希望使用组合、例如监控 DRDY、然后手动读取数据。


    此致。
    Bob B