- MCP4921 DAC (convertisseur numérique-analogique)
- Composants requis
- Schématique
- Explication du code
- Test de la conversion numérique-analogique à l'aide de PIC
Le numérique et l'analogique font partie intégrante de l'électronique. La plupart des appareils ont à la fois ADC et DAC et ils sont utilisés lorsqu'il est nécessaire de convertir des signaux analogiques vers numériques ou numériques vers analogiques. De plus, les signaux du monde réel comme le son et la lumière sont de nature analogique, donc chaque fois que ces signaux du monde réel doivent être utilisés, les signaux numériques doivent être convertis en signaux analogiques, par exemple pour produire du son à l'aide de haut-parleurs ou pour contrôler une source de lumière.
Un autre type de DAC est un modulateur de largeur d'impulsion (PWM). Un PWM prend un mot numérique et génère une impulsion numérique avec une largeur d'impulsion variable. Lorsque ce signal passe à travers un filtre, le résultat sera purement analogique. Un signal analogique peut contenir plusieurs types de données dans un signal.
Dans ce tutoriel, nous allons interfacer le DAC MCP4921 avec Microchip PIC16F877A pour la conversion numérique-analogique.
Ici, dans ce tutoriel, nous allons convertir le signal numérique en un signal analogique et afficher la valeur numérique d'entrée et la valeur analogique de sortie sur un écran LCD 16x2. Il fournira 1V, 2V, 3V, 4V et 5V comme sortie analogique finale, ce qui est démontré dans la vidéo donnée à la fin. Vous pouvez en apprendre davantage sur le DAC dans notre précieux tutoriel sur l'interfaçage du DAC avec les cartes Raspberry Pi, Arduino et STM32.
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. Avant de passer directement à la partie d'interface, il est important d'avoir une vue d'ensemble du MCP4921.
MCP4921 DAC (convertisseur numérique-analogique)
MCP4921 est un DAC 12 bits, donc MCP4921 fournira 12 bits de résolution de sortie. La résolution DAC signifie le nombre de bits numériques pouvant être convertis en signal analogique. Le nombre de valeurs que nous pouvons atteindre à partir de cela est basé sur la formule. Pour 12 bits, il est = 4096. Cela signifie qu'une résolution de 12 bits DAC pourrait produire 4096 sorties différentes.
En utilisant cette valeur, on peut facilement calculer la tension de pas analogique unique. Pour calculer les étapes, la tension de référence est requise. La tension logique de l'appareil étant de 5 V, la tension de pas est de 5/4095 (4096-1 car le point de départ du numérique n'est pas 1, il est 0), ce qui correspond à 0,00122100122 millivolt. Ainsi, un changement de 1 bit changera la sortie analogique avec 0,00122100122.
Donc, c'était la partie conversion. Le MCP4921 est un circuit intégré à 8 broches. Le diagramme des broches et la description se trouvent ci-dessous.
Le CI MCP4921 communique avec le microcontrôleur via le protocole SPI. Pour la communication SPI, un appareil doit être maître, qui soumet des données ou une commande à l'appareil externe connecté en tant qu'esclave. Dans le système de communication SPI, plusieurs appareils esclaves peuvent être connectés avec un seul appareil maître.
Pour soumettre les données et la commande, il est important de comprendre le registre de commande.
Dans l'image ci-dessous, le registre de commande est affiché,
Le registre de commande est un registre 16 bits. Les bits 15 à 12 sont utilisés pour la commande de configuration. L'entrée des données et la configuration sont clairement indiquées dans l'image ci-dessus. Dans ce projet, le MCP4921 sera utilisé comme configuration suivante:
Numéro de bit |
Configuration |
Valeur de configuration |
Bit 15 |
DAC A |
0 |
Bit 14 |
Sans tampon |
0 |
Bit 13 |
1x (SORTIE V * D / 4096) |
1 |
Bit 12 |
Bit de contrôle de mise hors tension de sortie |
1 |
Ainsi, le binaire est 0011 avec les données qui sont déterminées par les bits D11 à D0 du registre. Les données 16 bits 0011 xxxx xxxx xxxx doivent être soumises où les 4 premiers bits de MSB sont la configuration et le reste est le LSB. Cela sera plus clair en voyant le chronogramme de la commande d'écriture.
Selon le chronogramme et la fiche technique, la broche CS est faible pendant toute la période d'écriture de commande sur le MCP4921.
Il est maintenant temps d'interfacer l'appareil avec le matériel et d'écrire les codes.
Composants requis
Pour ce projet, les composants suivants sont nécessaires:
- MCP4921
- PIC16F877A
- Cristal 20 MHz
- Un écran LCD 16x2 caractères.
- Résistance 2k -1 pc
- Condensateurs 33pF - 2 pièces
- Résistance 4,7k - 1 pc
- Un multimètre pour mesurer la tension de sortie
- Une maquette
- Alimentation 5 V, un chargeur de téléphone peut fonctionner.
- Beaucoup de fils de raccordement ou de fils berg.
- Environnement de programmation Microchip avec kit de programmation et IDE avec compilateur
Schématique
Le schéma de circuit pour l' interfaçage du DAC4921 avec le microcontrôleur PIC est donné ci-dessous:
Le circuit est construit en Breadboard-
Explication du code
Le code complet de conversion des signaux numériques en signaux analogiques avec PIC16F877A est donné en fin d'article. Comme toujours, nous devons d'abord définir les bits de configuration dans le microcontrôleur PIC.
// Paramètres du bit de configuration PIC16F877A // Instructions de configuration de la ligne source 'C' // CONFIG #pragma config FOSC = HS // Bits de sélection de l'oscillateur (oscillateur HS) #pragma config WDTE = OFF // Bit d'activation de l'horloge de surveillance (WDT désactivé) # pragma config PWRTE = OFF // Bit d'activation de la minuterie de mise sous tension (PWRT désactivé) #pragma config BOREN = ON // Bit d'activation de la réinitialisation de Brown-out (BOR activé) #pragma config LVP = OFF // Basse tension (alimentation simple) Bit d'activation de la programmation série en circuit (la broche RB3 / PGM a une fonction PGM; programmation basse tension activée) #pragma config CPD = OFF // Bit de protection du code mémoire EEPROM des données (protection du code EEPROM des données désactivée) #pragma config WRT = OFF // Bits d'activation d'écriture de la mémoire de programme flash (protection en écriture désactivée; toute la mémoire de programme peut être écrite par la commande EECON) #pragma config CP = OFF // Bit de protection de code de mémoire de programme flash (protection de code désactivée)
Les lignes de code ci-dessous sont utilisées pour intégrer les fichiers d'en-tête LCD et SPI, la fréquence XTAL et la connexion de la broche CS du DAC sont également déclarées.
Le tutoriel et la bibliothèque PIC SPI peuvent être trouvés sur le lien donné.
#comprendre
La fonction SPI_Initialize_Master () est légèrement modifiée pour une configuration différente requise pour ce projet. Dans ce cas, le registre SSPSTAT est configuré de telle manière que les données d'entrée échantillonnées à la fin du temps de sortie des données et également l'horloge SPI configurée comme transmission se produisent lors du passage du mode d'état d'horloge actif au mode inactif. L'autre est le même.
void SPI_Initialize_Master () { TRISC5 = 0; // Défini comme sortie SSPSTAT = 0b11000000; // pg 74/234 SSPCON = 0b00100000; // pg 75/234 TRISC3 = 0; // Défini comme sortie pour le mode esclave }
De plus, pour la fonction ci-dessous, le SPI_Write () est légèrement modifié. La transmission de données se produira après que le tampon soit effacé pour assurer une transmission de données parfaite sur SPI.
void SPI_Write (caractère entrant) { SSPBUF = entrant; // Ecrit les données données par l'utilisateur dans le tampon while (! SSPSTATbits.BF); }
La partie importante du programme est le pilote MCP4921. C'est une partie un peu délicate car la commande et les données numériques sont poinçonnées ensemble pour fournir des données 16 bits complètes sur le SPI. Cependant, cette logique est clairement montrée dans les commentaires du code.
/ * Cette fonction sert à convertir la valeur numérique en valeur analogique. * / void convert_DAC (unsigned int value) { / * Step Size = 2 ^ n, Donc 12bit 2 ^ 12 = 4096 Pour la référence 5V, le step sera 5/4095 = 0.0012210012210012V ou 1mV (approx) * / unsigned int container; unsigned int MSB; unsigned int LSB; / * Étape: 1, stocké les données 12 bits dans le conteneur Supposons que les données soient 4095, en binaire 1111 1111 1111 * / conteneur = valeur; / * Étape: 2 Création de Dummy 8 bits. Ainsi, en divisant 256, les 4 bits supérieurs sont capturés dans LSB LSB = 0000 1111 * / LSB = container / 256; / * Étape: 3 Envoi de la configuration avec perforation des données 4 bits. LSB = 0011 0000 OU 0000 1111. Le résultat est 0011 1111 * / LSB = (0x30) - LSB; / * Étape: 4 Le conteneur a toujours la valeur 21 bits. Extraction des 8 bits inférieurs. 1111 1111 ET 1111 1111 1111. Le résultat est 1111 1111 qui est MSB * / MSB = 0xFF & container; / * Étape: 4 Envoi des données 16 bits en les divisant en deux octets. * / DAC_CS = 0; // CS est faible pendant la transmission des données. Selon la fiche technique, il est nécessaire SPI_Write (LSB); SPI_Write (MSB); DAC_CS = 1; }
Dans la fonction principale, une «boucle for» est utilisée où les données numériques pour créer la sortie de 1 V, 2 V, 3 V, 4 V et 5 V. La valeur numérique est calculée par rapport à la tension de sortie / 0,0012210012210012 millivolt.
void main () { system_init (); introduction_screen (); nombre int = 0; int volt = 0; while (1) { for (volt = 1; volt <= MAX_VOLT; volt ++) { number = volt / 0,0012210012210012; écran propre(); lcd_com (FIRST_LINE); lcd_puts ("DONNÉES envoyées: -"); lcd_print_number (nombre); lcd_com (SECOND_LINE); lcd_puts ("Sortie: -"); lcd_print_number (volt); lcd_puts ("V"); convert_DAC (nombre); __delay_ms (300); } } }
Test de la conversion numérique-analogique à l'aide de PIC
Le circuit construit est testé à l'aide d'un multimètre. Dans les images ci-dessous, la tension de sortie et les données numériques sont affichées sur l'écran LCD. Le multimètre affiche une lecture proche.
Le code complet avec une vidéo de travail est joint ci-dessous.