بررسی اثرات غیر خطی در مبدل های جریانی دیجیتال به آنالوگ

در این مقاله یک مبدل آنالوگ به دیجیتال 10 بیتی با استفاده از نرم افزار MATLAB، شبیه سازی شده است. DAC، دارای ساختارهای متفاوتی می باشد. سه ساختار Binary، unary و Segmented بررسی شده است. در این مقاله
دوشنبه، 3 شهريور 1393
تخمین زمان مطالعه:
موارد بیشتر برای شما
بررسی اثرات غیر خطی در مبدل های جریانی دیجیتال به آنالوگ
بررسی اثرات غیر خطی در مبدل های جریانی دیجیتال به آنالوگ

 

نويسنده:ساعد مرادی*
منبع: راسخون




 

چکیده

در این مقاله یک مبدل آنالوگ به دیجیتال 10 بیتی با استفاده از نرم افزار MATLAB، شبیه سازی شده است. DAC، دارای ساختارهای متفاوتی می باشد. سه ساختار Binary، unary و Segmented بررسی شده است. در این مقاله هدف این است که درستی روابط مربوط به σINL و σDNL را با شبیه سازی نشان دهیم.

مقدمه

DAC یک مبدل دیجیتال به آنالوگ می باشد. ورودی آن یک سیگنال دیجیتالی چند بیتی و خروجی آن یک ولتاژ و یا جریانی است که توانایی راه اندازی یک بار را دارد. برای اینکه DACها بتوانند بار را، راه اندازی کنند، از المانهای اکتیو مانند OPها، اسنفاده می نمایند.

انواع مبدل ها

بسته به نوع المانهایی که در پیاده سازی یک DAC استفاده می شود، DACها را طبقه بندی می نمایند. نمودار (1) طبقه بندی مبدلهای آنالوگ به دیجیتال را نشان میدهد.مبدل ها را می توان با استفاده از مقاومت ها، خازن ها و یا منابع جریان پیاده سازی کرد. هر کدام از این حالتها خود به دسته های دیگری تقسیم بندی می شوند. در این نمودار فقط دسته بندی مربوط به مبدلهای منبع جریانی، نشان داده شده است. علت این امر این است که در این مقاله، فقط با این نوع از مبدل ها سر و کار داریم.
مبدلهای منبع جریانی، در سه نوع باینری، unary و segmented می باشند.

Binary - weighted

