- Components necessaris
- Mòdul DAC MCP4725 (convertidor digital a analògic)
- Comunicació I2C a MCP4725
- Diagrama del circuit i explicació
- Programació STM32F103C8 per a conversió digital a analògica
- Prova del DAC amb STM32
Tots sabem que els microcontroladors només funcionen amb valors digitals, però al món real hem de tractar amb senyals analògics. És per això que ADC (convertidors analògics a digitals) està disponible per convertir els valors analògics del món real en forma digital perquè els microcontroladors puguin processar els senyals. Però, què passa si necessitem senyals analògics de valors digitals, així que aquí ve el DAC (convertidor digital a analògic).
Un exemple senzill del convertidor digital a analògic és gravar una cançó a l’estudi on un artista cantant utilitza micròfon i canta una cançó. Aquestes ones sonores analògiques es converteixen en forma digital i després s’emmagatzemen en un fitxer de format digital i quan la cançó es reprodueix mitjançant un fitxer digital emmagatzemat, aquests valors digitals es converteixen en senyals analògics per a la sortida dels altaveus. Per tant, en aquest sistema s’utilitza el DAC.
El DAC es pot utilitzar en moltes aplicacions com ara el control del motor, el control de la brillantor de les llums LED, l’amplificador d’àudio, els codificadors de vídeo, els sistemes d’adquisició de dades, etc.
Ja hem interfaçat el mòdul DAC MCP4725 amb Arduino. Avui utilitzarem el mateix IC DAC MCP4725 per dissenyar un convertidor digital a analògic mitjançant el microcontrolador STM32F103C8.
Components necessaris
- STM32F103C8
- MCP4725 DAC IC
- Potenciòmetre de 10 k
- Pantalla LCD de 16x2
- Taula de pa
- Connexió de cables
Mòdul DAC MCP4725 (convertidor digital a analògic)
MCP4725 IC és un mòdul de convertidor digital a analògic de 12 bits que s’utilitza per generar tensions analògiques de sortida de (0 a 5V) i es controla mitjançant la comunicació I2C. També inclou memòria no volàtil incorporada EEPROM.
Aquest CI té una resolució de 12 bits. Això significa que fem servir (0 a 4096) com a entrada per proporcionar la tensió de sortida respecte a la tensió de referència. La tensió màxima de referència és de 5 V.
Fórmula per calcular el voltatge de sortida
Voltatge O / P = (Voltatge / Resolució de referència) x Valor digital
Per exemple, si fem servir 5V com a tensió de referència i suposem que el valor digital és 2048. Per calcular la sortida DAC.
Voltatge O / P = (5/4096) x 2048 = 2,5V
Pinout de MCP4725A continuació es mostra la imatge de MCP4725 amb els noms dels pins que indiquen clarament.

|
Pins de MCP4725 |
Ús |
|
Fora |
Sortides de tensió analògica |
|
GND |
GND per a la sortida |
|
SCL |
Línia de rellotge sèrie I2C |
|
SDA |
Línia de dades sèrie I2C |
|
VCC |
Voltatge de referència d’entrada 5V o 3,3V |
|
GND |
GND per a l'entrada |
Comunicació I2C a MCP4725
Aquest IC DAC es pot connectar amb qualsevol microcontrolador mitjançant la comunicació I2C. La comunicació I2C requereix només dos cables SCL i SDA. Per defecte, l'adreça I2C per a MCP4725 és 0x60. Seguiu l'enllaç per obtenir més informació sobre la comunicació I2C a STM32F103C8.
Pins I2C a STM32F103C8:
SDA: PB7 o PB9, PB11.
SCL: PB6 o PB8, PB10.

Diagrama del circuit i explicació

Connexions entre STM32F103C8 i LCD de 16x2
|
Pin LCD núm |
Nom del pin LCD |
Nom del pin STM32 |
|
1 |
Terra (Gnd) |
Terra (G) |
|
2 |
VCC |
5V |
|
3 |
VEE |
Pin del centre del potenciòmetre per contrastar |
|
4 |
Selecciona registre (RS) |
PB11 |
|
5 |
Lectura / Escriptura (RW) |
Terra (G) |
|
6 |
Activa (EN) |
PB10 |
|
7 |
Bit de dades 0 (DB0) |
Sense connexió (NC) |
|
8 |
Bit de dades 1 (DB1) |
Sense connexió (NC) |
|
9 |
Bit de dades 2 (DB2) |
Sense connexió (NC) |
|
10 |
Bit de dades 3 (DB3) |
Sense connexió (NC) |
|
11 |
Bit de dades 4 (DB4) |
PB0 |
|
12 |
Bit de dades 5 (DB5) |
PB1 |
|
13 |
Bit de dades 6 (DB6) |
PC13 |
|
14 |
Bit de dades 7 (DB7) |
PC14 |
|
15 |
LED positiu |
5V |
|
16 |
LED negatiu |
Terra (G) |
Connexió entre MCP4725 DAC IC i STM32F103C8
|
MCP4725 |
STM32F103C8 |
Multímetre |
|
SDA |
PB7 |
NC |
|
SCL |
PB6 |
NC |
|
Fora |
PA1 |
Sonda positiva |
|
GND |
GND |
Sonda negativa |
|
VCC |
3,3V |
NC |
També es connecta un potenciòmetre, amb pin central connectat a l'entrada analògica PA1 (ADC) de STM32F10C8, pin esquerre connectat a GND i pin més dret connectat a 3,3 V de STM32F103C8.
En aquest tutorial connectarem un IC DAC MCP4725 amb STM32 i utilitzarem un potenciòmetre de 10 k per proporcionar un valor d’entrada analògic al pin PA0 ADC STM32. I després utilitzeu ADC per convertir el valor analògic en forma digital. Després, envieu aquests valors digitals a MCP4725 mitjançant el bus I2C. A continuació, converteix aquests valors digitals en analògics mitjançant el DAC MCP4725 IC i, a continuació, utilitzeu un altre pin ADC PA1 de STM32 per comprovar la sortida analògica de MCP4725 des del pin OUT. Finalment, mostreu els dos valors ADC i DAC amb voltatges a la pantalla LCD de 16x2.

