%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% File name : twostep SA_ADC_Ideal
% Version : 1.0
% Author : HuangWenjie
% Date : 20171011
% Modified by :
% Modified date:
% Module Name :
% Module Functions:
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clc;
clear;
format long;
%
% Sig_R_ref_select = linspace(0, 0.02, 15);%ref的R偏差 sig变化
% Sig_Vos_op_select = linspace(0, 0.01, 15);%ref的op的Vos偏差 sig变化
% Sig_Cmis_select = linspace(0, 0.006, 15);
%
% hwait = waitbar(0, 'Please Waitting >>>>>>>>>>');
%%%%%%%%%%%%%%%%%%%%%%%%%%% 输入信号录入 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Sample_Period = 229; %%%采样周期
% Sample_FFT = 1024; %%%采样点数
% Fre_Sample = 50e3; %%%采样频率
% Fre_Sig = Fre_Sample * Sample_Period / Sample_FFT; %%%输入信号频率
% Tcycle_Sample = 1 / Fre_Sample;
% Tcycle_Sig = 1 / Fre_Sig;
% Sig_Cycle = 229;
% Fre_FFT = Fre_Sample / 2 * linspace(0, 1, Sample_FFT / 2 + 1);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 信号量化 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Sig_Point = 0: Tcycle_Sample : Sig_Cycle * Tcycle_Sig; %%% 确定信号周期数
% Sig_Len = length(Sig_Point); %%% 确定采点个数
% Vout_Ideal = zeros(1, Sig_Len);
N = 7; %两步ADC的位数为N*2 bits
Bit_MSB = 4; %分段高位位数
Bit_LSB = N - Bit_MSB; %分段低位位数
Vref_Top = 1.5;
Vref_Bottom = 0.5;
Vcm = 1/2 * (Vref_Top - Vref_Bottom) + Vref_Bottom;
%V_REFP等待加非理想因素
Sig_Len = 2 ^ (2 * N);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 失调与噪声 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Sigma_Vos = 0; %%% 失调电压偏差
Vos = normrnd(0, Sigma_Vos, 1, 1); %%% 电压比较器输入端的等效失调电压
SFDR_times = zeros(3,15,1000);
SNDR_times = zeros(3,15,1000);
ENOB_times = zeros(3,15,1000);
% for change = 1:3;
% Sig_R_change = (change == 1);
% Sig_Vos_change = (change == 2);
% Sig_Cmis_change = (change == 3);
% for j = 1:15;
% for num = 1:1000;
%%%%%%%%%%%%%%%%%%%%%电容初始化
CLSB_Num = 2^Bit_LSB + 1; %%% 将末端电容、桥接电容划分到低端DAC
CMSB_Num = 2^Bit_MSB - 1;
Ctot_Num = CLSB_Num + CMSB_Num;
Cp1 = 0; %%% 桥接电容上极板寄生电容
Cp2 = 0; %%% 桥接电容下极板寄生电容
Cp3 = 0; %%% DAC输出端寄生电容
Cc_Bottom = Cp2; %%% 桥接电容下极板等效寄生电容
Cc_Top = Cp1 + Cp3; %%% 桥接电容上极板等效寄生电容
% Sigma_Cap = 0.003;
Sigma_Cap = 0 % Sig_Cmis_change * Sig_Cmis_select(j) + (1 - Sig_Cmis_change) * 0.003;
Cap_Mis_LSB = normrnd(0, Sigma_Cap, 1, CLSB_Num); %%% 低位电容失配
Cap_Mis_MSB = normrnd(0, Sigma_Cap, 1, CMSB_Num); %%% 高位电容失配
%%%%%%%%%%%%%%%%%%%%%%%%%% 计算各个电容值大小 %%%%%%%%%%%%%%%%%%%%%%%%%%
[CLSB, CMSB, C_S, C_T] = Cap_Mis_Record(Cap_Mis_LSB, Cap_Mis_MSB, Bit_LSB, Bit_MSB);
%%%%%%%%%%%%%%%%%%%%%%%% 计算各个电容权重大小 %%%%%%%%%%%%%%%%%%%%%%%%%
[Weight_Cap_toH, Weight_Cap_toL] = Weight_Caculate(C_T, C_S, CLSB, CMSB, Bit_LSB, Bit_MSB, Cc_Top, Cc_Bottom);
C_matrix = [C_T, CLSB, CMSB]';
%%%%%%%%%%%%%%%%%%%%%Vref_Top2和Vref_Bottom2的产生
% Vref_Top2 = Vref_Top + (Vref_Top - Vref_Bottom)/2^N;
% Vref_Bottom2 = (Vref_Top - Vref_Bottom)/2^N + Vref_Bottom;
% 电阻存在偏差
R_ref_ideal = ones(1 , 2 ^ N + 1);
Sig_R_ref = 0 % Sig_R_ref_select(j) * (Sig_R_change) + 0.01 * (1 - Sig_R_change);
R_ref_Mis = normrnd(0, Sig_R_ref , 1 , 2 ^ N + 1);
R_ref_actual = R_ref_ideal + R_ref_Mis;
R_ref_sum = sum( R_ref_actual( 1 : 2 ^ N ) );
%%% 看其他参数变化时,Vos失调不变
Sig_Vos_op = 0 % Sig_Vos_op_select(j) * (Sig_Vos_change) + 0 * (1 - Sig_Vos_change);
Vos_TOP_OP = normrnd(0, Sig_Vos_op , 1 , 1);
Vos_BOTTOM_OP = normrnd(0, Sig_Vos_op , 1 , 1);
V_ref_TOP = Vref_Top + Vos_TOP_OP;
V_ref_BOTTOM = Vref_Bottom + Vos_BOTTOM_OP;
I_ref = (V_ref_TOP - V_ref_BOTTOM) / R_ref_sum ;
Vref_Top2 = V_ref_TOP + R_ref_actual(2 ^ N + 1) * I_ref;
Vref_Bottom2 = V_ref_BOTTOM + I_ref * R_ref_actual(2 ^ N );
% MUX = zeros(1,N);%0:gnd 1:Vref_Top 2:Vref_Top2 3:Vref_Bottom2
D = zeros(1,2*N);
W_Quan = zeros(1, Sig_Len);
Vx = zeros(1, Sig_Len);
Code_Signal = zeros(Sig_Len, 2*N);
V_of_code = zeros(1, Sig_Len);
for k = 1 : Sig_Len;
% T = (k - 1) * Tcycle_Sample;
% Vin = (Vcm - Vref_Bottom)* sin(2 * pi * Fre_Sig * T) + Vcm;
Vin = k / 2^14 + 0.5;
Vx(k) = Vin;
%%%%%%%%%%%%%%%%%%%%%采样
%采样前,上极板接Vcm,采样时,上极板不变,下级板接V_PIX;
C_tot = (C_T + sum(CLSB) + Cc_Bottom + C_S)/((C_T + sum(CLSB) + Cc_Bottom)*C_S) + sum(CMSB) + Cc_Top;
Q_TOP_H = (Vcm - Vin) * C_tot;
%采样结束,先断上极板,下级板接gnd,保持
% MUX = zeros(1, N);
V_DAC_sampleH = (Vcm - Vin) + Vref_Bottom;
V_DAC_sampleL = C_S/(C_T + sum(CLSB) + Cc_Bottom + C_S)*(V_DAC_sampleH - Vref_Bottom) + Vref_Bottom;
[Dout_Fir , V_DAC_Fir, Vdac_to_LSB_Fir, W_Quan_Fir] = First_Quantization(Bit_MSB, Weight_Cap_toH, Weight_Cap_toL, V_DAC_sampleH, V_DAC_sampleL, Vref_Top, Vref_Bottom, Vos, Vcm, C_matrix);
[Dout_Sec, V_DAC_Sec, W_Quan_Sec] = Second_Quantization(Bit_MSB, Weight_Cap_toH, Weight_Cap_toL , V_DAC_Fir, Vdac_to_LSB_Fir, Vref_Top, Vref_Bottom, Vref_Top2, Vref_Bottom2, Vcm, C_matrix, Dout_Fir);
Code_Signal(k, :) = [Dout_Fir, Dout_Sec];
V1 = 0;
for i = 1 : 2 * N;
V1 = V1 + Code_Signal(k, i)/2^(i);
end
V_of_code(k) = (Vref_Top - Vref_Bottom)* V1 + Vref_Bottom;
W_Quan(k) = W_Quan_Fir + W_Quan_Sec;
end
% [ENOB, SFDR, SNDR, FFT_Power] = Caculate_FFT(V_of_code, Sample_FFT, Sample_Period);
% figure(1)
% axes('FontWeight','bold','FontSize',14, 'FontName','Times New Roman');
% hold on;
% plot(Fre_FFT, FFT_Power, '-ob', 'LineWidth', 2);
% text(10000, -30, {['SFDR=', num2str(SFDR)], ['SNDR=', num2str(SNDR)], ['ENOB=', num2str(ENOB)],}, 'FontSize', 18, 'Color', 'red');
% xlabel('f(Hz)','FontSize',14, 'FontName','Times New Roman');
% ylabel('Power(dB)','FontSize',14, 'FontName','Times New Roman');
% grid on;
% SFDR_times(change, j, num) = SFDR;
% SNDR_times(change, j, num) = SNDR;
% ENOB_times(change, j, num) = ENOB;
% str2 = ['The Code is running at ', num2str(num / 10), '%', ' in NO.', num2str(j),'in',num2str(change)];
% waitbar(num / 1000, hwait, str2);
% end
% end
% end
% save Dynamic_output SFDR_times SNDR_times ENOB_times;
评论5