මේ පාඩමෙන් මම බලාපොරොත්තු වෙන්නේ TCA Timer එකෙන් waveform generator එකක් සාදා ගන්නා ආකාරය කියලා දෙන්න. සරලව කිව්වොත් PWM තරංග වැනි කාලය සමග වෙනස් වන විද්‍යුත් තරංග TCA භාවිතා කරලා නිපදවන ආකාරය උගන්වන්න. එහෙනම් අපි පාඩම පටන් ගමු.

මොනවද මේ Wave forms?

Waveform එකක් කියන්නේ කාලය සමඟ වෙනස්වන විද්‍යුත් සංඥාවක්. උදාහරණ විදිහට කොටු හැඩයේ සහ sin හැඩයේ විද්‍යුත් තරංග සලකන්න පුළුවන්. AVR IC වල තියෙන TCA timer එකට පුළුවන් කාලය සමඟ වෙනස්වන කොටු හැඩයේ තරංග(square waves) නිපදවන්න.  මේවා වර්ග දෙකකට බෙදලා පෙන්වන්න පුළුවන්. ඒ,

  • Frequency waveform
  • PWM waveform

මෙතැන දී Frequency waveform එකක් කියන්නේ යම් සංඛ්‍යාතයකින්  “1” සහ “0” වන signal එකක්. මෙහි “1” වෙලා තියෙන කාලය “0” වෙලා තියෙන කාලයට සමානයි. පහත රූපයේ දැන්වෙන්නේ Frequency waveform එකක්. එහි ඇති d1, d2, d3 සහ d4 යන කාල පරතයන් එක සමාන වේ.

PWM waveform එකක “1”  සහ “0” වෙලා තියෙන කාලයන් සැම විටම සමාන වන්නේ නෑ. පහත රූපයේ දැන්වෙන්නේ PWM waveform එකක්. එහි ඇති d1, d2, d3 සහ d4 යන කාල පරතයන් එකිනෙකට වෙනස්.

මේ waveform වර්ග දෙකේම අවර්ත කාලය(T) සහ dn කියන කාල පරතයන් අපිට අවශ්‍ය පරිදි සැකසා ගන්න පුළුවන් පහසුකම් TCA වල තියෙනවා. අපි දැන් මේ තරංග නිපදවේන යාන්ත්‍රනය ඉගෙන ගනිමු.

Waveform generator එකේ ක්‍රියාකාරිත්වය තේරුම් ගනිමු.

TCA එක comparator එකක් ලෙස ක්‍රියාකරන විට සිදුවූ දේ ඔබට මතකද? එතැනදී සිදුවුනේ CNT කියන counter register එක එයට ලැබෙන clock pulses ගණන් කරගෙන යන අතර වාරයේදී CNT වල අගය CMPn කියන compare register එකේ අගයට සමාන වූ විගස interrupt එකක් නිර්මාණය කරන එක. Waveform generator එකක දී  වෙන්නේ interrupt එක වෙනුවට IO pin එකක logic level එක “1” හෝ “0” ලෙස වෙනස් වීම. මේ වෙනස් වීම තමා අපිට ලැබෙන digital signal එක. TCA වල කැටි සටහන බැලුවොත් මේ දේවල් තවත් හොදට තේරුම් ගන්න පුළුවන් වෙයි.

මේ රූපයේ තියෙන දේවල් වලින් waveform සැදීමට අවශ්‍ය වන්නේ Base counter එකේ තියෙන CNT counter register එක සහ පහතින් ඇති Compare channel තුන. Counter register එක තමාට ලැබෙන clock pulse චක්‍රීයව 0 සහ උපරිම(TOP) අගය අතර නොනවත්වා ගණන් කරගෙන යනවා. මෙහි ඇති Compare channel වල තියෙන CMPn කියන register එකට අපිට කැමති අගයක් ලියන්න පුළුවන්. ගණන් කරන විට CNT වල අගය යම් මොහොතක CMPn අගයට සමාන වෙනවා, ඒ මොහෙතිදී තමා waveform signal එක ලැබෙන්නේ. මේ signal එක WOn කියන pin එකක් හරහා පිටතට ගන්න පුළුවන්.

සැදෙන output එක Frequency waveform එකක් ද නැතිනම් PWM එකක් ද කියන එක තීරණය කරන්නේ TCA හී CTRLB register එකේ තියෙන WGMODE[2:0] bit වලින්. පහත වගුවේ තියෙන්නේ එසේ තෝරා ගත හැකි waveform වර්ග. මෙහි PWM mode කීපයක් තිබුනද ඒවායේ සමස්ථ ලක්ෂණ බොහෝ දුරට එක සමානයි.

