මේ පාඩමෙන් මම ඔයාලාට කියල දෙන්නේ AVR වල තියෙන Analog Comparator (AC) කියන අවයවය ගැන. Analog විභවයන් දෙකක් එකට සංසන්දනය කර ඒවායේ වෙනසට අනුව digital output එකක් ලබා දෙන්න මෙයට පුළුවන්. බොහෝ දෙනෙක් මේ අවයවයෙන් වැඩක් ගන්නේ නැතුව ඒ වෙනුවට Analog to Digital Converter (ADC) එක අනවශ්යය ලෙස භාවිතා කරන අවස්ථා මම ඕනෑ තරම් දැක තියෙනවා. DAC එකට වඩා වේගවත්ව අඩු විදුලි භාවිතයකින් analog voltage සංසන්දනය කරන්න AC අවයවයට පුළුවන්ම තියෙද්දී මෙය භාවිතා නොකරන්නේ ඒ ගැන නොදැනීම නිසා කියන එක තමා මගේ හැඟීම. එබැවින් මේ ගැන දැන ඉගෙන ගන්න එක වටිනවා.
මොකක්ද මේ Comparator එකක් කියන්නේ?
Comparator එකක් කියන්නේ Op-Amp වල සරල යෙදීමක්. මෙහිදී Op-Amp එකේ ධන(+) හා ඍණ(-) අග්ර දෙකට ලබාදෙන voltage අගයන් දෙක අතර වෙනස ධන අගයක් නම් output එක V+ ට සමාන වෙනවා. එම වෙනස ඍණ නම් output එක V- ට සමාන වෙනවා. පහත රූපයේ පෙන්වා ඇත්තේ analog comparator එකක්.
පහත දැල්වෙන උදාහරණ කීපය මඟින් මෙහි ක්රියාකාරිත්වය ඉගෙන ගමු.
සාමාන්යයෙන් micro-controller වල තියෙන comparator එකක V+ අග්රයට Vcc ද V- අග්රයට GND එකටද සම්බන්ධ වෙනවා. මේ නිසා output එක ලෙස ලැබෙන්නේ “1” සහ “0” කියන digital අගයන් දෙකෙන් එකක් පමණි. අපි දැන් AVR වල AC අවයවය ගැන ඉගෙන ගමු.
AVR වල තියෙන AC ගැන කෙටි හැදින්වීමක්
පහත රූපයේ පෙන්වා තියෙන්නේ අලුත් AVR IC වල දකින්න තියෙන AC එකක කැටි සටහනක්. මේ රූපය උපුටා ගත්තේ ATtiny1614 IC එකේ datasheet එකෙන්.
කැටි සටහනේ දැක්වෙන පරිදි comparator එකේ (+) සහ (-) අග්ර වලට අපි කැමති input source තෝරාගන්න පුළුවන්. එය AINPn සහ AINNn කියන බාහිර pin හරහා ලැබෙන voltage එකක් හෝ VREF සහ DAC වැනි අභ්යන්තර අවයව වලින් ලැබෙන voltage අගයක් විය හැක. තෝරාගැනීම සිදුවන්නේ මෙහි ඇති MUXCTRLA register එකට අපි ලියන අගය අනුවයි. AINPn සහ AINNn පිළිවෙලින් සම්බන්ධ වන්නේ AC එකේ (+) සහ (-) input අග්රවලට පමණක් බව මතක තියාගන්න. AC අවයවය සක්රිය කිරීම ආදී කටයුතු පාලනය කරන්නේ CTRLA register එකෙන්. AC එකෙන් ලැබෙන ප්රතිදානය IO pin එකක් හරහා ලබා ගන්න පුළුවන් OUT pin එක ඇත්තේ ඒ සඳහායි. කැමතිනම් මේ ප්රතිදානය interrupt එකක් ලෙස යොදා ගන්නත් පුළුවන්. මේ නිසා voltage වෙනසකට ක්ෂණිකව ප්රතිචාර දක්වන්න Analog Comparator අවයවය භාවිතා කරන්න පුළුවන්.
වැදගත්: DAC කියන අවයවය තියෙන්නේ tinyAVR-1 ඛාණ්ඩයේ IC වල පමණයි. ඒ නිසා tinyAVR-0 සහ megaAVR-0 series වල comparators වලට DAC input එකක් නැති බව හොදින් මතක තියාගන්න.
අපි භාවිතා කරන MCU වලට AC අවයව එකකට වඩා තියෙන්න පුළුවන්. උදාහරණයක් විදිහට ATtiny1614 කියන IC එක සතුව AC0, AC1 සහ AC2 ලෙසින් instance තුනක් දැකගන්න පුළුවන්. එබැවින් ඔබට අවශ්යය AC ප්රමාණයට අනුව ගැලපෙන MCU එකක් තෝරාගන්න වගකීම ඔබසතු වෙනවා. මෙය Datasheet එක මඟින් දැන ගන්න පුළුවන්.
AC එක භාවිතා කරන්න නම් AINPn, AINNn සහ OUT pin ගැන දැනගන්න ඕනේ. Datasheet එකේ ඇති PORT Function Multiplexing Map කියන වගුවෙන් මේවා යෙදෙන pin සොයාගන්න පුළුවන්. පහත රූපයේ තියෙන්නේ ATtiny1614 වල වගුව.
මේ අනුව බලන විට AC0 instance එකට AINPn ලෙසට PA7 හෝ PB1 ද, AINNn ලෙස PA6 ද OUT ලෙස PA5 භාවිතා කල හැකි බව පෙනේ. පරිපථ නිර්මාණය කරද්දී මේ ගැන සැලකිලිමත් වෙන්න වගබලා ගන්න.
මීළඟට ඔබ දැනගන්න වැදගත් දෙයක් වන්නේ AC වල input hysteresis ගැනයි. පරිපථයක ඇති විවිධ උපාංග හෝ බාහිර බලපෑම් නිසා electronic noise ඇතිවෙන බව අපි අහලා තියෙන දෙයක්. මේවා නිසා පරිපථයේ ඇති analog signal වලට යම් බලපෑම් (spikes) ඇතිවෙනවා. පහත ප්රස්ථාරයේ පෙන්වා තියෙන්නේ එවැනි අවස්ථාවක්.
දී ඇති ප්රස්ථාරයේ හැටියට noise එක එකතු වෙලා තියෙන්නේ (-) input signal එකට. පෙන්වා ඇති මොහොතේ (+) විභවය හා (-) විභවයන් ඉතා ආසන්න නිසා (-) අගයේ වන මේ ක්ෂණික විචල්යන්ට t1 සහ t2 යන සුළු කාල දෙකේදී output එක “0” වනහැටි ඔබට දැකගන්න පුළුවන්. මෙවැනි අවස්ථා මග හරින්න තමා input hysteresis (මන්දායනය) භාවිතා කරන්නනේ. එහිදී වන්නේ කුඩා වෙනස්වීම් නොසලකා හැරීමයි.
AVR වල තියෙන Analog Comparator අවයවයට ±10mV, ±25mV සහ ±50mV වැනි වෙනස්කම් තෝරාගෙන නොසලකා හරින්න පුළුවන්. මේවට කියන්නේ Hysteresis Modes කියලා. එය ඔබට CTRLA register එකේ ඇති HYSMODE[1:0] bit වලින් තෝරාගන්න පුළුවන්. දැන් අපිට AC අවයවය භාවිතා කරලා ප්රයෝගික ක්රියාකාරකමක් කරමු.
Project 01 : AC භාවිතා කර ස්වයංක්රිය night light system එකක් නිර්මාණය කරමු.
අඳුර වැටීගෙන එන විට ස්වයන්ක්රියව ON වෙන light system හරිම ප්රයෝජනවත් දෙයක්. මම මේ project එකේදී එවැනි පරිපථයක් AVR MCU එකක් භාවිතා කරලා නිර්මාණය කරන්න කියලා දෙන්නම්. මේ project එකේ ප්රධාන අරමුණ වෙන්නේ AC අවයවයෙන් නියම ප්රයෝජන ගන්නා හැටි කියලා දෙන එක නිසා මම මේ සඳහා TCB Timer Project 01: එකට නිර්මාණය කරපු remote control light system පරිපථයම භාවිතා කරනවා. ඒ පරිපථයට පුළුවන් උනේ remote controller එකෙන් යවන අණට අනුව ON/OFF වෙන්න පමණයි. අපි දැන් AC භාවිතා කරලා අඳුර වැටෙන විට ස්වයංක්රීයව ON වෙන්න අටවුමක් යොදන හැටි ඉගෙන ගමු.
මේ ව්යාපෘතියට පහත සක්වෙන Tools ටික install කර ගන්න ඕනේ. මගේ කලින් පාඩම් ටික කරලා තිබ්බා නම් ඒ ගැන වධ වෙන්න ඕනෑ නැති වෙයි. ඒත් අලුත් කෙනෙක් නම් මෙන්න මේ ටික install කරන්න වෙනවා.
- Firmware එකට Atmel Studio 7.0 or latest version (install කරන්න කියලා දෙන පාඩම)
- Circuit ඒක ඇඳ ගන්න KiCAD EDA (install කරන්න කියලා දෙන පාඩම)
ඒ වාගේ ම තමා
- Program එක IC එකට burn කරන්න PIC KIT 4 හෝ වෙනත් programmer එකක් ඕනෑ.
මේ ටික install කර ගත්තා නම් hardware එකෙන් ම වැඩේ පටන් ගමු.
Hardware එක නිර්මාණය කිරීම.
<මෙම කොටස තවම සාදමින් පවතී>
Firmware එක නිර්මාණය කිරීම.
දැන් අපි night light එකේ firmware එකේ වැඩ කරමු. අලුතෙන් Atmel Studio project එකක් හදන්නේ නැතුව TCB Project 01 එකේ code එකම මේ සඳහා මම භාවිතා කරනවා. මොකද, අලුතෙන් එකතු කරන අඳුරේදී auto ON වෙන code එක ඉතිරි කොටස්වලට බලපෑමක් ඇති කරන්නේ නෑ. මේ සඳහා ප්රථමයෙන්ම කලයුතු වන්නේ අලුත් AC0 එකෙන් compare output එකක් ලැබෙන මට්ටමට සකසා ගන්න එක. ඒ සඳහා අවශ්ය කරන settings පහත පරිදි විමසා බලා තීරණය කරමු,
- ප්රථමයෙන්ම AC0 සක්රිය කල යුතුයි, ඒ සඳහා CTRLA වල ENABLE bit එකක් “1” ලියමු.
- Input hysteresis අගය ලෙස ±10mV ලෙස තෝරා ගමු. ඒ නිසා CTRLA වල HYSMODE[1:0] සඳහා 0x1 යොදමු. මෙය ඔබට කැමති ලෙස වෙනස් කර බලන්න.
- විදුලිය පිරිමස්සින ඕනෑ කරන නිසා TCB Project 01 එකේදී MCU එක භාවිතා කලේ sleep mode එකේ. ඒ නිසා AC එකත් sleep mode එකේදී වැඩ කරන්න පුළුවන් වෙන්න සකස් කරන්න ඕනේ. ඒ නිසා CTRLA වල RUNSTADBY bit එකට “1” ලියන්න ඕනේ. LPMODE bit එකට “1” ලිව්වොත් තවත් විදුලිය පරිභෝජනය කරන එක අඩු කරන්න පුළුවන්. නමුත් LPMODE bit එක හරහා විදුලිය අඩු කරන විට AC0 එකේ ප්රතිචාර දක්වන වේගය අඩු වෙන බවත් මතක තියාගන්න. අපේ මේ යෙදිමට එය බාධාවක් නොවන නිසා ප්රශ්නයක් නෑ.
- ආලෝකය අඩු වෙනකොට LDR එකේ ප්රතිරෝදය වැඩි වෙනවා. මේ නිසා AINP0 එකේ input voltage එක අඩු වෙනවා. මෙය AINN0 වලට වඩා අඩු ව්වූ විට AC එකේ output එක “0” වෙන්වා. ඒ නිසා ආලෝකයේ සිට අදුරට යනවිට “1” සිට “0” ට AC0 output එක වෙනස් වෙනවා. ඒ නිසා negative edge interrupt එකක් බාවිතා කලොත් ආලෝකය අඩුවූ විට අපිට light ON කරන්න ඕනේ code එක auto run කරවන්න පුළුවන්. ඒ නිසා CTRLA වල INTMODE[1:0] වලට 0x2 යොදමු. Interrupt සක්රිය කිරීමට INTCTRL register එකේ CMP bit එකද “1” කල යුතුවේ.
- AINP0 සහ AINN0 තෝරා ගන්න නිසා MUXPOS[2:0] = 0x0 ද MUXNEG[1:0] = 0x0 ද යොදාගන්න ඕනේ.
මේ setting සාදන code එක තමා පහත පෙන්වලා තියෙන්නේ.
AC0 වලට අදාළ interrupt vector pointer එක වන්නේ AC0_AC_vect නිසා අපේ ISR function එකට එය යොදා light එක ON කරන්න ඕනේ code එක එහි ලියමු. පසෙකි පෙන්වා ඇත්තේ එම code එකයි. Interrupt ගැන ඔබට කිසි අදහසක් නැතිනම් මෙන්න මේ පාඩම බලන්න.
Remote controller එකත් සහිතව ක්රියා කරන සම්පුර්ණ code එක පහට පහත Github link එකෙන් බාගන්න. එය ඔබේ සැදු පරිපථයේ IC එකට program කර run කරලා බලන්න. පරිපථයේ ඇති variable resistor එක එහා මෙහා කරලා ඔබට කැමති ආලෝක මට්ටමකදී light එක ON කරගන්න ඔබට පුළුවන් කියලත් මතක තියාගන්න.