cxc168 发表于 2025-1-3 11:24

读出数据失真问题

本帖最后由 cxc168 于 2025-1-3 11:30 编辑

之前一直以为是运放或者ADC电路问题,但随着分析发现并不是,因此开新贴讨论。

原贴:https://bbs.21ic.com/icview-3424214-3-1.html?#pid14410842

---

**环境:**

使用的ADC芯片:AD7685BRM

同总线挂载的SPI芯片:AD7685BRM、TPL0501-100DCNR

总线上拉电压:5V

总线从器件到MCU:15cm

其他:总线使用2x5p的线,此外有vcc/gnd/片选信号同属一条线缆(双排母)。

---

**现象:**

输入ADC的波形正常,但是MCU从SPI读回的数据有问题,曲线显示异常。

---

图一:输入ADC的波形

![进入ADC的波形.PNG](data/attachment/forum/202501/03/110943zyy162z1h1306u01.png "进入ADC的波形.PNG")

---

图二:MCU从SPI读出的数据

![从SPI读出的波形.png](data/attachment/forum/202501/03/111157feemi99t2585pi5j.png "从SPI读出的波形.png")

---

图三:SDIO波形1

!(data/attachment/forum/202501/03/111224o4kk1fkdfekdjel4.png "SDIO波形.PNG")

---

图三:SDIO波形2

!(data/attachment/forum/202501/03/111259g68zuh7hlakxxkhz.png "SDIO波形2.PNG")

---

图四:SDIO波形3

!(data/attachment/forum/202501/03/111336hr18416kkeiz688w.png "SDIO波形放大3.PNG")

问题似乎出现在SPI总线上,只要合适的晃动或者摆放SPI线,就有几率得到平滑的双峰曲线,另外,使输入的ADC波形幅值减小,100%能够得到光滑的双峰曲线。

图六:光滑曲线

![微信截图_20250103112103.png](data/attachment/forum/202501/03/112113hbc5j9kzbyzkkbol.png "微信截图_20250103112103.png")

想不明白的是:

1.为什么输入信号变小了反而不会出现曲线异常,但大信号的时候ADC输入波形没有问题,那么是触发了ADC的什么问题呢?

2.SDIO的波形为什么在1V左右出现了方波突然升到5V左右又有方波?SPI总线是上拉5V了。

3.SDIO的这种有干扰的方波滤除后是否能解决?

cxc168 发表于 2025-1-3 11:26

本帖最后由 cxc168 于 2025-1-3 11:28 编辑

```c
void AD7685_GetSSP0Data(uint32_t *Data)
{
        // 连续采集SSP0_CYCLE_NUM=8次,将8次相加作为最终的采集值
        uint8_t i;
        *Data = 0;
        for (i = 0; i < SSP0_CYCLE_NUM; i++)
        {
                /* 启动转换 */
                SSP0_SSEL = 1;
                Timer1_us(5);
                SSP0_SSEL = 0;
                *Data += AD7685_SendSSP0Data();
                Timer1_us(5);
        }

        //        *Data >>= 1;
        *Data = (*Data > 0) ? *Data : 1;
}
```

补充代码,按照芯片要求给足了转换时间和采集间隔。

当然AD7685_SendSSP0Data函数返回类型是uint16_t,是符合16位返回数据大小的。

xionghaoyun 发表于 2025-1-4 08:42

学习一下

zyj9490 发表于 2025-1-4 10:29

串扰这么严重,每个信号线用地线进行隔离。

sandseas 发表于 2025-1-4 14:08

SPI总线一般不需要上下拉啊,你还是上个数字电路图吧,你这信号质量有点不忍直视,串扰太严重

sandseas 发表于 2025-1-4 14:16

你的数字电源和模拟电源网络也可能有问题

cxc168 发表于 2025-1-4 21:07

zyj9490 发表于 2025-1-4 10:29
串扰这么严重,每个信号线用地线进行隔离。

是的,现在基本上可以确认是串扰导致的采集问题。目前尝试的办法确实都能解决。改电路板的话,要对走线有更多的要求了。目前的想法是增加RC滤波,以及信号线包地处理,因为这一路径只有DIO和CLK是方波信号,其他信号线都是片选用的。

cxc168 发表于 2025-1-4 21:12

sandseas 发表于 2025-1-4 14:08
SPI总线一般不需要上下拉啊,你还是上个数字电路图吧,你这信号质量有点不忍直视,串扰太严重 ...