شکل (1) شماتیک مداری مربوط به مبدل جریانی باینری را نشان می دهد. در این مدار، سوئیچ های b0،b1، ... وbn - 1 ورودی دیجیتالی سیستم را نشان می دهند. این کلید ها تعیین می کنند که کدامیک از منابع جریان، جریان خروجی را تامین نمایند. تغییر وضعیت سوئیچ ها با توجه به مقدار کد ورودی تعیین می شود.
در این مدار از 2n - 1 منبع جریان استفاده شده است. برای مثال در یک مبدل 10 بیتی نیاز به 1023 منبع جریان داریم. فرض کنید که تنها ورودی b1 برابر با یک باشد و بقیه صفر باشند آنگاه مقدار جریان خروجی برابر با 2Iu خواهد شد. حال فرض کنید که تنها ورودی b2 برابر با یک باشد آنگاه خروجی برابر با 4Iu خواهد شد. بنابراین در حالت کلی با استفاده از اصل جمع آثار می توان مقدار جریان خروجی را به ازای هر کد ورودی به دست آورد. رابطه (1) مقدار جریان خروجی را در حالت کلی ارائه می دهد :
I_out = I_u [b_0 + 2b_1 + 2^2 b_2 + … + 2^k b_k + … + 2^(n-1) b_(n-1) (1) رابطه
از این رابطه بعدا در برنامه نویسی متلب استفاده خواهیم کرد.

Unary - weighted

در مدار قبلی دیده شد که برای یک مبدل n بیتی از 2n - 1 منبع جریان برای تولید مقدار آنالوپ خروجی استفاده شد. روش های متفاوتی برای تولید جریان خروجی وجود دارد. یک روش همانی بود که در بخش قبل گفته شد. یک شیوه دیگر چینش منابع جریان برای تولید مقدار آنالوگ مورد نظر در خروجی، در شکل (2) دیده می شود.
همان طور که در شکل دیده می شود در این مدار از تعداد سوئیچ ها و منابع جریان با هم برابر می باشند. در این روش تعداد سوئیچ های که هر بار ON میشوند معادل با دهدهی کد باینری ورودی است.
مقدار جریان خروجی در این مدار KI_u می باشد که K در این رابطه همان معادل دهدهی کد باینری ورودی می باشد. از این نکته نیز در پیاده سازی مدار unary در متلب استفاده می شود.

segmented methods

در این روش، از ترکیب حالت های فوق استفاده شده است. به این معنی که بیت های پر ارزشتر با استفاده از روش unary و بیت های کم ارزشتر با استفاده از روش binary پیاده سازی می شوند. شکل (3) شماتیک این مدار را نشان می دهد.
برای تعیین رابطه جریان خروجی این مدار از روابط به دست آمده در روش های unary و binary استفاده می شود. فقط کافی است که این دو رابطه را با استفاده از روش جمع آثار با هم ترکیب نماییم.

انحراف معیار DNL و INL

در یک مبدل خطاهای وجود دارد که باعث می شوند تا مشخصه واقعی یک DAC با مشخصه ایده آل آن تفاوت های داشته باشد. دو تا از معیارهای که می توان به وسیله آن ها میزان خطاها را مشخص کرد DNL و INL می باشند.
یکی از مواردی که باعث ایجاد خطا می شود تغییر در مقدار منبع جریان می باشد. آزمایش ها نشان می دهند که این تغییرات از یک تابع گوسی شکل، پیروی می کنند. با استفاده از روابط آماری می توان فرمول هایی را برای σINL و σDNL به دست آورد. این روابط در جدول (1) آورده شده است.
در این روابط B همان تعداد بیتها، Bb تعداد بیت های باینری، Bu تعداد بیت های unary و σu انحراف معیار منبع جریان واحد می باشد.

برنامه نویسی MATLAB

در این بخش در مورد الگوریتم استفاده شده در پیاده سازی مبدل ها در متلب توضیح داده شده است.
ابتدا یک بردار سطری از صفر تا 1023 تعریف شده است. مقادیر این بردار به صورت اعداد دهدهی می باشند. چون ورودی یک DAC باید اعداد باینری باشد با استفاده از دستور dec2bin () همه این اعداد را به فرم باینری تبدیل می کنیم. برای انجام این کار از یک حلقه for استفاده می کنیم. در این حلقه، ضمن تولید کدهای باینری، مقدار سیگنال آنالوگ خروجی را نیز محاسبه می کنیم. برای این کار نیز از روابط جریان خروجی که برای هر یک از مبدل ها توضیح داده شد، استفاده می کنیم.
برای هر منبع جریان یک مقدار خطا را به صورت تصادفی در نظر گرفتیم تا بتوانیم اثر DNL و INL را بررسی کنیم.
برای اینکه بتوانیم نمودار انحراف معیار DNL و INL را رسم کنیم، مقدار خروجی مدار را 1000 بار برای هر کد ورودی بدست آوردیم و سپس مقدار واریانس و انحراف معیار داده ها را محاسبه کردیم.
نکته ای که باید دقت کرد این است که در محاسبه DNL، ابتدا باید offset را حذف کنیم و همچنین برای INL نیز باید Gain error را حذف کنیم. این نکات ضمن برنامه نویسی رعایت شده است.
کدهای برنامه نویسی مربوط به هریک از مبدل ها در متلب ، در ضمیمه این گزارش آورده شده است.

محاسبات تئوری

با استفاده از روابط جدول (1) و این مورد که σu برابر با 2 درصد می باشد می توان مقادیر انحراف معیار DNL و INL را برای هر سه مدل DAC محاسبه نمود. این مقادیر در جدول (2) آورده شده است.

نتایج شبیه سازی

برای هر مبدل نمودارهای انحراف معیار DNL و INL و همچنین مشخصه انتقالی آن را نیز رسم کرده ایم. هر یک از این نمودارها در شکل های (4) تا (12) آورده شده است.

نتیجه گیری

در این مقاله مبدل های دیجیتال به آنالوگ منبع جریانی با استفاده از نرم افزار متلب مورد شبیه سازی قرار گرفت. دوتا از پارامترهای مهمی که در این مقاله مورد بررسی قرار گرفت، انحراف معیار DNL و انحراف معیار INL بودند. نتایج شبیه سازی نشان می دهد که اختلاف مقادیر ایدهآل که از طریق فرمول ها محاسبه شدند و مقادیر حاصل از شبیه سازی چندان تفاوتی باهم ندارند واین نشان می دهد که از فرمول های جدول (1) می توان به راحتی برای تجزیه تحلیل DACها استفاده کرد.
مراجع
B. Murmann Slides : Course EE315 , Stanford Univ
F. Maloberti , “Data Converters , ” Springer , 2007.
R. Lotfi , “Design of data converters , ” Lectures Slides , Ferdowsi University of Mashhad , I.R.Iran , Spring 2010.

کدهای MATLAB

الف) کد MATLAB مربوط به مبدل باینری
clear all
clc
r = 1 ; % the resistor that produce lsb voltage
decin = (0 : 1023) ; % decimal input vector for genarating digital 10 - bit codes
lsb = 1 ; % define lsb value
for n = 1 : 1000 % this command produce ideal value of output
a (n , : ) = (1 : 1023) ;
end ;
for k = 1 : 1000 % this command produce each code 1000 times
for m = 1 : 10 % define random current sources
ir = normrnd ( (2^ (m - 1) ) *1 , sqrt ( (2^ (m - 1) ) ) *0.01) ;
iref (1 , m) = ir ;
end ;

