- Componenten vereist
- MCP4725 DAC-module (digitaal naar analoog converter)
- I2C-communicatie in MCP4725
- Schakelschema en uitleg
- Programmering STM32F103C8 voor digitaal naar analoog conversie
- De DAC testen met STM32
We weten allemaal dat de Microcontrollers alleen met digitale waarden werken, maar in de echte wereld hebben we te maken met analoge signalen. Daarom is ADC (Analog to Digital Converters) er om analoge waarden uit de echte wereld om te zetten in digitale vorm, zodat microcontrollers de signalen kunnen verwerken. Maar wat als we analoge signalen van digitale waarden nodig hebben, dan komt hier de DAC (Digital to Analog Converter).
Een eenvoudig voorbeeld voor een digitaal naar analoog-omzetter is het opnemen van een nummer in de studio waar een artiest-zanger een microfoon gebruikt en een nummer zingt. Deze analoge geluidsgolven worden omgezet in digitale vorm en vervolgens opgeslagen in een digitaal formaatbestand en wanneer het nummer wordt afgespeeld met behulp van het opgeslagen digitale bestand, worden die digitale waarden omgezet in analoge signalen voor luidsprekeruitvoer. Dus in dit systeem wordt DAC gebruikt.
DAC kan in veel toepassingen worden gebruikt, zoals motorbesturing, helderheid van de LED-verlichting regelen, audioversterker, video-encoders, data-acquisitiesystemen enz.
We hebben de MCP4725 DAC-module al gekoppeld aan Arduino. Vandaag zullen we dezelfde MCP4725 DAC IC gebruiken om een digitaal naar analoog converter te ontwerpen met behulp van de STM32F103C8 microcontroller.
Componenten vereist
- STM32F103C8
- MCP4725 DAC IC
- 10k Potentiometer
- 16x2 LCD-scherm
- Breadboard
- Verbindingsdraden
MCP4725 DAC-module (digitaal naar analoog converter)
MCP4725 IC is een 12-bits digitaal naar analoog convertormodule die wordt gebruikt om analoge uitgangsspanningen van (0 tot 5V) te genereren en wordt bestuurd door middel van I2C-communicatie. Het wordt ook geleverd met een niet-vluchtig geheugen-EEPROM aan boord.
Dit IC heeft een resolutie van 12 bits. Dit betekent dat we (0 tot 4096) als ingang gebruiken om de uitgangsspanning te leveren met betrekking tot de referentiespanning. De maximale referentiespanning is 5V.
Formule om de uitgangsspanning te berekenen
O / P-spanning = (referentiespanning / resolutie) x digitale waarde
Bijvoorbeeld als we gebruik 5V als referentie spanning en laten we aannemen dat digitale waarde is 2048. Dus om de DAC-uitgang te berekenen.
O / P-spanning = (5/4096) x 2048 = 2,5 V.
Pinout van MCP4725Hieronder ziet u de afbeelding van MCP4725 met duidelijk aangegeven pinnamen.
Pinnen van MCP4725 |
Gebruik |
UIT |
Voert analoge spanning uit |
GND |
GND voor uitvoer |
SCL |
I2C Serial Clock-lijn |
SDA |
I2C seriële datalijn |
VCC |
Ingangsreferentiespanning 5V of 3.3V |
GND |
GND voor invoer |
I2C-communicatie in MCP4725
Deze DAC-IC kan worden gekoppeld aan elke microcontroller met behulp van de I2C-communicatie. I2C-communicatie vereist slechts twee draden SCL en SDA. Standaard is het I2C-adres voor MCP4725 0x60. Volg de link voor meer informatie over I2C-communicatie in STM32F103C8.
I2C-pinnen in STM32F103C8:
SDA: PB7 of PB9, PB11.
SCL: PB6 of PB8, PB10.
Schakelschema en uitleg
Verbindingen tussen STM32F103C8 en 16x2 LCD
LCD Pin Nr |
Naam LCD-pincode |
STM32 Pin-naam |
1 |
Grond (Gnd) |
Aarde (G) |
2 |
VCC |
5V |
3 |
VEE |
Pin van Center of Potentiometer voor contrast |
4 |
Registreren Select (RS) |
PB11 |
5 |
Lezen / schrijven (RW) |
Aarde (G) |
6 |
Inschakelen (EN) |
PB10 |
7 |
Gegevensbit 0 (DB0) |
Geen verbinding (NC) |
8 |
Gegevensbit 1 (DB1) |
Geen verbinding (NC) |
9 |
Gegevensbit 2 (DB2) |
Geen verbinding (NC) |
10 |
Gegevensbit 3 (DB3) |
Geen verbinding (NC) |
11 |
Gegevensbit 4 (DB4) |
PB0 |
12 |
Gegevensbit 5 (DB5) |
PB1 |
13 |
Gegevensbit 6 (DB6) |
PC13 |
14 |
Gegevensbit 7 (DB7) |
PC14 |
15 |
LED Positief |
5V |
16 |
LED negatief |
Aarde (G) |
Verbinding tussen MCP4725 DAC IC en STM32F103C8
MCP4725 |
STM32F103C8 |
Multimeter |
SDA |
PB7 |
NC |
SCL |
PB6 |
NC |
UIT |
PA1 |
Positieve sonde |
GND |
GND |
Negatieve sonde |
VCC |
3.3V |
NC |
Er is ook een potentiometer aangesloten, waarbij de middelste pin is aangesloten op PA1 analoge ingang (ADC) van STM32F10C8, de linkerpin is aangesloten op GND en de meest rechtse pin is aangesloten op 3,3V van STM32F103C8.
In deze tutorial zullen we een MCP4725 DAC IC verbinden met STM32 en een 10k potentiometer gebruiken om analoge ingangswaarde te leveren aan STM32 ADC pin PA0. En gebruik vervolgens ADC om analoge waarde om te zetten in digitale vorm. Stuur daarna die digitale waarden naar MCP4725 via de I2C-bus. Converteer vervolgens die digitale waarden naar analoog met behulp van de DAC MCP4725 IC en gebruik vervolgens een andere ADC-pin PA1 van STM32 om de analoge uitvoer van MCP4725 vanaf de pin OUT te controleren. Geef ten slotte de beide ADC- en DAC-waarden weer met spanningen in het 16x2 LCD-scherm.
Programmering STM32F103C8 voor digitaal naar analoog conversie
Een FTDI-programmeur is nu niet nodig om code naar STM32F103C8 te uploaden. Sluit hem gewoon aan op de pc via de USB-poort van STM32 en begin met programmeren met ARDUINO IDE. Bezoek deze link voor meer informatie over het programmeren van uw STM32 in Arduino IDE. Het volledige programma voor deze STM32 DAC-tutorial wordt aan het einde gegeven.
Neem eerst een bibliotheek op voor I2C en LCD met behulp van wire.h, SoftWire.h en liquidcrystal.h bibliotheek. Lees hier meer over I2C in STM32 Microcontroller.
# omvatten
Definieer en initialiseer vervolgens de LCD-pinnen volgens de LCD-pinnen die zijn verbonden met de STM32F103C8
const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14; LiquidCrystal lcd (rs, en, d4, d5, d6, d7);
Definieer vervolgens het I2C-adres van de MCP4725 DAC IC. Het standaard I2C-adres van de MCP4725 DAC is 0x60
# definiëren MCP4725 0x60
In de leegte setup ()
Begin eerst met de I2C-communicatie op de pinnen PB7 (SDA) en PB6 (SCL) van STM32F103C8.
Wire.begin (); // Begint de I2C-communicatie
Zet vervolgens het LCD-scherm in de 16x2-modus en laat een welkomstbericht zien.
lcd.begin (16,2); lcd.print ("CIRCUIT DIGEST"); vertraging (1000); lcd.clear (); lcd.setCursor (0,0); lcd.print ("STM32F103C8"); lcd.setCursor (0,1); lcd.print ("DAC met MCP4725"); vertraging (2000); lcd.clear ();
In de lege lus ()
1. Plaats als eerste in de buffer de waarde van de besturingsbyte (0b01000000).
(010-Sets MCP4725 in schrijfmodus) buffer = 0b01000000;
2. De volgende instructie leest de analoge waarde van pin PA0 en zet deze om in een digitale waarde van 0 tot 4096, aangezien ADC een 12-bits resolutie is en wordt opgeslagen in de variabele adc .
adc = analogRead (PA0);
3. Deze volgende verklaring is een formule die wordt gebruikt om de spanning te berekenen uit de ADC-ingangswaarde (0 tot 4096) met de referentiespanning van 3,3V.
zweven ipvolt = (3.3 / 4096.0) * adc;
4. Zet de meest significante bitwaarden in de buffer door 4 bits naar rechts te verschuiven in de ADC-variabele, en de minst significante bitwaarden in de buffer door 4 bits naar links te verschuiven in de adc- variabele.
buffer = adc >> 4; buffer = adc << 4;
5. De volgende verklaring leest de analoge waarde van ADC-pin PA1 van STM32, dat is de DAC-uitgang (MCP4725 DAC IC's OUTPUT-pin). Deze pin kan ook worden aangesloten op een multimeter om de uitgangsspanning te controleren.
unsigned int analogread = analogRead (PA1);
6. Verder wordt de spanningswaarde van de variabele analogread berekend met behulp van de formule met de volgende verklaring.
float opvolt = (3.3 / 4096.0) * analoog lezen;
7. In dezelfde void loop () zijn er enkele andere uitspraken die hieronder worden uitgelegd
Begint de verzending met MCP4725:
Wire.beginTransmission (MCP4725);
Stuurt de besturingsbyte naar I2C
Wire.write (buffer);
Stuurt de MSB naar I2C
Wire.write (buffer);
Stuurt de LSB naar I2C
Wire.write (buffer);
Beëindigt de verzending
Wire.endTransmission ();
Geef die resultaten nu weer op het LCD 16x2-scherm met 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 (analoog lezen); lcd.setCursor (10,1); lcd.print ("V:"); lcd.print (opvolt); vertraging (500); lcd.clear ();
De DAC testen met STM32
Wanneer we de ingangs-ADC-waarde en -spanning variëren door de potentiometer te draaien, veranderen de uitgangs-DAC-waarde en -spanning ook. Hier worden de invoerwaarden weergegeven in de eerste rij en de uitvoerwaarden in de tweede rij van het LCD-scherm. Er is ook een multimeter aangesloten op de MCP4725-uitgangspen om de analoge spanning te verifiëren.
Volledige code met demonstratievideo wordt hieronder gegeven.