TCA වල CMP0, CMP1 සහ CMP2 නමින් compare register තුනක් තියෙනවා. මේ නිසා එකින් එකට වෙනස් waveform තුනක් එක වර සාදාගන්න පුළුවන්. <Split mode එකේදී channel 6ක් ලැබෙනවා නමුත් PWM වලට පමණයි.> Waveform generator එකක් ලෙස භාවිතා කරද්දී WOn output pin මොනවද කියන එක දැනගන්න ඕනේ. ඔබ භාවිතා කරන IC එකේ datasheet එකේ තියෙන PORT Function Multiplexing Map කියන වගුව බැලුවොත් ඒ කරණය පහසුවෙන් හොයාගන්න පුළුවන්. පහත රූපයේ තියෙන්නේ ATtiny1614 කියන IC එකේ වගුව.

මෙහි තියෙන WO1, WO2 ලෙස WO5 දක්වා ඇති pin වලින් අපිට ouput එක ගන්න පුළුවන්. ඒ කියන්නේ PB0, PB1, PB2, PB3, PA3, PA4 සහ PA5 pin පමණක් මේ සඳහා යොදාගන්න පුළුවන් කියන එක. <WO3, WO4 සහ WO5 කියන output වලංගු වන්නේ Split mode එකේදී පමණයි.> හොදයි එහෙනම් දැන් අපිට ප්‍රයෝගික ක්‍රියාකාරකම් වලට යන්න පුළුවන්. මේ පාඩමේ projects දෙකක් තියෙනවා. ඉන් ඔබට කැමති එකක් තෝරාගෙන අත්හදා බලන්න පුළුවන්.

TCA Project 04:TCA භාවිතා කර Frequency waveform සාදන ආකාරය.

TCA Project 05: TCA භාවිතා කර PWM waveform සාදන ආකාරය.

Project 04 : TCA භාවිතා කර Frequency waveform සාදන ආකාරය.

Frequency(FRQ) waveform signal එකක logic level එක “1” සහ “0” වෙලා තියෙන කාලයන් සමානයි. මේ නිසා අපිට කැමති සංඛයාතයකින් සමබර කොටු තරංග අවශ්‍ය උනොත් මේ ක්‍රමය භාවිතා කරන්න පුළුවන්. පහත රූපයේ තියෙන්නේ FRQ signal නිපදවන විට TCA ක්‍රියා කරන ආකාරය පෙන්වන කාල ප්‍රස්ථාරයක්. ඒ මගින් ඔබට WOn signal එක “1” සහ “0” වෙනස් හැටි තේරුම් ගන්න පුළුවන්.

FRQ waveform නිෂ්පාදනය කිරීමට නිවැරදි ලෙස භාවිතා කල හැක්කේ channel 0 එක පමණයි. මීට හේතුව counter එකේ TOP එක තීරණය කරන්නේ CMP0 වල අගයෙන් වීම. Output එක ලෙස ලැබෙන තරංගයේ සංඛ්‍යාතය පහත සමීකරණයෙන් ලබා ගන්න පුළුවන්,

fFRQ = fCLK_PER / 2N (CMP0 + 1)

මෙහි N කියන්නේ prescale සංගුණකයට. System clock එකේ වේගය fCLK_PER වලින් දක්වනවා. සමීකරණයේ හැටියට අපිට සාදාගන්න පුළුවන් විශාලතම සංඛ්‍යාත වෙන්නේ fCLK_PER /2 ( එනම් N = 1, CMP0 = 0 ). මම හිතනවා Frequency waveform සාදන්න මේ දැනුම හොදටම ප්‍රමාණවත් කියලා. දැන් අපි සරල පරිපථයක් සාදාගෙන මේ දේ අත්හදා බලමු.

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

මේ project එකට මම භාවිතා කරන්නේ ඉතාම සරල පරිපථයක්. එහි ඇත්තේ ATtiny1614 MCU එකක් සහ headers කීපයක් පමණයි. FRQ signal නිපදවන්න භාවිතා කරන්නේ TCA වල CMP0 channel එක නිසා ඊට ප්‍රතිචාර දක්වන output signal එක වෙන්නේ WO0. මෙය සම්බන්ද වෙන්නේ PB0 pin එකට නිසා ඒ pin එක header එකකට සම්බන්ධ කළා. J1 header එක තියෙන්නේ IC එක program කිරීමටයි. පසෙකින් දැක්වෙන්නේ පරිපථ රූප සටහනයි.

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

 දැන් අපි FRQ waveform එකක් නිර්මාණය කරගන්න ඕනේ firmware එක ලියන්න පටන් ගමු. සුපුරුදු විදිහට මුලින්ම කරන්න ඕනේ දේ තමා Atmel Studio එකෙන් අලුත් project එකක් සාදා ගන්න එක. මම මේ project එකටත් IC එකේ තියෙන 20MHz clock source ඒක තෝරාගන්නවා. ඒ සඳහා Step 01 අනුගමනය කරන්න ඔබට පුළුවන්.

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

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

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

