මේ පාඩමෙන් මම ඔයාලාට කියල දෙන්නේ AVR වල තියෙන Digital to Analog Converter (DAC)  කියන අවයවය ගැන. මෙයට පුළුවන් digital සංඛ්‍යාවක් ඊට අනුරූප analog voltage එකක් බවට පරිවර්තනය කරන්න. Digital MCU එකකට analog ලෝකයත් එක්ක හැප්පෙන තියෙන උපාංග අතලොස්සෙන් එකක් තමා මේ DAC එක. විශේෂයෙන්ම කිව්වොත් analog output සාදාගන්න පුළුවන් එකම උපාංගය වෙන්නේ මෙයයි. මේ නිසා මේ ගැන දැනගෙන ගන්න එක සැහෙන වැදගත්.

ඔබේ පරිගණකයේ හෝ smart phone එකේ තියෙන ගීත වාදනය කරන විට speaker එකෙන් හඬ නිර්මාණය වන ආකාරය ගැන ඔබ මිට පෙර හිතලා තියෙනවා ද?

MP3 වැනි Digital data file එකක් ලෙස තියෙන ගීත speaker එක හරහා අපේ සවනට ඇහෙන විදිහට යලි නිර්මාණය කරන්න නම් ඒවා analog signal බවට පරිවර්තනය කර speaker එකට ලබා දිය යුතු වෙනවා. මේ කාර්යය කර දෙනු ලබන්නේ DAC වලින් කියලා ඔබ මීට පෙර අසා තිබුණා ද?

Digital to Analog Conversion ගැන දැන ගත යුතු මූලික සිද්ධාන්ත කීපයක් DAC Theories කොටසෙ තියෙනවා. නමුත් DAC එකෙන් ප්‍රයෝජන ගන්න මේ සිද්ධාන්ත දැන ගන්න එක අත්‍යවශ්‍ය වෙන්නේ නැති නිසා ඔබට ඒවා මගහැර AVR වල ඇති DAC හැඳින්වීම කොටසේ සිට ඉගෙන ගන්න පුළුවන්. ඔබ මේ විෂයට ආධුනිකයෙක් නම් මගේ නිර්දේශය නම් DAC project 01 එක කරලා ඉවර වෙලා Theories පාඩම පොඩිත්තක් හරි බලන්න කියන එක තමා. එවිට DAC එකේ අභ්‍යන්තර ක්‍රියාවලිය සහ 100% නිවැරදිව වැඩක් ගන්නේ කොහොමද කියලා ඔයාලාට හොඳ අවබෝධයක් එනවා.

මේ පාඩම් මාලාවට භාවිතා කරන්නේ Microchip ආයතනයේ අලුත් AVR Architecture එකට ඇතුලත් tinyAVR-0, tinyAVR-1 සහ ATmega-0 Series වල IC කියලා මේ පාඩම් මාලාව මුල දී මම සඳහන් කළා. එකට හේතුව මේ IC වල මිල අඩු වීම සහ features වැඩි ගණනක් තනි IC එකක ගැබ්වී තිබීමයි. තවත් වැදගත් දෙයක් වෙන්නේ මේ ඛාණ්ඩ තුනේම තියෙන්නේ එකම සැකැස්ම නිසා එකක් ඉගෙන  ගත්තොත් බය නැතුව ඒ ඛාණ්ඩයේ ඕනෑම IC එකක් භාවිතා කරන්න පුළුවන්කම. මේ ඛාණ්ඩ තුනෙනුත් DAC දැකගන්න පුළුවන් වන්නේ tinyAVR-1 series එකේ පමණයි. මේ series එකේ IC එකක DAC0, DAC1 සහ DAC2 නමින් instances තුනක් දැකගන්න පුළුවන්.

DAC සිද්ධාන්ත පාඩම

