آموزش تبدیل دیجیتال به آنالوگ DAC در برد STM32
سلام. آموزش دیجیتال به آنالوگ DAC با برد STM32 را آماده کردیم.
محتویات
- آموزش دیجیتال به آنالوگ با میکروکنترلر STM32
- پین های I2C در STM32
- مدار مبدل دیجیتال به آنالوگ با رزبری پای
- اتصالات بین STM32 و ال سی دی
- اتصال بین MCP4725 DAC IC و STM32F103C8
- قطعات مورد نیاز
- ماژول DP MCP4725 (مبدل دیجیتال به آنالوگ)
- فرمول برای محاسبه ولتاژ خروجی
- پین های MCP4725
- برنامه نویسی STM32F103C8 برای تبدیل دیجیتال به آنالوگ
- کد کامل
- فیلم عملکرد DAC با STM32
آموزش دیجیتال به آنالوگ با میکروکنترلر STM32
همه ما می دانیم که میکروکنترلرها فقط با مقادیر دیجیتال کار می کنند اما در دنیای واقعی باید با سیگنال های آنالوگ کار کنیم. به همین دلیل ADC (مبدل های آنالوگ به دیجیتال) برای تبدیل مقادیر آنالوگ در دنیای واقعی به فرم دیجیتال وجود دارد تا میکروکنترلر ها بتوانند سیگنال ها را پردازش کنند. اما اگر به سیگنال های آنالوگ از مقادیر دیجیتال نیاز داشته باشیم باید چکار کنیم؟ در اینجا DAC (مبدل دیجیتال به آنالوگ) به کمک ما می آید.
یک مثال ساده برای مبدل دیجیتال به آنالوگ ، ضبط آهنگ در استودیو است که در آن یک خواننده از میکروفون استفاده می کند و ترانه ای را می خواند. این امواج صوتی آنالوگ به فرم دیجیتال تبدیل می شوند و سپس در یک فایل با فرمت دیجیتال ذخیره می شوند و وقتی آهنگ با استفاده از فایل دیجیتالی ذخیره شده پخش می شود ، این مقادیر دیجیتالی برای خروجی بلندگو به سیگنال های آنالوگ تبدیل می شوند. بنابراین در این سیستم از DAC استفاده می شود.
DAC را می توان در بسیاری از برنامه ها مانند کنترل موتور ، کنترل روشنایی چراغ های LED ، تقویت کننده صوتی ، انکودر های ویدیویی و … مشاهده کرد. در این آموزش ما از MCP4725 DAC IC برای طراحی مبدل دیجیتال به آنالوگ با استفاده از میکروکنترلر STM32F103C8 استفاده خواهیم کرد.
همچنین اگر میخواهید الکترونیک را با فیلم های آموزشی یاد بگیرید، روی دوره آموزش الکترونیک کلیک کنید.
فیلم عملکرد پروژه در انتهای صفحه قرار داده شده است.
همچنین پیشنهاد میکنم آموزش راه اندازی مبدل آنالوگ به دیجیتال در STM32 را هم مشاهده کنید.
پین های I2C در STM32
با توجه به تصویر زیر که جزئیات پین های STM32 را نشان میدهد، پین های زیر I2C هستند.
SDA: PB7 یا PB9 ، PB11
SCL: PB6 یا PB8 ، PB10
مدار مبدل دیجیتال به آنالوگ با رزبری پای
تصویر زیر شماتیک مدار راه اندازی دیجیتال به آنالوگ توسط STM32 را نشان میدهد.
در این آموزش ما MCP4725 DAC IC را به STM32 وصل می کنیم و از پتانسیومتر 10 کیلو اهم برای ارائه مقدار ورودی آنالوگ به پین PA0 STM32 ADC استفاده می کنیم. و سپس از ADC استفاده میکنیم تا مقدار آنالوگ را به فرم دیجیتال تبدیل کنید. پس از آن مقادیر دیجیتالی را از طریق I2C به MCP4725 ارسال می کنیم. سپس آن مقادیر دیجیتالی را با استفاده از DAC MCP4725 IC به آنالوگ تبدیل میکنیم و سپس از ADC پین PA1 دیگر از STM32 استفاده میکنیم تا خروجی آنالوگ MCP4725 را از پین OUT بررسی کنیم. در آخر هر دو مقدار ADC و DAC را با ولتاژ در ال سی دی نمایش میدهیم.
اتصالات بین STM32 و ال سی دی
جدول زیر اتصالات بین STM32 و ال سی دی را به طور کامل نمایش میدهد.
شماره پین ال سی دی | نام پین ال سی دی | نام پین STM32 |
1 | Ground | Ground |
2 | VCC | 5V |
3 | VEE | پتانسیومتر |
4 | Register Select (RS) | PB11 |
5 | Read/Write (RW) | Ground |
6 | Enable (EN) | PB10 |
7 | Data Bit 0 DB0 | متصل نمیشود |
8 | Data Bit 1 DB1 | متصل نمیشود |
9 | Data Bit 2 DB2 | متصل نمیشود |
10 | Data Bit 3 DB3 | متصل نمیشود |
11 | Data Bit 4 DB4 | PB0 |
12 | Data Bit 5 DB5 | PB1 |
13 | Data Bit 6 DB6 | PC13 |
14 | Data Bit 7 DB7 | PC14 |
15 | LED مثبت | 5V |
16 | LED منفی | Ground |
اتصال بین MCP4725 DAC IC و STM32F103C8
MCP4725 | STM32 | مولتی متر |
SDA | PB7 | NC |
SCL | PB6 | NC |
OUT | PA1 | میله مثبت |
GND | GND | میله منفی |
VCC | 3.3V | NC |
قطعات مورد نیاز
- STM32 – برد توسعه (BluePill) (STM32F103C8T6)
- IC دیجیتال به آنالوگ MCP4725
- پتانسیومتر 10 کیلو اهم
- ال سی دی کاراکتری 16*2
ماژول DP MCP4725 (مبدل دیجیتال به آنالوگ)
MCP4725 IC یک ماژول مبدل دیجیتال 12 بیتی به آنالوگ است که برای تولید ولتاژ آنالوگ خروجی از (0 تا 5 ولت) استفاده می شود و با استفاده از ارتباط I2C کنترل می شود. همچنین با حافظه EEPROM همراه است.
این آی سی دارای وضوح 12 بیتی است. این بدان معنی است که ما از (0 تا 4096) به عنوان ورودی استفاده می کنیم تا خروجی ولتاژ را با توجه به ولتاژ مرجع تأمین کنیم. حداکثر ولتاژ مرجع 5 ولت است.
فرمول برای محاسبه ولتاژ خروجی
فرمول زیر برای محاسبه ولتاژ خروجی استفاده میشود.
ولتاژ خروجی = (ولتاژ مرجع / وضوح ) * مقدار دیجیتال
O/P Voltage = (Reference Voltage / Resolution) x Digital Value
به عنوان مثال اگر ما از 5 ولت به عنوان ولتاژ مرجع استفاده می کنیم و فرض می کنیم مقدار دیجیتال 2048 است. بنابراین برای محاسبه خروجی 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 برای ورودی |
این IC دیجیتال به آنالوگ با استفاده از ارتباطات I2C با هر میکروکنترلری قابل ارتباط است. ارتباط I2C فقط به دو سیم SCL و SDA نیاز دارد. به طور پیش فرض ، آدرس I2C برای MCP4725 برابر با 0x60 است.
برنامه نویسی STM32F103C8 برای تبدیل دیجیتال به آنالوگ
در آموزش قبلی ما درباره برنامه نویسی STM32 با استفاده از درگاه USB آموختیم. می توان با استفاده از درگاه USB بدون استفاده از پروگرامر FTDI برد STM32 را برنامه ریزی کرد : آموزش برنامه نویسی STM32 با پورت USB. برنامه ریزی را به راحتی با ARDUINO IDE شروع کنید. برنامه نویسی STM32 در آردوینو برای تبدیل آنالوگ به دیجیتال بسیار ساده است.
کد کامل در انتهای صفحه قرار داده شده است در اینجا بعضی از قسمت های کد را بررسی میکنیم.
ابتدا توابع I2C و LCD را با استفاده از كتابخانه های wire.h ، SoftWire.h و liquidcrystal.h فراخوانی میکنیم. درباره I2C در میکروکنترلر STM32 بیشتر بدانید.
#include<Wire.h> #include <LiquidCrystal.h> #include<SoftWire.h>
سپس پین های LCD متصل به STM32F103C8 تعریف و تنظیم میکنیم.
const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14; LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
سپس آدرس I2C MCP4725 را تعریف میکنیم. همانطور که گفته شد آدرس پیش فرض 0x60 است
#define MCP4725 0x60
در void setup()
ابتدا ارتباط I2C را در پین PB7 SDA و PB6 SCL شروع میکنیم.
Wire.begin();
سپس صفحه LCD را در حالت 16×2 تنظیم کرده و یک پیام خوش آمدید نمایش میدهیم.
lcd.begin(16,2); lcd.print("IRENX"); delay(1000); lcd.clear(); lcd.setCursor(0,0); lcd.print("STM32F103C8"); lcd.setCursor(0,1); lcd.print("DAC with MCP4725"); delay(2000); lcd.clear();
در void loop()
1. ابتدا بافر [0] مقدار بایت کنترل (0b01000000) قرار دهید.
(010-Sets MCP4725 in Write mode) buffer[0] = 0b01000000;
2. کد زیر مقدار آنالوگ را از پین PA0 می خواند و آن را به مقدار دیجیتال از 0 تا 4096 تبدیل می کند زیرا ADC با وضوح 12 بیتی است.
adc = analogRead(PA0) ;
3. عبارت زیر فرمولی است که برای محاسبه ولتاژ از مقدار ورودی ADC از 0 تا 4096 با ولتاژ مرجع 3.3V استفاده می شود.
float ipvolt = (3.3/4096.0)* adc;
4. با جابجایی 4 بیت به راست در متغیر ADC ، مقادیر مهمترین بیت را در بافر [1] قرار دهید و مقادیر قابل توجه بیت را در بافر [2] با تغییر 4 بیت به سمت چپ در متغیر adc قرار دهید.
buffer[1] = adc >> 4; buffer[2] = adc << 4;
5. کد زیر مقدار آنالوگ را از پین ADC PA1 از STM32 که خروجی DAC است (پین خروجی MCP4725 ) می خواند. این پین همچنین برای بررسی ولتاژ خروجی می تواند به مولتی متر متصل شود.
unsigned int analogread = analogRead(PA1);
6. بیشتر مقدار ولتاژ از متغیر آنالوگ با استفاده از فرمول با عبارت زیر محاسبه می شود.
float opvolt = (3.3/4096.0)* analogread;
7. در void loop () چند جمله دیگر وجود دارد که در زیر توضیح داده شده است
انتقال با MCP4725 آغاز می شود:
Wire.beginTransmission(MCP4725);
بایت کنترل را به I2C می فرستیم.
Wire.write(buffer[0]);
MSB را به I2C می فرستیم.
Wire.write(buffer[1]);
LSB را به I2C می فرستیم.
Wire.write(buffer[2]);
انتقال را پایان می دهیم.
Wire.endTransmission();
اکنون این نتایج را در صفحه LCD 16×2 با استفاده از lcd.print نمایش میدهیم.
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();
کد کامل
کد کامل برای این آموزش در باکس زیر قرار داده شده است.
#include<Wire.h> #include<SoftWire.h> #include <LiquidCrystal.h> #define MCP4725 0x60 const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14; LiquidCrystal lcd(rs, en, d4, d5, d6, d7); unsigned int adc; byte buffer[3]; void setup() { Wire.begin(); lcd.begin(16,2); lcd.print("CIRCUIT DIGEST"); delay(1000); lcd.clear(); lcd.setCursor(0,0); lcd.print("STM32F103C8"); lcd.setCursor(0,1); lcd.print("DAC with MCP4725"); delay(2000); lcd.clear(); } void loop() { buffer[0] = 0b01000000; adc = analogRead(PA0); float ipvolt = (3.3/4096.0)* adc; buffer[1] = adc >> 4; buffer[2] = adc << 4; unsigned int analogread = analogRead(PA1) ; float opvolt = (3.3/4096.0)* analogread; Wire.beginTransmission(MCP4725); Wire.write(buffer[0]); Wire.write(buffer[1]); Wire.write(buffer[2]); Wire.endTransmission(); 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(); }
فیلم عملکرد DAC با STM32
هنگامی که مقدار ولتاژ خروجی پتانسیومتر را با چرخاندن آن تغییر میدهیم، مقدار ورودی به آنالوگ به دیجیتال تغییر میکند و در نهایت مقدار ولتاژ خروجی دیجیتال به آنالوگ نیز تغییر میکند. در اینجا مقادیر ورودی در ردیف اول و مقادیر خروجی در ردیف دوم ال سی دی نمایش داده شده اند. همچنین یکم ولتی متر برای تایید صحت مقادیر استفاده شده است. فیلم زیر به شما در درک نحوه کار مبحث دیجیتال به آنالوگ در stm 32 کمک میکند.
سلام
خداقوت
اون D , A مقادیر دیجیتال و آنالوگ رو نمایش میده؟
و اینکه مثلا وقتی میزنه 4000 منظورش 4کیلو هرتزه؟
تشکر