SAR-ADC行为级仿真代码

问了同学,好像都没大细看。但是我比较慢,要仔细看才能懂,还是得学学。。。
电容就不分段了,简单一点。
逐段分析代码含义:

1、比较函数部分

function [adout] = adc_sar_diff(Vip,Vin,Vref,Vcm,M,Cm_p,Cm_n,Cd1_p,Cd1_n,Cp1_p,Cp1_n,Comp_os,del_Compvn,del_ktc,Wda)    % basic behavior model
%注意, 本函数简化为不分段结构, M就是DAC的分辨率, 整个ADC的分辨率应为M+1

这是函数的定义,参数分别为
Vip Vin 差分输入
Vref 参考电压,注意到差分输入理论上是有Vrn和Vrp,在这里,Vref=Vrn,Vrp=0
Vcm 公共端电压
M为DAC分辨率,M+1为整个ADC分辨率
Cm_p Cm_n 为充放电电容,
Cd1_p Cd1_n 为末端的电容
Cp1_p Cp1_n 为寄生电容
Comp_os 为比较器的offset
del_Compvn 比较器的噪声
del_ktc 采样噪声
Wda 为电容的权值

Ctm_p = sum(Cm_p)+Cd1_p+Cp1_p;
Ctm_n = sum(Cm_n)+Cd1_n+Cp1_n;
Qi_p = -(sum(Cm_p)+Cd1_p)*(Vip-Vcm+del_ktc*randn(1,1));   %定义输入采样得到的电荷,并考虑kT/C噪声
Qi_n = -(sum(Cm_n)+Cd1_n)*(Vin-Vcm+del_ktc*randn(1,1));   
Vdam_p(1:M) = Vcm;  % define bottom plate voltages 
Vdam_n(1:M) = Vcm; 
adout = 0;  % output

Ctm_p Ctm_n 是总电容
Qi_p Qi_n 输入采样电荷 ,并且考虑了kT/C噪声,也就是热噪声
Vdam_p(1:M) = Vcm 是底板电压 采样完成后,底板电压是Vcm
adout 是输出

for i = 1 : M
    Vres_p = Vcm + (Qi_p + (Vdam_p-Vcm)*rot90(Cm_p,3))/Ctm_p;
    Vres_n = Vcm + (Qi_n + (Vdam_n-Vcm)*rot90(Cm_n,3))/Ctm_n;    
    if Vres_p-Vres_n > Comp_os+del_Compvn*randn(1,1)   
        Vdam_p(i) = 0; Vdam_n(i) = Vref;        
    else
        Vdam_p(i) = Vref; Vdam_n(i) = 0;
        adout = adout + Wda(i)*2;
    end
end

依次算出Vresn和Vresp,比较,并由此确定开关的值。

Vres_p = Vcm + (Qi_p + (Vdam_p-Vcm)*rot90(Cm_p,3))/Ctm_p;
Vres_n = Vcm + (Qi_n + (Vdam_n-Vcm)*rot90(Cm_n,3))/Ctm_n;
if Vres_p-Vres_n < Comp_os+del_Compvn*randn(1,1)  adout = adout + 1; end

最后一次比较

这里要详细说明一下,对于差分电路,比如分辨率为三位,那么开关电容只有两位,比较时,下极板先全部连接VCM,此时得到最高位,然后根据最高位的值确定次高位的开关,比较出次高位。
在这里,应该是先比较,得到M+1位,然后控制第一个开关,
然后比较,得到M位,控制第二个开关
直到得到第二位,控制了第M个开关,
然后跳出循环,得到最后一位,此时也没有开关可以动。
对于权值,如果是M=9,那么一共10位,一共有1024个码元空间,那么最高位应该加512,一直到最后一位是1。

2、接下来是主程序

clear all;
% Defining the structure and parameters of SAR ADC;
%non-idealities included: capacitor mismatch, offset, noise,and parasitics
Vref = 1; Vcm = Vref/2;  % Reference voltages
N=10;    % the resolution of ADC
M = 9; Wda = [256,128,64,32,16,8,4,2,1];         % CDAC structure Without redundancy
%M = 11; Wda = [224,128,72,40,20,12,6,4,2,2,1]; % CDAC structure With redundancy

%定义结构和参数
%非理想因素包括:电容失配、offset、噪声、寄生
Vref 参考为1V
Vcm 公共端0.5V

Cu = 1e-15; del_Cu = 0.05/sqrt(2)*Cu;       % Unit cap and its distribution
alfa = 0.1; beta = 0.01;  % bottom & top plate parasitic factor
del_Compos = 0*2e-3; del_Compvn = 200e-6;   %% rms value for comp's offset & noise 
del_ktc = 100e-6;      % defining the rms value of samping noise

Cu 单元电容,del_Cu 电容误差
alfa = 0.1; beta = 0.01 极板寄生
del_Compos = 0*2e-3; del_Compvn = 200e-6; offset和noise的有效值
del_ktc 热噪声的有效值

for i=1:M   % Defining the cap value of CDAC, including random variation  
    Cm_p(i) = Wda(i)*Cu + sqrt(Wda(i))*del_Cu*randn(1,1);
    Cm_n(i) = Wda(i)*Cu + sqrt(Wda(i))*del_Cu*randn(1,1);
end;  

定义采样电容,包括了失配

Cd1_p = Cu + del_Cu*randn(1,1); Cd1_n = Cu + del_Cu*randn(1,1);
Cp1_p = beta*(sum(Cm_p)+Cd1_p); Cp1_n = beta*(sum(Cm_n)+Cd1_n); %parasitics
Comp_os = del_Compos*randn(1,1); % the offset of comp
%Cm_n(3) = Cm_n(3)*0.99;  % setting caps' value manually

这里Cd1_p 、Cd1_n 是最靠近比较器的那个电容
Cp1_p 寄生
Comp_os 比较器的offset

%*****************for adc conversion*********************
d_len = 2^10; dout(d_len) = 0;  % defining a data array to save ADC output 
delta_ph = 311/d_len*2*pi;  % input's delta phase for a Tclk
for i = 1:d_len                      
        Vip = 0.49*Vref*sin(i*delta_ph)+Vcm; % defining input signal
        Vin = -0.49*Vref*sin(i*delta_ph)+Vcm; 
        dout(i) = floor((adc_sar_diff(Vip,Vin,Vref,Vcm,M,Cm_p,Cm_n,Cd1_p,Cd1_n,Cp1_p,Cp1_n,Comp_os,del_Compvn,del_ktc,Wda)));
        % A/D Conversion
end
% plot(dout); grid; % plot the output waveform

不断改变输入的值,进行ADC转换

dout = dout - mean(dout);  % removing DC part
[pow,SNR,SNDR,ENOB,SFDR,THD,HD] = calculate_dynamic_spec(dout);

第一行这个没懂,第二行是在计算输出指标,这个函数等下详细看看。

%***************** Plot Output Power spectrum *****************************
d_len = length(pow); xstep = 1/(2*d_len);
xz = 0:xstep:(0.5-xstep);     
plot(xz,10*log10(pow)) %
title('ADC Output Spectrum') 
xlabel('fi/fs')
ylabel('Power (dB)')
axis([0,0.5,-120,0])  
grid

做的什么图,也没看懂,等下执行看看,后面是一段表,不复制了。

3、参数计算程序

算了好复杂不看了。。。
只需要知道它会计算出哪些指标就行了

你可能感兴趣的:(SARADC,模拟电路,matlab行为仿真)