Digital to Analog Converter(ADC) කියන්නේ digital input එකක් analog output එකක් බවට පරිවර්තනය කරන උපකරණයක්.  Digital අගයක් ලබා දීමට input line වැඩි ගණනක් අවශ්‍ය නිසා DAC එකක එකකට වැඩි input ප්‍රමාණයක් ඇත. මෙහි output එක analog ලක්ෂණ ඇති විභවයක් හෝ ධාරාවක් විය හැක. පහත රූපයේ පෙන්වා තියෙන්නේ DAC එකක සරල රූප සටහනක්.

 DAC වල පරිවර්තන ක්‍රියාව තේරුම් ගන්න අපි 2bit DAC එකක ක්‍රියාකාරිත්වය සලකමු. Input දෙකක් පමණක් ඇති නිසා මෙයට ලබා දෙන්න පුළුවන් එකිනෙකට වෙනස digital සංඛ්‍යා 4ක් පමණයි එනම් 0, 1, 2 සහ 3 කියන අගයන් පමණයි. වැඩි වෙන හැම input පියවරකට ම 1V බැගින් වැඩි වන output අගයක් නිපදවන්න පුළුවන් නම් පහත වගුවේ දැක්වෙන ආකාරයට එයට ලැබෙන ආදාන වලට ප්‍රතිචාර දක්වන්න පුළුවන්.

 මෙහිදී කැපී පෙනෙන දේ වෙන්නේ input bit ගණන සීමා වන නිසා DAC එකට තෝරා ගත් අගයන් කීපයක් පමණක් output කරන්න සමත් බවයි. මේ නිසා අපිට 100% සන්තතික(continues) analog output එකක් ලබාගන්න බැහැ. නමුත් විශාල input bit ගණනක් සහ එක පියවරකට වැඩි වෙන ප්‍රතිදානයේ අගය ඉතා කුඩා අගයක්(උද: 0.001V වැනි ) යොදා ගත විට යම් දුරකට හොඳ analog signal එකක් අපිට ගන්න පුළුවන් වෙනවා. විශාල bit ගණනක් සහිත DAC නිෂ්පාදනයට විශාල වියදමක් යන නිසා අපිට පොදුවේ දැක ගත හැක්කේ 8, 10, 12, 16 සහ 24 input bit ගණනක් ඇති DAC පමණි. එබැවින් DAC වල නිර්මාණය කරන analog output එක සෑම විටම සීමා සහිත බව හොඳින් මතක තබා ගන්න.

DAC එකට නිපදවන්න පුළුවන් එකිනෙකට වෙනස් output ගණන එහි resolution එක ලෙස නම් කරනවා. මෙය bit ගණන් අනුව තීරණය වෙනවා. ඒ වගේම පියවරකට වැඩිවන output එකේ අගය තීරණය වෙන්නේ එයට ලැබෙන reference voltage එකෙන්. උදාහරණ 01 සහ උදාහරණ 02 මඟින් එය විස්තර කර තියෙනවා.

5 bit DAC එකකට නිපදවන්න එකිනෙකට වෙනස් output අගයන් ගණන සොයන්න?

5 bit මගින් සැදිය හැකි එකිනෙකට වෙනස් සංඛ්‍යා ගණන = 25 = 32

මේ නිසා 0V ඇතුළුව එකිනෙකට වෙනස් voltage අගයන් 32ක් සැදිය හැක.

8 bit DAC එකකට නිපදවන්න එකිනෙකට වෙනස් output අගයන් ගණන සොයන්න?

8 bit මගින් සැදිය හැකි එකිනෙකට වෙනස් සංඛ්‍යා ගණන = 28 = 256

මේ නිසා 0V ඇතුළුව එකිනෙකට වෙනස් voltage අගයන් 256ක් සැදිය හැක.

Output voltage එක සාදනය කරන්න DAC දන්නා නියත voltage අගයක් ලබා දියයුතු වෙනවා. මේ voltage එකට කියන්නේ Reference voltage කියල. n bit ප්‍රමාණයක් ඇති DAC එකක, input එක ලෙස ලබා දිය හැකි උපරිම අගය වන 2n-1 ට ලැබෙන output එක මේ reference voltage අගය සමානයි. මේ නිසා එක් පියවරකට වැඩිවන output එකේ අගය reference voltage/(සැදිය හැකි output ගණන – 1) ට සමානයි. යම්කිසි input එකකට ලැබෙන output එක පහත සමීකරණයෙන් දැක්විය හැකයි.

Vout = Vref x (Digital code / 2n -1)

පහත ඇති උදාහරණ 03 සහ 04න් මේ කරණය තවත් පැහැදිලි කර තියෙනවා.

8 bit DAC එකකට 5V උපරිම voltage එකක් නිපදවන්න පුළුවන් නම් නිෂ්පාදනය කරන්න පුළුවන් කුඩාම analog අගය කුමක් ද?

කුඩා ම analog අගය ලැබෙන්නේ input එක 000000012 වූ විට ය,

එම නිසා කුඩා ම අගය = Vref (Digital Value/ 2n-1)

= 5V(1/28 -1) = 5V(1/255)

= 0.0196V

