এবার আমরা নিজেদের জন্য ADC লাইব্রেরি নিজেরাই তৈরি করবো। আমাদের নিজেদের লাইব্রেরি তৈরির উদ্দেশ্য হল আমাদের যাতে মাইক্রোকন্ট্রোলার এর আলাদা আলাদা কাজের জন্য একই জিনিস বারবার যেন লেখা না লাগে। একই জিনিস বারবার লেখাটা সত্যই খুব বিরক্তিকর। তো আর কথা না বাড়িয়ে কাজে নেমে যাই কি বল ?
প্রথমে adc.c এবং adc.h নামের দুটি ফাইল তৈরি করি। আমরা দুটি ফাংশন তৈরি করব। একটাতে থাকবে শুধু ADC কে Prescaler ইনপুট দিয়ে Initialize করার জন্য। আরেকটা থাকবে মাইক্রোকন্ট্রোলার এর পিন নাম্বার দিয়ে ADC Value জানার জন্য।
adc.c ফাইলে আমরা ReadADC ফাংশনটা তৈরি করে এভাবে।
1
2
3
4
5
6
7
8
uint16_t ReadADC(uint8_t pin){
ADMUX|=pin;
ADCSRA|=(1<<ADSC);
while(!(ADCSRA & (1<<ADIF)));
_delay_ms(50);
return(ADCW);
}
এখানে ফাংশনটির আর্গুমেন্ট দেয়া হয়েছে মাইক্রোকন্ট্রোলার এর যে পিন দিয়ে ADC Input নিবো তার পিন নম্বর। এখন এই পিন নাম্বারের জন্য ADMUX এর বিটগুলো High করে দেই। কনভার্সন শুরু করি। তারপর কনভার্সন শেষ হওয়া পর্যন্ত অপেক্ষা করি। যেহেতু ADIF কনভার্সন শেষে নিজে নিজেই High হয় যায় তাই আমরা চেক করবো এটি এখনও Low আছে কিনা। Low থাকা অবস্থা পর্যন্ত আমরা এখানেই থামবো তাই এখানে একটি Infinite লুপ তৈরি করা হয়েছে। কনভার্সন শেষে নিজে থেকেই লুপ থেকে বের হয়ে আসবে। কিছুক্ষণ ওয়েট করি যাতে মাইক্রোকন্ট্রোলার এর CPU Overload না হয়ে যায়। সম্পূর্ণ ADC Value টি ADCW দিয়ে রিটার্ন করি।
এখন আসি SetupADC() ফাংশনে। ফাংশনটিতে মাইক্রোকন্ট্রোলার এর ADC এর ভোল্টেজ রেফারেন্স সেট করি। তারপর বিভিন্ন Prescaler এর জন্য বিভিন্নভাবে ADCSRA সেট করে if কন্ডিশন দিয়ে আলাদা করে দেই। মাইক্রোকন্ট্রোলার এর ADC এনাবল করে দেই। ব্যাস তৈরি হয়ে গেলো আমাদের মাইক্রোকন্ট্রোলার এর জন্য গরম গরম ADC লাইব্রেরি। SetupADC() ফাংশনের আর্গুমেন্টে আমরা যে Prescaler চাই তা দিলেই সে অনুযায়ী Prescaler সেট হয়ে যাবে।
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void SetupADC(uint8_t presclr){
ADMUX=(1<<REFS0);
if(presclr==128)
ADCSRA=(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
else if(presclr==64)
ADCSRA=(1<<ADPS2)|(1<<ADPS1);
else if(presclr==32)
ADCSRA=(1<<ADPS2)|(1<<ADPS0);
else if(presclr==16)
ADCSRA=(1<<ADPS2);
else if(presclr==8)
ADCSRA=(1<<ADPS1)|(1<<ADPS0);
else if(presclr==4)
ADCSRA=(1<<ADPS1);
else if(presclr==2)
ADCSRA=(1<<ADPS0);
else
ADCSRA=(1<<ADPS0);
ADCSRA=(1<<ADEN);
}
শুধু তো আর লাইব্রেরি তৈরি করলেই চলবে না, একে কাজেও লাগাতে হবে। এখন আমরা এই লাইব্রেরি ব্যবহার করে ADC রিডিং নিবো। এখন আমরা মাইক্রোকন্ট্রোলার এর AVCC পিনে 5V এবং AGND পিনকে গ্রাউন্ড করে দেই। এটা করলে মাইক্রোকন্ট্রোলার এর ভেতরের এনালগ কম্প্যারেটর চালু হয়ে যাবে। এখন আমারা কাজের ধরন অনুযায়ী ADC এর বিভিন্ন মোড ঠিক করে নিব। আমরা এখানে “AVCC with external capacitor at AREF pin” এই মোডে কাজ করব। এই মোডে ADC এর রেফারেন্স ভোল্টেজ হল AVCC অর্থাৎ 5V। এই মোডে ADC নিয়ে কাজ করতে হলে মাইক্রোকন্ট্রোলার এর AVCC এবং AREF পিনের মাঝে একটি ক্যাপাসিটর লাগাতে হবে।
সাধারণত 0.1 mF (104) ক্যাপাসিটর লাগালেই কাজ হয়ে যায়। এখন আমরা যে ADC Channel সিলেক্ট করব সেই পিনে একটি পটেনশিওমিটারের মাঝখানের পিনটি লাগিয়ে দিব। পটেনশিওমিটারের বাকি পিনদুটির একটি VCC এবং অপরটি GND তে লাগিয়ে দিব। এখন ADC Value LCD তে দেখানোর জন্য কিছু কোড লিখে রান করবো। যদি সবকিছু ঠিক থাকে তবে পটেনশিওমিটারের নব ঘুরালে সেই অনুযায়ী ADC Value পরিবর্তন হবে এবং তা LCD তে দেখাবে।