- Composants requis
- Module DAC MCP4725 (convertisseur numérique-analogique)
- Communication I2C dans MCP4725
- Schéma de circuit et explication
- Programmation STM32F103C8 pour la conversion numérique-analogique
- Test du DAC avec STM32
Nous savons tous que les microcontrôleurs ne fonctionnent qu'avec des valeurs numériques, mais dans le monde réel, nous devons traiter des signaux analogiques. C'est pourquoi ADC (Analog to Digital Converters) est là pour convertir les valeurs analogiques du monde réel en forme numérique afin que les microcontrôleurs puissent traiter les signaux. Mais que faire si nous avons besoin de signaux analogiques à partir de valeurs numériques, voici donc le DAC (convertisseur numérique-analogique).
Un exemple simple de convertisseur numérique-analogique consiste à enregistrer une chanson en studio où un artiste chanteur utilise un microphone et chante une chanson. Ces ondes sonores analogiques sont converties en forme numérique puis stockées dans un fichier au format numérique et lorsque la chanson est lue à l'aide du fichier numérique stocké, ces valeurs numériques sont converties en signaux analogiques pour la sortie des haut-parleurs. Donc, dans ce système, DAC est utilisé.
Le DAC peut être utilisé dans de nombreuses applications telles que le contrôle du moteur, le contrôle de la luminosité des lumières LED, l'amplificateur audio, les encodeurs vidéo, les systèmes d'acquisition de données, etc.
Nous avons déjà interfacé le module DAC MCP4725 avec Arduino. Aujourd'hui, nous utiliserons le même circuit intégré DAC MCP4725 pour concevoir un convertisseur numérique-analogique à l'aide du microcontrôleur STM32F103C8.
Composants requis
- STM32F103C8
- MCP4725 DAC IC
- Potentiomètre 10k
- Écran LCD 16x2
- Planche à pain
- Connexion des fils
Module DAC MCP4725 (convertisseur numérique-analogique)
MCP4725 IC est un module de conversion numérique-analogique 12 bits qui est utilisé pour générer des tensions de sortie analogiques de (0 à 5 V) et il est contrôlé en utilisant la communication I2C. Il est également livré avec une mémoire non volatile EEPROM intégrée.
Ce circuit intégré a une résolution de 12 bits. Cela signifie que nous utilisons (0 à 4096) comme entrée pour fournir la tension de sortie par rapport à la tension de référence. La tension de référence maximale est de 5V.
Formule pour calculer la tension de sortie
Tension O / P = (tension de référence / résolution) x valeur numérique
Par exemple, si nous utilisons 5V comme tension de référence et supposons que la valeur numérique est 2048. Donc, pour calculer la sortie DAC.
Tension O / P = (5/4096) x 2048 = 2,5 V
Brochage du MCP4725Ci-dessous, l'image du MCP4725 avec des noms de broches indiquant clairement.
Broches de MCP4725 |
Utilisation |
EN DEHORS |
Sorties Tension analogique |
GND |
GND pour la sortie |
SCL |
Ligne d'horloge série I2C |
SDA |
Ligne de données série I2C |
VCC |
Tension de référence d'entrée 5 V ou 3,3 V |
GND |
GND pour l'entrée |
Communication I2C dans MCP4725
Ce DAC IC peut être interfacé avec n'importe quel microcontrôleur utilisant la communication I2C. La communication I2C ne nécessite que deux fils SCL et SDA. Par défaut, l'adresse I2C du MCP4725 est 0x60. Suivez le lien pour en savoir plus sur la communication I2C dans STM32F103C8.
Broches I2C dans STM32F103C8:
SDA: PB7 ou PB9, PB11.
SCL: PB6 ou PB8, PB10.
Schéma de circuit et explication
Connexions entre le STM32F103C8 et l'écran LCD 16x2
Broche LCD Non |
Nom de la broche LCD |
Nom de broche STM32 |
1 |
Sol (Gnd) |
Terre (G) |
2 |
VCC |
5V |
3 |
VEE |
Broche du centre du potentiomètre pour le contraste |
4 |
Inscription Sélectionner (RS) |
PB11 |
5 |
Lecture / écriture (RW) |
Terre (G) |
6 |
Activer (EN) |
PB10 |
sept |
Bit de données 0 (DB0) |
Pas de connexion (NC) |
8 |
Bit de données 1 (DB1) |
Pas de connexion (NC) |
9 |
Bit de données 2 (DB2) |
Pas de connexion (NC) |
dix |
Bit de données 3 (DB3) |
Pas de connexion (NC) |
11 |
Bit de données 4 (DB4) |
PB0 |
12 |
Bit de données 5 (DB5) |
PB1 |
13 |
Bit de données 6 (DB6) |
PC13 |
14 |
Bit de données 7 (DB7) |
PC14 |
15 |
LED positive |
5V |
16 |
LED négative |
Terre (G) |
Connexion entre MCP4725 DAC IC et STM32F103C8
MCP4725 |
STM32F103C8 |
Multimètre |
SDA |
PB7 |
NC |
SCL |
PB6 |
NC |
EN DEHORS |
PA1 |
Sonde positive |
GND |
GND |
Sonde négative |
VCC |
3,3 V |
NC |
Un potentiomètre est également connecté, avec la broche centrale connectée à l'entrée analogique PA1 (ADC) du STM32F10C8, la broche gauche connectée à GND et la broche la plus à droite connectée à 3,3 V de STM32F103C8.
Dans ce tutoriel, nous connecterons un IC DAC MCP4725 avec STM32 et utiliserons un potentiomètre 10k pour fournir une valeur d'entrée analogique à la broche PA0 du STM32 ADC. Et puis utilisez ADC pour convertir la valeur analogique en forme numérique. Ensuite, envoyez ces valeurs numériques au MCP4725 via le bus I2C. Ensuite, convertissez ces valeurs numériques en valeurs analogiques à l'aide du DAC MCP4725 IC, puis utilisez une autre broche ADC PA1 de STM32 pour vérifier la sortie analogique du MCP4725 à partir de la broche OUT. Enfin, affichez les valeurs ADC et DAC avec les tensions sur l'écran LCD 16x2.
Programmation STM32F103C8 pour la conversion numérique-analogique
Un programmeur FTDI n'est pas nécessaire maintenant pour télécharger le code vers STM32F103C8. Connectez-le simplement au PC via le port USB de STM32 et commencez à programmer avec ARDUINO IDE. Visitez ce lien pour en savoir plus sur la programmation de votre STM32 dans Arduino IDE. Le programme complet de ce tutoriel STM32 DAC est donné à la fin.
Tout d' abord inclure la bibliothèque pour I2C et LCD en utilisant wire.h, SoftWire.h et liquidcrystal.h bibliothèque. En savoir plus sur I2C dans le microcontrôleur STM32 ici.
#comprendre
Ensuite, définissez et initialisez les broches LCD en fonction des broches LCD connectées au STM32F103C8
const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14; LiquidCrystal LCD (rs, en, d4, d5, d6, d7);
Définissez ensuite l'adresse I2C du CI DAC MCP4725. L'adresse I2C par défaut du DAC MCP4725 est 0x60
#define MCP4725 0x60
Dans la configuration vide ()
Commencez par commencer la communication I2C aux broches PB7 (SDA) et PB6 (SCL) du STM32F103C8.
Wire.begin (); // Commence la communication I2C
Réglez ensuite l'écran LCD en mode 16x2 et affichez un message de bienvenue.
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 avec MCP4725"); retard (2000); lcd.clear ();
Dans la boucle vide ()
1. D'abord dans le tampon, mettez la valeur d'octet de contrôle (0b01000000).
(010-définit le MCP4725 en mode écriture) buffer = 0b01000000;
2. L'instruction suivante lit la valeur analogique de la broche PA0 et la convertit en une valeur numérique allant de 0 à 4096 car ADC est une résolution de 12 bits et stockée dans la variable adc .
adc = analogRead (PA0);
3. Cette déclaration suivante est une formule utilisée pour calculer la tension à partir de la valeur d'entrée ADC (0 à 4096) avec la tension de référence de 3,3V.
float ipvolt = (3,3 / 4096,0) * adc;
4. Mettez les valeurs de bits les plus significatives dans la mémoire tampon en décalant de 4 bits vers la droite dans la variable ADC et les valeurs de bits les moins significatives dans la mémoire tampon en décalant de 4 bits vers la gauche dans la variable adc .
tampon = adc >> 4; buffer = adc << 4;
5. L'instruction suivante lit la valeur analogique de la broche ADC PA1 de STM32 qui est la sortie DAC (broche OUTPUT du MCP4725 DAC IC). Cette broche peut également être connectée au multimètre pour vérifier la tension de sortie.
unsigned int analogread = analogRead (PA1);
6. En outre, la valeur de tension de la variable analogread est calculée en utilisant la formule avec l'instruction suivante.
float opvolt = (3,3 / 4096,0) * lecture analogique;
7. Dans la même boucle void (), il y a quelques autres instructions qui sont expliquées ci-dessous
Commence la transmission avec MCP4725:
Wire.beginTransmission (MCP4725);
Envoie l'octet de contrôle à I2C
Wire.write (tampon);
Envoie le MSB à I2C
Wire.write (tampon);
Envoie le LSB à I2C
Wire.write (tampon);
Termine la transmission
Wire.endTransmission ();
Affichez maintenant ces résultats sur l'écran LCD 16x2 en utilisant lcd.print ()
lcd.setCursor (0,0); lcd.print ("Une adresse IP:"); lcd.print (adc); lcd.setCursor (10,0); lcd.print ("V:"); lcd.print (ipvolt); lcd.setCursor (0,1); lcd.print ("D OP:"); lcd.print (lecture analogique); lcd.setCursor (10,1); lcd.print ("V:"); lcd.print (opvolt); retard (500); lcd.clear ();
Test du DAC avec STM32
Lorsque nous faisons varier la valeur d'entrée ADC et la tension en tournant le potentiomètre, la valeur et la tension de sortie DAC changent également. Ici, les valeurs d'entrée sont affichées dans la première ligne et les valeurs de sortie dans la deuxième ligne de l'écran LCD. Un multimètre est également connecté à la broche de sortie du MCP4725 pour vérifier la tension analogique.
Le code complet avec la vidéo de démonstration est donné ci-dessous.