මේ නිසා 0V ඇතුළුව එකිනෙකට වෙනස් voltage අගයන් 32ක් සැදිය හැක.

5 bit DAC එකකට 001012 ලබා දුන්න විට නිපදවන්න අගය 0.564V නම් නිපදවන්න පුළුවන් උපරිම සහ අවම voltage එක සොයන්න.

Vout = Vref (Digital Value/ 2n-1) සමීකරණයට Vout = 0.564V සහ n = 5 ආදේශ කර Vref සොයා ගමු.

Vref = (Vout x (2n -1)) / Digital value

= (0.564 * (25 -1))/5

= 3.4968V

Vref උපරිම අගයට සමාන නිසා නිෂ්පාදනය කරන්න පුළුවන් විශාල ම අගය 3.4968V වේ.කුඩා ම analog අගය ලැබෙන්නේ input එක 000012 වූ විට ය,

එම නිසා කුඩා ම අගය = Vref (Digital Value/ 2n-1)

= 3.4968V (1/25 -1)

= 0.1128V

අපි දැන් සැබෑ ලෝකයේ DAC නිර්මාණය කරන හැටි ඉගෙන ගමු. Electronic පරිපථ ලෙස DAC නිපදවන්න පුළුවන් ක්‍රම කීපයක් තියෙනවා. මේ අතර,

  • Summing Amplifier ආකෘතිය
  • R-2R Ladder ආකෘතිය
  • PWM ආකෘතිය

ප්‍රධාන වෙනවා. මේ පාඩමේ දී PWM ආකෘතිය විස්තර කරන්නේ නෑ. ඊට හේතුව PWM කියන්නේ analog පරිවර්තනයකට වඩා කාලය අනුව වෙනස් වන digital signal යොදා ගෙන analog ලක්ෂණ පෙන්වන ක්‍රමයක් වීමයි.

Summing Amplifier DAC ආකෘතිය

පහත රූපයේ දැක්වෙන්නේ Op-Amp එකක් voltage adder (summer) එකක් ලෙස භාවිතා කර සාදා ඇති 4bit DAC එකක්. මෙහි D0, D1, D2 සහ D3 යන අග්‍ර digital input ලෙස භාවිතා කරනු ලබනවා. මෙම DAC එකේ ප්‍රතිදානය,

Vout = – ( VD3 + 1/2 VD2 +1/4 VD1 + 1/8 VD0)*(Rf/R)

යන සමීකරණයෙන් ගන්න පුළුවන්. Vout සඳහා ඍණ අගයක් ලැබී ඇත්තේ inverting amplifier එකක් ලෙස සකසා ඇති නිසා ය. Rf/R අගය වෙනස් කිරීමෙන් Op-Amp එකේ gain එක වෙනස් කර ගන්න පුළුවන්. වගුවේ දැක්වෙන්නේ රූපයේ පෙන්වා පසෙකින් ඇති Summing Amplifier DAC එකේ සත්‍යතා වගුවයි.

පරිවර්තනය වෙන්න ඕනෑ digital input එක Op-Amp එකට සම්බන්ධ කරන්නේ CMOS gate driver හෝ transistor switch හරහායි. මේ නිසා reference voltage එක අපිට කැමති ලෙස වෙනස් කරන්න හැකියව තියෙනවා. මේ DAC පරිපථයේ ඇති resistors වල අගය තීරණය වන්නේ අදාළ bit එකේ දෙකේ පදයේ බලය අනුවයි. මේ නිසා bit ගණන වැඩි වන විට විවිධ අගයන් සහිත ප්‍රතිරෝධක විශාල ගණනක් අවශ්‍ය වෙනවා. මෙසේ ප්‍රතිරෝධ අගයන් විශාල ප්‍රමාණයක් අවශ්‍ය වීම නිසාම මෙම ආකෘතියේ DAC වැඩිය නිෂ්පාදනය කරන්නේ නෑ. මිට විසඳුමක් ලෙස තම R-2R ආකෘතිය භාවිතා වෙන්නේ.

R-2R Ladder DAC ආකෘතිය

පහත රූපයේ දක්වා තියෙන්නේ R-2R ආකෘතියේ DAC එකක්. මෙහි දී එකිනෙකට වෙනස් ප්‍රතිරෝධක අගයන් රාශියක් වෙනුවට අගයන් දෙකක් පමණක් Op-Amp එකකට දාමයක් ලෙස සම්බන්ධ කර ඇත. Input සියල්ල ද switch හරහා Op-Amp එකට සම්බන්ධ කරනු ලැබේ.</p