for i = 0 : 1023 % operating on each code

av = 0 ;
b = dec2bin (decin (1 , i + 1) , 10) ; % convert decimal number into 10 - bit string

for j = 0 : 9 % generating related analog value for each digital code
if ( b (10 - j) * 1 ) = = 49

av = av + iref (1 , j + 1) * r ;
end ;
end ;
av1 (k , i + 1) = av ;
end ;
end ;
for k = 1 : 1000
av1 (k , : ) = av1 (k , : ) *1023/av1 (k , 1024) ; % gain error rejection
for i = 1 : 1023
dnl (k , i) = (av1 (k , i + 1) - av1 (k , i) - lsb) /lsb ; % generating k - th dnl
inl (k , i) = av1 (k , i) - a (k , i) ; % generating k - th inl
end ;
end ;
for i = 1 : 1023
sigdnl (i) = sqrt (var (dnl ( : , i) ) ) ; % generating standard deviation of dnl for each code
siginl (i) = sqrt (var (inl ( : , i) ) ) ; % generating standard deviation of inl for each code
end ;
ب) کد MATLABL مربوط به مبدل UNARY
clear all
clc
r = 1 ; % the resistor that produce lsb voltage
decin = (0 : 1023) ; % decimal input vector for genarating digital 10 - bit codes
lsb = 1 ; % define lsb value
for n = 1 : 100 % this command produce ideal value of output
a (n , : ) = (1 : 1023) ;
end ;
for k = 1 : 100 % this command produce each code 100 times
for m = 1 : 1024 % define random current sources
ir = normrnd (1 , 0.01) ;
iref (1 , m) = ir ;
end ;
for i = 0 : 1023 % operating on each code
av1 = 0 ;
av = 0 ;
b = dec2bin (decin (1 , i + 1) , 10) ; % convert decimal number into 10 - bit string

for j = 0 : 9 % generating related analog value for each digital code
if ( b (10 - j) * 1 ) = = 49

av = av + (2^j) ;
end ;
end ;
for l = 1 : av ;
av1 = av1 + iref (1 , l) ;
end ;
av2 (k , i + 1) = av1 ;
end ;
end
for k = 1 : 100
av2 (k , : ) = av2 (k , : ) *1023/av2 (k , 1024) ; % gain error rejection
for i = 1 : 1023
dnl (k , i) = (av2 (k , i + 1) - av2 (k , i) - lsb) /lsb ; % generating k - th dnl
inl (k , i) = av2 (k , i) - a (k , i) ; % generating k - th inl
end ;
end ;
for i = 1 : 1023
sigdnl (i) = sqrt (var (dnl ( : , i) ) ) ; % generating standard deviation of dnl for each code
siginl (i) = sqrt (var (inl ( : , i) ) ) ; % generating standard deviation of inl for each code
end ;
ج) کد MATLAB مربوط به مبدل SEGMENTED
clear all
clc
r = 1 ; % the resistor that produce lsb voltage
decin = (0 : 1023) ; % decimal input vector for genarating digital 10 - bit codes
lsb = 1 ; % define lsb value
for n = 1 : 100 % this command produce ideal value of output
a (n , : ) = (1 : 1023) ;
end ;
for k = 1 : 100 % this command produce each code 100 times
for m = 1 : 6 % define random current sources (binary)
ir1 = normrnd ( (2^ (m - 1) ) *1 , sqrt ( (2^ (m - 1) ) ) *0.01) ;
iref1 (1 , m) = ir1 ;
end ;
for h = 1 : 960 % define random current sources (unary)
ir2 = normrnd (1 , 0.01) ;
iref2 (1 , h) = ir2 ;
end ;
for i = 0 : 1023 % operating on each code
av1 = 0 ;
av = 0 ;
v = 0 ;
av2 = 0 ;
b = dec2bin (decin (1 , i + 1) , 10) ; % convert decimal number into 10 - bit string
for j = 0 : 9 % generating related analog value for each digital code
if ( b (10 - j) * 1 ) = = 49
if j < = 5
av = av + iref1 (1 , j + 1) ;
end ;

