در این آموزش تصمیم داریم نحوه راه اندازی ماژول مبدل دیجیتال به آنالوگ MCP4725 را با آردوینو برای شما دانشپژوهان عزیز بیان کنیم.
لازم است بدانید که میکروکنترلرها فقط با مقادیر دیجیتال کار میکنند اما در دنیای واقعی، ما نیاز به ایجاد ارتباط توسط سیگنالهای آنالوگ، خواهیم داشت. به همین دلیل در تمامی میکروکنترلرها واحد ADC (مبدل آنالوگ به دیجیتال)، برای تبدیل مقادیر آنالوگ دنیای واقعی به مقادیر دیجیتال تعبیهشده تا بتوانند تمام سیگنالها را پردازش کنند. اما تصور کنید در پروژهای، اگر به تبدیل مقادیر دیجیتال به سیگنالهای آنالوگ یا به عبارت دیگر به واحد DAC (مبدل دیجیتال به آنالوگ) نیازداشته باشیم، چه میشود؟ اگر به دنبال پاسخ این سوال هستید تا پایان این آموزش با ما همراه باشید.
راهکار این موضوع استفاده از یک مبدل دیجیتال به آنالوگ است. یک مثال ساده از کاربرد این قطعه، ضبط آهنگ در استودیو است که در آن خواننده با استفاده از میکروفن، آهنگی را میخواند و سپس این امواج صوتی آنالوگ به مقادیر دیجیتال تبدیل شده و در آخر در یک فایل با فرمت دیجیتال ذخیره میشوند. هنگامی که این آهنگ پخش میشود، مقادیر دیجیتال به سیگنالهای آنالوگ تبدیل و از طریق بلندگو پخش میشوند. بنابراین به آسانی میتوان تشخیص داد که در این سیستم پخش صدا از یک DAC (مبدل دیجیتال به آنالوگ) استفاده میشود. امروزه از مبدلهای دیجیتال به آنالوگ در پروژههای بسیاری مانند کنترل موتور، روشنایی چراغهای الایدی، تقویت کنندههای صوتی، انکودرهای ویدئویی، سیستمهای جمعآوری داده ، MP3 و … استفاده میشود.
تعریف واحد DAC در ماژول آردوینو
در بسیاری از میکروکنترلرها، یک واحد DAC داخلی وجود دارد که میتوان از آن برای تولید خروجی آنالوگ استفاده کرد. اما میکروکنترلرهای استفادهشده در ماژولهای آردوینو مانند ATmega328/ATmega168 فاقد DAC داخلی هستند. البته در همهی این آردوینوها یک واحد ADC داخلی وجود دارد که دارای یک DAC ده بیتی درساختار خود هستند، اما این DAC نمیتواند به صورت مستقل استفاده شود و زمانی ما با مشکل رو به رو میشویم که در پروژه خود نیاز داشته باشیم توسط آردوینو دستورات خود را روی قطعاتی با ورودی آنالوگ اجرا کنیم، بنابراین لازم است یک واحد DAC مستقل در آردوینو تعریف کنیم .
و ما برای تعریف این واحد و اجرای دستورات در آردوینو نیاز به یک مبدل دیجیتال به آنالوگ داریم در ادامه با اتصال ماژول مبدل دیجیتال به آنالوگ MCP4725 به آردوینو، یک واحد DAC مستقل برای آن تعریف کنیم.
معرفی ماژول مبدل دیجیتال به آنالوگ MCP4725
ماژول MCP4725، یک مبدل دیجیتال به آنالوگ 12بیتی است و کاربرد آن برای تولید ولتاژ خروجی آنالوگ در بازهی 0 تا 5 ولت میباشد. این ماژول دارای یک تراشهی حافظه غیرفرار EEPROM میباشد و از طریق رابط I2C با آردوینو ارتباط برقرار میکند.
تراشه MCP4725 دارای رزولوشن 12 بیتی است، بدین معنا ه این معنا که با دریافت یک مقدار از 0 تا 4096 در ورودی، با توجه به ولتاژ مرجع یک ولتاژ آنالوگ در خروجی میسازد. (ولتاژ مرجع حداکثر میتواند 5 ولت باشد)
نحوهی محاسبهی ولتاژ خروجی
برای محاسبه میزان ولتاژی که قصد دارید در خروجی این ماژول مبدل دریافت کنید با توجه به میزان ولتاژ ورودی یا تغذیه و همچنین مقدار دیجیتال، بایستی از فرمول زیر استفاده نمایید:
O/P Voltage = (Reference Voltage / Resolution) x Digital Value
به عنوان مثال: اگر مقدار دیجیتال را 2048 و ولتاژ مرجع را 5 ولت فرض کنیم، برای محاسبه خروجی DAC خواهیم داشت:
O/P Voltage = (5/ 4096) x 2048 = 2.5V
پینهای ماژول MCP4725
درادامه تصویری از ماژول MCP4725 را مشاهده میکنید که درآن نام هر یک از پایههای ماژول به وضوح نشان داده شدهاست:
درجدول زیر، عملکرد هر پین به طور خلاصه بیان شدهاست:
پایههای MCP4725 | کاربرد |
OUT | ولتاژ خروجی آنالوگ |
GND | GND خروجی |
SCL | کلاک سریال ارتباط I2C |
SDA | دادهی سریال ارتباط I2C |
VCC | ولتاژ مرجع ورودی 5 یا 3.3 ولت |
GND | GND ورودی |
استفاده از رابط I2C در ماژول MCP4725
این آی سی مبدل آنالوگ به دیجیتال را میتوانید با استفاده از ارتباط I2C به هر میکروکنترلری متصل نمایید. ارتباط I2C، فقط به دو سیم کلاک (SCL) و دیتا (SDA) نیاز دارد و میتوانید از طریق آن، چندین تراشه MCP4725 را به آردوینو متصل نمایید. فقط در نظر داشته باشید که در این حالت میبایست آدرس I2C تراشهها را تغییر دهید زیرا به صورت پیش فرض آدرس I2C تراشه MCP4725 معادل 0X60 ،0X61 یا 0X62 میباشد.
راه اندازی ماژول مبدل دیجیتال به آنالوگ MCP4725
در این آموزش، ابتدا ماژول MCP4725 را به آردوینو Uno متصل کرده و با استفاده از یک پتانسیومتر، سیگنال آنالوگ ورودی را به پین A0 آردوینو اعمال مینماییم. سپس با به کارگیری واحد ADC آردوینو، سیگنال آنالوگ ورودی را به دیجیتال تبدیل میکنیم. این مقادیر دیجیتال از طریق رابط I2C، به ماژول MCP4725 ارسال میشود تا از طریق واحد DAC تراشه MCP4725 به سیگنالهای آنالوگ تبدیل شود. برای بررسی خروجی آنالوگ تراشه MCP4725، پین OUT ماژول MCP4725 را به پین A1 آردوینو متصل میکنیم و درنهایت، هر دو مقادیر ADC و DAC و ولتاژها را بر روی صفحه نمایش LCD 16×2 نمایش میدهیم.
با یادگیری کامل راه اندازی LCD کاراکتری با ماژول رابط سریال I2C و آردوینو میتوانید دانش بیشتری در رابطه با نحوه عملکرد و کارایی این ماژول در پروژههای گوناگون به دست آورید.
گام اول) تهیه قطعات موردنیاز:
پیش از شروع به اتصالات و راه اندازی ماژول مبدل دیجیتال به آنالوگ MCP4725، ابتدا لازم است اقلامی که در لیست زیر همراه با لینک خرید قرار دادهشده اند، تهیه و آماده نمایید:
- ماژول DAC MCP4725
- آردوینو Uno یا آردوینو Nano
- ماژول LCD کاراکتری 16×2
- پتانسیومتر 10 کیلواهم
- بردبورد
- چند عدد سیم جامپرنری/نری
گام دوم) انجام سیمبندی و اتصالات
در این بخش میتوانید مدار راه اندازی ماژول مبدل دیجیتال به آنالوگ MCP4725 را با کمک بررسی شماتیک و جداول آماده شده در ادامه، کامل نمایید.
- اگر میخواهید مقادیر ولتاژ خروجی ماژول را بر روی مولتیمتر نمایشدهید، طیق جدول زیر اتصالات را برقرارنمایید.
MCP4725 | Arduino Nano | Multimeter |
SDA | A4 | NC |
SCL | A5 | NC |
A0 or OUT | A1 | +ve terminal |
GND | GND | -ve terminal |
VCC | 5V | NC |
- برای اتصال آردوینو NANO به یک السیدی کاراکتری، طبق جدول زیر ماژولها را به یکدیگر متصل نمایید.
LCD 16×2 | Arduino Nano |
VSS | GND |
VDD | 5V+ |
V0 | From Potentiometer Centre Pin to adjust contrast of LCD |
RS | D2 |
RW | GND |
E | D3 |
D4 | D4 |
D5 | D5 |
D6 | D6 |
D7 | D7 |
A | 5V+ |
K | GND |
برای اتصال پتانسیومتر، پین وسط آن را به ورودی آنالوگ A0 آردوینو متصل کرده و دو پین دیگر را به پین GND و 5 ولت آردوینو متصل نمایید.
گام سوم) آپلود کد در آردوینو:
در این قسمت ابتدا کد کامل آردوینو برای راه اندازی ماژول مبدل دیجیتال به آنالوگ MCP4725 آورده شده است که در ادامه به توضیح آن خواهیم پرداخت:
#include<Wire.h> //Include Wire library for using I2C functions
#include <LiquidCrystal.h> //Include LCD library for using LCD display functions
#define MCP4725 0x61 //MCP4725 address as 0x61 Change yours accordingly
LiquidCrystal lcd(2,3,4,5,6,7); //Define LCD display pins RS,E,D4,D5,D6,D7
unsigned int adc;
byte buffer[3];
void setup()
{
Wire.begin(); //Begins the I2C communication
lcd.begin(16,2); //Sets LCD in 16X2 Mode
lcd.print("CIRCUIT DIGEST");
delay(1000);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Arduino");
lcd.setCursor(0,1);
lcd.print("DAC with MCP4725");
delay(2000);
lcd.clear();
}
void loop()
{
buffer[0] = 0b01000000; //Sets the buffer0 with control byte (010-Sets in Write mode)
adc = analogRead(A0) * 4; //Read Analog value from pin A0 and convert into digital (0-1023) multiply with 4 gives (0-4096)
float ipvolt = (5.0/4096.0)* adc; //Finding voltage formula (A0)
buffer[1] = adc >> 4; //Puts the most significant bit values
buffer[2] = adc << 4; //Puts the Least significant bit values
unsigned int analogread = analogRead(A1)*4 ; //Reads analog voltage from A1
float opvolt = (5.0/4096.0)* analogread; //Finding Voltage Formula (A1)
Wire.beginTransmission(MCP4725); //Joins I2C bus with MCP4725 with 0x61 address
Wire.write(buffer[0]); //Sends the control byte to I2C
Wire.write(buffer[1]); //Sends the MSB to I2C
Wire.write(buffer[2]); //Sends the LSB to I2C
Wire.endTransmission(); //Ends the transmission
lcd.setCursor(0,0);
lcd.print("A IP:");
lcd.print(adc); //Prints the ADC value from A0
lcd.setCursor(10,0);
lcd.print("V:"); //Prints the Input Voltage at A0
lcd.print(ipvolt);
lcd.setCursor(0,1);
lcd.print("D OP:");
lcd.print(analogread); //Prints the ADC value from A1 (From DAC)
lcd.setCursor(10,1);
lcd.print("V:");
lcd.print(opvolt); //Prints the Input Voltage at A1 (From DAC)
delay(500);
lcd.clear();
}
توضیحات کد:
- ابتدا کتابخانههای I2C و LCD را به برنامه اضافهمیکنیم:
#include<Wire.h>
#include <LiquidCrystal.h>
- سپس پینهای السیدی را با توجه به این که به کدام یک ازپینهای آردوینو نانو متصل کردیم، تعریف و مقداردهی اولیه میشود:
LiquidCrystal lcd(2,3,4,5,6,7); //Define LCD display pins RS,E,D4,D5,D6,D7
- سپس آدرس I2C تراشه MCP4725 را تعریف میکنیم:
#define MCP4725 0x61
در تابع ()Setup:
- ابتدا ارتباط I2C را با دستور زیر در پینهای A4 و A5 آردوینو نانو آغاز میکنیم.
Wire.begin(); //Begins the I2C communication
- صفحهنمایش السیدی را درحالت 2*16 تنظیم و یک پیام خوشآمدگویی بر روی ان نمایش میدهیم.
lcd.begin(16,2); //Sets LCD in 16X2 Mode
lcd.print("CIRCUIT DIGEST");
delay(1000);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Arduino");
lcd.setCursor(0,1);
lcd.print("DAC with MCP4725");
delay(2000);
lcd.clear();
در تابع ()loop :
1.ابتدا در Bufer[0] مقدار بایت کنترلی را به 0b01000000 تنظیم میکنیم. با این تنظیمات تراشه MCP4725 را در مد نوشتن قرار میگیرد.
buffer[0] = 0b01000000;
2. عبارت زیر، مقدارآنالوگ را از پین A0 ماژول MCP4725 میخواند و به مقادیردیجیتال در بازهی (0-1023) تبدیل میکند. از آنجاییکه رزولوشن ADC در آردوینو 10بیتی است و رزولوشن این آیسی 12بیتی و دربازهی (0-4096) میباشد، میبایست در عدد 4 ضرب شود.
adc = analogRead(A0) * 4;
3. با عبارت زیر، مقدار ولتاژ بر اساس مقدار ADC ورودی در بازهی (0-4096) و به ازای ولتاژ مرجع 5 ولت محاسبه میشود.
float ipvolt = (5.0/4096.0)* adc;
4. در خط اول با جابهجایی (شیفت دادن) 4 بیت متغیر ADC به سمت راست، مقادیر باارزشترین بیت در Buffer[1] قرارمیدهیم و در خط دوم با جابهجایی 4 بیت متغیر ADC به سمتچپ، مقادیر کم ارزشترین بیت را در Buffer[2] قرارمیدهیم.
buffer[1] = adc >> 4;
buffer[2] = adc << 4;
5. عبارت زیر ولتاژ آنالوگ را از پین A1 آردوینو میخواند، این پین درواقع همان خروجی آنالوگ ماژول DAC MCP4725 میباشد که میتوانید آن را به مولتیمتر نیز متصل کرده و ولتاژخروجی را بررسی کنید.
unsigned int analogread = analogRead(A1)*4 ;
6. بیشترین مقدار ولتاژ آنالوگ متغیر، با استفاده از فرمول زیر محاسبه میشود:
float opvolt = (5.0/4096.0)* analogread;
7. عبارت زیر برای شروع انتقال داده به وسیلهی ماژول MCP4725 استفاده میشود.
Wire.beginTransmission(MCP4725);
8. عبارت زیر بایت کنترلی را به I2C ارسال میکند.
Wire.write(buffer[0]);
9. بیت MSB یا پرارزشترین بیت را به I2C میفرستد.
Wire.write(buffer[1]);
10. بیت LSB یا کم ارزشترین بیت را به I2C میفرستد.
Wire.write(buffer[2]);
11. دستور زیر نیز، تبادل اطلاعات را پایانمیدهد.
Wire.endTransmission();
12. درنهایت میتوانید بااستفاده از تابع ()lcd.print، نتایج را برروی صفحهنمایش LCD 16×2 نمایشدهید.
lcd.setCursor(0,0);
lcd.print("A IP:");
lcd.print(adc);
lcd.setCursor(10,0);
lcd.print("V:");
lcd.print(ipvolt);
lcd.setCursor(0,1);
lcd.print("D OP:");
lcd.print(analogread);
lcd.setCursor(10,1);
lcd.print("V:");
lcd.print(opvolt);
delay(500);
lcd.clear();
گام آخر) تبدیل مقادیر دیجتال به آنالوگ با ماژول MCP4725 و آردوینو
پس از برقراری اتصالات و آپلود کد بر روی آردوینو، پتانسومتر را تغییردهید و نتایج خروجی را بر روی السیدی تماشا کنید. در خط اول السیدی، مقدار ADC ورودی و ولتاژ آنالوگ نمایش داده میشود و در خط دوم، مقادیر DAC و ولتاژ خروجی نمایش داده میشود.
البته شما میتوانید، ولتاژ خروجی را با اتصال مولتیمتر به پین OUT و GND ماژول MCP4725 نیز بررسی نمایید.
به این ترتیب توانستیم با اتصال ماژول DAC MCP4725 به آردوینو، مقادیردیجیتال را به سیگنالهای آنالوگ تبدیل کنیم.
سخن آخر
امیدواریم با یادگیری کامل نحوه راه اندازی ماژول مبدل دیجیتال به آنالوگ MCP4725 در این آموزش، توانایی استفاده از این ماژول را در پروژههای گوناگون خود بهدست آورده باشید. چنانچه هنگام یادگیری و پیادهسازی این مطلب دچار مشکل شده و سؤالی ذهن شما را درگیر کرده، میتوانید تنها با ارسال پرسش خود در بخش دیدگاه همین صفحه، برای تیم کارشناس آکادمی روبوایکیو راهحل خود را در اسرع زمان از ما دریافت نمایید.