Programació STM32F103C8 per a conversió digital a analògica
Ara no cal un programador FTDI per penjar codi a STM32F103C8. Simplement connecteu-lo al PC mitjançant el port USB de STM32 i comenceu a programar amb ARDUINO IDE. Visiteu aquest enllaç per obtenir més informació sobre la programació del vostre STM32 a Arduino IDE. Al final es proporciona el programa complet d’aquest tutorial STM32 DAC.
Primer inclou la biblioteca per a I2C i LCD mitjançant wire.h, SoftWire.h i liquidcrystal.h. Obteniu més informació sobre I2C al microcontrolador STM32 aquí.
#incloure
A continuació, definiu i inicialitzeu els pins LCD segons els pins LCD connectats amb el STM32F103C8
const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14; LiquidCrystal lcd (rs, en, d4, d5, d6, d7);
A continuació, definiu l'adreça I2C de l'ICC DAC MCP4725. L'adreça I2C per defecte MCP4725 DAC és 0x60
#define MCP4725 0x60
A la configuració buida ()
Primer comenceu la comunicació I2C als pins PB7 (SDA) i PB6 (SCL) de STM32F103C8.
Wire.begin (); // Comença la comunicació I2C
A continuació, configureu la pantalla LCD en mode 16x2 i mostreu un missatge de benvinguda.
lcd.begin (16,2); lcd.print ("CIRCUIT DIGEST"); retard (1000); lcd.clear (); lcd.setCursor (0,0); lcd.print ("STM32F103C8"); lcd.setCursor (0,1); lcd.print ("DAC amb MCP4725"); endarreriment (2000); lcd.clear ();
Al bucle buit ()
1. Primer, a la memòria intermèdia, poseu el valor del byte de control (0b01000000).
(010-Sets MCP4725 en mode d'escriptura) memòria intermèdia = 0b01000000;
2. La següent declaració llegeix el valor analògic del pin PA0 i el converteix en valor digital que oscil·la entre 0 i 4096, ja que ADC té una resolució de 12 bits i s'emmagatzema a la variable adc .
adc = analogRead (PA0);
3. Aquesta afirmació següent és una fórmula que s’utilitza per calcular la tensió a partir del valor d’entrada ADC (0 a 4096) amb la tensió de referència de 3,3V.
float ipvolt = (3.3 / 4096.0) * adc;
4. Introduïu els valors de bits més significatius a la memòria intermèdia desplaçant 4 bits a la dreta en la variable ADC i els valors de bits mínims significatius a la memòria intermèdia desplaçant 4 bits a l'esquerra en la variable adc .
buffer = adc >> 4; buffer = adc << 4;
5. La següent sentència llegeix el valor analògic del pin ADC PA1 de STM32 que és la sortida DAC (pin OUTPUT de l'IC DAC IC MCP4725). Aquest pin també es pot connectar al multímetre per comprovar la tensió de sortida.
unsigned int analogread = analogRead (PA1);
6. A més, el valor de la tensió de la variable lectura analògica es calcula mitjançant la fórmula amb la següent afirmació.
float opvolt = (3.3 / 4096.0) * analògic;
7. Al mateix bucle buit () hi ha poques altres afirmacions que s’expliquen a continuació
Comença la transmissió amb MCP4725:
Wire.beginTransmission (MCP4725);
Envia el byte de control a I2C
Wire.write (memòria intermèdia);
Envia el MSB a I2C
Wire.write (memòria intermèdia);
Envia el LSB a I2C
Wire.write (memòria intermèdia);
Finalitza la transmissió
Wire.endTransmission ();
Ara mostreu aquests resultats a la pantalla LCD 16x2 mitjançant 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 (lectura analògica); lcd.setCursor (10,1); lcd.print ("V:"); lcd.print (opvolt); retard (500); lcd.clear ();
Prova del DAC amb STM32
Quan variam el valor i la tensió ADC d’entrada girant el potenciòmetre, també canvia el valor i la tensió DAC de sortida. Aquí es mostren els valors d'entrada a la primera fila i els valors de sortida a la segona fila de la pantalla LCD. També es connecta un multímetre al pin de sortida MCP4725 per verificar la tensió analògica.

A continuació es mostra el codi complet amb el vídeo de demostració.