පහත රූපයේ දක්වා තියෙන්නේ R-2R ආකෘතියේ DAC එකක්. මෙහි දී එකිනෙකට වෙනස් ප්‍රතිරෝධක අගයන් රාශියක් වෙනුවට අගයන් දෙකක් පමණක් Op-Amp එකකට දාමයක් ලෙස සම්බන්ධ කර ඇත. Input සියල්ල ද switch හරහා Op-Amp එකට සම්බන්ධ කරනු ලැබේ.</p

උදාහරණ කීපයක් ගෙන මෙහි දී සිදුවන්නේ කුමක්ද කියා අවබෝධ කරගමු.

ලබා දෙන input එක 10002 නම්. D0, D1, D2 වලට 0V ලැබෙන අතර D3 වලට 5V ලැබේ. එවිට පරිපථය පහත රූපයේ පරිදි දැක්විය හැක.

ඉහත පරිපථයේ a ලක්ෂයට වම් පසින් පිහිට ඇති 2R ප්‍රතිරෝධක දෙක එකිනෙකට සමාන්තර නිසා එහි සමක ප්‍රතිරෝධය R වේ. එය b ට වම් පසින් ඇති Rට ශ්‍රේණි ගත ව ඇති නිසා R සමඟ එකතු කල යුතුයි. පසෙකින් දැක්වෙන්නේ එසේ විසඳූ පරිපථයයි.

යළිත් b ට වම් පැත්තේ ඇති 2R සහ පහළින් ඇති 2R සමාන්තර නිසා එය R වලට ලඝු වේ. එය c ට වම් පසින් ඇති R ශ්‍රේණි ගත ව යෙදෙන නිසා පෙර පරිදි ම 2R වේ. පසෙකින් දැක්වෙන්නේ එසේ විසඳූ පරිපථයයි.

මේ රටාව N ලක්ෂයට දක්වා යයි. එවිට පරිපථය පසෙකින් පෙනෙන පරිදි ලඝු කොට දැක්විය හැක.

N ලක්ෂයට වම් පසින් ඇති පරිපථයට Thevenin නියමය භාවිතා කර පරිපථය පසෙකින් දැක්වෙන ආකාරයට සුළුකර දක්වන්න පුළුවන්.

දැන් අපිට Vout වල අගය, Vout = Vth * (Op-Amp Gain) කියන Op-Amp සමීකරණය භාවිතා කර ලබා ගත හැක. එවිට,

Vout = ½ V * (Rf/R)

යන ලැබේ. මෙහි දී Rf = R නම් , Vout = ½ V වේ.

ලබා දෙන input එක 10002 නම්. D0, D1, D2 වලට 0V ලැබෙන අතර D3 වලට 5V ලැබේ. එවිට පරිපථය පහත රූපයේ පරිදි දැක්විය හැක.

ඉහත පරිපථයේ a ලක්ෂයට වම් පසින් පිහිට ඇති 2R ප්‍රතිරෝධක දෙක එකිනෙකට සමාන්තර නිසා එහි සමක ප්‍රතිරෝධය R වේ. එය b ට වම් පසින් ඇති Rට ශ්‍රේණි ගත ව ඇති නිසා R සමඟ එකතු කල යුතුයි. පසෙකින් දැක්වෙන්නේ එසේ විසඳූ පරිපථයයි.

යළිත් b ට වම් පැත්තේ ඇති 2R සහ පහළින් ඇති 2R සමාන්තර නිසා එය R වලට ලඝු වේ. එය c ට වම් පසින් ඇති R ශ්‍රේණි ගත ව යෙදෙන නිසා පෙර පරිදි ම 2R වේ. පසෙකින් දැක්වෙන්නේ එසේ විසඳූ පරිපථයයි.

දැන් C ලක්ෂයට වම් පසින් ඇති පරිපථයට Thevenin නියමය භාවිතා කර පරිපථය පසෙකින් දැක්වෙන ආකාරයට සුළුකර දක්වන්න පුළුවන්.

දැන් N ලක්ෂයට වම් පසින් ඇති පරිපථයට Thevenin නියමය භාවිතා කර පරිපථය පසෙකින් දැක්වෙන ආකාරයට සුළුකර දක්වන්න පුළුවන්.

දැන් අපිට Vout වල අගය, Vout = Vth * (Op-Amp Gain) කියන Op-Amp සමීකරණය භාවිතා කර ලබා ගත හැක. එවිට,

Vout = ¼ V * (Rf/R)

