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.

[参考译文] ADC081C021:ADC 读数问题

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/895858/adc081c021-adc-reading-issue

器件型号:ADC081C021

我在正常模式下读取 ADC 转换结果时遇到问题、即地址指针寄存器设置为0 (零)。 当我尝试读取结果时、只有第一个读数返回转换结果、之后的所有读数为零。 我阅读 ADC081C021数据表。 它表示在读取后、它将再次启动转换。 因此、我假设我可以继续读取它。  

但是、如果我关闭该文件并为每次读取再次打开、它将返回 none-zero 结果。 假设是在正常模式(单次触发模式)下读取 ADC 的方法

我的 Linux env 使用 TI AM3357 和 Linux 内核4.14.96 (Linaro)、并使用 ADC081C021 进行电池监控。  

这是我尝试读取 ADC 转换结果的代码。  

char adcName[]="/sys/bus/iio/devices/iio:device0/in_volte_ray";
output_fd = open (adcName、O_RDWR);
if (output_fd < 0){
  log (LL_INFO、"打开 ADC 失败\n");
  pthread_exit (NULL);

对于(int i = 0;i < 10;i++)  

/*读取 ADC */

日志(LL_INFO、"写入地址指针 REG \n");
addrPointerReg = conversion 结果;// conversion 结果为零
写入(output_fd、&addrPointerReg、sizeof (Address_Pointer_Reg));

int ret =读取(output_fd、&convisionResultReg、sizeof (conversion_Result_Register));
log (LL_INFO、"ADC 输出转换结果=%d ret =%d \n"、
                            convisionResultReg.convisionResult、RET);


conversionResultReg ={0}

Close (output_fd);

谢谢

-Tom

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

    您好!

    请提供数字线路的示波器截图吗? 这有助于确认代码应该执行的操作实际上就是它所执行的操作。

    此外、为了确保读取命令正确、我建议使用 数据表中的以下段落进行确认

    此致、Cynthia

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

    Cynthia、  

    感谢您的回复。

    我按照 图30进行了操作。 (b)典型指针置1、然后立即读取数据表中指示步骤的2字节 ADC 寄存器

    帧1从主机发送地址字节

    2.帧2从主机发送指针字节

    帧3从主机发送地址字节

    帧4和5是从 ADC 读取的数据字节。

    根据我解释的序列、我的代码如下、但第一次写入已经失败。  

    char adcName[]="/sys/bus/iio/devices/iio:device0/in_volte_ray"; 
    fileDescriptor = open (adcName、O_RDWR);
    if (fileDescriptor < 0){
    log (LL_INFO、"打开 ADC 失败\n");
    pthread_exit (NULL);
    } 

    memset (buf、0、bufSize);
    buf[0]= ADC_address;//从主器件寻址字节
    RET = WRITE (fileDescriptor、buf、1);
    if (ret <= 0)

    log (LL_INFO、"-" 1无法写入 DAC ret =%d \n"、ret);


    memset (buf、0、bufSize);
    addrPointerReg = conversion 结果;
    buf[0]= addrPointerReg;//主器件的指针字节
    写入(fileDescriptor、buf、1);

    memset (buf、0、bufSize);
    buf[0]= ADC_address;//主器件的地址字节
    写入(fileDescriptor、buf、1);

    memset (buf、0、bufSize);
    RET =读取(fileDescriptor、buf、2);//读取 ADC 2个字节

    您能否确认上述写入和读取器件的顺序是否与数据表匹配?

    稍后我将询问硬件帮助以捕获数字线路。 他们现在都在家里。

    谢谢

    -Tom



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

    我最终可以使用 cat /sys/bus/iio/devices/iio:device0/in_volte_raw 读取数据而不使用这些序列、因为我的需求只是单次触发模式。  

    我只是将 cat 之外的 C 代码定向到一个文件并将其读回。  

    感谢你的帮助。

    -Tom