- Componenti richiesti
- Modulo DAC MCP4725 (convertitore da digitale ad analogico)
- Comunicazione I2C in MCP4725
- Schema del circuito e spiegazione
- Programmazione STM32F103C8 per conversione da digitale ad analogico
- Testare il DAC con STM32
Sappiamo tutti che i microcontrollori funzionano solo con valori digitali ma nel mondo reale abbiamo a che fare con segnali analogici. Ecco perché ADC (Convertitori da analogico a digitale) è disponibile per convertire i valori analogici del mondo reale in forma digitale in modo che i microcontrollori possano elaborare i segnali. Ma cosa succede se abbiamo bisogno di segnali analogici da valori digitali, ecco che arriva il DAC (convertitore da digitale ad analogico).
Un semplice esempio di convertitore da digitale ad analogico è la registrazione di una canzone in studio in cui un artista cantante utilizza il microfono e canta una canzone. Queste onde sonore analogiche vengono convertite in forma digitale e quindi memorizzate in un file in formato digitale e quando il brano viene riprodotto utilizzando il file digitale memorizzato, quei valori digitali vengono convertiti in segnali analogici per l'uscita degli altoparlanti. Quindi in questo sistema viene utilizzato DAC.
Il DAC può essere utilizzato in molte applicazioni come controllo del motore, controllo della luminosità delle luci LED, amplificatore audio, codificatori video, sistemi di acquisizione dati ecc.
Abbiamo già interfacciato il modulo DAC MCP4725 con Arduino. Oggi utilizzeremo lo stesso DAC IC MCP4725 per progettare un convertitore da digitale ad analogico utilizzando il microcontrollore STM32F103C8.
Componenti richiesti
- STM32F103C8
- MCP4725 DAC IC
- Potenziometro 10k
- Display LCD 16x2
- Breadboard
- Collegamento dei cavi
Modulo DAC MCP4725 (convertitore da digitale ad analogico)
L' IC MCP4725 è un modulo convertitore da digitale ad analogico a 12 bit utilizzato per generare tensioni analogiche in uscita da (0 a 5 V) ed è controllato utilizzando la comunicazione I2C. Inoltre è dotato di memoria non volatile EEPROM integrata.
Questo IC ha una risoluzione a 12 bit. Ciò significa che utilizziamo (da 0 a 4096) come ingresso per fornire l'uscita di tensione rispetto alla tensione di riferimento. La tensione di riferimento massima è 5V.
Formula per calcolare la tensione di uscita
Tensione O / P = (Tensione di riferimento / Risoluzione) x Valore digitale
Ad esempio, se usiamo 5V come tensione di riferimento e supponiamo che il valore digitale sia 2048. Quindi per calcolare l'uscita DAC.
Tensione O / P = (5/4096) x 2048 = 2,5 V.
Pinout di MCP4725Di seguito è riportata l'immagine di MCP4725 con i nomi dei pin che indicano chiaramente.
Perni di MCP4725 |
Uso |
SU |
Uscita in tensione analogica |
GND |
GND per l'uscita |
SCL |
Linea I2C Serial Clock |
SDA |
Linea dati seriale I2C |
VCC |
Tensione di riferimento in ingresso 5 V o 3,3 V. |
GND |
GND per l'ingresso |
Comunicazione I2C in MCP4725
Questo DAC IC può essere interfacciato con qualsiasi microcontrollore utilizzando la comunicazione I2C. La comunicazione I2C richiede solo due fili SCL e SDA. Per impostazione predefinita, l'indirizzo I2C per MCP4725 è 0x60. Segui il link per saperne di più sulla comunicazione I2C in STM32F103C8.
Pin I2C in STM32F103C8:
SDA: PB7 o PB9, PB11.
SCL: PB6 o PB8, PB10.
Schema del circuito e spiegazione
Collegamenti tra STM32F103C8 e LCD 16x2
N. pin LCD |
Nome pin LCD |
Nome pin STM32 |
1 |
Terra (Gnd) |
Terra (G) |
2 |
VCC |
5V |
3 |
VEE |
Pin dal centro del potenziometro per il contrasto |
4 |
Seleziona registro (RS) |
PB11 |
5 |
Lettura / scrittura (RW) |
Terra (G) |
6 |
Abilita (EN) |
PB10 |
7 |
Bit di dati 0 (DB0) |
Nessuna connessione (NC) |
8 |
Bit di dati 1 (DB1) |
Nessuna connessione (NC) |
9 |
Bit di dati 2 (DB2) |
Nessuna connessione (NC) |
10 |
Bit di dati 3 (DB3) |
Nessuna connessione (NC) |
11 |
Bit di dati 4 (DB4) |
PB0 |
12 |
Bit di dati 5 (DB5) |
PB1 |
13 |
Bit di dati 6 (DB6) |
PC13 |
14 |
Bit di dati 7 (DB7) |
PC14 |
15 |
LED positivo |
5V |
16 |
LED negativo |
Terra (G) |
Collegamento tra MCP4725 DAC IC e STM32F103C8
MCP4725 |
STM32F103C8 |
Multimetro |
SDA |
PB7 |
NC |
SCL |
PB6 |
NC |
SU |
PA1 |
Sonda positiva |
GND |
GND |
Sonda negativa |
VCC |
3,3V |
NC |
È anche collegato un potenziometro, con il pin centrale collegato all'ingresso analogico PA1 (ADC) di STM32F10C8, il pin sinistro collegato a GND e il pin più a destra collegato a 3,3 V di STM32F103C8.
In questo tutorial collegheremo un DAC IC MCP4725 con STM32 e utilizzeremo un potenziometro da 10k per fornire il valore di ingresso analogico al pin PA0 dell'ADC STM32. Quindi utilizzare ADC per convertire il valore analogico in formato digitale. Successivamente inviare quei valori digitali a MCP4725 tramite il bus I2C. Quindi convertire quei valori digitali in analogici utilizzando l'IC DAC MCP4725 e quindi utilizzare un altro pin ADC PA1 di STM32 per controllare l'uscita analogica di MCP4725 dal pin OUT. Infine visualizza i valori ADC e DAC con le tensioni nel display LCD 16x2.
Programmazione STM32F103C8 per conversione da digitale ad analogico
Ora non è necessario un programmatore FTDI per caricare il codice su STM32F103C8. Basta collegarlo al PC tramite la porta USB di STM32 e avviare la programmazione con ARDUINO IDE. Visita questo collegamento per saperne di più sulla programmazione del tuo STM32 in Arduino IDE. Alla fine viene fornito il programma completo per questo tutorial DAC STM32.
In primo luogo comprendere libreria per I2C e LCD utilizzando wire.h, SoftWire.h e liquidcrystal.h biblioteca. Ulteriori informazioni su I2C nel microcontrollore STM32 qui.
#includere
Quindi definire e inizializzare i pin LCD in base ai pin LCD collegati con STM32F103C8
const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14; LiquidCrystal lcd (rs, en, d4, d5, d6, d7);
Quindi definire l'indirizzo I2C dell'IC DAC MCP4725. L'indirizzo I2C predefinito del DAC MCP4725 è 0x60
#define MCP4725 0x60
In the void setup ()
Iniziare innanzitutto la comunicazione I2C sui pin PB7 (SDA) e PB6 (SCL) di STM32F103C8.
Wire.begin (); // Inizia la comunicazione I2C
Quindi impostare il display LCD in modalità 16x2 e visualizzare un messaggio di benvenuto.
lcd.begin (16,2); lcd.print ("CIRCUIT DIGEST"); ritardo (1000); lcd.clear (); lcd.setCursor (0,0); lcd.print ("STM32F103C8"); lcd.setCursor (0,1); lcd.print ("DAC con MCP4725"); ritardo (2000); lcd.clear ();
Nel vuoto loop ()
1. Per prima cosa nel buffer inserire il valore del byte di controllo (0b01000000).
(010-Imposta MCP4725 in modalità di scrittura) buffer = 0b01000000;
2. La seguente dichiarazione legge il valore analogico dal pin PA0 e lo converte in un valore digitale compreso tra 0 e 4096 poiché l'ADC ha una risoluzione di 12 bit e lo memorizza nella variabile adc .
adc = analogRead (PA0);
3. La seguente dichiarazione è una formula utilizzata per calcolare la tensione dal valore di ingresso dell'ADC (da 0 a 4096) con la tensione di riferimento di 3,3V.
float ipvolt = (3.3 / 4096.0) * adc;
4. Mettere i valori di bit più significativi nel buffer spostando 4 bit a destra nella variabile ADC e i valori di bit meno significativi nel buffer spostando 4 bit a sinistra nella variabile adc .
buffer = adc >> 4; buffer = adc << 4;
5. La seguente dichiarazione legge il valore analogico dal pin ADC PA1 di STM32 che è l'uscita DAC (pin OUTPUT dell'IC DAC MCP4725). Questo pin può anche essere collegato al multimetro per controllare la tensione di uscita.
unsigned int analogread = analogRead (PA1);
6. Inoltre, il valore della tensione dalla variabile analogread viene calcolato utilizzando la formula con la seguente dichiarazione.
float opvolt = (3.3 / 4096.0) * analogread;
7. Nello stesso void loop () ci sono poche altre istruzioni che vengono spiegate di seguito
Inizia la trasmissione con MCP4725:
Wire.beginTransmission (MCP4725);
Invia il byte di controllo a I2C
Wire.write (buffer);
Invia l'MSB a I2C
Wire.write (buffer);
Invia l'LSB a I2C
Wire.write (buffer);
Termina la trasmissione
Wire.endTransmission ();
Ora visualizza quei risultati nel display LCD 16x2 usando 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); ritardo (500); lcd.clear ();
Testare il DAC con STM32
Quando si varia il valore e la tensione dell'ADC in ingresso ruotando il potenziometro, cambiano anche il valore e la tensione del DAC in uscita. Qui i valori di input vengono visualizzati nella prima riga e i valori di output nella seconda riga del display LCD. Un multimetro è anche collegato al pin di uscita MCP4725 per verificare la tensione analogica.
Di seguito viene fornito il codice completo con il video dimostrativo.