TI论坛
直播中

李进锋

8年用户 999经验值
私信 关注
[问答]

用ADS8556和STM32F407采集信号数据错乱的原因?


  • 大家好,我用ADS8556和STM32F407采集信号,并口16位传输硬件模式,PA0 PA1 PB0 PB1四通道同时采集,但是读数据时第三四个数据总是不对,第三个数据和第一个差不了多少,第四个和第二个完全一样,这是为什么。请大家指教。
    我用示波器看了CONVST_A CONVST_B的波形是没问题的。
    void CollectData(uint16_t* ad_data)
    {
    uint8_t i;
    uint16_t data;
    SetADS8556Pin(ADS8556_PIN_CONVSTA);
    SetADS8556Pin(ADS8556_PIN_CONVSTB);

    while(!ReadADS8556Pin(ADS8556_PIN_BUSY));
    while(ReadADS8556Pin(ADS8556_PIN_BUSY));

    ResetADS8556Pin(ADS8556_PIN_CS);
    for(i=0; i<4; i++)
    {
    ResetADS8556Pin(ADS8556_PIN_RD);
    DelayNop(10);
    data = ReadADS8556Data();
    *(ad_data + i) = data;
    SetADS8556Pin(ADS8556_PIN_RD);
    DelayNop(5);
    }
    SetADS8556Pin(ADS8556_PIN_CS);
    ResetADS8556Pin(ADS8556_PIN_CONVSTA);
    ResetADS8556Pin(ADS8556_PIN_CONVSTB);
    }

回帖(2)

杨帆

2025-1-4 10:34:45
是CONVST_A CONVST_B两个PIN没有接在一起,而已两条语句分别拉高这两个脚,不满足数据手册的两脚最大拉高时间差4ns。将两个脚焊在一起就好了。
举报

任凭风吹

2025-1-6 11:13:27
根据您的描述,您在使用ADS8556和STM32F407采集信号数据时遇到了数据错乱的问题。以下是一些可能的原因和解决方案:

1. 时序问题:请检查您的代码中的时序是否正确。确保在读取数据之前,ADS8556已经完成了数据转换。您可以通过添加一些延时来调整时序。

```c
void CollectData(uint16_t* ad_data) {
    uint8_t i;
    uint16_t data;

    SetADS8556Pin(ADS8556_PIN_CONVSTA);
    SetADS8556Pin(ADS8556_PIN_CONVSTB);
    while(!ReadADS8556Pin(ADS8556_PIN_BUSY));
    while(ReadADS8556Pin(ADS8556_PIN_BUSY));

    // 添加延时,确保数据转换完成
    for (i = 0; i < 100; i++) {
        __NOP();
    }

    ResetADS8556Pin(ADS8556_PIN_CONVSTA);
    ResetADS8556Pin(ADS8556_PIN_CONVSTB);

    for (i = 0; i < 4; i++) {
        SetADS8556Pin(ADS8556_PIN_CONVSTA);
        SetADS8556Pin(ADS8556_PIN_CONVSTB);
        while(!ReadADS8556Pin(ADS8556_PIN_BUSY));
        while(ReadADS8556Pin(ADS8556_PIN_BUSY));

        // 读取数据
        data = ReadDataFromADS8556();

        ad_data[i] = data;

        ResetADS8556Pin(ADS8556_PIN_CONVSTA);
        ResetADS8556Pin(ADS8556_PIN_CONVSTB);
    }
}
```

2. 多路复用问题:由于您使用的是并口16位传输硬件模式,可能存在多路复用问题。请检查您的硬件连接是否正确,确保每个通道的信号线都连接到了正确的引脚。

3. 干扰问题:请检查您的电源和地线是否接地良好,以减少干扰。此外,您可以尝试使用屏蔽线来连接ADS8556和STM32F407,以减少信号干扰。

4. 代码问题:请检查您的代码是否有错误,例如在读取数据时是否正确地处理了16位数据。以下是读取数据的示例代码:

```c
uint16_t ReadDataFromADS8556() {
    uint16_t data = 0;
    uint8_t high_byte, low_byte;

    // 读取高8位
    high_byte = ReadADS8556Pin(ADS8556_PIN_D0) |
                (ReadADS8556Pin(ADS8556_PIN_D1) << 1) |
                (ReadADS8556Pin(ADS8556_PIN_D2) << 2) |
                (ReadADS8556Pin(ADS8556_PIN_D3) << 3) |
                (ReadADS8556Pin(ADS8556_PIN_D4) << 4) |
                (ReadADS8556Pin(ADS8556_PIN_D5) << 5) |
                (ReadADS8556Pin(ADS8556_PIN_D6) << 6) |
                (ReadADS8556Pin(ADS8556_PIN_D7) << 7);

    // 读取低8位
    low_byte = ReadADS8556Pin(ADS8556_PIN_D8) |
               (ReadADS8556Pin(ADS8556_PIN_D9) << 1) |
               (ReadADS8556Pin(ADS8556_PIN_D10) << 2) |
               (ReadADS8556Pin(ADS8556_PIN_D11) << 3) |
               (ReadADS8556Pin(ADS8556_PIN_D12) << 4) |
               (ReadADS8556Pin(ADS8556_PIN_D13) << 5) |
               (ReadADS8556Pin(ADS8556_PIN_D14) << 6) |
               (ReadADS8556Pin(ADS8556_PIN_D15) << 7);

    // 组合高8位和低8位
    data = (high_byte << 8) | low_byte;

    return data;
}
```

请尝试以上建议,希望能够帮助您解决问题。如果问题仍然存在,请提供更多详细信息,以便我们进一步分析。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分