নবম অধ্যায়
9.1 State the function of a timer and the mode of operation of timer.
কোন একটি মাইক্রোকন্ট্রোলারের কাজ করার সুক্ষ্ণতা মূলত এই টাইমারের উপরই ডিপেন্ড করে
8051 মাইক্রোকন্ট্রোলারের দুইটি ১৬-বিটের টাইমার/কাউন্টার রয়েছে। এদেরকে যথাক্রমে Timer/Counter0 এবং Timer/Counter1 বলা হয়। 8051 ফ্যামিলির কোন কোন মডেলে (AT89C52,AT89C55) অবশ্য তৃতীয় একটি টাইমার রয়েছে যেটাকে Timer/Counter2 বলা হয়।
টাইমার আসলে কিভাবে কাজ করে?
9.2 Describe the function of each bit of TMOD & TCON Register.
Timer Mode Selection Register (TMOD)
C/T: এই বিটটি সেট করে দিলে কাউন্টার হিসেবে কাজ করবে এবং এই বিট ক্লিয়ার করে দিলে টাইমার হিসেবে কাজ করবে। বাই-ডিফল্ট এই বিটটি ক্লিয়ার -ই করা থাকে। টাইমার/কাউন্টার-০ এর জন্যে তৃতীয় বিট এবং টাইমার/কাউন্টার-১ এর জন্যে সপ্তম বিট।
GATE: এই বিটটি নিয়ে কথা বলার আগে আরেকটি জিনিস আমাদের জানতে হবে। সেটা হল টাইমার পেরিফেরাল্সটা দুইভাবে ব্যবহার করা যায়। ফ্রি-রানিং মোডে অর্থাৎ যেখানে মাইক্রোকন্ট্রোলারে পাওয়ার-আপ করার সাথে সাথে টাইমার তার কাজ শুরু করবে এবং আরেকটি হল INT0 ও INT1 পিনে সিগন্যাল প্রদানের মাধ্যমে অর্থাৎ এই পিনদ্বয়ে হাই-টু-লো সিগন্যাল দিলে টাইমার তার কাজ শুরু করবে। এই দুটি মোড সিলেক্ট করার জন্যে এই বিটটি ব্যবহৃত হয়। এই বিট সেট করে দিলে INT0 এবং INT1 পিনের মাধ্যমে টাইমার তার অপারেশন শুরু করে এবং ক্লিয়ার করে দিলে ফ্রি-রানিং মোডে কাজ শুরু করে। বাই-ডিফল্ট এই বিটটি লো -ই থাকে।
TR0: এই বিটটি সেট করে দিলে টাইমার/কাউন্টার-০ পেরিফেরাল্সটি অন হয় আর ক্লিয়ার করে দিলে অফ হয়ে যায়। বাই-ডিফল্ট ক্লিয়ার করা থাকে।
TF0: টাইমার/কাউন্টার-০ ওভার-ফ্লো হয়ে গেলে এই বিটটি হাই হয়ে যায়। টাইমার/কাউন্টার-০ রিলেটেড ইন্টারাপ্ট-সার্ভিস-রুটিন এক্সিকিউট হলে প্রসেসর একে ক্লিয়ার করে দেয় নতুবা প্রোগ্রামের মাধ্যমে একে ক্লিয়ার করে দিতে হয়।
TR1: এই বিটটি সেট করে দিলে টাইমার/কাউন্টার-১ পেরিফেরাল্সটি অন হয় আর ক্লিয়ার করে দিলে অফ হয়ে যায়। বাই-ডিফল্ট ক্লিয়ার করা থাকে।
TF1: টাইমার/কাউন্টার-১ ওভার-ফ্লো হয়ে গেলে এই বিটটি হাই হয়ে যায়। টাইমার/কাউন্টার-১ রিলেটেড ইন্টারাপ্ট-সার্ভিস-রুটিন এক্সিকিউট হলে প্রসেসর একে ক্লিয়ার করে দেয় নতুবা প্রোগ্রামের মাধ্যমে একে ক্লিয়ার করে দিতে হয়।
9.3 Write code for setting timer in different mode.
মোড 0 হ'ল 13-বিট টাইমার মোড যার জন্য 8-বিট THX এবং 5-বিট টিএলএক্স (প্রেসক্যালার হিসাবে) ব্যবহৃত হয়। এটি বেশিরভাগই পুরানো এমসিএস -৪৮ পরিবার মাইক্রোকন্ট্রোলারের সাথে ইন্টারফেসিংয়ের জন্য ব্যবহৃত হয়।
উপরের চিত্রটিতে প্রদর্শিত হয়েছে, 8 বিট THx এবং 5 টি বিট TLx মোট 13-বিট টাইমার তৈরি করত। TLx উচ্চতর 3-বিটগুলি টাইমার মোড 0 ব্যবহার করার সময় শূন্য হিসাবে লিখতে হবে, বা এটি ফলাফলকে প্রভাবিত করবে।
উদাহরণ
পোর্ট 1 এর পি 1.0 পিনে মোডে টাইমার 0 সহ একটি AT89C51 মাইক্রোকন্ট্রোলার ব্যবহার করে 2mSec পিরিয়ডের বর্গাকার তরঙ্গ তৈরি করি। 11.0592 মেগাহার্টজ এর অক্স্টাল অসিলেটর ফ্রিকোয়েন্সি ধরে নিন।
Programming steps for delay function
- Load Tmod register value i.e. TMOD = 0x00 for Timer0/1 mode0 (13-bit timer mode).
- Load calculated THx value i.e. here TH0 = 0xE3.
- Load calculated TLx value i.e. here TL0 = 0x14.
- Start timer by setting TRx bit. i.e. here TR0 = 1.
- Poll TFx flag till it does not get set.
- Stop timer by clearing TRx bit. i.e. here TR0 = 0.
- Clear timer flag TFx bit i.e. here TF0 = 0.
- Repeat from step 1 to 7 for delay again.
sbit test = P1^0; /* set test pin 0 of port1 */
void timer_delay() /* Timer0 delay function */
{
TH0 = 0xE3; /* Load 8-bit in TH0 (here Timer0 used) */
TL0 = 0x14; /* Load 5-bit in TL0 */
TR0 = 1; /* Start timer0 */
while(TF0 == 0); /* Wait until timer0 flag set */
TR0 = 0; /* Stop timer0 */
TF0 = 0; /* Clear timer0 flag */
}
void main()
{
TMOD = 0x00; /* Timer0/1 mode0 (13-bit timer mode) */
while(1)
{
test = ~test; /* Toggle test pin */
timer_delay(); /* Call timer0 delay */
}
}
মোড 1 (16-বিট টাইমার মোড)
মোড 1 হ'ল 16-বিট টাইমার মোডটি বিলম্ব উত্পন্ন করতে ব্যবহৃত হয়, এটি মোট 16-বিট রেজিস্টার গঠনে 8 বিট THX এবং 8-বিট TLx ব্যবহার করে।
উদাহরণ
আসুন পোর্ট 1 এর পি 1.0 পিনে মোডে টাইমার 0 সহ একটি AT89C51 মাইক্রোকন্ট্রোলার ব্যবহার করে 2mSec সময়কালের বর্গাকার তরঙ্গ তৈরি করি। 11.0592 মেগাহার্টজ এর এক্স্টাল দোলক ফ্রিকোয়েন্সি ধরে নিন।
Programming steps for delay function
- Load Tmod register value i.e. TMOD = 0x01 for Timer0 mode1 (16-bit timer mode).
- Load calculated THx value i.e. here TH0 = 0xFC.
- Load calculated TLx value i.e. here TL0 = 0x74.
- Start timer by setting TRx bit. i.e. here TR0 = 1.
- Poll TFx flag till it does not get set.
- Stop timer by clearing TRx bit. i.e. here TR0 = 0.
- Clear timer flag TFx bit i.e. here TF0 = 0.
- Repeat from step 1 to 7 for delay again.
sbit test = P1^0; /* set test pin0 of port1 */
void timer_delay() /* Timer0 delay function */
{
TH0 = 0xFC; /* Load higher 8-bit in TH0 */
TL0 = 0x74; /* Load lower 8-bit in TL0 */
TR0 = 1; /* Start timer0 */
while(TF0 == 0); /* Wait until timer0 flag set */
TR0 = 0; /* Stop timer0 */
TF0 = 0; /* Clear timer0 flag */
}
void main()
{
TMOD = 0x01; /* Timer0 mode1 (16-bit timer mode) */
while(1)
{
test = ~test; /* Toggle test pin */
timer_delay(); /* Call timer0 delay */
}
}
9.5 Calculate the initial value of timer for creating a certain delay.
আমাদের প্রয়োজন = ১ সেকেন্ড = ১,০০০ মিলিসেকেন্ড
যেহেতু 8051 মাইক্রোকন্ট্রোলার সর্বোচ্চ ৬৫.৫৩৫ মিলিসেকেন্ড সময় গণনা করতে পারে সেহেতু,
১,০০০ / ৬৫.৫৩৫ = ১৫.২৫৯০ সংখ্যক বার আমাদের টাইমারের কাউন্ট রিপিট করতে হবে। কিন্তু যেহেতু এটি একটি ভগ্নাংশ সংখ্যা সেহেতু এই সংখ্যকবার তো লুপ ঘুরানো যাবেনা। এর জন্যে আমরা দশমিক পয়েন্টের আগ সংখ্যা পর্যন্ত লুপ ঘুরাবো। অর্থাৎ ১৫ সংখ্যকবার টাইমারকে ওভার-ফ্লো হতে দিব। ১৬ বিটের টাইমার একবার ওভার-ফ্লো হতে সময় লাগে ৬৫.৫৩৫ মিলিসেকেন্ড, তাহলে ১৫ সংখ্যকবার লুপ ঘুরাতে সময় লাগবে মোট = ১৫ * ৬৫.৫৩৫ মিলিসেকেন্ড = ৯৮৩.০২৫ মিলিসেকেন্ড। কিন্তু আমাদের টার্গেট হল ১,০০০ মিলিসেকেন্ড। যেহেতু আমরা দশমিকের পরের সংখ্যা নেগ্লেক্ট করেছি সেহেতু টার্গেট সময়ের চাইতে আমাদের কিছু সময় কম এসেছে।
সময়ের ঘাটতি = ১,০০০ - ৯৮৩.০২৫ = ১৬.৯৭৫ মিলিসেকেন্ড।
এখন এইসময় তো আমরা টাইমার দিয়ে খুব সহজেই গণনা করতে পারি। টাইমার রেজিস্টারের মান হিসাবের জন্যে আমাদের সুত্র হল-
Register_value = Timer Max Value - (Delay / tick)
= ৬৫,৫৩৬ - ((১৬.৯৭৫ * ১০০০) / ১)
= ৬৫,৫৩৬ - ১৬৯৭৫
= ৪৮,৫৬০ হেক্সাডেসিমেলে BDB1
9.7 Develop program for generating square wave and PWM.
8051 টাইমার ব্যবহার করে যে কোনও ফ্রিকোয়েন্সি (নিয়ামক নির্দিষ্টকরণের দ্বারা সীমাবদ্ধ) এর বর্গাকার তরঙ্গ উত্পন্ন করা যায়। কৌশলটি খুব সাধারণ। বর্গাকার তরঙ্গের অর্ধেক সময়কালের সমান বিলম্ব সহ একটি বিলম্ব সাবরুটাইন লিখুন। যে কোনও পোর্ট পিনটি উচ্চ করুন এবং বিলম্বের সাবরুটিনকে কল করুন। বিলম্ব সাববুটিন শেষ হওয়ার পরে, সংশ্লিষ্ট পোর্ট পিনটি কম করুন এবং বিলম্বকে সাব্রোটিন লাভ কল করুন। সাব্রোটিন শেষ হওয়ার পরে, আবার চক্রটি পুনরাবৃত্তি করুন। ফলাফলটি নির্বাচিত পোর্ট পিনে কাঙ্ক্ষিত ফ্রিকোয়েন্সিটির বর্গাকার তরঙ্গ হবে। সার্কিট ডায়াগ্রামটি নীচে দেখানো হয়েছে এবং এটি যে কোনও বর্গাকার তরঙ্গ জন্য ব্যবহার করা যেতে পারে, তবে প্রোগ্রামটি সেই অনুযায়ী হতে হবে। বিভিন্ন বর্গাকার তরঙ্গগুলির জন্য প্রোগ্রামগুলি সার্কিট ডায়াগ্রামের নীচে প্রদর্শিত হয়
1KHz Square wave using 8051 timer.MOV P1,#00000000B
MOV TMOD,#00000001B
MAIN: SETB P1.0
ACALL DELAY
CLR P1.0
ACALL DELAY
SJMP MAIN
DELAY: MOV TH0,#0FEH
MOV TL0,#00CH
SETB TR0
HERE: JNB TF0,HERE
CLR TR0
CLR TF0
SETB P1.0
RET
END
PWM (পিডব্লিউএম )কি?
PWM এর পূর্নরূপ হলো Pulse Width Modulation. ডিজিটাল ইলেকট্রনিক্স এর জগতে একটি অপরিহার্য পদ্ধতি এই PWM. বিভিন্ন কাজে, যেমন LED এর উজ্জ্বলতা নিয়ন্ত্রন, DC মোটরের গতি নিয়ন্ত্রনসহ নানা কাজে ব্যবহার করা হয় এই পদ্ধতিটি। এনালগ ইলেকট্রনিক্সে মূলত কোন লাইট বাল্বের উজ্জ্বলতা অথবা মোটরের গতি নিয়ন্ত্রন করা হয়ে থাকে দুই ভাবে।
ভোল্টেজ কন্ট্রোল করে, অথবা
কারেন্ট কন্ট্রোল করে।
কিন্তু ডিজিটাল ইলেকট্রনিক্স এর ডিভাইস গুলি যেমন মাইক্রোকন্ট্রলার ভোল্টেজ বলতে চেনে কেবল 0 Volt (0) অথবা 5 Volt(1). সুতরাং সেক্ষেত্রে গতি অথবা উজ্জলতা নিয়ন্ত্রন করা সম্ভবপর হয়ে ওঠে না। দরকার পরে নতুন কোন পদ্ধতির যাকে বলে PWM (পিডব্লিউএম)
একটু সহজ ভাবে পিডব্লিউএম (PWM)
যেহেতু মাইক্রোকন্ট্রোলার শুন্য অথবা ৫ ভোল্ট আউটপুট দিতে পারে সেহেতু যা করার এই দুটো ভোল্টেজ দিয়েই করতে হবে। ধরুন আপনি একটা LED তে ৫ সেকেন্ড ধরে ৫ ভোল্ট দিলেন, এবং ৫ সেকেন্ড ০ ভোল্ট দিলেন। অর্থাৎ, ৫ সেকেন্ড জ্বালালেন এবং ৫ সেকেন্ড নেভালেন।
আপনি একটি Blinking LED তৈরী করে ফেললেন যা জ্বলছে-নিভছে। এখন এই Blinking কে আরো দ্রুত করে দেয়া হলো। সেকেন্ডে ২০ বার জ্বলছে এবং ২০ বার নিভছে। সুতরাং, জ্বলা নেভার ফ্রিকোয়েন্সি ২০ হার্জ। মানুষের চোখ ০.১ সেকেন্ডের পরিবর্তন ধরতে পারে। কিন্তু LED কে জ্বলা-নেভা করা হচ্ছে ০.০৫ সেকেন্ডের মধ্যে। যা মানুষের চোখ ধরতে পারে না। মনেহয় বরং যেন উজ্জ্বলতা কমে গেছে।
এই blinking টা আরো দ্রুত করলে আরো ভালো ফল পাওয়া যাবে। ধরাযাক সেকেন্ডে ৫০০ বার অন এবং ৫০০ বার অফ করা হচ্ছে। সেক্ষেত্রে উজ্জ্বলতা অর্ধেক হয়ে যাবে। শুধু তাই না, খুব দ্রুত অন-অফ সুইচিং হবার কারনে এভারেজ কারেন্ট কমে যাবে এবং তার সাথে সাথে উজ্জ্বলতা কমানো যাবে।
ডিউটি সাইকেল (Duty Cycle) কি?
এখন আসা যাক আরেকটি নতুন কনসেপ্টে, ডিউটি সাইকেল কি?
এই যে LED কে সেকেন্ডে ৫০০ বার অন এবং ৫০০ বার অফ করা হচ্ছে। এখানে অন এবং অফ এর অনুপাত কত? উত্তর ১ঃ১। অর্থাৎ অর্ধেক সময় (১ মিলিসেকেন্ড) অন থাকছে এবং অর্ধেক সময় (১ মিলিসেকেন্ড) অফ। ১০০ এর অর্ধেক ৫০।
সুতরাং এই PWM Frequency এর ডিউটি সাইকেল 50%. উজ্জ্বলতা/ গতি নির্ভর করে এই ডিউটি সাইকেল এর উপর। যেহেতু এক্ষেত্রে ডিউটি সাইকেল 50% সেহেতু LED এর উজ্জ্বলতা অর্ধেক হবে। নিচের ছবিটি লক্ষ্য করুন।
No comments