යන ලැබේ. මෙහි දී Rf = R නම් , Vout = ¼ V වේ.

මේ පරිදි ම digital code එක 00102 විට Vout = 1/8 V*(Rf/R) සහ 00012 විට Vout = 1/16 V*(Rf/R) ලෙසට ලැබිය යුතු ය. ඉතිරි digital code වලට DAC එක නිපදවන අගයන් සොයා මේ සොයාගත් අගයන් වල සංයෝජන වේ. එනම්,

  • 10012 වල අගය 10002 සහ 00012 වල එකතුව වේ.
  • 11012 වල අගය 10002, 01002 සහ 00012 වල එකතුව වේ.

මම හිතනවා මේ වන විට ඔබට DAC එකක ක්‍රියාකාරීත්වය ගැන හොඳ අවබෝධයක් ලබා ගෙන ඇති කියා. මීට අමතරව DAC ගැන දැන ගත යුතු කරුණු ටිකක් සාරාංශ වශයෙන් පහතින් දක්වා තියෙනවා.

Resolution

නිෂ්පාදනය කල හැකි එකිනෙකට වෙනසක් output ප්‍රමාණය. මෙය DAC එකේ bit ගණන ඍජුවම සම්බන්ධයි. හොඳ DAC එකකට වැඩි Resolution එකක් දැක ගන්න පුළුවන්.

Full Scale range (FSR)

නිෂ්පාදනය කරන්න පුළුවන් ප්‍රතිදානයේ විශාලතම අගය. මෙය ධාරාවක් (± mA ) හෝ විභවයක් (±V) අගයක් ලෙස දක්වා ඇත.

Conversion Rate

අපි ලබා දෙන digital අගය analog බවට පරිවර්තනය වී ප්‍රතිදානය ලැබෙන්න යම් කාලයක් ගත වෙනවා. එම නිසා තත්පරයකට කරන්න පුළුවන් පරිවර්තන ප්‍රමාණය සීමා සහිතයි. Conversion Rate එකෙන් පෙන්වන්නේ එසේ තත්පරයක කල හැකි උපරිම පරිවර්තන ගණනයි. Conversion Rate එක විශාල නම් වේගයෙන් පරිවර්තනය කල හැකි වෙනවා.

Offset error

0 කියන digital code එකට DAC එක ලබා දෙන ප්‍රතිදානයේ අගය සහ පරිපූර්ණ (ideal) DAC එකක් එම input එකට ම ලබා දෙන්න ඕනෑ අගය අතර වෙනස offset error එක ලෙස හඳුන්වනවා. Offset error එකක් ඇත්නම්, එයින් අදහස් වන දේ වන්නේ DAC එකේ සියලු ප්‍රතිදාන වල එම දෝෂය බලාපොරොත්තු විය හැකි බවයි.

Gain error

ලබා දිය හැකි උපරිම digital code එකට, එනම් 2n-1 ට DAC එක ලබා දෙන ප්‍රතිදානයේ අගය සහ පරිපූර්ණ (ideal) DAC එකක් එම input එකට ම ලබා දෙන්න ඕනෑ අගය අතර වෙනස Gain error එක ලෙස හඳුන්වනවා.

Differential Non Linearity

DAC එකට 1, 2, 3 … (2n – 1) ලෙසට input අගයන් ලබාදෙන විට output එක රේඛියව Vref/(2n-1) බැගින් පියවරෙන් පියවර සමානව වැඩිවිය යුතුයි. නමුත් සැබෑ DAC එක ළඟ ඇති input code දෙකකට ලැබෙන output එක Vref/(2n-1) වඩා වෙනස් විය හැකියි.  Differential Non Linearity (DNL) ලෙස දක්වන්නේ එසේ වෙනස් වන්නේ නම් වියහැකි විශාලතම වෙනසයි.

AVR වල තියෙන DAC ගැන කෙටි හැදින්වීමක්

පහත රූපයේ පෙන්වා තියෙන්නේ tinyAVR-1 Series එකේ IC වල තියෙන DAC එකේ කැටි සටහනක්.