这是电路原理图,两个SPI挂在同一个总线上,由于ADC是只读,数字电位器是只写,我把MOSI和MISO共用了,在逻辑上它们不会同时启用。即先写数字电位器,然后才读ADC。另外SPI线共计5条,其中2条片选,5条线附近没有其他信号线,只有电源和地,然后直连MCU,距离有15cm长,通过端子线连接的。我看了下以前的设计,我在SPI端子线两边都加了GND,这次没有做这个,即FPC两个GND中间走CLK和SDI线,【GND、CLK、SDI、GND】这样,没有问题,波形正常。

现在不改电路板情况下,只能外加RC滤波,或者用GND线包裹一下。后续改版的话,在电路上增加RC滤波,以及走线上加入GND包裹,应该可以解决。

cxc168 发表于 2025-1-4 21:16

sandseas 发表于 2025-1-4 14:16
你的数字电源和模拟电源网络也可能有问题

模拟电源和数字电源是隔离的,GND也是,在ADC芯片下方做了分割。目前确定是SPI串扰问题,而且非常严重。那边的应该没什么问题,因为ADC得到的信号曲线重复性很好,至于输入ADC的波形有尖峰,这个想了挺多办法效果都不太好,只能是数字滤波了,这是光电二极管出来的信号。

cxc168 发表于 2025-1-4 21:33

zyj9490 发表于 2025-1-4 10:29
串扰这么严重,每个信号线用地线进行隔离。

这是PCB层面的走线

Siderlee 发表于 2025-1-4 23:53

两层的板子?没有专门的地层?

Jack315 发表于 2025-1-5 07:26

【建议】
1. ADC 前应有专门设计的抗混叠滤波器。
2. 数字信号的 PCB 走线尽可能短,必要时可能还需要改善 EMC 效果的设计。
3. 数字电路电源 (VDD, DGND) 和模拟电路电源 (VCC, AGND) 在 PCB 上全部分开、单独走线,在电源的输出端处合并。

(高频的)数字信号是强烈的干扰源,在 PCB 上应尽可能缩小散布范围。

zyj9490 发表于 2025-1-5 08:51

本帖最后由 zyj9490 于 2025-1-5 08:57 编辑

cxc168 发表于 2025-1-4 21:33
这是PCB层面的走线
发现严重的问题,SPI线夸层布线,本来分开GND与AGND二个地平面。因此高频回流要流进大环路啊,大忌。SPI作为数字信号,下层作为回流信GND地平面,怎么大部分都在AGND平面呢?

sandseas 发表于 2025-1-5 17:57

cxc168 发表于 2025-1-4 21:16
模拟电源和数字电源是隔离的,GND也是,在ADC芯片下方做了分割。目前确定是SPI串扰问题,而且非常严重。 ...

没看到你的隔离方式是什么样的,但看你贴的一部分原理图和PCB好像并没有采用隔离器件,不方便贴整体原理图的话,贴一个系统框图看一下

qinlu123 发表于 2025-1-6 08:38

你是DCDC供电吧,噪声咋这么大,再一个把SDIO总线上的上下拉电阻都拆了,SPI、SDIO这种总线设计就是为了每根数据线都是高阻状态没有电流流动,你装上上拉电阻后就会有高频电流流过ADC芯片。

qinlu123 发表于 2025-1-6 08:48

再有就是模拟电路要做成孤岛形式,也就是说模拟电路的GND只有一个点和主GND连接,就和一个孤岛一样只有一条路和外界相通,这样就可以避免外界的GND回流电流流过模拟区。

丙丁先生 发表于 2025-1-6 09:50

感谢分享

Jack315 发表于 2025-1-12 06:23

还有一点是关于电源的:
如果用了 DC-DC 电源,其中的电感要用磁路闭合的那种。
否则由电感通过开放的磁场会造成严重的噪声干扰,如工字电感。

zchong 发表于 2025-1-12 08:40

完整地平面可以解决大部分问题,并且拿不准的情况下不要区分模拟地和数字地,尽量让这两部分不要交叉即可。

GlenX 发表于 2025-1-22 14:02

感觉你的不够,应大于要求的采样时间并右余量,否则打信号猜不到或消顶。
转换时间不够会带来结果异常。
页: [1]
查看完整版本: 读出数据失真问题