矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
楼主: abbey_tom

24bitADC芯片ADS1256的测量精度

[复制链接]
     
发表于 2022-4-10 11:48:45 | 显示全部楼层
本帖最后由 xjw01 于 2022-4-10 12:00 编辑
abbey_tom 发表于 2022-4-10 06:53
其实并没有您想像中的那么糟糕,
其实在测电池电压的时候,
噪声也就在两三个微伏的样子。


你这个还可以的。网络上,有个玩8位半的制作,他做的ADS1256,噪声摆幅6uV以上

http://www.javashuo.com/article/p-wwfitglj-hu.html

不少玩高位表的,理论搞了一堆,实际制作时,却不是那么回事。也就是说,他们认为的关键点,往往是臆测的。比如,大量钽电容可以降低噪声,到底降了多少,没有具体描述,事实是,最后的噪声6uV以上。
wash讲的那些,是比较实的。早年,曾和他一起玩过这类ADC,他测试到的结果,与我测到的基本相似。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2022-4-10 12:00:20 | 显示全部楼层
本帖最后由 abbey_tom 于 2022-4-10 12:02 编辑
xjw01 发表于 2022-4-10 11:48
你这个还可以的。网络上,有个玩8位半的制作,他做的ADS1256,噪声摆幅10uV

http://www.javashuo.co ...


刚截图了一下40mV测试的统计结果
录得30Sa    p-p:  0.6uV
40mV统计测试.jpg
回复 支持 反对

使用道具 举报

     
发表于 2022-4-10 12:26:31 | 显示全部楼层
abbey_tom 发表于 2022-4-10 06:53
其实并没有您想像中的那么糟糕,
其实在测电池电压的时候,
噪声也就在两三个微伏的样子。

这还差不多,你之前说有 10uV 所以我问你是怎么得到这个结果的 这个结果比官方指标差太多了。

3uVpp 左右,和我用 1232 测南孚电池结果一致,比官方数据大,可能是系统问题或鸡肫问题就再说了,起码你的结果和我的结果一致,你再测测输入噪声(输入短路)是多大看看。

回复 支持 反对

使用道具 举报

     
发表于 2022-4-10 12:29:44 | 显示全部楼层
abbey_tom 发表于 2022-4-10 09:22
您这个是什么意思?
fOut = fOut / Gainerr - Offseterr
除以增益减去偏差?

Gainerr 不是 PGA 值,是鸡肫(以及 1232 自身)的增益误差(相对于 1V 标准源的误差),是一个来自外部的参数,这里你可以不管它。

回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2022-4-10 13:10:05 | 显示全部楼层
本帖最后由 abbey_tom 于 2022-4-10 13:11 编辑
washu 发表于 2022-4-10 12:29
Gainerr 不是 PGA 值,是鸡肫(以及 1232 自身)的增益误差(相对于 1V 标准源的误差),是一个来自外部 ...


最新测试截图
40mV源,PGA=32,2.5Sps
50样本重复测试(录得最低pp=0.6uV)

50样本统计多次重复.jpg
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2022-4-10 13:20:00 | 显示全部楼层
washu 发表于 2022-4-10 12:26
这还差不多,你之前说有 10uV 所以我问你是怎么得到这个结果的  这个结果比官方指标差太多了。

3u ...

短路测试截图
短路统计测试.jpg
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2022-4-10 13:21:46 | 显示全部楼层
本帖最后由 abbey_tom 于 2022-4-10 13:31 编辑
washu 发表于 2022-4-10 12:29
Gainerr 不是 PGA 值,是鸡肫(以及 1232 自身)的增益误差(相对于 1V 标准源的误差),是一个来自外部 ...


测量40mV源,
试着改变PGA=1、2、4……64
测量结果均为40mV
这个我始终搞不懂,
按我的理解,
40mV经过设PGA=4后应该是160mV送给ADC的采样器,
ADC的结果应该是160mV才是,
事实是AD的变换结果仍是40mV,
好像这个片子是自动的,
变换成160mV的值之后,
自动再除以4后输出。
完全把用户当成傻瓜型的了,
并且看噪声也没有什么明显的变化。
回复 支持 反对

使用道具 举报

     
发表于 2022-4-10 15:38:45 | 显示全部楼层
abbey_tom 发表于 2022-4-10 13:21
测量40mV源,
试着改变PGA=1、2、4……64
测量结果均为40mV

去看看你的单片机代码,结果转换为mv时已经除以PGA了。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2022-4-10 16:01:00 | 显示全部楼层
chhds 发表于 2022-4-10 15:38
去看看你的单片机代码,结果转换为mv时已经除以PGA了。

