不同位数的R2R DAC的性能测试

文章详细描述了一名技术专家对15位R2R电阻梯形DAC的线性精度进行实验,通过不同输出通道的测试,发现线性误差在通道数11时达到峰值,随后递减,平均误差保持在较低水平。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

02:39\\\\\\\\\\\\\\\\r\\\\\\\\\\\\\\\\n不同位数DAC线性精度

AD\Test\2024\March\R2RF40110K.SchDoc
D:\zhuoqing\window\ARM\Keil\STM32\Test\2024\March\R2RF40110k\Core\Src\main.c

 

01 R2RDAC的性能


一、前言

  前几天, 使用 千分之一精度的电阻, 搭建了 R2R 梯形电阻 DAC电路,  通过实测, 电路达到了 12bit 的线性精度。  下面, 我思考一个问题,  那就是, 如果降低 R2R 的阶次, 比如降低到 12bit,  那么它的线性精度是多少呢? 下面通过实验, 或者相应的数据, 来尝试给出这个问题的解答。

GM1712062439_1920_1080.MP4|_-5

▲ 图1.1.1 测试电路原理图

▲ 图1.1.1 测试电路原理图

▲ 图1.1.2 测试电路PCB

▲ 图1.1.2 测试电路PCB

二、测试结果

  通过编程, 测量DAC通道从 1 变化到15,  对应每个DAC输出对应的输出电压。 通过 DM3068记录每种通道个数 最多128 个测量数据。  这个过程虽然是程序自动完成, 但是还是耗费了我 今天上午将近 半个小时的测量时间。 对于每组数据计算 线性误差曲线, 这是计算结果, 可以看到, 随着输出通道的数量的提高, 线性误差曲线也逐步减小。 当输出通道达到 15 时, 也就是图表中最长的那组数据, 可以看到它对应的误差最小。

GM1712104957_1920_1080.MP4|_-4

▲ 图1.2.1 不同的通道与误差曲线

▲ 图1.2.1 不同的通道与误差曲线

#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# TEST1.PY                     -- by Dr. ZhuoQing 2024-04-03
#
# Note:
#============================================================

from headm import *
from tsmodule.tsstm32       import *
from tsmodule.tsvisa        import *

dm3068open()

for b in range(15):
    stm32cmd("ch %d"%(b+1))
    time.sleep(.2)

    npzname = 'ch%02d'%(b+1)
    vdim = []
    nrange = 2**(b+1)

    if nrange <= 128: ddim = arange(nrange)
    else:
        ddim = arange(128) * (nrange/128)

    printf(ddim)

    vdim = []

    for d in ddim:
        stm32cmd("dac %d"%d)
        time.sleep(1.5)
        v = dm3068vdc()
        vdim.append(v)
        tspsave(npzname, ddim=ddim, vdim=vdim)

        printff(b+1, d, v)

#------------------------------------------------------------


#------------------------------------------------------------

printf("\a")




#------------------------------------------------------------
#        END OF FILE : TEST1.PY
#============================================================
#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# TEST2.PY                     -- by Dr. ZhuoQing 2024-04-03
#
# Note:
#============================================================

from headm import *
from scipy.optimize        import curve_fit

def linefun(x, a, b):
    return a*x + b


#------------------------------------------------------------

maxerr = []
stderr = []


for c in range(15):
    npzfile = 'ch%02d'%(c+1)
    ddim, vdim = tspload(npzfile, 'ddim', 'vdim')

#    printf(vdim, ddim)

    param = (1/(2**c), 0)
    param, conv = curve_fit(linefun, ddim, vdim, p0=param)
#    printf(param)

    vfit = linefun(ddim, *param)
    err = [v1-v2 for v1,v2 in zip(vdim, vfit)]


    errmax = max(abs(array(err)))
    errstd = std(err)

    printf(c+1, max(abs(array(err))), std(err))

    maxerr.append(errmax)
    stderr.append(errstd)


    plt.plot(ddim, err, lw=3, label='CH=%d'%(c+1))

    plt.xlabel("DAC")
    plt.ylabel("Error(V)")
    plt.grid(True)
    plt.tight_layout()



#    plt.show()



#    break

#------------------------------------------------------------

tspsave('err', maxerr=maxerr, stderr=stderr)

printf(maxerr, stderr)
plt.legend(loc='upper right')
plt.show()


#------------------------------------------------------------
#        END OF FILE : TEST2.PY
#============================================================

  但是, 将上面测量不同DAC 通道下, 误差的最大值 和 标准方差绘制出来, 情况有了变化。  线性误差的最大值是青色曲线,  下面是线性误差的均方根。  可以看到, 线性误差在 DAC 通道数为 11 的时候, 达到峰值, 然后又随着通道数增加而下降。  对于误差的均方根, 则是呈现一种平稳的态势, 也就是无论输出通道数是多少, DAC 线性误差的均方根都基本上维持在 0.5mV左右。 这个结果的确出乎我的意外。

GM1712105462_1920_1080.MP4|_-5

▲ 图1.2.2 不同的通道数对应的线性误差的最大值和标准方差

▲ 图1.2.2 不同的通道数对应的线性误差的最大值和标准方差

#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# TEST3.PY                     -- by Dr. ZhuoQing 2024-04-03
#
# Note:
#============================================================

from headm import *

maxerr, stderr = tspload('err', 'maxerr', 'stderr')

plt.plot(arange(len(stderr))+1, maxerr, lw=3, label="MAX ERROR")
plt.plot(arange(len(stderr))+1, stderr, lw=3, label='STD')


plt.xlabel("CH(N)")
plt.ylabel("ERROR")
plt.grid(True)
plt.legend(loc="upper right")
plt.tight_layout()
plt.show()





#------------------------------------------------------------
#        END OF FILE : TEST3.PY
#============================================================
maxerr=[0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00]
stderr=[0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00]

 

  结 ※


  天一大早对前几天制作的 15bit 电阻 R2R DAC的线性误差进行了测量,  虽然都是 千分之一精度的电阻,  但是选择了不同的输出通道数,  对应的线性误差的均方根却是大体相同的。 这是实验测量的结果, 后面有时间再进行理论分析吧。 今天是清明节前一天, 上午 还有课程, 待会儿去上课。

GM1712105727_1920_1080.MP4|_-4


■ 相关文献链接:

● 相关图表链接:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卓晴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值