找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2805|回复: 8
收起左侧

ADS1256芯片驱动多通道切换问题

[复制链接]
ID:61261 发表于 2021-10-9 13:05 | 显示全部楼层 |阅读模式
STM32F407通过SPI接口驱动ADS1256 AD芯片,经调试单通道获取AD没有问题。
从一个通道切换到另一个通道交替获取时出现问题,通道数值乱串,不知道大家是否遇到同类问题,或者有调试通过的驱动。
本人辅助调试设备有限,无法精确调试,感谢留言
回复

使用道具 举报

ID:810165 发表于 2021-10-9 17:16 | 显示全部楼层
1.在ADS1256片外要将模拟地AGND和数字地DGND连接在一起。否则,AGND和DGND之间存在电压,会使ADS1256无法正常工作。

2。在印刷电路板布线时,应将外部晶振尽可能地靠近ADS1256,否则将影响输入幅值的大小,而当幅值太小时,可以通过减小晶振两端的电容来增大其幅值,电容范围应在0~20μF,晶振为7.68MHz时,接入电容的典型值为18pF。

3。为了得到最佳的转换结果,每次改变初始寄存器值时(例如改变输入通道),最好自校准一次。而且应在改变输入通道命令后发同步命令SYNC,然后经过一段延时时再读取上次转换的结果。该延时应随着ADS1256的采样频率和滤波方式变化而变化。

4。在使用ADS1256处理微小信号时,最好采用比例测量,并应在DRDY由高变低时读取数据。
回复

使用道具 举报

ID:883242 发表于 2021-10-10 19:51 | 显示全部楼层
用过类似的ADS1xxx,通道转换先扔掉两个数据就行了。
回复

使用道具 举报

ID:61261 发表于 2022-3-8 11:12 | 显示全部楼层
Hephaestus 发表于 2021-10-10 19:51
用过类似的ADS1xxx,通道转换先扔掉两个数据就行了。

这样确实可以,还是要吐槽下这个ADC芯片,要想精度高那是慢啊
回复

使用道具 举报

ID:556497 发表于 2022-9-14 11:26 | 显示全部楼层
二、Sigma-Delta模数转换器的特点及其对驱动程序的影响
本质上说Sigma-Delta模数转换器是一个数字器件,其执行的是一个有限长冲击响应滤波器(FIR),包含一系列复杂的乘加运算,需要较长的计算时间。这一本质造成的影响包括:

1、Sigma-Delta转换器处理时间较慢,采样率较低;且存在一次转换的输出的“潜伏期”,数据手册提供的时序图如下。
2、进行通道轮换时的采样率
很多小伙伴想当然的认为在数据率寄存器(DRATE,03h)里配置的数据率就是所有情况下的采样率。其实当你知道Sigma-Delta器件内部的FIR滤波器本质时你就会知道,当你进行通道切换并重新对器件进行同步(synchronize)和唤醒(wakeup)后,转换速度会变慢。具体来讲,实际采样率和你配置的通过率之间的对应关系如数据手册中的下表所示
https://www.cnblogs.com/helesheng/p/15583047.html
回复

使用道具 举报

ID:459318 发表于 2023-1-5 18:57 | 显示全部楼层
Hephaestus 发表于 2021-10-10 19:51
用过类似的ADS1xxx,通道转换先扔掉两个数据就行了。

扔掉两个数据啥意思?
回复

使用道具 举报

ID:883242 发表于 2023-1-5 19:28 | 显示全部楼层
liruilirui 发表于 2023-1-5 18:57
扔掉两个数据啥意思?

等待数据稳定。
回复

使用道具 举报

ID:459318 发表于 2023-1-5 22:51 | 显示全部楼层

                for(ch = 0;ch <2;ch++)
                {       
                        Adc1 =  ADS1256ReadData( ch<<4|ADS1256_MUXN_AINCOM);
                        Volts1 = Adc1*.00000059453; // 0.00000059453
                        delay_ms(1000);
                        if(ch==0)
                        {                               
                        OLED_ShowNum(6,6,Volts1,4);
                        }
                        if(ch==1)
                        {                       
                        OLED_ShowNum(56,6,Volts1,4);
                        }
                }
我测2路数据,我如何扔掉数据,该咋写?
回复

使用道具 举报

ID:1057962 发表于 2023-3-14 14:33 | 显示全部楼层

               for(ch = 0;ch <2;ch++)
                 {        
                         Adc1 =  ADS1256ReadData( ch<<4|ADS1256_MUXN_AINCOM);
                         Adc1 =  ADS1256ReadData( ch<<4|ADS1256_MUXN_AINCOM);
                         Adc1 =  ADS1256ReadData( ch<<4|ADS1256_MUXN_AINCOM);
                         Volts1 = Adc1*.00000059453; // 0.00000059453
                         delay_ms(1000);
                         if(ch==0)
                         {                                
                         OLED_ShowNum(6,6,Volts1,4);
                         }
                         if(ch==1)
                         {                        
                         OLED_ShowNum(56,6,Volts1,4);
                         }
                 }
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表