সুচিপত্র:

Arduino এবং PCF8591 ADC DAC IC: 7 ধাপ
Arduino এবং PCF8591 ADC DAC IC: 7 ধাপ

ভিডিও: Arduino এবং PCF8591 ADC DAC IC: 7 ধাপ

ভিডিও: Arduino এবং PCF8591 ADC DAC IC: 7 ধাপ
ভিডিও: LDR Sensor Kya hai | #shorts 2024, নভেম্বর
Anonim
Arduino এবং PCF8591 ADC DAC IC
Arduino এবং PCF8591 ADC DAC IC

আপনি কি কখনও আপনার Arduino প্রকল্পে আরো এনালগ ইনপুট পিন চেয়েছিলেন, কিন্তু একটি মেগা জন্য ফর্ক আউট করতে চান নি? অথবা আপনি এনালগ সংকেত তৈরি করতে চান? তারপর আমাদের টিউটোরিয়ালের বিষয় দেখুন - NXP PCF8591 IC।

এটি এই উভয় সমস্যার সমাধান করে কারণ এটিতে একটি একক DAC (ডিজিটাল থেকে এনালগ) রূপান্তরকারী এবং সেইসাথে চারটি ADC (ডিজিটাল রূপান্তরকারী থেকে এনালগ) - সবই I2C বাসের মাধ্যমে অ্যাক্সেসযোগ্য। PCF8591 DIP, সারফেস মাউন্ট এবং মডিউল আকারে পাওয়া যায়, যা পরীক্ষা করা সহজ করে তোলে।

এগিয়ে যাওয়ার আগে, ডাটা শীট ডাউনলোড করুন। PCF8591 5V এবং 3.3V উভয় ক্ষেত্রেই কাজ করতে পারে তাই আপনি যদি Arduino Due, Raspberry Pi বা অন্য 3.3 V ডেভেলপমেন্ট বোর্ড ব্যবহার করেন তাহলে আপনি ভালো আছেন। এখন আমরা প্রথমে DAC, তারপর ADCs ব্যাখ্যা করব।

ধাপ 1: DAC (ডিজিটাল-টু-এনালগ কনভার্টার) ব্যবহার করা

DAC (ডিজিটাল-টু-এনালগ কনভার্টার) ব্যবহার করা
DAC (ডিজিটাল-টু-এনালগ কনভার্টার) ব্যবহার করা

PCF8591 এর DAC এর 8-বিট রেজোলিউশন আছে-তাই এটি 255 ধাপে শূন্য ভোল্ট এবং রেফারেন্স ভোল্টেজ (Vref) এর মধ্যে একটি তাত্ত্বিক সংকেত তৈরি করতে পারে। প্রদর্শনের উদ্দেশ্যে আমরা 5V এর Vref ব্যবহার করবো, এবং আপনি 3.3V এর মত নিম্ন Vref ব্যবহার করতে পারেন অথবা আপনি যা চান সর্বোচ্চ মান হতে পারে … তবে এটি সরবরাহ ভোল্টেজের চেয়ে কম হতে হবে।

লক্ষ্য করুন যে যখন এনালগ আউটপুটে লোড থাকে (একটি বাস্তব-বিশ্বের পরিস্থিতি), সর্বাধিক আউটপুট ভোল্টেজ হ্রাস পাবে-ডেটা শীট (যা আপনি ডাউনলোড করেছেন) 10kΩ লোডের জন্য 10% ড্রপ দেখায়। এখন আমাদের বিক্ষোভ সার্কিটের জন্য।