දැන් ඔබට පහත දැක්වෙන පරිදි window එකක් දකින්න ලැබේවි. එකේ තියෙන CLKCTRL කියන එක ඔබන්න.

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

MAIN CLOCK CONFIGURATION යටතේ තියෙන,

  • Enable = True
  • Main Clock Source = 20Mhz internal Osc.
  • PEN:Prescaler enable = True
  • PDIV: Prescaler Division = 10

ලෙස සකසා ගන්න. අනිත් දේවල් වලට කිසි වෙනසක් කරන්න යන්න එපා! අවසානයේ GENERATE PROJECT ඔබන්න.

සමහරක් විට 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 එක ඔයාටත් එන්න ඕනෑ. පළමු පියවර සාර්ථකයි. දැන් තියෙන්නේ Timer එකට අදාළ code එක ලියන්න

වැදගත්:
හොඳට මතක තියා ගන්න දැන් අපට system 2MHz clock එකක් තියෙනවා කියලා. මොකද අපි 20MHz internal clock එක 10න් බෙදලා (PDIV = 10) ගත්ත නිසා. ඒ කියන්නේ අපේ ලියන program එක IC එකේ දී ඇත්තටම run වෙන වේගය 2MHz කියන එක තමයි.

Step 02 : FRQ waveform සඳහා අවශ්‍ය කරන TCA settings සොයගමු.

මම 2kHz සංඛ්‍යාතයක් සහිත FRQ waveform එකක් හදලා පෙන්වන්නම්. ඒ පිළිවෙල අනුගමනය කලොත් ඔබට පුළුවන් ඔබ කැමති සංඛ්‍යාවකින් FRQ waveform සාදාගන්න. මේ සඳහා අපිට ඕනේ කරන prescale අගය සහ CMP0 අගය සොයගමු. කලින් උගත් සමීකරනය භාවිතා කරමු.

fFRQ = fCLK_PER / 2N (CMP0 + 1)

fFRQ =2kHz, fCLK_PER = 2MHz ලෙස යෙදු විට, N (CMP0 +1 ) = 500 දක්වා සුලුකරන්න පුළුවන්.  අපි N සඳහා  2 තෝරා ගතහොත් CMP0 වල අගය විය යුත්තේ 249. පහතින් පෙන්වා තියෙන්නේ සම්පුර්ණ code එක.

පිලිවෙලින්,

  1. PB0 pin එක output එකෙක් කිරීම. මෙසේ නොකලොත් අපි නිපදවන FRQ waveform එක IC එකෙන් ඉවතට ගන්න බැහැ.
  2. CMP0 වලට අපි සොයාගත් අගය ලබා දීම
  3. CTRLB වල WGMODE[2:0] වලට FRQ mode එක සැකසීම සහ CMP0EN මගින් channel 0 එක enable කිරීම
  4. CTRLA වලට සොයාගත් prescale අගය සහ ENABLE bit එකෙන් TCA එක ON කිරීම.

යන දේවල් තමා මේ code කරන්නේ.  ඔබට පුළුවන් ඔබ ලඟ PICkit එක භාවිතා කරලා IC එකට මේ code එක burn කරලා බලන්න. එවිට PB0 වලින් 2kHz digital signal එකක් ලැබිය යුතුයි.

Project 05 : TCA භාවිතා කර PWM waves සාදන ආකාරය.

PWM කියන්නේ යම්කිසි නියත ආවර්ථ කාලයක්(T) ඇති නමුත් “1” සහ “0” වෙලා තියෙන වෙලාව අපිට ඕනෑ විදිහට වෙනස් කරන්න පුළුවන් waveform එකකට. PWM signal එකක “1” වෙලා තියෙන කාලයට කියන්නේ Duty cycle කියලා. පහත රූපයේ පෙන්වන්නේ TCA මගින් PWM waveform එකක් නිපදව ආකාරය පෙන්වන කාල ප්‍රස්ථාරයක්.

රූපයේ පෙන්වන ආකාරයට CNT = 0 වන මොහොතේ තමා අලුත් ආවර්ථ කාලක්(T) පටන් ගන්නේ. මේ මොහොතේදී WOn “1” වෙනවා. CNT ගණන් කරගෙන ඉහලට යනවිට MATCH වෙන මොහොතේ, එනම් CNT = CMPn විට WOn අගය “0” වෙනවා. CNT = TOP විට මේ ක්‍රියාව නැවතත් පටන් ගන්නවා. මේ රූපයේ තියෙන්නේ TCA වලට PWM waveform නිපදවන්න පුළුවන් ක්‍රම 4න්  එකක් වන SINGLE SLOP PWM වලට අදාල රටාවයි. ඉතිරි PWM වර්ග තුන වෙන්නේ,

  • DSTOP
  • DSBOTH
  • DSBOTTOM