මෙහි ඇති DATA කියන 8bit register එකට තමා analog voltage එකක් බවට පරිවර්තනය කරන්න අවශ්‍ය digital සංඛ්‍යාව ලබා දෙන්න ඕනෑ. ඒ සංඛ්‍යාව analog voltage එකක් බවට සාදනය කරන්න අවශ්‍ය reference voltage එක ලැබෙන්නේ VREF වලින්. VREF කියන්නේ AVR වල තියෙන තවත් එක් අවයවයක් නිසා tinyAVR-1 ඛාණ්ඩයේ DAC වලට ස්වාදීනව වැඩ කරන්න බැහැ. DAC තේරුම් ගන්න VREF ගැන ගැඹුරට ඉගෙන ගන්න අනිවාර්ය නෑ. එය සරල voltage regulator එකක් කියලා මතක තියාගත්තොත් ඇති. නමුත් ඔබට VREF ගැන වැඩි දුර දැනගන්න කැමතිනම් VREF ගැන ලියපු පාඩම බලන්න පුළුවන්.

Reference voltage එකක් කියන්නේ DAC එක නිපදවන උපරිම output voltage අගය. වෙනත් විදිහට කීවොත් මේ DAC එක 8bit නිසා, එකට ලියන්න පුළුවන් උපරිම අගය වන 25510 ලියපු විට විය DAC එකෙන් output කරන volt අගය තමා reference voltage එක වෙන්නේ. VREF හරහා 0.55V, 1.1V, 2.5V, 4.3V සහ 1.5V කියන ඕනෑම අගයන් වලින් එකක් අපිට ඒ සඳහා තෝරා ගන්න පුළුවන්. මෙසේ නිපදවන analog voltage එක අපිට අවශ්‍ය නම් IO pin එකක් හරහා ඉවතට ගන්න පුළුවන්. නැතිනම් IC එක ඇතුළේ ඇති වෙනත් අවයව වලට input එකක් ලෙස භාවිතා කරන්නත් පුළුවන්. රූපයේ ඇති CTRLA register එක තිබෙන්නේ ඒ දේවල් පාලනය කරන්න.

අලුත් AVR IC වල විවිධ ප්‍රමාණයෙන් DAC තියෙනවා. මේ ගැන ඔබ සැලකිලිමත් වෙන්න ඕනෑ. ඊට හේතුව IC වලට ම ආවේණික සීමාවන් තියෙන නිසා. උදාහරණයක් විදිහට ATtiny1614 IC එකේ මෙවැනි DAC instances තුනක් තියෙනවා. ඒවා නම් වෙන්නේ DAC0,  DAC1 සහ DAC2 කියලා. මේ නිසා අපිට එකවර DAC signal තුනක් නිපදවා ගන්න පුළුවන් නමුත් IO pin එකක් හරහා පිටතට ගන්න පුළුවන් DAC0 නිපදවන analog voltage එක පමණයි.  අපි දැන් ප්‍රයෝගික ක්‍රියාකාරකමක් කරලා DAC එකෙන් ප්‍රයෝජනයක් ගමු.

Project 01 : DAC භාවිතා කරලා Pocket signal generator එකක් සාදමු.

Electronic ඉගෙන ගන්න විට විවිධ හැඩයේ electronic signal ගැන ඉගෙන ගත්තා මතකද? පහත රූප සටහන් වල තියෙන්නේ එවැනි මූලික තරංග කීපයක්. අපි මේ project එකෙන් නිර්මාණය කරන්නේ ඒ වාගේ තරංග නිපදවන්න පුළුවන් කුඩා පරිපථයක්. මං හිතනවා ඔයාලා එකට කැමති වෙයි කියලා.

මෙහි දැක්වෙන Square waves (කොටු හැඩයේ තරංග) හදන්න නම් ලොකු මහන්සියක් වෙන්න ඕනෑ නෑ. මොකද MCU එක digital උපකරණයක් නිසා IO pin එකක්  “1” සහ “0” කිරීමෙන් ක්ෂණිකව ම වැඩේ කරන්න පුළුවන් නිසා. නමුත් අනිත් සියලු ම තරංග නිපදවන එක නම් කරන්න බැරි වැඩක්. අන්න ඒ නිසා තමා අපි මේ සඳහා DAC එක භාවිතා කරන්නේ.

ඔයාලා මුලින්ම කරන්න ඕනෑ දේ තමා මේ වැඩේට අවශ්‍ය Tools ටික install කර ගන්න එක. මගේ කලින් පාඩම් ටික කරලා තිබ්බා නම් ඒ ගැන වධ වෙන්න ඕනෑ නැති වෙයි. ඒත් අලුත් කෙනෙක් නම් මෙන්න මේ ටික install කරන්න වෙනවා.

  1. Firmware එකට Atmel Studio 7.0 or latest version (install කරන්න කියලා දෙන පාඩම)
  2. Circuit ඒක ඇඳ ගන්න KiCAD EDA (install කරන්න කියලා දෙන පාඩම)

