পাঠ ০৭ · ৫৭-এর মধ্যে · মডিউল ২
Home / Courses / Microprocessors, Embedded Systems & IoT / ক্লক ও রিসেট

ক্লক সিস্টেম ও রিসেট

Clock systems and reset
৮ মিনিট পড়া মধ্যম · Intermediate Python সিমুলেশনসহ সম্পূর্ণ বাংলায়

এই পাঠে যা শিখবেন

  • ইন্টারনাল RC অসিলেটর বনাম বাহ্যিক ক্রিস্টাল অসিলেটরের মধ্যে ট্রেড-অফ
  • PLL কীভাবে ক্লক ফ্রিকোয়েন্সি গুণ করে, আর প্রিস্কেলার কীভাবে তা ভাগ করে
  • ক্লক গেটিং ধারণার সংক্ষিপ্ত পরিচিতি (পাওয়ার সাশ্রয়ের একটি কৌশল)
  • মাইক্রোকন্ট্রোলার রিসেট হওয়ার চারটি সাধারণ উৎস
  • একটি সত্যিকারের সূত্র-ভিত্তিক গণনা — ক্রিস্টাল ফ্রিকোয়েন্সি থেকে চূড়ান্ত পেরিফেরাল ফ্রিকোয়েন্সি

১ · ক্লকের উৎস: RC অসিলেটর বনাম ক্রিস্টাল

প্রতিটি মাইক্রোকন্ট্রোলারের একটি "হৃদস্পন্দন" দরকার — একটি ক্লক সিগন্যাল যা প্রতিটি ইনস্ট্রাকশন সাইকেলের গতি নির্ধারণ করে। এই ক্লকের দুটি সাধারণ উৎস:

  • ইন্টারনাল RC অসিলেটরInternal RC Oscillatorচিপের ভেতরেই তৈরি একটি সাধারণ রেজিস্টর-ক্যাপাসিটর ভিত্তিক অসিলেটর — কোনো বাহ্যিক কম্পোনেন্ট লাগে না। — চিপের ভেতরেই বিল্ট-ইন, কোনো বাহ্যিক কম্পোনেন্ট লাগে না, সস্তা ও কম বোর্ড স্পেস লাগে। কিন্তু তাপমাত্রা ও ভোল্টেজের সাথে এর ফ্রিকোয়েন্সি কিছুটা "ড্রিফট" করে (সাধারণত কয়েক শতাংশ ভুল) — টাইমিং-সংবেদনশীল কাজে (যেমন নির্ভুল UART বড রেট) সমস্যা করতে পারে।
  • বাহ্যিক ক্রিস্টালExternal Crystal Oscillatorচিপের বাইরে সংযুক্ত একটি কোয়ার্টজ ক্রিস্টাল — খুবই নির্ভুল ও স্থিতিশীল ফ্রিকোয়েন্সি দেয়। — চিপের বাইরে একটি কোয়ার্টজ ক্রিস্টাল সংযুক্ত করতে হয় (দুটি অতিরিক্ত পিন ও সাধারণত দুটি ছোট ক্যাপাসিটর লাগে), কিন্তু ফ্রিকোয়েন্সি অনেক বেশি নির্ভুল ও স্থিতিশীল (সাধারণত কয়েক ppm ভুল) — নির্ভুল টাইমিং বা নির্ভরযোগ্য সিরিয়াল কমিউনিকেশনের (M6) জন্য এটিই বেশি ব্যবহৃত হয়।

২ · PLL ও প্রিস্কেলার — ক্লক গুণ ও ভাগ

সোর্স অসিলেটরের ফ্রিকোয়েন্সি প্রায়ই CPU-র সর্বোচ্চ গতির তুলনায় কম (যেমন একটি ৮ MHz ক্রিস্টাল, কিন্তু CPU ৭২ MHz-এ চলতে সক্ষম)। PLL (Phase-Locked Loop) এই সোর্স ফ্রিকোয়েন্সিকে একটি নির্দিষ্ট গুণকে গুণ করে উচ্চতর সিস্টেম ক্লক তৈরি করে। এরপর বিভিন্ন পেরিফেরালের (টাইমার, UART) নিজস্ব প্রিস্কেলার থাকে যা সেই দ্রুত সিস্টেম ক্লককে ভাগ করে প্রতিটি পেরিফেরালের জন্য উপযুক্ত, ধীরতর ফ্রিকোয়েন্সিতে নামিয়ে আনে। সম্পূর্ণ সূত্রটি —

$$f_{peripheral} = \frac{f_{crystal} \times \text{PLL গুণক}}{\text{প্রিস্কেলার}}$$

পাওয়ার সাশ্রয়ের আরেকটি কৌশল হলো ক্লক গেটিং — যে পেরিফেরাল ব্যবহার হচ্ছে না, তার ক্লক সাপ্লাই সাময়িকভাবে সম্পূর্ণ বন্ধ রাখা (M8-এর লো-পাওয়ার মোড পাঠে বিস্তারিত আসবে)।

