请教用maxim提供的程序测试DNL和INL
有没有高手告知,我把输入电平加到1.8v了,还是说ADC not clipping,我想是我输入的数据有问题,我是直接从逻辑分析仪采样的数据,二进制,十进制,无符号的十进制都试过了,还是同样的提示。本人最近刚开始做这个事情,公司内部也无人告知,愁煞人啊
我记得maxim 的 那个程序好像是10进制输入的
他说你没有clipping,很正常啊,
那个程序需要你输入sine wave,而且要有一点clipping,也就是输入信号超过full scale
产生一点点clip,
你可能需要修改一下那个matlab程序,应该就可以用了
非常不好意思,我现在才回复,我的adc的full scale是1v,可是我试过1.05v,1.15v,1.25v,1.6v,1.8v的正弦波输入都不行,另外我的adc是12位的,您看我的设置可以吗?fid=fopen(filename,'r');
numpt=32768;%input('Enter Number of Data Points:');
numbit=12;%input ('Enter ADC Resolution:');
mid_code=2048;%input('Enter Mid-Code (Mean Code):');
整个程序如下:
filename=input('Enter File Name: ');
if isempty(filename)
filename = 'listing';
end
fid=fopen(filename,'r');
numpt=32768;%input('Enter Number of Data Points:');
numbit=12;%input ('Enter ADC Resolution:');
mid_code=2048;%input('Enter Mid-Code (Mean Code):');
%for i=1:13,
% fgetl(fid);
%end
[v1,count]=fscanf(fid,'%f',[2,numpt]);
fclose(fid);
v1=v1';
code=v1(:,1,;
code_count=zeros(1,2^numbit);
for i=1:size(code),
code_count(code(i)+1)=code_count(code(i)+1) + 1;
end
if code_count(1) == 0 | code_count(2^numbit) == 0 | ...
(code_count(1) < code_count(2)) | (code_count(2^numbit-1) > code_count(2^numbit))
disp('ADC not clipping ... Increase sinewave amplitude!');
break;
end
A=max(mid_code,2^numbit-1-mid_code)+0.1;
vin=(0:2^numbit-1)-mid_code;
sin2ramp=1./(pi*sqrt(A^2*ones(size(vin))-vin.*vin));
while sum(code_count(2:2^numbit-1)) < numpt*sum(sin2ramp(2:2^numbit-1))
A=A+0.1;
sin2ramp=1./(pi*sqrt(A^2*ones(size(vin))-vin.*vin));
end
disp('You Have Applied a Sine Wave of (dBFS): ');
Amplitude=A/(2^numbit/2)
figure;
plot([0:2^numbit-1],code_count,[0:2^numbit-1],sin2ramp*numpt);
title('CODE HISTOGRAM - SINE WAVE');
xlabel('DIGITAL OUTPUT CODE');
ylabel('COUNTS');
axis([0 2^numbit-1 0 max(code_count(2),code_count(2^numbit-1))]);
code_countn=code_count(2:2^numbit-1)./(numpt*sin2ramp(2:2^numbit-1));
figure;
plot([1:2^numbit-2],code_countn);
title('CODE HISTOGRAM - NORMALIZED')
xlabel('DIGITAL OUTPUT CODE');
ylabel('NORMALIZED COUNTS');
dnl=code_countn-1;
inl=zeros(size(dnl));
for j=1:size(inl')
inl(j)=sum(dnl(1:j));
end
%End-Point fit INL
%[p,S]=polyfit([1,2^numbit-2],[inl(1),inl(2^numbit-2)],1);
%Best-straight-line fit INL
[p,S]=polyfit([1:2^numbit-2],inl,1);
inl=inl-p(1)*[1:2^numbit-2]-p(2);
disp('End Points Eliminated for DNL and INL Calculations');
figure;
plot([1:2^numbit-2],dnl);
grid on;
title('DIFFERENTIAL NONLINEARITY vs. DIGITAL OUTPUT CODE');
xlabel('DIGITAL OUTPUT CODE');
ylabel('DNL (LSB)');
figure;
plot([1:2^numbit-2],inl);
grid on;
title('INTEGRAL NONLINEARITY vs. DIGITAL OUTPUT CODE');
xlabel('DIGITAL OUTPUT CODE');
ylabel('INL(LSB)');
晕,笑脸是:)
tHANK YOU LANDLORD ....
XIEXIE
代码很有帮助
XIEX IE
可作为模块用
高手你好,这个程序我也从网站下了,这几天也研究了下码密度直方图法。请问这个程序具体是怎样用呢?
目前ADC的simulink Model 已经建好了,仿真DNL INL 的话。是不是将ADC MODEL的DAC OUT 数据导入到matlb中,再用这段代码进行处理? 这个代码处理的sample code 是 digital code 还是 DAC 的analog output?
诸多不懂,还忘指教一二
你输入信号幅度应该适当的大于被测件的满量程。
mid_code为什么是2048?应该是在输入信号小于fullscale情况下,通过计算确定mid_code,而不是2^12/2的来的。采用该评估程序必须分成两步进行。第一步确定mid_code.第二步,输入信号稍大于fullscale,再评估。
你好,能大概讲讲具体怎么计算吗,他这个mid_code 具体指的是什么呢?
你好,我想再补充问一下,就是在算mean code的时候您说条件是小于FSR,是为了避免过FSR的输入会导致首尾两个码箱的容量非常大,从而影响mean code 的计算值吗?
good reference for design
thank you for the code
是这个?