- Απαιτούμενα στοιχεία
- MCP4725 DAC Module (ψηφιακός σε αναλογικός μετατροπέας)
- Επικοινωνία I2C στο MCP4725
- Διάγραμμα κυκλώματος και επεξήγηση
- Προγραμματισμός STM32F103C8 για ψηφιακή σε αναλογική μετατροπή
- Δοκιμή του DAC με STM32
Όλοι γνωρίζουμε ότι οι μικροελεγκτές λειτουργούν μόνο με ψηφιακές τιμές, αλλά στον πραγματικό κόσμο πρέπει να αντιμετωπίσουμε αναλογικά σήματα. Αυτός είναι ο λόγος για τον οποίο το ADC (Analog to Digital Converters) υπάρχει για να μετατρέψει τις πραγματικές αναλογικές τιμές σε ψηφιακή μορφή έτσι ώστε οι μικροελεγκτές να μπορούν να επεξεργάζονται τα σήματα. Αλλά τι γίνεται αν χρειαζόμαστε αναλογικά σήματα από ψηφιακές τιμές, έτσι έρχεται το DAC (Digital to Analog Converter).
Ένα απλό παράδειγμα για το Digital to Analog converter είναι η ηχογράφηση ενός τραγουδιού στο στούντιο όπου ένας καλλιτέχνης τραγουδιστής χρησιμοποιεί μικρόφωνο και τραγουδά ένα τραγούδι. Αυτά τα αναλογικά ηχητικά κύματα μετατρέπονται σε ψηφιακή μορφή και στη συνέχεια αποθηκεύονται σε αρχείο ψηφιακής μορφής και όταν το τραγούδι αναπαράγεται χρησιμοποιώντας το αποθηκευμένο ψηφιακό αρχείο, αυτές οι ψηφιακές τιμές μετατρέπονται σε αναλογικά σήματα για έξοδο ηχείου. Έτσι σε αυτό το σύστημα χρησιμοποιείται το DAC.
Το DAC μπορεί να χρησιμοποιηθεί σε πολλές εφαρμογές, όπως έλεγχος κινητήρα, φωτεινότητα ελέγχου των φώτων LED, ενισχυτής ήχου, κωδικοποιητές βίντεο, συστήματα απόκτησης δεδομένων κ.λπ.
Έχουμε ήδη διασυνδέσει το MCP4725 DAC Module με το Arduino. Σήμερα θα χρησιμοποιήσουμε το ίδιο MCP4725 DAC IC για να σχεδιάσουμε έναν ψηφιακό σε αναλογικό μετατροπέα χρησιμοποιώντας τον μικροελεγκτή STM32F103C8.
Απαιτούμενα στοιχεία
- STM32F103C8
- MCP4725 DAC IC
- Ποτενσιόμετρο 10k
- Οθόνη LCD 16x2
- Ψωμί
- Σύνδεση καλωδίων
MCP4725 DAC Module (ψηφιακός σε αναλογικός μετατροπέας)
Το MCP4725 IC είναι ένα 12-Bit Digital to Analog Converter Module που χρησιμοποιείται για την παραγωγή αναλογικών τάσεων εξόδου από (0 έως 5V) και ελέγχεται με τη χρήση επικοινωνίας I2C. Έρχεται επίσης με ενσωματωμένη μη πτητική μνήμη EEPROM.
Αυτό το IC έχει ανάλυση 12-bit. Αυτό σημαίνει ότι χρησιμοποιούμε (0 έως 4096) ως είσοδο για να παρέχουμε την έξοδο τάσης σε σχέση με την τάση αναφοράς. Η μέγιστη τάση αναφοράς είναι 5V.
Τύπος για τον υπολογισμό της τάσης εξόδου
Τάση O / P = (Τάση αναφοράς / Ανάλυση) x Ψηφιακή τιμή
Για παράδειγμα, αν χρησιμοποιούμε 5V ως τάση αναφοράς και ας υποθέσουμε ότι η ψηφιακή τιμή είναι 2048. Έτσι, για να υπολογίσουμε την έξοδο DAC.
Τάση O / P = (5/4096) x 2048 = 2.5V
Pinout του MCP4725Παρακάτω είναι η εικόνα του MCP4725 με σαφή ένδειξη ονομάτων.
Καρφίτσες MCP4725 |
Χρήση |
ΕΞΩ |
Έξοδος αναλογικής τάσης |
GND |
GND για έξοδο |
SCL |
Γραμμή σειριακού ρολογιού I2C |
SDA |
Γραμμή σειριακών δεδομένων I2C |
VCC |
Τάση αναφοράς εισόδου 5V ή 3.3V |
GND |
GND για εισαγωγή |
Επικοινωνία I2C στο MCP4725
Αυτό το DAC IC μπορεί να συνδεθεί με οποιονδήποτε μικροελεγκτή χρησιμοποιώντας την επικοινωνία I2C. Η επικοινωνία I2C απαιτεί μόνο δύο καλώδια SCL και SDA. Από προεπιλογή, η διεύθυνση I2C για MCP4725 είναι 0x60. Ακολουθήστε τον σύνδεσμο για να μάθετε περισσότερα σχετικά με την επικοινωνία I2C στο STM32F103C8.
Καρφίτσες I2C στο STM32F103C8:
SDA: PB7 ή PB9, PB11.
SCL: PB6 ή PB8, PB10.
Διάγραμμα κυκλώματος και επεξήγηση
Συνδέσεις μεταξύ STM32F103C8 & 16x2 LCD
Κωδικός LCD αριθ |
Όνομα Pin LCD |
Όνομα Pin STM32 |
1 |
Έδαφος (Gnd) |
Έδαφος (G) |
2 |
VCC |
5V |
3 |
VEE |
Καρφίτσωμα από το Κέντρο Ποτενσιόμετρου για αντίθεση |
4 |
Εγγραφή Επιλογή (RS) |
PB11 |
5 |
Ανάγνωση / εγγραφή (RW) |
Έδαφος (G) |
6 |
Ενεργοποίηση (EN) |
PB10 |
7 |
Bit δεδομένων 0 (DB0) |
Χωρίς σύνδεση (NC) |
8 |
Bit δεδομένων 1 (DB1) |
Χωρίς σύνδεση (NC) |
9 |
Bit δεδομένων 2 (DB2) |
Χωρίς σύνδεση (NC) |
10 |
Bit δεδομένων 3 (DB3) |
Χωρίς σύνδεση (NC) |
11 |
Bit δεδομένων 4 (DB4) |
PB0 |
12 |
Bit δεδομένων 5 (DB5) |
PB1 |
13 |
Bit δεδομένων 6 (DB6) |
PC13 |
14 |
Bit δεδομένων 7 (DB7) |
PC14 |
15 |
Θετικό LED |
5V |
16 |
Αρνητικό LED |
Έδαφος (G) |
Σύνδεση μεταξύ MCP4725 DAC IC και STM32F103C8
MCP4725 |
STM32F103C8 |
Πολύμετρο |
SDA |
PB7 |
ΝΚ |
SCL |
PB6 |
ΝΚ |
ΕΞΩ |
ΡΑ1 |
Θετική ανίχνευση |
GND |
GND |
Αρνητικός έλεγχος |
VCC |
3.3V |
ΝΚ |
Ένα ποτενσιόμετρο είναι επίσης συνδεδεμένο, με κεντρικό πείρο συνδεδεμένο στην αναλογική είσοδο PA1 (ADC) του STM32F10C8, το αριστερό πείρο συνδεδεμένο στο GND και το δεξί πείρο συνδεδεμένο στο 3.3V του STM32F103C8.
Σε αυτό το σεμινάριο θα συνδέσουμε ένα MCP4725 DAC IC με STM32 και θα χρησιμοποιήσουμε ένα ποτενσιόμετρο 10k για να παρέχουμε αναλογική τιμή εισόδου στο STM32 ADC pin PA0. Και μετά χρησιμοποιήστε το ADC για να μετατρέψετε την αναλογική τιμή σε ψηφιακή μορφή. Στη συνέχεια, στείλτε αυτές τις ψηφιακές τιμές στο MCP4725 μέσω διαύλου I2C. Στη συνέχεια, μετατρέψτε αυτές τις ψηφιακές τιμές σε αναλογική χρησιμοποιώντας το DAC MCP4725 IC και, στη συνέχεια, χρησιμοποιήστε έναν άλλο ADC pin PA1 του STM32 για να ελέγξετε την αναλογική έξοδο του MCP4725 από τον ακροδέκτη OUT Τέλος, εμφανίστε και τις δύο τιμές ADC & DAC με τάσεις στην οθόνη LCD 16x2.
Προγραμματισμός STM32F103C8 για ψηφιακή σε αναλογική μετατροπή
Δεν απαιτείται προγραμματιστής FTDI για να ανεβάσετε κώδικα στο STM32F103C8 Απλώς συνδέστε τον με υπολογιστή μέσω θύρας USB του STM32 και ξεκινήστε τον προγραμματισμό με το ARDUINO IDE. Επισκεφτείτε αυτόν τον σύνδεσμο για να μάθετε περισσότερα σχετικά με τον προγραμματισμό του STM32 σας στο Arduino IDE. Στο τέλος παρέχεται πλήρες πρόγραμμα για αυτό το σεμινάριο STM32 DAC.
Πρώτα συμπεριλάβετε βιβλιοθήκη για I2C και LCD χρησιμοποιώντας βιβλιοθήκη wire.h, SoftWire.h και liquidcrystal.h. Μάθετε περισσότερα για το I2C στον μικροελεγκτή STM32 εδώ.
#περιλαμβάνω
Στη συνέχεια ορίστε και αρχικοποιήστε τους ακροδέκτες LCD σύμφωνα με τους ακροδέκτες 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 DAC IC. Η προεπιλεγμένη διεύθυνση I2C MCP4725 DAC είναι 0x60
# καθορισμός MCP4725 0x60
Στην κενή ρύθμιση ()
Αρχικά ξεκινήστε την επικοινωνία I2C στους ακροδέκτες PB7 (SDA) και PB6 (SCL) του STM32F103C8.
Wire.begin (); // Ξεκινά την επικοινωνία I2C
Στη συνέχεια ρυθμίστε την οθόνη LCD σε λειτουργία 16x2 και εμφανίστε ένα μήνυμα καλωσορίσματος.
lcd.begin (16,2); lcd.print ("CIRCUIT DIGEST"); καθυστέρηση (1000) lcd.clear (); lcd.setCursor (0,0); lcd.print ("STM32F103C8"); lcd.setCursor (0,1); lcd.print ("DAC με MCP4725"); καθυστέρηση (2000); lcd.clear ();
Στο κενό βρόχο ()
1. Πρώτα στο buffer βάλτε την τιμή byte ελέγχου (0b01000000).
(010-Sets MCP4725 σε λειτουργία εγγραφής) buffer = 0b01000000;
2. Η ακόλουθη δήλωση διαβάζει την αναλογική τιμή από τον πείρο PA0 και τη μετατρέπει σε ψηφιακή τιμή που κυμαίνεται από 0 έως 4096 καθώς το ADC είναι ανάλυση 12-bit και αποθηκεύεται στη μεταβλητή adc .
adc = analogRead (PA0);
3. Αυτή η ακόλουθη δήλωση είναι ένας τύπος που χρησιμοποιείται για τον υπολογισμό της τάσης από την τιμή εισόδου ADC (0 έως 4096) με την τάση αναφοράς 3.3V.
float ipvolt = (3.3 / 4096.0) * adc;
4. Βάλτε τις πιο σημαντικές τιμές bit στο buffer, μετατοπίζοντας 4 bit προς τα δεξιά στη μεταβλητή ADC και Λιγότερο σημαντικές τιμές bit στο buffer αλλάζοντας 4 bit προς τα αριστερά στη μεταβλητή adc
buffer = adc >> 4; buffer = adc << 4;
5. Η ακόλουθη δήλωση διαβάζει την αναλογική τιμή από τον ακροδέκτη ADC PA1 του STM32 που είναι η έξοδος DAC (ακροδέκτης εξόδου MCP4725 DAC IC). Αυτός ο πείρος μπορεί επίσης να συνδεθεί σε πολύμετρο για να ελέγξει την τάση εξόδου.
unsigned int analogread = analogRead (PA1);
6. Περαιτέρω, η τιμή τάσης από τη μεταβλητή αναλογική ένδειξη υπολογίζεται χρησιμοποιώντας τον τύπο με την ακόλουθη δήλωση.
float opvolt = (3.3 / 4096.0) * αναλογικό;
7. Στο ίδιο κενό βρόχου () υπάρχουν μερικές άλλες δηλώσεις που εξηγούνται παρακάτω
Ξεκινά τη μετάδοση με MCP4725:
Wire.beginTransmission (MCP4725);
Στέλνει το byte ελέγχου στο I2C
Wire.write (buffer);
Στέλνει το MSB στο I2C
Wire.write (buffer);
Στέλνει το LSB στο I2C
Wire.write (buffer);
Τερματίζει τη μετάδοση
Wire.endTransmission ();
Τώρα εμφανίστε αυτά τα αποτελέσματα στην οθόνη LCD 16x2 χρησιμοποιώντας 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); καθυστέρηση (500) lcd.clear ();
Δοκιμή του DAC με STM32
Όταν αλλάζουμε την τιμή και την τάση ADC εισόδου περιστρέφοντας το ποτενσιόμετρο, αλλάζει επίσης η τιμή και η τάση DAC εξόδου. Εδώ οι τιμές εισόδου εμφανίζονται στην πρώτη σειρά και οι τιμές εξόδου στη δεύτερη σειρά της οθόνης LCD. Ένα πολύμετρο είναι επίσης συνδεδεμένο στο MCP4725 Output Pin για την επαλήθευση της αναλογικής τάσης.
Ο πλήρης κώδικας με βίντεο επίδειξης δίνεται παρακάτω.