if j>5
v = v + (2^j) ;
end ;
end ;
end ;
for l = 1 : v ;
av2 = av2 + iref2 (1 , l) ;
end ;
av3 = av + av2 ;
av4 (k , i + 1) = av3 ;
end ;
end ;
for k = 1 : 100
av4 (k , : ) = av4 (k , : ) *1023/av4 (k , 1024) ; % gain error rejection
for i = 1 : 1023
dnl (k , i) = (av4 (k , i + 1) - av4 (k , i) - lsb) /lsb ; % generating k - th dnl
inl (k , i) = av4 (k , i) - a (k , i) ; % generating k - th inl
end ;
end ;
for i = 1 : 1023
sigdnl (i) = sqrt (var (dnl ( : , i) ) ) ; % generating standard deviation of dnl for each code
siginl (i) = sqrt (var (inl ( : , i) ) ) ; % generating standard deviation of inl for each code
end ;

نمودارها و وجدوال:

بررسی اثرات غیر خطی در مبدل های جریانی دیجیتال به آنالوگ
نمودار 1
بررسی اثرات غیر خطی در مبدل های جریانی دیجیتال به آنالوگ
شکل 1
بررسی اثرات غیر خطی در مبدل های جریانی دیجیتال به آنالوگ
شکل 2
بررسی اثرات غیر خطی در مبدل های جریانی دیجیتال به آنالوگ
شکل 3
بررسی اثرات غیر خطی در مبدل های جریانی دیجیتال به آنالوگ
جدول 1
جدول 2

binary

Segmented

Unary

 

0.32

σINL

0.64

0.225

0.32

σDNL

بررسی اثرات غیر خطی در مبدل های جریانی دیجیتال به آنالوگ
شکل 4: انحراف معیار DNL مبدل باینری
بررسی اثرات غیر خطی در مبدل های جریانی دیجیتال به آنالوگ
شکل 5: انحراف معیار INL مبدل باینری
بررسی اثرات غیر خطی در مبدل های جریانی دیجیتال به آنالوگ
شکل 6: مشخصه انتقالی مبدل باینری
بررسی اثرات غیر خطی در مبدل های جریانی دیجیتال به آنالوگ
شکل (7)-انحراف معیار DNLمبدل UNARY
بررسی اثرات غیر خطی در مبدل های جریانی دیجیتال به آنالوگ
شکل(8)-انحراف معیار INL مبدل UNARY
بررسی اثرات غیر خطی در مبدل های جریانی دیجیتال به آنالوگ
شکل (9) – مشخصه انتقالی مبدل UNARY
بررسی اثرات غیر خطی در مبدل های جریانی دیجیتال به آنالوگ
شکل (10)-انحراف معیار DNLمبدل SEGMENTED
بررسی اثرات غیر خطی در مبدل های جریانی دیجیتال به آنالوگ
شکل(11)-انحراف معیار INL مبدل SEGMENTED
بررسی اثرات غیر خطی در مبدل های جریانی دیجیتال به آنالوگ
شکل ((12 – مشخصه انتقالی مبدل SEGMENTED

پي‌نوشت‌ها:

* دانشجوی دکتری مهندسی برق




 

 



نظرات کاربران
ارسال نظر
با تشکر، نظر شما پس از بررسی و تایید در سایت قرار خواهد گرفت.
متاسفانه در برقراری ارتباط خطایی رخ داده. لطفاً دوباره تلاش کنید.