ADC : ডিজিটাল দুনিয়ায় এনালগ দুনিয়ার বার্তাবাহক

Bangla tutorial series on Microcontroller, retreived from my previous blog d15tech.com. Dated here according to the original published date.

Posted by Shadly on January 7, 2014

Analog to Digital Converter

আমরা জানি, মাইক্রোকন্ট্রোলার একটি ডিজিটাল চিপ। তাই এটি ০ আর ৫ ভোল্ট ছাড়া অন্যকোন ভোল্টেজ বুঝতে পারে না।
অর্থাৎ মাইক্রোকন্ট্রোলার এর দুনিয়ায় ২,৩, ৩.৫ ভোল্ট বলে কোন কথা নেই। হয় ৫ নাহয় কিছুই না। কিন্তু আমাদের আশেপাশের দুনিয়া পুরোটাই এনালগ। মাইক্রোকন্ট্রোলার কে জিজ্ঞাসা করলে সে বলতে পারবে বাতাসে অক্সিজেন আছে নাকি নাই। কিন্তু তাকে যদি প্রশ্ন করি কতটুকু আছে তাহলে সে পরবে এক মহাসমস্যায়। এই সমস্যা থেকে মুক্তির উপায়ই হল ADC। এটার কাজ হল আমাদের আশেপাশের এনালগ জিনিসকে ডিজিটালে রূপান্তরিত করে মাইক্রোকন্ট্রোলার কে বুঝানো। সহজ ভাষায়, এটি এক ধরণের অনুবাদক। ADC এর পূর্ণ ফর্ম হল Analog to Digital Converter। যেকোনো সেন্সরকে কোনকিছু মাপতে বললে তা সাধারণত এনালগ রেজাল্ট দেয়। আর তাই ADC এর প্রধান কাজ হল সেন্সর ইন্টারফেস করা। হতে পারে এটি আলো,তাপমাত্রা, শব্দ কিংবা Accelerometer বা Gyroscope এর মতো জটিল সেন্সর। অর্থাৎ আমরা সেন্সরের মাধ্যমে আলো, তাপমাত্রা বা শব্দ যেকোনো কিছুই মাইক্রোকন্ট্রোলার দিয়ে মাপতে পারি।

Atmega8 মাইক্রোকন্ট্রোলার এর ADC

এখন কাজের কথায় আসা যাক। Atmega8 মাইক্রোকন্ট্রোলার এ আছে ৬ চ্যানেল ADC যার প্রত্যেকটির আছে ১০ বিট Accuracy। ১০ বিট Accuracy বলতে বোঝায় এটি ০ ভোল্ট থেকে এর রেফারেন্স ভোল্টেজকে 0b1111111111 ভাগে অর্থাৎ ডেসিমাল করলে দাঁড়ায় ১০২৩ ভাগে ভাগ করতে পারে। অর্থাৎ এর রেফারেন্স ভোল্টেজ যদি হয় ৫ ভোল্ট তবে মাইক্রোকন্ট্রোলার এর ADC পিনে ৫ ভোল্ট হলে রেজাল্ট দিবে ১০২৩ আর যদি শুন্য হয় তবে দিবে ০। আর যদি হয় ৩ ভোল্ট তাহলে ঐকিক নিয়ম অনুযায়ী হবে ADC রেজাল্ট হবে ৬১৩।

আমাদের মাইক্রোকন্ট্রোলার Atmega8 এর ADC কে চালাতে হলে আমাদের আগে তিন ধরণের গুরুত্বপূর্ণ Register সম্পর্কে জানতে হবে। এগুলো হল

ADCSRA যার পূর্ণ নাম ADC Control and Status Register A
ADMUX যার পূর্ণ নাম ADC Multiplexer Selection Register

ADC Data Register যা দুটি অংশে ভাগ করা ADCH এবং ADCL

ADC Control and Status Register A

ADC Control and Status Register A - D15 Technologies

আমাদের মাইক্রোকন্ট্রোলার Atmega8 এর মিনিমাম ক্লক ফ্রিকোয়েন্সি হল ১ মেগাহার্জ। কিন্তু এর ভেতরে যে ADC মডিউল আছে তা এতো তাড়াতাড়ি স্যাম্পল নিতে পারেনা। তাই একে চালানোর জন্য Atmega8 এর অভ্যন্তরীণ module এ মূল Frequency কে ভাগ করে ইনপুট দিতে হয়। ৫০ কিলোহার্জ থেকে ২০০ কিলোহার্জ ফ্রিকোয়েন্সিতে ADC কাজ করে। মাইক্রোকন্ট্রোলার এর মূল ক্লক স্পিডকে ভাগ করে দেয়াই হল Prescalling। ADCSRA নামক Register এর ADPS2, ADPS1 এবং ADPS0 এই তিনটি বিট কে High কিংবা Low করে Prescaler পরিবর্তন করা হয়। নিচে বিভিন্ন প্রিস্কেলারের চার্ট দেয়া হল।

