Sommaire
Introduction
Le composant AD7303 de Analog Devices (documentation) est un convertisseur numérique analogique sur 8 bits à 2 sorties. Il peut être piloté via une interface SPI (voir tutoriel PIC16F1509) jusqu’à 30~MHz.
On peut remarquer sur le diagramme fonctionnel précédent que ce convertisseur est équipé de 2 sorties. Elles sont indépendantes.
Etant donné qu’il s’agit d’un convertisseur numérique-analogique, il n’est nécessaire que de lui transmettre des informations numériques à convertir. Ce composant, malgré le fait qu’il fonctionne selon le protocole SPI, n’a pas de broche MOSI.
Transfert de données
Pour pouvoir appliquer une tension sur l’une des deux sorties du convertisseur, il faut lui transmettre :
- un octet de contrôle : tension de référence, voie à modifier, utilisation des registres de stockage…
- un octet de données à convertir.
La documentation technique fournit les informations suivantes à propos des bits de contrôle :
Il s’agit d’envoyer une série de bits qui correspondent à l’utilisation souhaitée du convertisseur. Les différentes valeurs et actions associées sont présentées dans la suite de la documentation constructeur.
Par exemple, si l’on souhaite convertir la valeur 0x54 vers la voie A directement par le registre du DAC, en utilisant la référence interne, il faudra transmettre l’information suivante : 0b 0 0 1 0 0 0 1 1 et 0x54.
Utilisation du DAC avec un PIC16F15xx
Bibliothèque de fonctions
Une bibliothèque de fonctions permettant d’utiliser le DAC en mode SPI est disponible ici : dac.h / dac.c. Elle nécessite l’utilisation de la bibliothèque spi.h / spi.c (voir tutoriel Microchip PIC16F / Utiliser une liaison SPI / PIC16F1509).
Cette bibliothèque contient les fonctions suivantes :
- void initDAC(void) : initialiser le DAC (après avoir initialiser la liaison SPI)
- void changeDACA_IntRef(char val) : convertir la valeur passée en paramètre sur la voie A, en utilisant la référence de tension interne
- void changeDACB_IntRef(char val) : convertir la valeur passée en paramètre sur la voie B, en utilisant la référence de tension interne
- void changeDACA_ExtRef(char val) : convertir la valeur passée en paramètre sur la voie B, en utilisant la référence de tension externe
- void changeDACB_ExtRef(char val) : convertir la valeur passée en paramètre sur la voie B, en utilisant la référence de tension externe
Ces fonctions sont détaillées dans la suite de ce tutoriel.
Connexion SPI entre le PIC16F1509 et la SRAM 23LCV
Les broches de connexion de la liaison SPI entre le microcontroleur PIC16F1509 et la SRAM 23LCV1024 peuvent être les suivantes :
- SCK : broche RB6 / configurée en sortie
- SDO : broche RC7 / configurée en sortie
- SDI : broche RB4 / configurée en entrée
- SS : broche RC2 / configurée en sortie
Initialisation de la communication
Pour initialiser la communication entre le DAC et le PIC, il est nécessaire de faire appel à la fonction initSPI(0) de la bibliothèque spi.h puis initDAC() de la bibliothèque dac.h.
void initDAC(void) {
// CS DAC
TRISCbits.TRISC1 = 0;
CS_DAC = 1;
__delay_ms(10);
Ces premières lignes permettent d’initialiser la broche SS en sortie et de lui affecter la valeur ‘1’.
CS_DAC = 0;
Pour démarrer ensuite une communication SPI avec le DAC, la sortie SS est passée à ‘0’.
sendSPI(INT_REF | UPDATE_DACA);
sendSPI(0x80);
Ensuite on transmet les données nécessaires à la mise à jour du DAC :
- la première donnée correspond à une mise à jour de la voie A, en utilisant une tension de référence interne
- la seconde à la donnée à convertir, ici la valeur 128 (correspondant sur 8 bits à la tension 2,5 V, pour une alimentation de 5 V).
CS_DAC = 1;
__delay_ms(10);
CS_DAC = 0;
On stoppe ensuite la discussion avec le DAC en remettant à ‘1’ la broche SS. Après un délai de 10 ms, on relance une nouvelle transmission.
sendSPI(INT_REF | UPDATE_DACB);
sendSPI(0x80);
On envoie cette fois-ci le même type d’informations mais sur la voie B.
CS_DAC = 1;
__delay_ms(10);
return;
}
Enfin, on stoppe la communication SPI avec le DAC.
L’ensemble des commandes sont transmises à l’aide de la fonction void sendSPI(char data) de la bibliothèque spi.h.
Conversion de données
Référence interne
Pour pouvoir convertir une donnée sur la sortie A (ou B) en utilisant une référence de tension interne, il faut utiliser la fonction changeDACA_IntRef(char val) (ou DACB pour la voie B).
void changeDACA_IntRef(char val){
CS_DAC = 0;
sendSPI(INT_REF | UPDATE_DACA);
sendSPI(val);
CS_DAC = 1;
return;
}
Cette fonction permet de lancer la transmission sur la liaison SPI puis d’envoyer la commande permettant de configurer le DAC sur sa sortie A en utilisant la référence interne de tension. Le second octet transmis correspond à la donnée à convertir passée en paramètre de la fonction (ici sur 1 octet car le convertisseur est sur 8 bits).