آموزش ARMآموزش STM32آموزش الکترونیک

آموزش تبدیل دیجیتال به آنالوگ DAC در برد STM32

سلام. آموزش دیجیتال به آنالوگ DAC با برد STM32 را آماده کردیم.

آموزش Digital به Analog با میکروکنترلر STM32

همه ما می دانیم که میکروکنترلرها فقط با مقادیر دیجیتال کار می کنند اما در دنیای واقعی باید با سیگنال های آنالوگ کار  کنیم. به همین دلیل ADC (مبدل های آنالوگ به دیجیتال) برای تبدیل مقادیر آنالوگ در دنیای واقعی به فرم دیجیتال وجود دارد تا میکروکنترلرها بتوانند سیگنال ها را پردازش کنند. اما اگر به سیگنال های آنالوگ از مقادیر دیجیتال نیاز داشته باشیم باید چکار کنیم؟ در اینجا DAC (مبدل دیجیتال به آنالوگ) به کمک ما می آید.

یک مثال ساده برای مبدل دیجیتال به آنالوگ ، ضبط آهنگ در استودیو است که در آن یک خواننده از میکروفون استفاده می کند و ترانه ای را می خواند. این امواج صوتی آنالوگ به فرم دیجیتال تبدیل می شوند و سپس در یک فایل با فرمت دیجیتال ذخیره می شوند و وقتی آهنگ با استفاده از فایل دیجیتالی ذخیره شده پخش می شود ، این مقادیر دیجیتالی برای خروجی بلندگو به سیگنال های آنالوگ تبدیل می شوند. بنابراین در این سیستم از DAC استفاده می شود.

دیجیتال به آنالوگ DAC در STM32

DAC را می توان در بسیاری از برنامه ها مانند کنترل موتور ، کنترل روشنایی چراغ های LED ، تقویت کننده صوتی ، انکودر های ویدیویی و … مشاهده کرد. در این آموزش ما از MCP4725 DAC IC برای طراحی مبدل دیجیتال به آنالوگ با استفاده از میکروکنترلر STM32F103C8 استفاده خواهیم کرد.

فیلم عملکرد پروژه در انتهای صفحه قرار داده شده است.

همچنین پیشنهاد میکنم آموزش راه اندازی مبدل آنالوگ به دیجیتال در STM32 را هم مشاهده کنید.

پین های I2C در STM32

با توجه به تصویر زیر که جزئیات پین های STM32 را نشان میدهد، پین های زیر I2C هستند.

SDA: PB7 یا PB9 ، PB11

SCL: PB6 یا PB8 ، PB10

اگر میخواهید آردوینو را به صورت اصولی و پروژه محور (ساخت ربات، ارتباط با اندروید، اینترنت اشیا، برنامه نویسی حرفه ای) یاد بگیرید، حتما دوره آموزش آردوینو را مشاهده کنید.

جزئیات پین های STM32

توضیحات مدار مبدل DAC

تصویر زیر شماتیک مدار راه اندازی دیجیتال به آنالوگ توسط STM32 را نشان میدهد.

آموزش تبدیل دیجیتال به آنالوگ با میکروکنترلر 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

قطعات مورد نیاز

  1. STM32 – برد توسعه (BluePill) (STM32F103C8T6)
  2. IC دیجیتال به آنالوگ MCP4725
  3. پتانسیومتر 10 کیلو اهم
  4. ال سی دی کاراکتری 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

پین های 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 کمک میکند.

نظرتان را در مورد این مطلب با ستاره دادن اعلام کنید
امیدوارم این مطلب برای شما مفید بوده باشد. نظرات ، مشکلات و پیشنهادات خود را در پایین صفحه اعلام کنید
محمد رحیمی

محمد رحیمی

محمد رحیمی هستم. سعی میکنم در آیرنکس مطالب مفید را قرار دهم. مالکیتی بر مطالب ارائه شده ندارم. اکثر فعالیت بنده در زمینه ترجمه است. (در خصوص سوال در مورد این مطلب از قسمت نظرات همین مطلب اقدام کنید)

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *