- Erforderliche Komponenten
- MCP4725 DAC-Modul (Digital-Analog-Wandler)
- I2C-Kommunikation in MCP4725
- Schaltplan und Erklärung
- Programmierung des STM32F103C8 für die Digital-Analog-Wandlung
- Testen des DAC mit STM32
Wir alle wissen, dass die Mikrocontroller nur mit digitalen Werten arbeiten, aber in der realen Welt müssen wir uns mit analogen Signalen befassen. Aus diesem Grund dient ADC (Analog-Digital-Wandler) dazu, reale Analogwerte in digitale Form umzuwandeln, damit Mikrocontroller die Signale verarbeiten können. Aber was ist, wenn wir analoge Signale von digitalen Werten benötigen? Hier kommt der DAC (Digital-Analog-Wandler).
Ein einfaches Beispiel für einen Digital-Analog-Wandler ist die Aufnahme eines Songs im Studio, in dem ein Künstlersänger ein Mikrofon verwendet und einen Song singt. Diese analogen Schallwellen werden in digitale Form umgewandelt und dann in einer digitalen Formatdatei gespeichert. Wenn das Lied unter Verwendung der gespeicherten digitalen Datei abgespielt wird, werden diese digitalen Werte für die Lautsprecherausgabe in analoge Signale umgewandelt. In diesem System wird also DAC verwendet.
DAC kann in vielen Anwendungen wie Motorsteuerung, Steuerhelligkeit der LED-Leuchten, Audioverstärker, Videocodierer, Datenerfassungssysteme usw. verwendet werden.
Wir haben das MCP4725 DAC-Modul bereits mit Arduino verbunden. Heute werden wir denselben MCP4725-DAC-IC verwenden, um einen Digital-Analog-Wandler mit dem Mikrocontroller STM32F103C8 zu entwerfen .
Erforderliche Komponenten
- STM32F103C8
- MCP4725 DAC IC
- 10k Potentiometer
- 16x2 LCD-Anzeige
- Steckbrett
- Kabel anschließen
MCP4725 DAC-Modul (Digital-Analog-Wandler)
Der MCP4725 IC ist ein 12-Bit-Digital-Analog- Wandlermodul, mit dem analoge Ausgangsspannungen von (0 bis 5 V) erzeugt werden und das über I2C-Kommunikation gesteuert wird. Es kommt auch mit integriertem nichtflüchtigen Speicher-EEPROM.
Dieser IC hat eine 12-Bit-Auflösung. Dies bedeutet, dass wir (0 bis 4096) als Eingang verwenden, um den Spannungsausgang in Bezug auf die Referenzspannung bereitzustellen. Die maximale Referenzspannung beträgt 5V.
Formel zur Berechnung der Ausgangsspannung
O / P-Spannung = (Referenzspannung / Auflösung) x Digitalwert
Zum Beispiel, wenn wir 5 V als Referenzspannung verwenden und annehmen, dass der digitale Wert 2048 ist. Um also den DAC-Ausgang zu berechnen.
O / P-Spannung = (5/4096) x 2048 = 2,5 V.
Pinbelegung des MCP4725Unten sehen Sie das Bild des MCP4725 mit deutlich sichtbaren Pin-Namen.
Stifte von MCP4725 |
Verwenden |
AUS |
Gibt analoge Spannung aus |
GND |
GND für die Ausgabe |
SCL |
I2C Serial Clock-Leitung |
SDA |
I2C Serial Data Line |
VCC |
Eingangsreferenzspannung 5V oder 3,3V |
GND |
GND für die Eingabe |
I2C-Kommunikation in MCP4725
Dieser DAC-IC kann über die I2C-Kommunikation mit jedem Mikrocontroller verbunden werden. Für die I2C-Kommunikation sind nur zwei Drähte SCL und SDA erforderlich. Standardmäßig lautet die I2C-Adresse für MCP4725 0x60. Folgen Sie dem Link, um mehr über die I2C-Kommunikation in STM32F103C8 zu erfahren.
I2C-Pins in STM32F103C8:
SDA: PB7 oder PB9, PB11.
SCL: PB6 oder PB8, PB10.
Schaltplan und Erklärung
Verbindungen zwischen STM32F103C8 und 16x2 LCD
LCD Pin Nr |
LCD-Pin-Name |
STM32 Pin Name |
1 |
Boden (Gnd) |
Boden (G) |
2 |
VCC |
5V |
3 |
VEE |
Pin von der Mitte des Potentiometers für Kontrast |
4 |
Register Select (RS) |
PB11 |
5 |
Lesen / Schreiben (RW) |
Boden (G) |
6 |
Aktivieren (EN) |
PB10 |
7 |
Datenbit 0 (DB0) |
Keine Verbindung (NC) |
8 |
Datenbit 1 (DB1) |
Keine Verbindung (NC) |
9 |
Datenbit 2 (DB2) |
Keine Verbindung (NC) |
10 |
Datenbit 3 (DB3) |
Keine Verbindung (NC) |
11 |
Datenbit 4 (DB4) |
PB0 |
12 |
Datenbit 5 (DB5) |
PB1 |
13 |
Datenbit 6 (DB6) |
PC13 |
14 |
Datenbit 7 (DB7) |
PC14 |
15 |
LED positiv |
5V |
16 |
LED negativ |
Boden (G) |
Verbindung zwischen MCP4725 DAC IC und STM32F103C8
MCP4725 |
STM32F103C8 |
Multimeter |
SDA |
PB7 |
NC |
SCL |
PB6 |
NC |
AUS |
PA1 |
Positive Sonde |
GND |
GND |
Negative Sonde |
VCC |
3,3V |
NC |
Ein Potentiometer ist ebenfalls angeschlossen, wobei der mittlere Pin mit dem Analogeingang PA1 (ADC) von STM32F10C8, der linke Pin mit GND und der Pin ganz rechts mit 3,3 V von STM32F103C8 verbunden sind.
In diesem Tutorial verbinden wir einen MCP4725 DAC IC mit STM32 und verwenden ein 10k Potentiometer, um den analogen Eingangswert für den STM32 ADC Pin PA0 bereitzustellen. Verwenden Sie dann ADC, um analoge Werte in digitale Form umzuwandeln. Danach senden Sie diese digitalen Werte über den I2C-Bus an den MCP4725. Wandeln Sie diese digitalen Werte dann mit dem IC DAC MCP4725 in analoge Werte um und überprüfen Sie mit einem anderen ADC-Pin PA1 von STM32 den analogen Ausgang von MCP4725 vom Pin OUT. Zeigen Sie abschließend die ADC- und DAC-Werte mit den Spannungen im 16x2-LCD-Display an.
Programmierung des STM32F103C8 für die Digital-Analog-Wandlung
Ein FTDI-Programmierer wird jetzt nicht benötigt, um Code auf STM32F103C8 hochzuladen. Schließen Sie es einfach über den USB-Anschluss des STM32 an den PC an und starten Sie die Programmierung mit der ARDUINO IDE. Besuchen Sie diesen Link, um mehr über die Programmierung Ihres STM32 in Arduino IDE zu erfahren. Das vollständige Programm für dieses STM32-DAC-Tutorial finden Sie am Ende.
Fügen Sie zunächst die Bibliothek für I2C und LCD mit der Bibliothek wire.h, SoftWire.h und liquidcrystal.h hinzu. Weitere Informationen zu I2C im STM32-Mikrocontroller finden Sie hier.
#einschließen
Definieren und initialisieren Sie als Nächstes die LCD-Pins gemäß den mit dem STM32F103C8 verbundenen LCD-Pins
const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14; LiquidCrystal lcd (rs, en, d4, d5, d6, d7);
Definieren Sie dann die I2C-Adresse des MCP4725 DAC IC. Die Standard-I2C-Adresse des MCP4725-DAC lautet 0x60
#define MCP4725 0x60
In der Leere Setup ()
Beginnen Sie zuerst die I2C-Kommunikation an den Pins PB7 (SDA) und PB6 (SCL) von STM32F103C8.
Wire.begin (); // Startet die I2C-Kommunikation
Stellen Sie als nächstes das LCD-Display in den 16x2-Modus und zeigen Sie eine Willkommensnachricht an.
lcd.begin (16,2); lcd.print ("CIRCUIT DIGEST"); Verzögerung (1000); lcd.clear (); lcd.setCursor (0,0); lcd.print ("STM32F103C8"); lcd.setCursor (0,1); lcd.print ("DAC mit MCP4725"); Verzögerung (2000); lcd.clear ();
In der Leerenschleife ()
1. Geben Sie zuerst in den Puffer den Steuerbytewert (0b01000000) ein.
(010-Setzt MCP4725 in den Schreibmodus) buffer = 0b01000000;
2. Die folgende Anweisung liest den Analogwert von Pin PA0 und wandelt ihn in einen Digitalwert im Bereich von 0 bis 4096 um, da der ADC eine 12-Bit-Auflösung hat und in der Variablen adc gespeichert wird .
adc = analogRead (PA0);
3. Diese folgende Aussage ist eine Formel zur Berechnung der Spannung aus dem ADC-Eingangswert (0 bis 4096) mit der Referenzspannung von 3,3 V.
float ipvolt = (3.3 / 4096.0) * adc;
4. Setzen Sie die höchstwertigen Bitwerte in den Puffer, indem Sie 4 Bits in der ADC-Variablen nach rechts verschieben, und die niedrigstwertigen Bitwerte im Puffer, indem Sie 4 Bits in der ADC-Variablen nach links verschieben.
buffer = adc >> 4; buffer = adc << 4;
5. Die folgende Anweisung liest den Analogwert vom ADC-Pin PA1 des STM32, der der DAC-Ausgang ist (der OUTPUT-Pin des MCP4725-DAC-IC). Dieser Pin kann auch mit einem Multimeter verbunden werden, um die Ausgangsspannung zu überprüfen.
unsigned int analogread = analogRead (PA1);
6. Ferner wird der Spannungswert aus der Variablen analogread unter Verwendung der Formel mit der folgenden Aussage berechnet.
float opvolt = (3.3 / 4096.0) * analogread;
7. In derselben void loop () gibt es nur wenige andere Anweisungen, die unten erläutert werden
Beginnt die Übertragung mit MCP4725:
Wire.beginTransmission (MCP4725);
Sendet das Steuerbyte an I2C
Wire.write (Puffer);
Sendet das MSB an I2C
Wire.write (Puffer);
Sendet das LSB an I2C
Wire.write (Puffer);
Beendet die Übertragung
Wire.endTransmission ();
Zeigen Sie diese Ergebnisse nun mit lcd.print () auf dem LCD 16x2-Display an.
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); Verzögerung (500); lcd.clear ();
Testen des DAC mit STM32
Wenn wir den Eingangs-ADC-Wert und die Spannung durch Drehen des Potentiometers variieren, ändern sich auch der Ausgangs-DAC-Wert und die Spannung. Hier werden die Eingabewerte in der ersten Zeile und die Ausgabewerte in der zweiten Zeile der LCD-Anzeige angezeigt. Ein Multimeter ist ebenfalls an den MCP4725-Ausgangspin angeschlossen, um die analoge Spannung zu überprüfen.
Der vollständige Code mit Demonstrationsvideo ist unten angegeben.