ඒ වාගේ ම තමා

  1. Program එක IC එකට burn කරන්න PIC KIT 4 හෝ වෙනත් programmer එකක් ඕනෑ.

මේ ටික install කර ගත්තා නම් hardware එකෙන් ම වැඩේ පටන් ගමු.

Hardware එක නිර්මාණය කිරීම.

රූපයේ පෙන්වා ඇත්තේ මේ සඳහා මම නිර්මාණය කරපු පරිපත සටහන. එහි අපිට කැමති තරංග හැඩය තොර ගන්න push button 4ක් භාවිතා කරලා තියෙනවා. තෝරාගත් තරඟයේ සංඛ්‍යාතය වෙනස් කරන්න variable resistor එකකකුත් යොදාගත්තා. ඒ නිසා variable resistor එකේ knob එක දෙපසට කරකවලා අපිට පුළුවන් නිපවන තරඟයේ සංඛ්‍යාතය අඩු වැඩි කරන්න. නිපදවන සංඛ්‍යාතය හා තරංග වර්ගය පෙන්වන්න I2C 16×2 LCD එකකුත් මේ පරිපථයට එකතු කළා. අපිට ලැබෙන output එක J1 header එකෙන් එලියට ලැබෙනවා. ATtiny1614 IC එක program කරන්න J2 header එක භාවිතා කරන්න පුළුවන්.

Firmware එක නිර්මාණය කිරීම.

අපේ signal generator එකේ code එක ලියන්න පටන් ගමු. මුලින් කරන්න ඕනෑ දේ අලුත් Atmel Studio Project එකක් සාදා ගන්න එක. ඒ සඳහා Step 01 අනුගමනය කරන්න.

Step 01 : ATmel Studio වලින් අලුත් Project එකක් හදා ගන්න හැටි

Atmel Studio එකේ File > New > Atmel Start Project තෝරා ගන්න

ඔබ තෝරා ගත් microcontroller එක search box එක අධාරයෙන් සොයා ගන්න. ඉන් පසුව Create New Project වලට යන්න.

දැන් ඔබට පහත දැක්වෙන පරිදි window එකක් දකින්න ලැබේවි. DAC වලට විශේෂ සැකසුම් කරන්න අවශ්‍ය වන්නේ නෑ. ඒ නිසා GENERATE PROJECT බොත්තම ඔබන්න.

එවිට අලුත් project එක save කරන්න ඕනෑ තැන සහ project එකට නමක් පවරන්න කියලා අසාවි. ඔබ කැමති නමක් භාවිතා කර කැමති තැනක save කරන්න.

සමහරක් විට save කරන්න යද්දී රූපයේ දැක්වෙන message එක පෙන්වන්න පුළුවන්. එහෙම උනොත් NO button එක click කරන්න.

දැන් අපේ project එක save වෙලා ඉවරයි. ඕනෑ නම් ATMEL START window එක close කරන්න පුළුවන්. ඔයාලාට පේනවා ඇති Solution Explorer Window එකේ ඔයාගේ project එක පෙන්නනවා. Solution Explorer එක පෙනෙන්නේ නැතිනම් View > Solution Explorer  වලින් ඒක ගන්න. main.c file එක double click කරපු විට පහත තියෙන view එක ඔයාටත් එන්න ඕනෑ. පළමු පියවර සාර්ථකයි. දැන් තියෙන්නේ DAC එකට අදාළ code එක ලියන්න

Step 02 :DAC එක analog voltage නිපදවීමට සකසා ගැනීම.

