二、推导过程
天生DAC理论公式还是利用上午的 LCA 软件包,只是将器电路构造增加到 15个通道。这是LCA 绘制的R2R 电阻DAC的电路图。之后,它天生了末了电路的输出的解析表达式。这个求解过程打算机花费了 10分钟旁边。
▲ 图1.2.1 15bitDAC构造

将 LCA推导出 输出电压的公式,转换成了 Python 程序。这样可以打算出在不同的 DAC 数值情形下,电阻网络的输出。可以看到,在 R1,R2分别为 10k,20k欧姆的情形下,输出电压与DAC 数值之间呈现严格的线性关系。这是输出电压与DAC理论值之间的偏差,除了由于打算机浮点精度所引起的眇小偏差之外,公式搜得到的数值与理论值是相同的。
#!/usr/local/bin/python# -- coding: gbk --## TEST3.PY - by Dr. ZhuoQing 2024-04-03## Note:#from headm import def Dr1r2(R1,R2): return 2R114 + 55R113R2 + 676R112R22 + 4900R111R23 + 23276R110R24 +\ 76153R19R25 + 175560R18R26 + 286824R17R27 + 329460R16R28 +\ 260338R15R29 + 136136R14R210 + 44200R13R211 + 8008R12R212 + 665R1R213 + 16R214def N1(R1,R2): return R214def N10(R1,R2): return (2R19R25 + 33R18R26 + 225R17R27 + 819R16R28 + 1716R15R29 + 2079R14R210 + 1386R13R211 + 450R12R212 + 54R1R213 + R214)def N11(R1,R2): return (2R110R24 + 37R19R25 + 289R18R26 + 1240R17R27 + 3185R16R28 + 5005R15R29 + 4719R14R210 + 2508R13R211 + 660R12R212 + 65R1R213 + R214)def N12(R1,R2): return (2R111R23 + 41R110R24 + 361R19R25 + 1785R18R26 + 5440R17R27 + 10556R16R28 + 13013R15R29 + 9867R14R210 + 4290R13R211 + 935R12R212 + 77R1R213 + R214)def N13(R1,R2): return (2R112R22 + 45R111R23 + 441R110R24 + 2470R19R25 + 8721R18R26 + 20196R17R27 + 30940R16R28 + 30888R15R29 + 19305R14R210 + 7007R13R211 + 1287R12R212 + 90R1R213 + R214)def N14(R1,R2): return (2R113R2 + 49R112R22 + 529R111R23 + 3311R110R24 + 13300R19R25 + 35853R18R26 + 65892R17R27 + 82212R16R28 + 68068R15R29 + 35750R14R210 + 11011R13R211 + 1729R12R212 + 104R1R213 + R214)def N15(R1,R2): return (2R114 + 53R113R2 + 625R112R22 + 4324R111R23 + 19481R110R24 + 59983R19R25 + 128877R18R26 + 193800R17R27 + 201552R16R28 + 140998R15R29 + 63206R14R210 + 16744R13R211 + 2275R12R212 + 119R1R213 + R214)def N2(R1,R2): return (2R1R213 + R214)def N3(R1,R2): return (2R12R212 + 5R1R213 + R214)def N4(R1,R2): return (2R13R211 + 9R12R212 + 9R1R213 + R214)def N5(R1,R2): return (2R14R210 + 13R13R211 + 25R12R212 + 14R1R213 + R214)def N6(R1,R2): return (2R15R29 + 17R14R210 + 49R13R211 + 55R12R212 + 20R1R213 + R214)def N7(R1,R2): return (2R16R28 + 21R15R29 + 81R14R210 + 140R13R211 + 105R12R212 + 27R1R213 + R214)def N8(R1,R2): return (2R17R27 + 25R16R28 + 121R15R29 + 285R14R210 + 336R13R211 + 182R12R212 + 35R1R213 + R214)def N9(R1,R2): return (2R18R26 + 29R17R27 + 169R16R28 + 506R15R29 + 825R14R210 + 714R13R211 + 294R12R212 + 44R1R213 + R214)#------------------------------------------------------------def DAC15(number, r1, r2): D = Dr1r2(r1,r2) Ndim = [N15(r1,r2), N14(r1,r2), N13(r1,r2), N12(r1,r2), N11(r1,r2), N10(r1,r2), N9(r1,r2), N8(r1,r2), N7(r1,r2), N6(r1,r2), N5(r1,r2), N4(r1,r2), N3(r1,r2), N2(r1,r2), N1(r1,r2)] nstr = bin(number)[2:] nstr = '0'(15-len(nstr)) + nstr number = [int(s)n/D for s,n in zip(nstr, Ndim)] return sum(number)#------------------------------------------------------------r1 = 10e3r2 = 20e3+50v = DAC15(0x8000, r1, r2)Vmax = 3.3ddim = arange(0, 0x7fff, 0x10)vdim = [DAC15(d,r1,r2)Vmax for d in ddim]odim = [dVmax/0x8000 for d in ddim]edim = [v1-v2 for v1,v2 in zip(vdim, odim)]plt.plot(ddim, edim, lw=3)plt.xlabel("DAC(N)")plt.ylabel("Voltage(V)")plt.grid(True)plt.tight_layout()plt.show()#------------------------------------------------------------printf("\a")#------------------------------------------------------------# END OF FILE : TEST3.PY#
这是将R2增加了50欧姆,仿照单片机IO口输出电阻,打算出DAC输出的偏差。可以看到这个偏差的封装还是 13mV旁边,与上午 8 通道对应的偏差是一样的。这解释 单片机 IO 口的电阻所引起的线性偏差的绝对值和通道数量是没有关系的。
▲ 图1.2.2 将 R2增加50欧之后,输出线性偏差
※总 结 ※
本文对 15 比特 电阻DAC 输出电压表达式进行了推导,通过对 R2电阻增加 50欧姆,打算出 DAC 的输出偏差,验证了 R2R 电阻网络受到 单片机IO口输出电阻的影响。偏差的大小和通道数没有关系。这里仿真Python 程序和数据可以在 CSDN 文章中找到。这为之后对 电阻DAC进一步的理论剖析打下了根本。