我编的代码,
我还不知道吗
回复 支持 反对

使用道具 举报

     
发表于 2022-4-10 16:20:25 | 显示全部楼层

PGA=?速度=?

我前面 1.7uVpp 是 PGA=1 测试的(速度 10Sa/s,1232 不能更慢),如果也是,那么 1232 和 1256 还真没啥差别(噪声)啊
回复 支持 反对

使用道具 举报

     
发表于 2022-4-10 18:48:10 | 显示全部楼层
abbey_tom 发表于 2022-4-10 16:01
我编的代码,
我还不知道吗

你确认所有代码都是你自己编的?

芯片返回的是24位二进制值,需要转换才得mV值

QQ截图20220410184050.jpg
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2022-4-10 19:29:35 | 显示全部楼层
chhds 发表于 2022-4-10 18:48
你确认所有代码都是你自己编的?

芯片返回的是24位二进制值,需要转换才得mV值

这也正是我疑惑的地方,
代码虽有芯片的读写时序部分不是我自己编的,
但这部分没有多少,
我基本都读懂了。
芯片返回的是24位二进制值,
需要转换才得mV值,
这个在我的主程序中,
见46楼所贴代码的第一句,
您画圈的这个公式,
当Vref=2.5V,PGA=1时,
每BIT=0.596046447753906uV,
由返回的是24位二进制值,可正常转换成mV
可问题是我可以命令芯片的PGA=2、4……64
按道理这个系数应该分别再除以2、4……64
但我只有仍维持系数不变才能得到正确的毫伏值。


回复 支持 反对

使用道具 举报

     
发表于 2022-4-10 19:55:03 | 显示全部楼层
abbey_tom 发表于 2022-4-10 19:29
这也正是我疑惑的地方,
代码虽有芯片的读写时序部分不是我自己编的,
但这部分没有多少,

我使用一个函数转换

QQ截图20220410195004.jpg

你把芯片传回来的二进制数传到PC,看看是否大了PGA倍,如果不是,则应该是放大倍数设置没有成功。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2022-4-10 20:47:36 | 显示全部楼层
本帖最后由 abbey_tom 于 2022-4-10 20:50 编辑
chhds 发表于 2022-4-10 19:55
我使用一个函数转换



我是这样想的,
PGA=1时,
我所有的代码均正常,
包括24BIT读入主程序正常,
乘一个系数(令PGA=1)时也得到正确的电压值。
而同样的代码令PGA=2或其它时,
这个系数无须变化才能得到正确的电压值。
无须看传回的二进制,
必然与PGA=1时是一样的。

正如您所分析的那样,
有一个原因可导致如此,
那就是PGA设置没有起作用。

但是控制芯片的那些代码超级简单,
是在芯片初始化时完成的。
代码如下(是商家的演示代码):
//初始化ADS1256
void ADS1256_Init(void)
{
        ADS1256WREG(ADS1256_STATUS,        0x06);               // 高位在前、校准、使用缓冲
        ADS1256WREG(ADS1256_ADCON,        ADS1256_GAIN_64);                // 设置PGA
        ADS1256WREG(ADS1256_DRATE,        ADS1256_DRATE_2_5SPS);  // 数据速率
        ADS1256WREG(ADS1256_IO,        0x00);               
}
就是写内部寄存器预置PGA而已,
其它代码均与此无关了(也总共没有多少)
假如像您所说的(我也这么怀疑过),
PGA设置没有起作用,
但同时发出的指令,改变速率却表现非常正常。
没有道理第二句没有起作用,
而第三句却起作用了。

附上有关代码:您抽空指导一下,谢谢。


ADS1256.rar

4.06 KB, 下载次数: 77

回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2022-4-11 13:23:55 | 显示全部楼层
chhds 发表于 2022-4-10 18:48
你确认所有代码都是你自己编的?

芯片返回的是24位二进制值,需要转换才得mV值

已经找到问题之所在了,
那段初始化代码

void ADS1256_Init(void)
{
         ADS1256WREG(ADS1256_STATUS,        0x06);               // 高位在前、校准、使用缓冲
        ADS1256WREG(ADS1256_ADCON,        ADS1256_GAIN_64);                // 设置PGA
         ADS1256WREG(ADS1256_DRATE,        ADS1256_DRATE_2_5SPS);  // 数据速率
        ADS1256WREG(ADS1256_IO,        0x00);               
}

由于STM32速度太快,
使得ADS1256在两个写寄存器指令之间没有来得及反应,
设置PGA指令没有起作用。
现在在写寄存器指令之间,
增加10us的延时就可以了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2025-4-26 13:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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