ADC Prescaler Chart

ADC Prescaler Chart - D15 Technologies

আমাদের মাইক্রোকন্ট্রোলার এর মূল ক্লক স্পিড যদি হয় ৮ মেগাহার্জ তাহলে আমরা যদি ১২৮ ডিভিশন ফ্যাক্টর সিলেক্ট করি তাহলে ADC এর ইনপুট Clock Frequency হবে ৮০০০০০০/১২৮ = ৬২.৫ কিলোহার্জ এবং আমাদের কোডে লিখতে হবে

1
2
  // সবগুলো পিন হাই
ADCSRA  =  (1<<ADEN)  |  (1<<ADPS2)  |  (ADPS1)  |  (ADPS0);

ADCSRA Register এর আরও কিছু গুরুত্বপূর্ণ বিট

ADCSRA Register এর আরও কিছু গুরুত্বপূর্ণ বিট আছে। সেগুলো হল

ADEN যার পূর্ণনাম ADC Enable : ADC কে এনাবল বা চালু করতে এই বিটটি হাই করতে হবে।

ADSC যার পূর্ণনাম ADC Start Conversion : এই বিট হাই হলে ADC পিন থেকে প্রাপ্ত স্যাম্পলকে ডিজিটালে কনভার্ট করা শুরু করে।

ADIF যার পূর্ণনাম ADC Interrupt Flag : যখন প্রাপ্ত Sample টি ডিজিটালে রূপান্তর হয়ে যায় তখন আমাদেরকে সিগনাল দেবার জন্য এই বিটটিকে মাইক্রোকন্ট্রোলার নিজে হাই করে দেয়।

ADC Multiplexer Selection Register

ADC Multiplexer Selection Register - D15 Technologies

Voltage Reference Chart for ADC

Voltage Reference Chart for ADC  - D15 Technologies

ADMUX Register

ADMUX Register এর সবচেয়ে গুরুত্বপূর্ণ বিট দুটি হল REFS1 এবং REFS0। এই দুটি বিট দ্বারা ADC এর জন্য ভোল্টেজ রেফারেন্স দেয়া হয়। এই বিট দুটিকে বিভিন্নভাবে কনফিগার করে ADC এর জন্য বিভিন্ন Voltage Reference সেট করা যায়। নিচে REFS1 এবং REFS0 এর বিভিন্ন কম্বিনেশন চার্ট দেয়া হল।

আমরা যদি আমাদের মাইক্রোকন্ট্রোলার এর ADC এর জন্য রেফারেন্স ভোল্টেজ অভ্যন্তরীণ 2.56 ভোল্ট করতে চাই তবে ADMUX কে সেট করতে হবে এভাবে -

1
ADMUX  =  (1<<REFS0)  |  (1<<REFS1);

আর যদি Vcc কে রেফারেন্স করতে চাই তাহলে ADMUX = (1«REFS0); সেট করতে হবে।

ADC Input Channel Selection Char

ADC Input Channel Selection Chart  - D15 Technologies

আমরা কোন মাইক্রোকন্ট্রোলার এর চ্যানেলে অর্থাৎ কোন পিনে Analog Signal ইনপুট দিবো তা নির্ধারণ করে দেয়া হয় MUX0 – MUX3 এই চারটি বিট দিয়ে। MUX0 – MUX3 এর বিভিন্ন কম্বিনেশন চার্ট দেয়া হল।

যদি ADC5 পিন থেকে এনালগ সিগনাল নিতে চাই তবে আমাদের কোড হবে

1
ADMUX  |  =  (1<<MUX0)  |  (1<<MUX2);

এতক্ষণ আমরা দেখলাম কিভাবে বিভিন্ন রকম করে ADC Configure করা যায়। এখন দেখব কিভাবে ADC Output নিবে সেটা। এটা খুবই সহজ পুরো রেজাল্টের Higher আট বিট ADCH থেকে এবং Lower আট বিট ADCL থেকে পাওয়া যাবে। এর চেয়েও সহজ উপায় আছে। সরাসরি ADCW দিলেই সম্পূর্ণ রেজাল্ট একেবারে চলে আসবে।