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.

[参考译文] ADS1256:快速读取和写入

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/677302/ads1256-fast-read-and-write

器件型号:ADS1256
主题中讨论的其他器件: DAC8532

您好!  

我购买了采用 ADS1256作为 ADC 的 Waveshare 高精度 AD/DA 板。 它们提供了一个示例程序来读取模拟值、但速度相当慢。  

有人能帮我解决这个问题吗、我将 Raspberry Pi 与电路板结合使用。  

片选连接到引脚15、当为低电平时、它将选择 ADS1256。 数据就绪连接到引脚11。 希望使用 ADS1256 24位接收传入信号、并将结果设置为输出 DAC 16位和至少8kHz 的变量。

希望有人能帮助我或让我朝着正确的方向前进。

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

    我们在这里有一个轻微的缺点-我们中没有人熟悉您使用 ADS1256的硬件。 您能否为您购买的电路板提供器件型号、或将我们指向其原理图?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Tom、

    很抱歉我不清楚。
    可以在 www.waveshare.com/.../DA_Board 上找到我正在使用的板
    它将 ADS1256用于 ADC: www.ti.com/.../ads1256.pdf
    和 DAC8532 AD DAC: www.ti.com/.../dac8552.pdf

    运行他们在此处提供的示例代码时: www.waveshare.com/.../File:High-Precision-AD-DA-Board-Code.7z
    我测试了 ADS1256_TEST 并对其进行了一些修改、仅查看一个端口(一个 ADC 输入)。 在读取0 - 5 [V]之间波动的正弦值时、我希望程序在之间打印大量值、例如步长0.1[V]或更小。 我认为它与 ADS1256的 DRDY 有关。
    我可以通过更改配置设置获得更好的结果。 这些是 SPI 分频器和每秒样本数(SP)。 我通过将 SPS 从30000更改为1000并将 SPI fom 从1024更改为256来获得最佳结果。 降低 SP 以获得更好的结果不是我所期望的。 我需要更多的样本、这意味着分辨率更高。

    如果我在 Raspberry Pi 上使用一条 SPI 总线进行写入(DAC)、另一条 SPI 总线进行读取(ADC)、是否会有所帮助?

    此致、

    吕克

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我当前正在运行此循环(请参阅下面的)。 现在、等待 DRDY 变为可用状态的外部循环在进入一次之前运行大约60次。 如果我能够减少等待时间、那么在本例中、我可以更频繁地检查 ADC 输入。

    此致、


    int main()

    uint8_t id;
    int32_t ADC[8];
    int32_t volt[8];
    uint8_t i;
    //uint8_t ch_num;
    int32_t ITEMP;
    //uint8_t buf[3];
    //uint32_t DACVAL;
    //uint16_t _D_;
    //uint16_t newvar;
    uint8_t _ch;
    int8_t 计数器;


    if (!BCM2835_init())
    返回1;

    BCM2835_SPI_BEGIN ();
    BCM2835_SPI_setBitOrder (BCM2835_SPI_bit_order_LSBFIRST); //默认值
    BCM2835_SPI_setDataMode (BCM2835_SPI_MODE1); //默认值
    BCM2835_SPI_setClockDivider (BCM2835_SPI_Cock_divider);//默认
    BCM2835_GPIO_fsel (SPICS、BCM2835_GPIO_FSEL_OUTP);//
    BCM2835_GPIO_WRITE (SPICS、高电平);
    BCM2835_GPIO_fsel (DRDY、BCM2835_GPIO_FSEL_INPT);
    BCM2835_GPIO_SET_Pud (DRDY、BCM2835_GPIO_PUD_UP);
    //ADS1256_WriteReg (REG_MUX、0x01);
    //ADS1256_WriteReg (REG_ADCON、0x20);
    // ADS1256_CfgADC (ADS1256_GAIN_1、ADS1256_15SPS);

    //~ struct timespec tstart ={0、0}、tend ={0、0};
    //~ clock_gettime (clock_monotonic、_tstart);

    //~ clock_gettime (clock_monotonic、tend);
    //~ printf ("计算大约需要%.5F 秒\n"、((double) twt.tv_sec + 1.0e-9*twt_nsec)-((double) tstart.ttv_sec + 1.0e-9*tstart.ttv_nsec));


    ID = ADS1256_ReadChipID ();
    printf ("\r\n");
    printf ("ID=\r\n");

    如果(id!= 3)

    printf ("错误、ASD1256芯片 ID = 0x%d\r\n"、(int) id);

    其他

    printf ("确定、ASD1256芯片 ID = 0x%d\r\n"、(int) id);

    /*
    11110000 = 30、000SPS (默认值)
    11100000 = 15、000SPS
    11010000 = 7、500SPS
    11000000 = 3、750SPS
    10110000 = 2、000SPS
    10100001 = 1、000SPS
    10010 = 500SPS
    10000010 = 100SPS
    01110010 = 60SPS
    01100011 = 50SPS
    01010011 = 30SPS
    01000011 = 25SPS
    00110011 = 15SPS
    00100011 = 10SPS
    00010011 = 5SPS
    00000011 = 2.5SPS
    *


    ADS1256_CfgADC (ADS1256_GAIN_1、ADS1256_1000SPS);
    ADS1256_StartScan (0);
    G_tADS1256.ScanMode = 0;//通道模式0 =单通道、1 =差分
    //ADS1256_SetChannal (0);//通道模式0 =单通道、1 =差分

    //ch_num = 8;
    I = 2;
    计数器= 0;


    while (1)//外部循环

    //时间采样外部环路
    struct timespec tstart ={0、0}、tend ={0、0};
    Clock_gettime (clock_monotonic、_tstart);

    //Count 循环次数、然后再进入内循环
    计数器=计数器+1;
    printf ("%d 计数器\r\n"、计数器);


    while (DRDY_IS _LOW ())//内部循环

    //ADS1256_ISR();
    //返回1;

    struct timespec tstart ={0、0}、tend ={0、0};
    Clock_gettime (clock_monotonic、_tstart);

    /*在循环内运行 ADS1256_ISR */
    //ADS1256_SetChannal (g_tADS1256.Channel);/*切换通道模式*/
    _ch = g_tADS1256.Channel;//而不是 ADS1256_SetChannal 函数

    ADS1256_WriteReg (REG_MUX、(_ch << 4)|(1 << 3));//而不是 ADS1256_SetChannal 函数

    BSP_DelayUS (5);

    ADS1256_WriteCmd (CMD_SYNC);
    BSP_DelayUS (5);

    ADS1256_WriteCmd (CMD_WAKEUP);
    BSP_DelayUS (5);



    如果(g_tADS1256.Channel = 0)

    G_tADS1256.AdcNow[7]= ADS1256_ReadData ();

    其他

    G_tADS1256.AdcNow[g_tADS1256.Channel-1]= ADS1256_ReadData ();


    如果(++g_tADS1256。通道>= 8)

    G_tADS1256.Channel = 0;


    printf ("%d DRADY LOW \r\n"、DRDY);


    ADC[i]= ADS1256_GetAdc (i);
    VOLT[i]=(ADC[i]* 100)/ 167;

    printf ("%d volt \r\n"、vol[i]);

    ITEMP = VOLT[i];
    printf ("%d ITEMP \r\n"、ITEMP);


    //~ ITEMP = VOLT[i];// uV */
    //~ if (ITEMP < 0)
    //~{
    //~ ITEMP =-ITEMP;
    //~ printf ("(-%ld.%03ld %03ld V)\r\n"、ITEMP /1000000、(ITEMP%1000000)/1000、ITEMP%1000);
    //~}
    //~否则
    //~{
    //~ printf ("(%ld.%03ld %03ld V)\r\n"、ITEMP /1000000、(ITEMP%1000000)/1000、ITEMP%1000);
    //~}

    计数器= 0;
    clock_gettime (clock_monotonic、tend);
    printf ("计算内循环大约花费了%.5F 秒\n"、((double) tad.tv_sec + 1.0e-9*tad.tv_nsec)-((double) tstart.ttv_sec + 1.0e-9*tstart.ttv_nsec));


    }//结束 DRDY while 循环

    clock_gettime (clock_monotonic、tend);
    printf ("计算外循环大约花费了%.5F 秒\n"、((double) twt.tv_sec + 1.0e-9*twt_nsec)-((double) tstart.ttv_sec + 1.0e-9*tstart.ttv_nsec));

    }//结束 while (1)循环

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

    尊敬的 Luc:

    如何实现"ADS1256_ReadData()函数? 也许可以加快该功能的实施。

    此外,我注意到数据收集循环中有一些"printf()"语句。 请注意,"printf()"调用可能非常慢,这可能是您读取数据速度不快的原因。

    至于更改时钟分频器时性能提升的原因、可能会发生一些事情。 通常、较快的时钟将更快地获取数据、这样您就不会错过任何样片。 此外、如果您在/DRDY 变为低电平时读取数据、则可能会获得旧数据和新数据组合的损坏数据。 因此、您可能需要注意读取该数据的时间、并尝试使用 RDATA 命令时钟输出数据、因为该命令将缓冲输出数据、并帮助防止在新转换完成时对其进行覆盖。

    此致、
    Chris