දැන් අපි DAC එක analog output එකක් නිපදවන්න පුළුවන් මට්ටමකට සකසා ගන්න ඕනේ. මම මේ project එකට ATtiny1614 IC එකේ තියෙන DAC0 කියන DAC instance එක තමා භාවිතා කරන්නේ.  DAC0 සකස් කර ගන්න අනුගමනය කල යුතු පිළිවල වෙන්නේ,

  1. Voltage reference එකක් තෝරා ගැනීම සඳහා VREF වල CTRLA register එකේ ඇති DAC0REFSEL[2:0] සහ CTRLB register එකේ DAC0REFEN කියන bits අවශ්‍ය පරිදි සකස් කර ගත යුතු වෙනවා. අපි Vref අගය 4.3V වෙන්න DAC0REFSEL = 0x3 සහ DAC0REFEN = “1” යොදමු. (datasheet එකේ VREF වල ඇති Register Description කියන කොටසේ මේ ගැන විස්තර ගැන බලන්න). 
  2. DAC0 වල CTRLA register එකේ තියෙන ENABLE සහ OUTEN (Output Enable) කියන bit වලට “1” ලියන්න ඕනෑ. මෙහි දී DAC0 එක සක්‍රිය කිරීම සහ එය නිෂ්පාදනය කරන analog signal එක අදාළ IO pin (PA6 ) එකට යොමු කිරීම සිදු වෙනවා.
  3. PA6 pin එක analog output signal එකක් විදිහට භාවිතා වෙන නිසා මේ pin එකේ digital input sense කොටස අක්‍රිය කරමු. මේක කරන්න අත්‍යාවශ්‍ය දෙයක් නොවෙයි. නමුත් අපිට පුළුවන් ඒ input sense කොටසට යන විදුලිය ඉතුරු කර ගන්න. එයට කිරීමට PORTA වල PIN0CTRL register එකේ ISC[2:0] කියන bit වලට INPUT_DISABLE (0x4) ලබා දෙන්න ඕනෑ.

ඉහත පිළිවලට code එක සකස් කල පසු ADC0 වල DATA register එකට අගයක් ලිවීමෙන් අපිට අවශ්‍ය analog output එක PA6 pin එකෙන් ලබා ගන්න පුළුවන්. පහතින් පෙන්වා ඇත්තේ එසේ පිළියෙළ කරගත් code එක.

Step 03 : Sawtooth Waveforms සඳහා code එක ලියමු.

Sawtooth waveform නිර්මාණය කරන්න නම් DAC වලින් නිපදවන වෝල්ටීයතාවය ක්‍රමයෙන් වැඩි විය යුතුයි. සරල for loop එකක් භාවිතා කර පහත පරිදි ලිවිය හැක.

රූපයේ දැක්වෙන්නේ ඉහත ලියපු code එක IC එකට program කරලා run කල විට ලැබෙන තරංගය oscilloscope එකකින් බැලුව විට පෙනෙන ආකාරය.

Step 04 : Triangle shape waveforms සඳහා code එක ලියමු.

Triangle waveform නිර්මාණය කරන්න නම් DAC වලින් නිපදවන වෝල්ටීයතාව ක්‍රමයෙන් වැඩි වී නැවත ක්‍රමයෙන් අඩු විය යුතුයි. එය for loop භාවිතා කර පහත පරිදි ලිවිය හැක.

රූපයේ දැක්වෙන්නේ ඉහත ලියපු code එක IC එකට program කරලා run කල විට ලැබෙන තරංගය oscilloscope එකකින් බැලුව විට පෙනෙන ආකාරය.

Step 05 : Square shape waveforms සඳහා code එක ලියමු.

Square waveform නිර්මාණය කරන්න නම් DAC වලින් නිපදවන වෝල්ටීයතාව digital signal එකකට සමාන වන ලෙස උපරිමයක් හා අවමයක් ලිවීම ප්‍රමාණවත්.

රූපයේ දැක්වෙන්නේ ඉහත ලියපු code එක IC එකට program කරලා run කල විට ලැබෙන තරංගය oscilloscope එකකින් බැලුව විට පෙනෙන ආකාරය.

Step 06 : Sin shape waveforms සඳහා code එක ලියමු.

Sin waveform නිර්මාණය කරන්න නම් ගණන් ටිකක් හදන්න ඕනෑ. එහෙම ගණන් පාවිච්චි කරලා කරපු function එකක් තමා පහත තියෙන්නේ. මේ සඳහා භාවිතා කලේ <math.h> C library එකේ තියෙන sin() කියන function එක. ADC = 127 කියන අගය sin තරඟයේ 0 ලක්ෂය ලෙස යොදා ගත්තා.

රූපයේ දැක්වෙන්නේ ඉහත ලියපු code එක IC එකට program කරලා run කල විට ලැබෙන තරංගය oscilloscope එකකින් බැලුව විට පෙනෙන ආකාරය.

Step 04 : Code එක සම්පුර්ණ කරලා IC එකට program කරලා run කරලා බලමු.

දැන් අපිට ඕනෑම තරඟයක් නිපදවන්න පුළුවන්. අපි දැන් push button වලින් අපිට අවශ්‍ය හැඩය තෝරාගන්න code එකත් ලියමු. එසේ ලියපු සම්පුර්ණ code එක පහට පහත Github link එකෙන් බාගන්න. IC එක program කරලා run කරලා බලන්න.

DAC Github project source files.