RC/ক্রিস্টাল অসিলেটর PLL (×N) সিস্টেম ক্লক প্রিস্কেলার (÷N) পেরিফেরাল ক্লক
সোর্স অসিলেটর থেকে PLL দিয়ে গুণ, তারপর প্রিস্কেলার দিয়ে ভাগ — প্রতিটি পেরিফেরাল নিজস্ব প্রিস্কেলার সেটিং দিয়ে ভিন্ন ফ্রিকোয়েন্সি পেতে পারে, নিচের কোড সেলে এই সূত্রই গণনা করা হয়েছে।

৩ · একটি সত্যিকারের সিমুলেশন — পেরিফেরাল ফ্রিকোয়েন্সি গণনা

Python
def peripheral_clock(f_crystal_hz, pll_mult, prescaler):
    # f_peripheral = f_crystal * PLL গুণক / প্রিস্কেলার
    f_system = f_crystal_hz * pll_mult
    f_peripheral = f_system / prescaler
    return f_system, f_peripheral


configs = [
    {"name": "কনফিগ ১ (লো-পাওয়ার, PLL ছাড়া)", "f_crystal_hz": 8_000_000, "pll_mult": 1, "prescaler": 1},
    {"name": "কনফিগ ২ (স্ট্যান্ডার্ড ক্রিস্টাল + PLL)", "f_crystal_hz": 8_000_000, "pll_mult": 9, "prescaler": 2},
    {"name": "কনফিগ ৩ (হাই-স্পিড ক্রিস্টাল, বড় প্রিস্কেলার)", "f_crystal_hz": 16_000_000, "pll_mult": 6, "prescaler": 4},
]

for cfg in configs:
    f_sys, f_peri = peripheral_clock(cfg["f_crystal_hz"], cfg["pll_mult"], cfg["prescaler"])
    print(cfg["name"])
    print(f"  ক্রিস্টাল: {cfg['f_crystal_hz'] / 1e6:.1f} MHz, PLL গুণক: x{cfg['pll_mult']}, প্রিস্কেলার: /{cfg['prescaler']}")
    print(f"  সিস্টেম ক্লক (PLL-এর পর): {f_sys / 1e6:.1f} MHz")
    print(f"  পেরিফেরাল ক্লক: {f_peri / 1e6:.2f} MHz")
    print()

    
লক্ষ্য করুন — কনফিগ ২-তে ৮ MHz ক্রিস্টাল PLL দিয়ে ৯ গুণ হয়ে ৭২ MHz সিস্টেম ক্লক তৈরি করছে (একটি বাস্তব STM32-শ্রেণির চিপে খুবই সাধারণ একটি কনফিগারেশন), তারপর প্রিস্কেলার ২ দিয়ে ভাগ করে পেরিফেরাল ৩৬ MHz-এ চলছে। CPU নিজে সম্পূর্ণ ৭২ MHz-এ চলতে পারে, কিন্তু প্রতিটি পেরিফেরাল আলাদা প্রিস্কেলার দিয়ে নিজের প্রয়োজন অনুযায়ী ভিন্ন গতি বেছে নিতে পারে।

৪ · রিসেটের উৎস

একটি মাইক্রোকন্ট্রোলার কয়েকটি ভিন্ন কারণে রিসেট (পুনরায় শুরু) হতে পারে:

  • পাওয়ার-অন রিসেট (POR) — চিপে প্রথম পাওয়ার আসার সময় স্বয়ংক্রিয়ভাবে ঘটে, নিশ্চিত করে সবকিছু একটি জানা অবস্থা থেকে শুরু হয়।
  • ওয়াচডগ রিসেট — ফার্মওয়্যার যদি হ্যাং হয়ে যায় ও একটি নির্দিষ্ট সময়ের মধ্যে ওয়াচডগ টাইমারকে "পেট" না করে, তাহলে ওয়াচডগ নিজেই চিপ রিসেট করে দেয় — বিস্তারিত L33 (ওয়াচডগ টাইমার)-এ।
  • এক্সটার্নাল রিসেট পিন — একটি ডেডিকেটেড রিসেট পিনে বাহ্যিকভাবে (যেমন একটি বাটন বা ডিবাগার) সিগন্যাল দিয়ে ম্যানুয়ালি রিসেট করানো যায়।
  • ব্রাউন-আউট রিসেট (BOR) — সাপ্লাই ভোল্টেজ একটি নিরাপদ থ্রেশহোল্ডের নিচে নেমে গেলে চিপ নিজেকে রিসেট করে, কারণ কম ভোল্টেজে লজিক অনির্ভরযোগ্যভাবে আচরণ করতে পারে — একটি গুরুত্বপূর্ণ নির্ভরযোগ্যতা বৈশিষ্ট্য (M8-এর রিলায়েবিলিটি পাঠে আরও আসবে)।
মূল কথা · Key takeaway

ক্লক সিস্টেম (উৎস, PLL, প্রিস্কেলার) একসাথে নির্ধারণ করে চিপ ও প্রতিটি পেরিফেরাল ঠিক কত গতিতে চলবে, আর রিসেট সোর্সগুলো নিশ্চিত করে চিপ সবসময় একটি জানা, নিরাপদ অবস্থা থেকে শুরু করে বা ফিরে আসে — দুটোই এমবেডেড সিস্টেমের নির্ভরযোগ্যতার ভিত্তি।

ভাবনার প্রশ্ন

প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।

প্র ০১ একটি ব্যাটারি-চালিত সেন্সর নোড ডিজাইন করছেন যেখানে নির্ভুল টাইমিংয়ের প্রয়োজন নেই। ইন্টারনাল RC অসিলেটর নাকি বাহ্যিক ক্রিস্টাল বেছে নেবেন, এবং কেন?

এই ক্ষেত্রে ইন্টারনাল RC অসিলেটর ভালো পছন্দ — এটি বাহ্যিক ক্রিস্টাল ও ক্যাপাসিটরের প্রয়োজন বাদ দেয় (কম কম্পোনেন্ট, কম খরচ, কম বোর্ড স্পেস), এবং সাধারণত সামান্য কম পাওয়ার খরচ করে। যেহেতু অ্যাপ্লিকেশনে নির্ভুল টাইমিংয়ের প্রয়োজন নেই, RC অসিলেটরের কয়েক শতাংশ ফ্রিকোয়েন্সি ড্রিফট এখানে সমস্যা নয়।

প্র ০২ উপরের কোড সেলে কনফিগ ১-এ PLL গুণক ও প্রিস্কেলার দুটোই ১ রাখা হয়েছে কেন?

এটি "PLL বাইপাস" মোডের সিমুলেশন — অনেক লো-পাওয়ার এমবেডেড অ্যাপ্লিকেশনে PLL সম্পূর্ণ বন্ধ রেখে সরাসরি ক্রিস্টাল ফ্রিকোয়েন্সিতেই চলা হয়, কারণ PLL নিজেও কিছুটা অতিরিক্ত পাওয়ার খরচ করে ও চালু হতে সময় নেয়। কনফিগ ১-এ তাই f_peripheral = f_crystal — কোনো গুণ বা ভাগ ছাড়াই।

প্র ০৩ ব্রাউন-আউট রিসেট (BOR) না থাকলে কম সাপ্লাই ভোল্টেজে চিপের কী ধরনের সমস্যা হতে পারে বলে আপনার ধারণা?

ভোল্টেজ খুব কম হয়ে গেলে ডিজিটাল লজিক গেট নির্ভরযোগ্যভাবে ০/১ পার্থক্য করতে ব্যর্থ হতে পারে — ফলে রেজিস্টার ভুল মান "মনে" রাখতে পারে, ইনস্ট্রাকশন ভুলভাবে ডিকোড হতে পারে, বা Flash রাইট/ইরেজ অপারেশন মাঝপথে দুর্নীতিগ্রস্ত (corrupt) হয়ে যেতে পারে। BOR এই বিপজ্জনক অবস্থাটি সনাক্ত করে চিপকে একটি নিয়ন্ত্রিত রিসেটে পাঠিয়ে দেয়, বরং অনির্দিষ্ট (undefined) আচরণে চলতে দেওয়ার চেয়ে।

অনুশীলন

  1. চিন্তা করুন: একটি ১২ MHz ক্রিস্টাল, PLL গুণক ৮, প্রিস্কেলার ৩ হলে পেরিফেরাল ফ্রিকোয়েন্সি কত হবে বলে আপনার ধারণা?

    সূত্র অনুযায়ী $f_{peripheral} = \dfrac{12 \times 8}{3} = \dfrac{96}{3} = 32$ MHz।

  2. পরীক্ষা করুন: উপরের কোড সেলে configs লিস্টে একটি নতুন কনফিগ যোগ করুন — {"name": "কনফিগ ৪", "f_crystal_hz": 12_000_000, "pll_mult": 8, "prescaler": 3} — এবং Run চেপে দেখুন ফলাফল উপরের হাতে-করা হিসাবের সাথে মেলে কিনা।

    কোড চালানোর পর "সিস্টেম ক্লক (PLL-এর পর): 96.0 MHz" ও "পেরিফেরাল ক্লক: 32.00 MHz" প্রিন্ট হবে — যা ঠিক প্রথম অনুশীলনের হাতে-করা হিসাবের সাথে মিলে যায়, নিশ্চিত করে যে ফাংশনটি সত্যিই সূত্রটি সঠিকভাবে গণনা করছে, কোনো হার্ডকোড করা সংখ্যা নয়।

আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ

আগের পাঠ
মেমরি ম্যাপ — Flash, SRAM ও পেরিফেরাল রেজিস্টার