读出数据失真问题
本帖最后由 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的波形

---
图二:MCU从SPI读出的数据

---
图三: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%能够得到光滑的双峰曲线。
图六:光滑曲线

想不明白的是:
1.为什么输入信号变小了反而不会出现曲线异常,但大信号的时候ADC输入波形没有问题,那么是触发了ADC的什么问题呢?
2.SDIO的波形为什么在1V左右出现了方波突然升到5V左右又有方波?SPI总线是上拉5V了。
3.SDIO的这种有干扰的方波滤除后是否能解决?
本帖最后由 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位返回数据大小的。
学习一下 串扰这么严重,每个信号线用地线进行隔离。 SPI总线一般不需要上下拉啊,你还是上个数字电路图吧,你这信号质量有点不忍直视,串扰太严重 你的数字电源和模拟电源网络也可能有问题 zyj9490 发表于 2025-1-4 10:29
串扰这么严重,每个信号线用地线进行隔离。
是的,现在基本上可以确认是串扰导致的采集问题。目前尝试的办法确实都能解决。改电路板的话,要对走线有更多的要求了。目前的想法是增加RC滤波,以及信号线包地处理,因为这一路径只有DIO和CLK是方波信号,其他信号线都是片选用的。 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包裹,应该可以解决。
sandseas 发表于 2025-1-4 14:16
你的数字电源和模拟电源网络也可能有问题
模拟电源和数字电源是隔离的,GND也是,在ADC芯片下方做了分割。目前确定是SPI串扰问题,而且非常严重。那边的应该没什么问题,因为ADC得到的信号曲线重复性很好,至于输入ADC的波形有尖峰,这个想了挺多办法效果都不太好,只能是数字滤波了,这是光电二极管出来的信号。 zyj9490 发表于 2025-1-4 10:29
串扰这么严重,每个信号线用地线进行隔离。
这是PCB层面的走线
两层的板子?没有专门的地层? 【建议】
1. ADC 前应有专门设计的抗混叠滤波器。
2. 数字信号的 PCB 走线尽可能短,必要时可能还需要改善 EMC 效果的设计。
3. 数字电路电源 (VDD, DGND) 和模拟电路电源 (VCC, AGND) 在 PCB 上全部分开、单独走线,在电源的输出端处合并。
(高频的)数字信号是强烈的干扰源,在 PCB 上应尽可能缩小散布范围。 本帖最后由 zyj9490 于 2025-1-5 08:57 编辑
cxc168 发表于 2025-1-4 21:33
这是PCB层面的走线
发现严重的问题,SPI线夸层布线,本来分开GND与AGND二个地平面。因此高频回流要流进大环路啊,大忌。SPI作为数字信号,下层作为回流信GND地平面,怎么大部分都在AGND平面呢? cxc168 发表于 2025-1-4 21:16
模拟电源和数字电源是隔离的,GND也是,在ADC芯片下方做了分割。目前确定是SPI串扰问题,而且非常严重。 ...
没看到你的隔离方式是什么样的,但看你贴的一部分原理图和PCB好像并没有采用隔离器件,不方便贴整体原理图的话,贴一个系统框图看一下 你是DCDC供电吧,噪声咋这么大,再一个把SDIO总线上的上下拉电阻都拆了,SPI、SDIO这种总线设计就是为了每根数据线都是高阻状态没有电流流动,你装上上拉电阻后就会有高频电流流过ADC芯片。 再有就是模拟电路要做成孤岛形式,也就是说模拟电路的GND只有一个点和主GND连接,就和一个孤岛一样只有一条路和外界相通,这样就可以避免外界的GND回流电流流过模拟区。 感谢分享 还有一点是关于电源的:
如果用了 DC-DC 电源,其中的电感要用磁路闭合的那种。
否则由电感通过开放的磁场会造成严重的噪声干扰,如工字电感。 完整地平面可以解决大部分问题,并且拿不准的情况下不要区分模拟地和数字地,尽量让这两部分不要交叉即可。 感觉你的不够,应大于要求的采样时间并右余量,否则打信号猜不到或消顶。
转换时间不够会带来结果异常。
页:
[1]