කියන ඒවායි. සුළු වෙනස්කම් ඇති නිසා මම මේ දේවල් මේ පාඩමෙන් කියලා දෙන්න යන්න නෑ. ඔබට පුළුවන් පසුව මේවා ගැන තනියම datasheet එක හරහා ඉගෙනගන්න. අපිට මෙතැන දී මතක තියාගන්න ඕනේ TOP එක තීරයන කරන්නේ PER  register ඒකෙන් කියන වග සහ duty cycle එක පාලනය කරන්නේ CMPn register වලින් බව පමණයි. මේ නිසා Output එක ලෙස ලැබෙන PWM තරංගයේ සංඛ්‍යාතය පහත සමීකරණයෙන් ලබා ගන්න පුළුවන්,

fPWM = fCLK_PER / 2N (PER + 1)

මෙහි N කියන්නේ prescale සංගුණකයට. System clock එකේ වේගය fCLK_PER වලින් දක්වනවා. අපි දැන් සරල පරිපථයක් සාදාගෙන මේ දේ අත්හදා බලමු.

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

මේ project එකට මම භාවිතා කරන්නේ ඉතාම සරල පරිපථයක්. එහි ඇත්තේ ATtiny1614 IC එකක් සහ LED තුනක් පමණයි. LED තුන PWM හරහා ON/OFF කරන්න තමා කරන්න හිතාගෙන ඉන්නේ. PB0, PB1 සහ PB2 pin මේ තෝරා ගත්තේ PWM channel තුන (WO0, WO1 සහ WO2) සම්බන්ධ වෙන්නේ මේවාට නිසයි. J1 header එක තියෙන්නේ IC එක program කිරීමටයි. පසෙකින් දැක්වෙන්නේ ඒ පරිපථ රූප සටහන.

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

 ප්‍රථමයෙන් ම අලුත් Atmel Studio project එකක් සාදා ගත යුතුයි. මෙයට Project 05 වල step 01 එක අනුගමනය කරන්න.

Step 02 : PWM waveform සඳහා අවශ්‍ය කරන TCA settings සොයගමු.

මම මේ code එකේදී 1kHz සංඛ්‍යාතයක් සහිත PWM signal තුනක් හදලා පෙන්වන්නම්. ඒ පිළිවෙල අනුගමනය කලොත් ඔබට පුළුවන් ඔබ කැමති සංඛ්‍යාවකින් PWM waveform සාදාගන්න. මේ සඳහා අපිට ඕනේ කරන prescale අගය සහ PER අගය සොයගමු. කලින් උගත් සමීකරනය භාවිතා කරමු.

fFRQ = fCLK_PER / 2N (PER + 1)

fFRQ =1kHz, fCLK_PER = 2MHz ලෙස යෙදු විට, N (PER +1 ) = 1000 දක්වා සුලුකරන්න පුළුවන්.  අපි N සඳහා  2 තෝරා ගතහොත් PER වල අගය විය යුත්තේ 499. පහතින් පෙන්වා තියෙන්නේ PWM නිපදවීමට TCA එක සැකසු code එක.

පිලිවෙලින්,

  1. PB0 සිට PB2 pin එක output එකෙක් කිරීම. මෙසේ නොකලොත් අපි නිපදවන PWM waveform එක IC එකෙන් ඉවතට ගන්න බැහැ.
  2. PER register එකට අපි සොයාගත් අගය ලබා දීම.
  3. CTRLB වල WGMODE[2:0] එක SINGLE SLOP PWM mode ලෙස සැකසීම සහ CMP0EN, CMP1EN සහ CMP2EN මගින් channel තුනම enable කිරීම.
  4. CTRLA වලට සොයාගත් prescale අගය සහ ENABLE bit එකෙන් TCA එක ON කිරීම.
  5. අහඹු අගයන් තුනක් CMP0, CMP1 සහ CMP2 වලට ලබා දීම. මේ අගයන් තමා duty cycle එක වන්නේ.

යන දේවල් තමා මේ code කරන්නේ. ඔබට පුළුවන් ඔබ ලඟ PICkit එක භාවිතා කරලා IC එකට මේ code එක burn කරලා බලන්න. එවිට එකිනෙකට වෙනස් PB0,PB1 සහ PB2 වලින් 1kHz PWM signal තුනක් ලැබිය යුතුයි. ඔබට කැමති PWM signal එකක් CMPn වල අගයන් වෙනස් කරලා ලබා ගන්න පුළුවන්. නමුත් CMPn වල අගය PER වලට වඩා විශාල නොවිය යුතුයි.