- Componente necesare
- Modul DAC MCP4725 (convertor digital-analog)
- Comunicare I2C în MCP4725
- Diagrama și explicația circuitului
- Programare STM32F103C8 pentru conversie digital-analog
- Testarea DAC cu STM32
Știm cu toții că microcontrolerele funcționează numai cu valori digitale, dar în lumea reală trebuie să ne ocupăm de semnale analogice. De aceea, ADC (analogic la convertizoare digitale) este acolo pentru a converti valorile analogice din lumea reală în formă digitală, astfel încât microcontrolerele să poată procesa semnalele. Dar ce se întâmplă dacă avem nevoie de semnale analogice de la valori digitale, așa că aici vine DAC (Convertor digital la analog).
Un exemplu simplu pentru convertorul digital în analog este înregistrarea unei melodii în studio în care un cântăreț artist folosește microfonul și cântă o melodie. Aceste unde sonore analogice sunt convertite în formă digitală și apoi stocate într-un fișier în format digital și atunci când melodia este redată folosind fișierul digital stocat, acele valori digitale sunt convertite în semnale analogice pentru ieșirea difuzoarelor. Deci, în acest sistem este utilizat DAC.
DAC poate fi utilizat în multe aplicații, cum ar fi controlul motorului, controlul luminozității luminilor LED, amplificator audio, codificatoare video, sisteme de achiziție de date etc.
Am interfațat deja modulul DAC MCP4725 cu Arduino. Astăzi vom folosi același IC DAC MCP4725 pentru a proiecta un convertor digital în analogic folosind microcontrolerul STM32F103C8.
Componente necesare
- STM32F103C8
- MCP4725 DAC IC
- Potențiometru 10k
- Afișaj LCD 16x2
- Breadboard
- Conectarea firelor
Modul DAC MCP4725 (convertor digital-analog)
MCP4725 IC este un modul convertor digital la analog pe 12 biți care este utilizat pentru a genera tensiuni analogice de ieșire de la (0 la 5V) și este controlat prin utilizarea comunicației I2C. De asemenea, vine cu memorie EEPROM non-volatilă la bord.
Acest IC are o rezoluție de 12 biți. Aceasta înseamnă că folosim (0 la 4096) ca intrare pentru a furniza tensiunea de ieșire în raport cu tensiunea de referință. Tensiunea maximă de referință este de 5V.
Formula pentru calcularea tensiunii de ieșire
Tensiune O / P = (tensiune de referință / rezoluție) x valoare digitală
De exemplu, dacă folosim 5V ca tensiune de referință și să presupunem că valoarea digitală este 2048. Deci, pentru a calcula ieșirea DAC.
Tensiune O / P = (5/4096) x 2048 = 2,5V
Pinout MCP4725Mai jos este imaginea MCP4725 cu indicarea clară a numelor pinilor.
Pinii MCP4725 |
Utilizare |
OUT |
Ieșiri Tensiune analogică |
GND |
GND pentru ieșire |
SCL |
Linia I2C Serial Clock |
SDA |
Linia de date seriale I2C |
VCC |
Tensiunea de referință a intrării 5V sau 3,3V |
GND |
GND pentru intrare |
Comunicare I2C în MCP4725
Acest IC DAC poate fi interfațat cu orice microcontroler folosind comunicația I2C. Comunicarea I2C necesită doar două fire SCL și SDA. În mod implicit, adresa I2C pentru MCP4725 este 0x60. Urmați linkul pentru a afla mai multe despre comunicarea I2C în STM32F103C8.
Pinii I2C din STM32F103C8:
SDA: PB7 sau PB9, PB11.
SCL: PB6 sau PB8, PB10.
Diagrama și explicația circuitului
Conexiuni între STM32F103C8 și LCD 16x2
Pin LCD nr |
Numele pinului LCD |
Numele pinului STM32 |
1 |
Teren (Gnd) |
Teren (G) |
2 |
VCC |
5V |
3 |
VEE |
Pin din Centrul potențiometrului pentru contrast |
4 |
Selectare înregistrare (RS) |
PB11 |
5 |
Citire / Scriere (RW) |
Teren (G) |
6 |
Activați (EN) |
PB10 |
7 |
Bit de date 0 (DB0) |
Fără conexiune (NC) |
8 |
Bit de date 1 (DB1) |
Fără conexiune (NC) |
9 |
Bit de date 2 (DB2) |
Fără conexiune (NC) |
10 |
Bit de date 3 (DB3) |
Fără conexiune (NC) |
11 |
Bit de date 4 (DB4) |
PB0 |
12 |
Bit de date 5 (DB5) |
PB1 |
13 |
Bit de date 6 (DB6) |
PC13 |
14 |
Bit de date 7 (DB7) |
PC14 |
15 |
LED pozitiv |
5V |
16 |
LED negativ |
Teren (G) |
Conexiune între MCP4725 DAC IC și STM32F103C8
MCP4725 |
STM32F103C8 |
Multimetru |
SDA |
PB7 |
NC |
SCL |
PB6 |
NC |
OUT |
PA1 |
Sonda pozitivă |
GND |
GND |
Sonda negativă |
VCC |
3,3V |
NC |
De asemenea, este conectat un potențiometru, cu pinul central conectat la intrarea analogică PA1 (ADC) a STM32F10C8, pinul stâng conectat la GND și pinul cel mai drept conectat la 3,3V din STM32F103C8.
În acest tutorial vom conecta un IC MCP4725 DAC cu STM32 și vom folosi un potențiometru de 10k pentru a furniza valoarea de intrare analogică pinului ST032 ADC PA0. Și apoi utilizați ADC pentru a converti valoarea analogică în formă digitală. După aceea, trimiteți aceste valori digitale către MCP4725 prin magistrala I2C. Apoi convertiți aceste valori digitale în analog folosind IC DAC MCP4725 și apoi utilizați un alt pin ADC PA1 al STM32 pentru a verifica ieșirea analogică a MCP4725 de la pinul OUT. În cele din urmă, afișați ambele valori ADC și DAC cu tensiuni pe afișajul LCD de 16x2.
Programare STM32F103C8 pentru conversie digital-analog
Un programator FTDI nu este necesar acum pentru a încărca codul în STM32F103C8. Pur și simplu conectați-l la computer prin portul USB al STM32 și începeți programarea cu ARDUINO IDE. Accesați acest link pentru a afla mai multe despre Programarea STM32 în Arduino IDE. Programul complet pentru acest tutorial STM32 DAC este dat la sfârșit.
Mai întâi includeți biblioteca pentru I2C și LCD folosind wire.h, SoftWire.h și biblioteca liquidcrystal.h. Aflați mai multe despre I2C în microcontrolerul STM32 aici.
#include
Apoi definiți și inițializați pinii LCD în conformitate cu pinii LCD conectați cu STM32F103C8
const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14; LiquidCrystal lcd (rs, en, d4, d5, d6, d7);
Apoi definiți adresa I2C a IC DAC MCP4725. Adresa I2C implicită DAC MCP4725 este 0x60
#define MCP4725 0x60
În setarea nulă ()
Mai întâi începeți comunicarea I2C la pinii PB7 (SDA) și PB6 (SCL) ai STM32F103C8.
Wire.begin (); // Începe comunicarea I2C
Apoi setați afișajul LCD în modul 16x2 și afișați un mesaj de întâmpinare.
lcd.inceput (16,2); lcd.print ("CIRCUIT DIGEST"); întârziere (1000); lcd.clear (); lcd.setCursor (0,0); lcd.print ("STM32F103C8"); lcd.setCursor (0,1); lcd.print ("DAC cu MCP4725"); întârziere (2000); lcd.clear ();
În bucla de gol ()
1. Mai întâi în buffer puneți valoarea octetului de control (0b01000000).
(010-Sets MCP4725 în modul Write) buffer = 0b01000000;
2. Următoarea declarație citește valoarea analogică de la pinul PA0 și o convertește în valoare digitală variind de la 0 la 4096 deoarece ADC are o rezoluție de 12 biți și se stochează în variabila adc .
adc = analogRead (PA0);
3. Această afirmație următoare este o formulă utilizată pentru a calcula tensiunea de la valoarea de intrare ADC (0 la 4096) cu tensiunea de referință de 3,3V.
float ipvolt = (3.3 / 4096.0) * adc;
4. Puneți cele mai semnificative valori de biți în buffer prin deplasarea a 4 biți la dreapta în variabila ADC, și Valorile de biți cel mai puțin semnificative în buffer prin schimbarea a 4 biți la stânga în variabila adc .
tampon = adc >> 4; tampon = adc << 4;
5. Următoarea declarație citește valoarea analogică de la pinul ADC PA1 al STM32 care este ieșirea DAC (pinul OUTPUT al DAC IC MCP4725). Acest pin poate fi conectat și la multimetru pentru a verifica tensiunea de ieșire.
unsigned int analogread = analogRead (PA1);
6. În plus, valoarea tensiunii din variabila analogică este calculată utilizând formula cu următoarea afirmație.
float opvolt = (3.3 / 4096.0) * citire analogică;
7. În aceeași buclă de gol () există puține alte afirmații care sunt explicate mai jos
Începe transmisia cu MCP4725:
Wire.beginTransmission (MCP4725);
Trimite octetul de control către I2C
Wire.write (tampon);
Trimite MSB către I2C
Wire.write (tampon);
Trimite LSB către I2C
Wire.write (tampon);
Încheie transmisia
Wire.endTransmission ();
Afișați acum aceste rezultate pe ecranul LCD 16x2 folosind 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 (citire analogică); lcd.setCursor (10,1); lcd.print ("V:"); lcd.print (opvolt); întârziere (500); lcd.clear ();
Testarea DAC cu STM32
Când modificăm valoarea și tensiunea ADC de intrare prin rotirea potențiometrului, se schimbă și valoarea și tensiunea DAC de ieșire. Aici valorile de intrare sunt afișate în primul rând și valorile de ieșire în al doilea rând de afișaj LCD. Un multimetru este, de asemenea, conectat la pinul de ieșire MCP4725 pentru a verifica tensiunea analogică.
Codul complet cu demonstrația video este dat mai jos.