কিছু সময় আগে আমরা সম্পর্কে আরো তথ্য প্রকাশ millis() ফাংশন de যাও Arduinoএখন আমরা আরও গভীরে প্রবেশ করব আরডুইনো টাইমার, বৈশিষ্ট্যটির জন্য এই বৈশিষ্ট্যটি দিয়ে শুরু করতে, বুঝুন কিভাবে এই বোর্ড MCU এর সাথে সময় পরিচালনা করে, সেইসাথে millis() এর বাইরে অন্যান্য ফাংশন।
আরডুইনো টাইমার কি?
El Arduino টাইমার, বা টাইমার, হার্ডওয়্যার দ্বারা বাস্তবায়িত একটি ফাংশন (মাইক্রোকন্ট্রোলারে, কোয়ার্টজ ক্রিস্টালের সাহায্যে যা ঘড়ির স্পন্দন তৈরি করে এবং এটি "তাল" সেট করে, বহিরাগত হার্ডওয়্যার বা ICs 555 এর প্রয়োজন ছাড়াই) যা ঘড়ির কারণে অস্থায়ী ঘটনাগুলি নিয়ন্ত্রণ করতে দেয় অভ্যন্তরীণ উদাহরণস্বরূপ, স্কেচ কোড থেকে স্বতন্ত্রভাবে একটি কাজ বিরতিতে করা, সুনির্দিষ্ট সময়ের পরিমাপ করা ইত্যাদি।
কল্পনা করুন যে আপনি ব্যবহার করুন delay() ফাংশন, এটি নির্দিষ্ট সময় অতিবাহিত না হওয়া পর্যন্ত আরডুইনো এমসিইউ-তে এক্সিকিউশন ব্লক করবে এবং তারপর প্রোগ্রামটি চালিয়ে যাবে, কিন্তু টাইমার ব্লক করবে না। এমসিইউ একই সাথে অন্যান্য নির্দেশাবলী কার্যকর করা চালিয়ে যাওয়ার সময় এটি হবে। এটাই বড় সুবিধা।
টাইমার এর সাথে সম্পর্কিত বাধা Arduino এর, যেহেতু তারা কিছু নির্দিষ্ট কাজে যোগদানের জন্য তাদের মাধ্যমে মৃত্যুদন্ড কার্যকর করা হবে। অন্য কথায়, আরডুইনো টাইমার হল একটি ফাংশন যা একটি নির্দিষ্ট সময়ে ট্রিগার হয়, একটি ইন্টারাপ্ট ফাংশন কার্যকর করে। সেজন্য এসব বাধা সম্পর্কে জানাও জরুরি।
মোড
আরডুইনো টাইমার আছে 2 অপারেটিং মোড, এটি ব্যবহার করতে সক্ষম হচ্ছে:
- PWM সংকেত: আপনি নিয়ন্ত্রণ করতে পারেন আরডুইনো পিন (~).
- CTC (তুলনা ম্যাচে ক্লিয়ার টাইমার): একটি কাউন্টারের ভিতরে সময় গণনা করে এবং যখন এটি টাইমারের একটি রেজিস্টারে নির্দিষ্ট মান পর্যন্ত পৌঁছায়, তখন বাধাটি কার্যকর করা হয়।
এটা কত টাইমার আছে? টাইমারের প্রকারভেদ
আছে 3 টাইমার প্লেট উপর Arduino UNO, যদিও অন্যান্য শীর্ষ প্লেটে আরও থাকতে পারে:
- টাইমার 0: 8-বিট, 0 থেকে 255 পর্যন্ত গণনা করতে পারে (256 সম্ভাব্য মান)। delay(), millis(), এবং micros() এর মত ফাংশন দ্বারা ব্যবহৃত হয়। প্রোগ্রামগুলি পরিবর্তন না করার জন্য এটির পরিবর্তনের সুপারিশ করা হয় না।
- টাইমার 1: টাইমার 0-এর সমান। UNO-তে সার্ভো লাইব্রেরি ব্যবহার করে (MEGA-এর জন্য টাইমার 5)।
- টাইমার 2: 16-বিট, এবং 0 থেকে 65.525 পর্যন্ত হতে পারে (65.536 সম্ভাব্য মান)। টোন() ফাংশনের জন্য ব্যবহৃত হয়, যদি ব্যবহার না করা হয় তবে এটি আপনার অ্যাপ্লিকেশনের জন্য অবাধে ব্যবহার করা যেতে পারে।
- টাইমার 3, 4, 5 (শুধুমাত্র Arduino MEGA তে): সব 16-বিট।
Arduino টাইমার কিভাবে কাজ করে?
সক্ষম হতে একটি Arduino টাইমারের সাথে কাজ করুন, এই উন্নয়ন বোর্ডের MCU তে এই সমস্ত কীভাবে ইলেকট্রনিকভাবে কাজ করে তা জানা অত্যাবশ্যক:
- ঘড়ির ফ্রিকোয়েন্সি: প্রতি সেকেন্ডে কত চক্রের সংখ্যা এটি বিকাশ করতে সক্ষম, আরডুইনোর ক্ষেত্রে এটি 16 মেগাহার্টজ, বা একই, ঘড়ির সংকেতটি সেকেন্ডে (চক্র) 16.000.000 বার দোলা দেয়।
- কাল: T দ্বারা উপস্থাপিত হয়, এবং সেকেন্ডে পরিমাপ করা হয়, এবং চক্রের বিপরীত। উদাহরণস্বরূপ, T=1/C, যার ফলাফল হবে 1/16000000 = 0.0000000625, প্রতিটি চক্র সম্পূর্ণ হতে সময় লাগবে। এবং ফ্রিকোয়েন্সি হল সময়ের বিপরীত, তাই f = 1/T।
- সাইকেল: সময়ের একক প্রতি ঘটতে থাকা সংকেতের পুনরাবৃত্তিগুলির প্রত্যেকটি। আরডুইনোতে এটি এক সেকেন্ডে 16M হবে। বা একই কি, এই ক্ষেত্রে, যখন 16 মিলিয়ন চক্র অতিক্রম করেছে, এক সেকেন্ড পেরিয়ে গেছে। অতএব, একটি চক্র 625 ns নিতে বলা যেতে পারে।
- একটি সংকেতের প্রান্ত: ঘড়ির সংকেতগুলি বর্গাকার, এবং প্রান্তগুলি উঠতে বা পড়ে যেতে পারে৷ একটি প্রান্ত হল সিগন্যালের সরল রেখা যখন এটি থেকে পরিবর্তিত হয়:
- 0 (নিম্ন) থেকে 1 (উচ্চ): ক্রমবর্ধমান প্রান্ত।
- 1 (উচ্চ) থেকে 0 (নিম্ন): পতনশীল প্রান্ত।
প্রান্তগুলি গুরুত্বপূর্ণ কারণ Arduino টাইমারগুলি সংকেত প্রান্ত থেকে চক্র পরিমাপ করে। ক) হ্যাঁ প্রতিযোগী এটি প্রতিটি চক্রের সাথে বৃদ্ধি পায় এবং যখন এটি রেজিস্টার মান পর্যন্ত পৌঁছায়, তখন বাধাটি কার্যকর করা হয়।
অতএব, একবার যদি আপনি এই জানেন, যদি আপনি আছে Arduino MCU তে 16Mhz, এবং একটি 8-বিট টাইমার ব্যবহার করা হয়, এটা বলা যেতে পারে যে প্রতি 16 μs (256/16000000) বা 4-বিট (16/65536) এর জন্য 16000000 ms অন্তর অন্তর বাধা আসবে। অতএব, আপনি যদি 16-বিট কাউন্টার রেজিস্টার সর্বোচ্চ 65535 মান সহ সেট করেন, তাহলে যে কাজই হোক না কেন তা চালানোর জন্য 4 ms এ বাধা আসবে।
যখন কাউন্টারটি সর্বাধিক সম্ভাব্য মান পর্যন্ত পৌঁছায়, এটি আবার 0 এ ফিরে আসবে. যে, একটি ওভারফ্লো ঘটে এবং এটি শুরু থেকে ফিরে গণনা করা হবে।
টাইমার বৃদ্ধির হার নিয়ন্ত্রণ করতে আপনিও ব্যবহার করতে পারেন একটি prescaler, যা 1, 8, 64, 256 এবং 1024 মান নেয় এবং এই মত সময় পরিবর্তন করে:
টাইমার স্পিড (Hz) = Arduino / Prescaler এর ক্লক ফ্রিকোয়েন্সি
যদি এটি 1 প্রিসকেলার হয় তাহলে কন্ট্রোলার 16 মেগাহার্জে বৃদ্ধি পাবে, যদি এটি 8 থেকে 2 মেগাহার্টজ হয়, যদি এটি 64 থেকে 250 kHz হয়, ইত্যাদি। মনে রাখবেন যে কাউন্টার এবং প্রিসকেলারের মান সমান না হওয়া পর্যন্ত তুলনা করার জন্য একটি টাইমার কাউন্টার স্টেট তুলনাকারী থাকবে এবং তারপরে একটি ক্রিয়া সম্পাদন করবে। তাই, বাধা ফ্রিকোয়েন্সি সূত্র দ্বারা দেওয়া হয়:
বিঘ্নিত গতি (Hz) = Arduino / Prescaler ঘড়ির ফ্রিকোয়েন্সি (তুলনাকারী রেজিস্টার মান + 1)
সৌভাগ্যবশত, আমরা অবশ্যই না রেকর্ড পরিবর্তন করুন আরডুইনো টাইমারগুলির, যেহেতু আমরা কোডে ব্যবহার করি এমন লাইব্রেরিগুলির দ্বারা এটি যত্ন নেওয়া হবে। কিন্তু যদি তারা ব্যবহার না করা হয়, তারা কনফিগার করা উচিত.
Arduino IDE এর উদাহরণ
এই সব কিছুকে একটু ভালোভাবে বোঝার জন্য, এখানে আমি Arduino IDE-এর জন্য দুটি স্কেচ কোড দেখাচ্ছি যার সাহায্যে আপনি টাইমার ব্যবহারের অভিজ্ঞতা পেতে পারেন। প্রথমটি হল কোড যা প্রতি সেকেন্ডে Arduino পিন 8 এর সাথে সংযুক্ত একটি LED ব্লিঙ্ক করবে:
#define ledPin 8 void setup() { pinMode(ledPin, OUTPUT); // Configurar Timer1 TCCR1A = 0; //Registro control A a 0, pines OC1A y OC1B deshabilitados TCCR1B = 0; //Limpia el registrador TCCR1B |= (1<<CS10)|(1 << CS12); //Configura prescaler a 1024: CS12 = 1 y CS10 = 1 TCNT1 = 0xC2F8; //Iniciar timer para desbordamiento a 1 segundo //65536-(16MHz/1024/1Hz - 1) = 49912 = 0xC2F8 en hexadecimal TIMSK1 |= (1 << TOIE1); //Habilitar interrupción para Timer1 } void loop() { } ISR(TIMER1_OVF_vect) //Interrupción del TIMER1 { TCNT1 = 0xC2F7; // Reniciar Timer1 digitalWrite(ledPin, digitalRead(ledPin) ^ 1); //Invierte el estado del LED }
প্রতি সেকেন্ডে আগের মতোই LED এর ব্লিঙ্কিং বা ফ্ল্যাশিং প্রোগ্রাম করুন, কিন্তু এবার ব্যবহার করুন CTC অর্থাৎ তুলনা:
#define ledPin 8 void setup() { pinMode(ledPin, OUTPUT); // Configuración Timer1 TCCR1A = 0; //Registro de control A a 0 TCCR1B = 0; //Limpiar registro TCNT1 = 0; //Inicializar el temporizador OCR1A = 0x3D08; //Carga el valor del registro de comparación: 16MHz/1024/1Hz -1 = 15624 = 0X3D08 TCCR1B |= (1 << WGM12)|(1<<CS10)|(1 << CS12); //Modo CTC, prescaler de 1024: CS12 = 1 y CS10 = 1 TIMSK1 |= (1 << OCIE1A); //Habilita interrupción por igualdad de comparación } void loop() { } ISR(TIMER1_COMPA_vect) //Interrupción por igualdad de comparación en TIMER1 { digitalWrite(ledPin, digitalRead(ledPin) ^ 1); //Invierte el estado del LED }
Arduino প্রোগ্রামিং সম্পর্কে আরো
একটি প্লেট কিনুন Arduino UNO রেভ 3