新聞中心

        EEPW首頁 > 測試測量 > 設計應用 > 測量差分輸出、電流模式數/模轉換器(DAC)的線性度

        測量差分輸出、電流模式數/模轉換器(DAC)的線性度

        作者: 時間:2017-02-27 來源:網絡 收藏




        表3. 5-4-3體系結構的12位編碼組



        定義了編碼組后,必須解決采集測量點的問題。適合這類測量的萬用表是Agilent? 3458,分辨率高達8.5位。該表連接在MAX5891的OUTP和OUTN端之間,輸出端以50Ω負載接地。當DAC設置為20mA滿量程電流時,萬用表輸入得到的電壓擺幅是±1V。

        萬用表量程設置為固定的1.2V,使用最大分辨率,得到10nV最小測量結果。切換表的量程會增大測量值的增益誤差;因此,使用單電壓量程可以避免其他的誤差源。由于需要鎖存數字輸入,MAX5891還需要時鐘信號。一旦連接好了萬用表、時鐘源、電源和數字輸入控制,就可以采集線性度測量點。

        采集所有測量點后,需要畫出重建后的DAC輸出傳輸函數。由于對每一電流源都進行了測量,很容易產生對應于所有編碼的傳輸函數。例如,考慮器件的4個LSB。我們測量編碼0x8000、0x8001、0x8002、0x8004和0x8008。對于編碼0x8000,LSB計算的基準是DAC量程中部。LSB權重是在0x8001測得的電壓值減去在0x8000測得的電壓值。

        在0x8001和0x8780之間測量的所有編碼采用相同的公式。0x0800到0xF800的其他點是MSB電流源,以編碼0x0000為基準進行計算。考慮編碼0x4F31作為各種電流相加的例子。

        首先,我們需要確定哪一測量點什么時候相加能夠等于實例編碼。0x4800是小于目標編碼的最大MSB。從0x4F31中減去0x4800后的余數為0x0331。編碼0x0300是可以減掉的次最大編碼(0x8300 - 0x8000),隨后是0x0030 (0x8030 - 0x8000),最后是0x0001 (0x8001 - 0x8000)。

        因此,可以采用下面的等式來表示編碼0x4F31的電壓值:

        [V(0x4800) - V(0x0000)] + [V(0x8300) - V(0x8000)] + [V(0x8030) - V(0x8000)] + [V(0x8001) - V(0x8000)](公式1)

        使用相似的等式,可以計算任意給定輸入編碼的電壓值。利用MATLAB?或Excel?軟件等工具可以很容易地計算所有編碼的電壓,重建全部的DAC傳輸。

        一旦建立了傳輸函數,就可以計算線性度。第一步是根據傳輸函數的端點計算LSB的電壓值(端點法)。

        VLSB = [V(0xFFFF) - V(0x0000)]/[2N - 1](公式2)

        其中

        N是器件分辨率 (16、14或者12位)

        V(0x0000)是測得的DAC零標輸出電壓。

        V(0xFFFF)是測得的DAC滿幅輸出電壓。

        采用下面的等式來計算任意給定編碼的INL:

        INLCODE(LSB) = [VCODE - (CODE × VLSB)]/VLSB(公式3)

        其中

        CODE是要計算的數字編碼。

        VLSB是公式2中計算的電壓值。

        VCODE是計算的DAC輸出電壓值。

        下面的等式用于計算任意給定編碼的DNL:

        DNLCODE(LSBs) = [VCODE - VCode-1 - VLSB]/VLSB(公式4)

        其中

        CODE是要計算的數字編碼。

        VCODE是針對CODE計算的DAC輸出電壓值。

        VCODE-1是針對CODE - 1計算的DAC輸出電壓值。

        VLSB是公式2中計算的電壓值。

        以下舉例說明利用MATLAB腳本計算MAX5889、MAX5890和MAX5891的線性度。每次計算都得到最小和最大DNL和INL誤差編碼和誤差值。實例還為所有編碼畫出了傳輸函數,得到INL和DNL。要求用戶輸入前面表格中所列出編碼的電壓測量值。必須按照所列順序輸入數值。

        計算16位線性度的MATLAB腳本

        function Lin16(Measurements)
        %Calculate INL and DNL of a 16-bit device with a 5-4-3-4 segmentation architecture
        % DACCodes is the range of possible input data to the 16-bit DAC
        DACCodes=[0:65535]’;
        %VOUT for each code is calculated from the measured points
        %create a VOUT variable and fill it with zeros
        VOUT=zeros(size(DACCodes));
        %The first measurement is the zero-scale point, or code (0x0000)
        ZS=Measurements(1);
        VOUT(1)=ZS;
        %The last measurement is the full-scale point, or code (0xFFFF)
        FS=Measurements(length(Measurements));
        VOUT(65536)=FS;
        %Midscale is stored at position 43 of the input data array
        MS=Measurements(43);
        %The device has four segmentation levels
        Segments=4;
        %The decimal values for the LSB codes are 1, 2, 4 and 8
        Seg1Codes=[1;2;4;8];
        %The voltages for the LSBs are in positions 2-5 of the input array
        for i=1:4
        Seg1V(i)=Measurements(i+1)-MS;
        end
        %The second level of segmentation is controlled with input codes 16 through
        %112 in steps of 16. Create the code array and fill the measurements for
        %this segmentation level
        Seg2Codes=[16:16:16*7]’;
        for i=1:7
        Seg2V(i)=Measurements(i+5)-MS;
        end
        %Segmentation level 3 uses input codes 128 through 1920 in steps of 128.
        %Create the code array and fill the measurements array.
        Seg3Codes=[128:128:128*(2^4-1)]’;
        for i=1:15
        Seg3V(i)=Measurements(i+12)-MS;
        end
        %Segmentation level 3 uses input codes 2048 through 63,488 in steps of 2048.
        %Create the code array and fill the measurements array.
        Seg4Codes=[2048:2048:2048*(2^5-1)]’;
        for i=1:31
        Seg4V(i)=Measurements(i+27)-ZS;
        end
        %The endpoints have been defined, now fill in the voltages for the
        %remaining points of the DAC transfer function.
        for i = 2:65535
        targetcode=i-1;
        VOUT(i)=ZS;
        for s=31:-1:1
        if Seg4Codes(s)<=targetcode
        targetcode=targetcode-Seg4Codes(s);
        VOUT(i)=VOUT(i)+Seg4V(s);
        s=0;
        end
        end
        for s=15:-1:1
        if Seg3Codes(s)<=targetcode
        targetcode=targetcode-Seg3Codes(s);
        VOUT(i)=VOUT(i)+Seg3V(s);
        s=0;
        end
        if targetcode==0
        s=0;
        end
        end
        for s=7:-1:1
        if Seg2Codes(s)<=targetcode
        targetcode=targetcode-Seg2Codes(s);
        VOUT(i)=VOUT(i)+Seg2V(s);
        s=0;
        end
        if targetcode==0
        s=0;
        end
        end
        if targetcode==0
        s=0;
        end
        for s=4:-1:1
        if Seg1Codes(s)<=targetcode
        targetcode=targetcode-Seg1Codes(s);
        VOUT(i)=VOUT(i)+Seg1V(s);
        end
        end
        end
        %Plot the transfer function
        figure(1)
        plot(DACCodes, VOUT);
        xlabel(‘DAC Input Code’);
        ylabel(‘Measured Voltage’);
        axis([0 65536 -1.1 1.1]);
        title(‘DAC Transfer Function’);
        set(gca,’XTick’,0:16384:65536)
        %Calculate the linearity
        LSB=(max(VOUT)-min(VOUT))/65535;
        INL(1)=0;
        DNL(1)=0;
        for i=2:65536
        INL(i)=(VOUT(i)-(VOUT(1)+(i-1)*LSB))/LSB;
        DNL(i)=(VOUT(i)-VOUT(i-1)-LSB)/LSB;
        end
        %Plot INL
        figure(2)
        plot(DACCodes, INL);
        title(‘DAC Integral Linearity’);
        xlabel(‘DAC Input Code’);
        ylabel(‘INL (LSBs)’);
        axis([0 65536 min(INL)*1.1 max(INL)*1.1]);
        set(gca,’XTick’,0:16384:65536)
        %Plot DNL
        figure(3)
        plot(DACCodes, DNL);
        title(‘DAC Differential Linearity’);
        xlabel(‘DAC Input Code’);
        ylabel(‘DNL (LSBs)’);
        axis([0 65536 min(DNL)*1.1 max(DNL)*1.1]);
        set(gca,’XTick’,0:16384:65536)
        txtstr=sprintf(‘INL MAX = %f’, max(INL));
        disp (txtstr);
        txtstr=sprintf(‘INL MIN = %f’, min(INL));
        disp (txtstr);
        txtstr=sprintf(‘DNL MAX = %f’, max(DNL));
        disp (txtstr);
        txtstr=sprintf(‘DNL MIN = %f’, min(DNL));
        disp (txtstr);






        16位腳本產生的曲線


        上一頁 1 2 下一頁

        關鍵詞: 測量DAC電

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 江城| 七台河市| 大庆市| 海淀区| 姜堰市| 红桥区| 井冈山市| 南宫市| 大渡口区| 金华市| 威信县| 乌兰浩特市| 库尔勒市| 广饶县| 徐闻县| 三原县| 威信县| 白玉县| 六枝特区| 勐海县| 炉霍县| 许昌市| 化德县| 成安县| 类乌齐县| 尉氏县| 苏尼特左旗| 集安市| 清原| 长垣县| 泰顺县| 镇坪县| 黎川县| 临西县| 光泽县| 安乡县| 彭阳县| 诸城市| 蓬溪县| 正宁县| 阳曲县|