I2C বাসে 10kΩ পুল-আপ প্রতিরোধক এবং 5V এবং GND এর মধ্যে 10μF ক্যাপাসিটরের ব্যবহার লক্ষ্য করুন। I2C বাসের ঠিকানা A0 ~ A2 পিনের সংমিশ্রণ দ্বারা সেট করা হয়েছে, এবং তাদের সকলের সাথে GND ঠিকানা 0x90। এনালগ আউটপুট পিন 15 থেকে নেওয়া যেতে পারে (এবং পিন 13 এ একটি পৃথক এনালগ GND আছে। এছাড়াও, পিন 13 কে GND এবং সার্কিট GND কে Arduino GND এর সাথে সংযুক্ত করুন।

DAC কে নিয়ন্ত্রণ করতে আমাদের দুই বাইট ডেটা পাঠাতে হবে। প্রথমটি হল কন্ট্রোল বাইট, যা কেবল DAC সক্রিয় করে এবং 1000000 (অথবা 0x40) এবং পরবর্তী বাইট হল 0 এবং 255 (আউটপুট লেভেল) এর মধ্যে মান। এটি নিম্নলিখিত স্কেচে প্রদর্শিত হয়:

// উদাহরণ 52.1 PCF8591 DAC ডেমো

#অন্তর্ভুক্ত "Wire.h" #PCF8591 (0x90 >> 1) // I2C বাসের ঠিকানা অকার্যকর সেটআপ () {Wire.begin (); } void loop () {for (int i = 0; i <256; i ++) {Wire.beginTransmission (PCF8591); // জেগে উঠুন PCF8591 Wire.write (0x40); // নিয়ন্ত্রণ বাইট - DAC চালু করুন (বাইনারি 1000000) Wire.write (i); // DAC Wire.endTransmission () এ পাঠানোর মান; // শেষ ট্রান্সমিশন}

জন্য (int i = 255; i> = 0; --i)

{Wire.beginTransmission (PCF8591); // জেগে উঠুন PCF8591 Wire.write (0x40); // নিয়ন্ত্রণ বাইট - DAC চালু করুন (বাইনারি 1000000) Wire.write (i); // DAC Wire.endTransmission () এ পাঠানোর মান; // শেষ ট্রান্সমিশন}}

আপনি কি #ডিফাইন স্টেটমেন্টে বাসের ঠিকানার পরিবর্তন লক্ষ্য করেছেন? Arduino 7-বিট ঠিকানা পাঠায় কিন্তু PCF8591 একটি 8-বিট চায়, তাই আমরা এক বিট দ্বারা বাইট স্থানান্তর করি।

ধাপ ২:

ছবি
ছবি

ছবিতে স্কেচের ফলাফল দেখানো হয়েছে, আমরা Vref কে 5V এবং অসিলোস্কোপ প্রোব এবং GND কে যথাক্রমে এনালগ আউটপুট এবং GND এর সাথে সংযুক্ত করেছি।

ধাপ 3:

ছবি
ছবি

আপনি যদি কার্ভ পছন্দ করেন তবে আপনি নীচের স্কেচ দিয়ে সাইন ওয়েভ তৈরি করতে পারেন। এটি একটি অ্যারেতে একটি লুকআপ টেবিল ব্যবহার করে যাতে প্রয়োজনীয় পূর্ব-গণনা করা ডেটা পয়েন্ট থাকে:

// উদাহরণ 52.2 PCF8591 DAC ডেমো - সাইন ওয়েভ

#অন্তর্ভুক্ত "Wire.h" #PCF8591 (0x90 >> 1) // I2C বাসের ঠিকানা uint8_t sine_wave [256] = {0x80, 0x83, 0x86, 0x89, 0x8C, 0x90, 0x93, 0x96, 0x99, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C 0xA2, 0xA5, 0xA8, 0xAB, 0xAE, 0xB1, 0xB3, 0xB6, 0xB9, 0xBC, 0xBF, 0xC1, 0xC4, 0xC7, 0xC9, 0xCC, 0xCE, 0xD1, 0xD3, 0xD5, 0xD8, 0xDA, 0xDC, 0xDE, 0xE0, 0xE2, 0xE4, 0xE6, 0xE8, 0xEA, 0xEB, 0xED, 0xEF, 0xF0, 0xF1, 0xF3, 0xF4, 0xF5, 0xF6, 0xF8, 0xF9, 0xFA, 0xFA, 0xFB, 0xFC, 0xFD, 0xFD, 0xFE, 0xFE, 0xFE, 0xFF 0xFF 0xED, 0xEB, 0xEA, 0xE8, 0xE6, 0xE4, 0xE2, 0xE0, 0xDE, 0xDC, 0xDA, 0xD8, 0xD5, 0xD3, 0xD1, 0xCE, 0xCC, 0xC9, 0xC7, 0xC4, 0xC1, 0xBF, 0xBC, 0xB9, 0xB6, 0xB3, 0xB1, 0xAE, 0xAB, 0xA8, 0xA5, 0xA2, 0x9F, 0x9C, 0x99, 0x96, 0x93, 0x90, 0x8C, 0x89, 0x86, 0x83, 0x80, 0x7D, 0x7A, 0x77, 0x74, 0x70, 0x6D, 0x6A, 0x67, 0x64, 0x61, 0x5E, 0x5B, 0x58, 0x55, 0x52, 0x4F, 0x4D, 0x4A, 0x47, 0x44, 0x41, 0x3F, 0x 3C, 0x39, 0x37, 0x34, 0x32, 0x2F, 0x2D, 0x2B, 0x28, 0x26, 0x24, 0x22, 0x20, 0x1E, 0x1C, 0x1A, 0x18, 0x16, 0x15, 0x13, 0x11, 0x10, 0x0, 0x0 0x0B, 0x0A, 0x08, 0x07, 0x06, 0x06, 0x05, 0x04, 0x03, 0x03, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x03, 0x03, 0x04, 0x05, 0x06, 0x06, 0x07, 0x08, 0x0A, 0x0B, 0x0C, 0x0D, 0x0F, 0x10, 0x11, 0x13, 0x15, 0x16, 0x18, 0x1A, 0x1C, 0x1E, 0x20, 0x22, 0x24, 0x26, 0x28, 0x2B, 0x2D, 0x2F, 0x32, 0x34, 0x37, 0x39, 0x3C, 0x3F, 0x41, 0x44, 0x47, 0x4A, 0x4D, 0x4F, 0x52, 0x55, 0x58, 0x5B, 0x5E, 0x61, 0x64, 0x67, 0x6A, 0x6D, 0x70, 0x74, 0x77, 0x7A, 0x7D}; অকার্যকর সেটআপ () {Wire.begin (); } void loop () {for (int i = 0; i <256; i ++) {Wire.beginTransmission (PCF8591); // জেগে উঠুন PCF8591 Wire.write (0x40); // নিয়ন্ত্রণ বাইট - DAC চালু করুন (বাইনারি 1000000) Wire.write (sine_wave ); // DAC Wire.endTransmission () এ পাঠানোর মান; // শেষ ট্রান্সমিশন}}

ধাপ 4:

ছবি
ছবি

নিম্নলিখিত DSO ইমেজ ডাম্পের জন্য, আমরা Vref কে 3.3V এ পরিবর্তন করেছি - সাইন ওয়েভের ম্যাক্সিমায় পরিবর্তন লক্ষ্য করুন।

এখন আপনি সাউন্ড এফেক্ট, সিগন্যাল বা অন্যান্য এনালগ সার্কিট নিয়ন্ত্রণ করতে DAC এর সাথে পরীক্ষা করতে পারেন।

ধাপ 5: ADC ব্যবহার করা (এনালগ-টু-ডিজিটাল কনভার্টার)

আপনি যদি আপনার Arduino এ analogRead () ফাংশন ব্যবহার করেন (প্রথম অধ্যায় থেকে ফিরে) তাহলে আপনি ইতিমধ্যে একটি ADC এর সাথে পরিচিত। PCF8591 এর বাইরে আমরা শূন্য এবং Vref এর মধ্যে একটি ভোল্টেজ পড়তে পারি এবং এটি শূন্য এবং 255 এর মধ্যে একটি মান প্রদান করবে যা সরাসরি শূন্য এবং Vref এর সমানুপাতিক।

উদাহরণস্বরূপ, 3.3V পরিমাপ করা উচিত 168। কিন্তু আমরা এক মুহুর্তে এটিতে পৌঁছাব। প্রথমত, কেবল প্রতিটি ADC পিনের মানগুলি পড়ার জন্য আমরা PCF8591 কে বলার জন্য একটি নিয়ন্ত্রণ বাইট পাঠাই যা আমরা পড়তে চাই। এডিসির শূন্য থেকে তিনের জন্য নিয়ন্ত্রণ বাইট যথাক্রমে 0x00, 0x01, ox02 এবং 0x03।

তারপর আমরা ADC থেকে দুই বাইট ডেটা ফেরত চাই এবং ব্যবহারের জন্য দ্বিতীয় বাইট সংরক্ষণ করি। দুই বাইট কেন? PCF8591 প্রথমে পূর্বে পরিমাপকৃত মান প্রদান করে - তারপর বর্তমান বাইট। (ডেটা শীটে চিত্র 8 দেখুন)। অবশেষে, যদি আপনি সমস্ত ADC পিন ব্যবহার না করেন, অব্যবহৃতগুলিকে GND এর সাথে সংযুক্ত করুন। নিম্নোক্ত উদাহরণ স্কেচ কেবলমাত্র প্রতিটি এডিসি পিন থেকে একবারে মানগুলি পুনরুদ্ধার করে, তারপর সেগুলি সিরিয়াল মনিটরে প্রদর্শন করে:

#"Wire.h" অন্তর্ভুক্ত করুন

#ডিফাইন PCF8591 (0x90 >> 1) // I2C বাসের ঠিকানা #ADC0 0x00 // ডিফল্ট ADCs পড়ার জন্য নিয়ন্ত্রণ বাইট #Define ADC1 0x01 #define ADC2 0x02 #define ADC3 0x03 byte value0, value1, value2, value3; অকার্যকর সেটআপ () {Wire.begin (); Serial.begin (9600); } অকার্যকর লুপ () {Wire.beginTransmission (PCF8591); // জেগে উঠুন PCF8591 Wire.write (ADC0); // নিয়ন্ত্রণ বাইট - ADC0 Wire.endTransmission () পড়ুন; // শেষ ট্রান্সমিশন Wire.requestFrom (PCF8591, 2); value0 = Wire.read (); value0 = Wire.read (); Wire.beginTransmission (PCF8591); // জেগে উঠুন PCF8591 Wire.write (ADC1); // নিয়ন্ত্রণ বাইট - ADC1 Wire.endTransmission () পড়ুন; // শেষ ট্রান্সমিশন Wire.requestFrom (PCF8591, 2); value1 = Wire.read (); value1 = Wire.read (); Wire.beginTransmission (PCF8591); // জেগে উঠুন PCF8591 Wire.write (ADC2); // নিয়ন্ত্রণ বাইট - ADC2 Wire.endTransmission () পড়ুন; // শেষ ট্রান্সমিশন Wire.requestFrom (PCF8591, 2); value2 = Wire.read (); value2 = Wire.read (); Wire.beginTransmission (PCF8591); // জেগে উঠুন PCF8591 Wire.write (ADC3); // নিয়ন্ত্রণ বাইট - ADC3 Wire.endTransmission () পড়ুন; // শেষ ট্রান্সমিশন Wire.requestFrom (PCF8591, 2); value3 = Wire.read (); value3 = Wire.read (); সিরিয়াল.প্রিন্ট (মান 0); সিরিয়াল.প্রিন্ট (""); সিরিয়াল.প্রিন্ট (মান 1); সিরিয়াল.প্রিন্ট (""); সিরিয়াল.প্রিন্ট (মান 2); সিরিয়াল.প্রিন্ট (""); সিরিয়াল.প্রিন্ট (মান 3); সিরিয়াল.প্রিন্ট (""); Serial.println (); }

স্কেচ চালানোর পর আপনাকে সিরিয়াল মনিটরে প্রতিটি এডিসির মান উপস্থাপন করা হবে। যদিও প্রতিটি এডিসি কীভাবে আলাদাভাবে পড়তে হয় তা দেখানোর জন্য এটি একটি সাধারণ প্রদর্শন ছিল, এটি একটি নির্দিষ্ট এডিসি থেকে একবারে একাধিক বাইট পাওয়ার একটি কষ্টকর পদ্ধতি।

ধাপ 6:

এটি করার জন্য, অটো-ইনক্রিমেন্টের অনুরোধ করার জন্য কন্ট্রোল বাইট পরিবর্তন করুন, যা কন্ট্রোল বাইটের বিট 2 সেট করে 1 তে করা হয়। সুতরাং ADC0 থেকে শুরু করার জন্য আমরা বাইনারি 00000100 বা হেক্সাডেসিমাল 0x04 এর একটি নতুন কন্ট্রোল বাইট ব্যবহার করি। তারপরে পাঁচ বাইট ডেটার অনুরোধ করুন (আবার আমরা প্রথম বাইটটি উপেক্ষা করি) যার ফলে PCF8591 বাইটের একটি শৃঙ্খলে সমস্ত মান ফিরিয়ে দেবে। এই প্রক্রিয়াটি নিম্নলিখিত স্কেচে প্রদর্শিত হয়:

#"Wire.h" অন্তর্ভুক্ত করুন

#সংজ্ঞায়িত করুন PCF8591 (0x90 >> 1) // I2C বাসের ঠিকানা বাইট মান 0, মান 1, মান 2, মান 3; অকার্যকর সেটআপ () {Wire.begin (); Serial.begin (9600); } অকার্যকর লুপ () {Wire.beginTransmission (PCF8591); // জেগে উঠুন PCF8591 Wire.write (0x04); // কন্ট্রোল বাইট - পড়ুন ADC0 তারপর অটো -ইনক্রিমেন্ট Wire.endTransmission (); // শেষ ট্রান্সমিশন Wire.requestFrom (PCF8591, 5); value0 = Wire.read (); value0 = Wire.read (); value1 = Wire.read (); value2 = Wire.read (); value3 = Wire.read (); সিরিয়াল.প্রিন্ট (মান 0); সিরিয়াল.প্রিন্ট (""); সিরিয়াল.প্রিন্ট (মান 1); সিরিয়াল.প্রিন্ট (""); সিরিয়াল.প্রিন্ট (মান 2); সিরিয়াল.প্রিন্ট (""); সিরিয়াল.প্রিন্ট (মান 3); সিরিয়াল.প্রিন্ট (""); Serial.println (); }

পূর্বে আমরা উল্লেখ করেছি যে PCF8591 এমন কিছু করতে পারে যা Arduino এর ADC পারে না, এবং এটি একটি ডিফারেনশিয়াল ADC অফার করে। Arduino এর একক-সমাপ্তির বিপরীতে (অর্থাৎ এটি ইতিবাচক সংকেত ভোল্টেজ এবং GND এর মধ্যে পার্থক্য ফিরিয়ে দেয়, ডিফারেনশিয়াল ADC দুটি সংকেত গ্রহণ করে (যা অগত্যা মাটিতে উল্লেখ করতে হবে না), এবং দুটি সংকেতের মধ্যে পার্থক্য ফিরিয়ে দেয় লোড কোষের জন্য ভোল্টেজের ছোট পরিবর্তন পরিমাপের জন্য এটি সুবিধাজনক হতে পারে।

ধাপ 7:

ছবি
ছবি

ডিফারেনশিয়াল এডিসির জন্য PCF8591 সেট আপ করা নিয়ন্ত্রণ বাইট পরিবর্তন করার একটি সহজ বিষয়। আপনি যদি ডাটা শীটের সাত পৃষ্ঠার দিকে ফিরে যান, তাহলে বিভিন্ন ধরণের এনালগ ইনপুট প্রোগ্রামিং বিবেচনা করুন। আগে আমরা চারটি ইনপুটের জন্য '00' মোড ব্যবহার করতাম, তবে আপনি স্পষ্টভাবে চিত্রিত অন্যান্যগুলি নির্বাচন করতে পারেন, উদাহরণস্বরূপ চিত্রটি।

সুতরাং দুটি ডিফারেনশিয়াল ইনপুটের জন্য কন্ট্রোল বাইট সেট করতে, বাইনারি 00110000 বা 0x30 ব্যবহার করুন। তারপরে ডেটার বাইটগুলি অনুরোধ করা এবং তাদের সাথে কাজ করা একটি সহজ বিষয়। আপনি দেখতে পাচ্ছেন যে এখানে একক/ডিফারেনশিয়াল এবং একটি জটিল তিন-ডিফারেনশিয়াল ইনপুট রয়েছে। যাইহোক, আমরা আপাতত তাদের ছেড়ে দেব।

আশা করি আপনি এই আগ্রহ খুঁজে পেয়েছেন, আপনার পরীক্ষায় একটি DAC যোগ করা হোক বা ADCs সম্পর্কে একটু বেশি শেখা। দয়া করে PMD Way থেকে আপনার PCF8591 অর্ডার করার কথা বিবেচনা করুন।

এই পোস্টটি আপনার জন্য নিয়ে এসেছে pmdway.com - নির্মাতা এবং ইলেকট্রনিক্স উত্সাহীদের জন্য সবকিছু, বিশ্বব্যাপী বিনামূল্যে বিতরণ সহ।

প্রস্তাবিত: