Mise en œuvre du PIC18F2550 et d'un convertisseur...

29
2010-2011 Mise en œuvre du PIC18F2550 et d'un convertisseur analogique numérique 18bits pour conditionnement d'une sonde de mesure SAN AGUSTIN Nicolas LE GUERINEL PAUL Licence professionnelle AII/SIE 1/29

Transcript of Mise en œuvre du PIC18F2550 et d'un convertisseur...

2010-2011

Mise en œuvre du PIC18F2550 et d'un convertisseur analogique numérique

18bits pour conditionnement d'une sonde de mesure

SAN AGUSTIN NicolasLE GUERINEL PAUL Licence professionnelle AII/SIE

1/29

Sommaire

I. Présentation du contexte...............................................................................................................31. Besoins....................................................................................................................................32. Système existant......................................................................................................................33. Études précédentes..................................................................................................................3

II. Cahier des charges.......................................................................................................................41. Les objectifs............................................................................................................................42. Les exigences et les contraintes..............................................................................................4

Dans l’ensemble.....................................................................................................................4Capteur(s) à effet Hall............................................................................................................4Convertisseur analogique-numérique.....................................................................................4Pinguino : matériel et logiciel................................................................................................5Budget et délai........................................................................................................................5

3. Répartition des tâches et planning...........................................................................................5III. Déroulement du projet...............................................................................................................6

1. Recherche et études des composants.......................................................................................6Capteurs à effet Hall...............................................................................................................6Convertisseur analogique-numérique.....................................................................................6Référence de tension..............................................................................................................7

2. Schéma électronique...............................................................................................................73. Tests des sondes......................................................................................................................94. Programmation......................................................................................................................10

Les bases d’un programme Pinguino...................................................................................10Cycle d'acquisition................................................................................................................11Fonctions SPI.......................................................................................................................13

Fonctions SpiWrite..........................................................................................................14Fonction SpiRead............................................................................................................15

5. Phase de tests........................................................................................................................16IV. Conclusion...............................................................................................................................24Annexes.........................................................................................................................................25

Organigramme de l’exécution...................................................................................................25Code source complet.................................................................................................................26

2/29

I. I. Présentation du contextePrésentation du contexte

1. BesoinsLa société Sciencéthic est spécialisée dans la vente de matériel scientifique pédagogique. Celui-ci est destiné avant tout aux établissements scolaires dans le cadre de travaux pratiques pour les études scientifiques et technologiques.

Parmi ces produits, Sciencéthic propose un appareil de mesure magnétique afin d'étudier les variations d'un champ magnétique.

2. Système existantL'appareil de mesure existant permet de mesurer les variations d'un champ magnétique généré par un aimant ou une bobine à un point fixe d'une grille. En déplaçant manuellement la sonde reliée à un boîtier, lui-même relié à un oscilloscope, elle permet de mesurer le champ magnétique de chaque point de la grille, sur deux axes.

Depuis l'an dernier, il est possible d'effectuer une cartographie du champ magnétique en reliant l'appareil de mesure à un ordinateur et en utilisant un logiciel réalisé par un étudiant de licence professionnelle dans le cadre de son stage.

L'étendue de mesure de la sonde n'est cependant pas satisfaisante. En effet, elle ne permet pas de mesurer la valeur du champ magnétique lorsque la sonde est trop proche de celui-ci. Le même problème se pose lorsqu'elle en est trop éloignée. Il s'agit également d'un instrument relativement peu évident à prendre en main.

3. Études précédentesAfin de pallier la difficulté de prise en main de l'appareil de mesure, un projet de licence professionnelle Systèmes Informatiques Embarqués de l'année dernière consistait à envisager la possibilité de relier l'appareil de mesure à un ordinateur via USB.

Ce projet a démontré qu'il est possible de recréer un système existant, basé sur la mise en œuvre d'un micro-contrôleur gérant l'USB et l'utilisation d'un convertisseur analogique-numérique, pour pouvoir faciliter la prise en main de l'appareil de mesure.

3/29

II. Cahier des chargesII. Cahier des charges

1. Les objectifsIl nous fallait tout d'abord prendre connaissance des documentations utilisées et réalisées lors du projet précédent pour concevoir et réaliser un nouvel appareil de mesure. Par la suite, nous devions parcourir les sites de constructeurs et de revendeurs de composants électroniques afin de sélectionner et comparer ceux correspondant au cahier des charges.

Le projet précédent étant basé sur le système Pinguino, nous devions également prendre en main le matériel et les outils de développement afin d’adapter les travaux de nos prédécesseurs à notre projet.

Nous devions également réaliser un schéma électronique en se basant sur celui du système déjà existant pour permettre la réalisation du prototype qui nous servirait pour le projet.

Une fois le prototype à notre disposition et s’être assuré de son bon fonctionnement, nous pouvions passer à la conception et la réalisation du nouveau programme pour finalement le tester.

2. Les exigences et les contraintes

Dans l’ensembleLe système doit permettre l’acquisition des mesures d’un champ magnétique, sur deux axes, dans un délai de 10 ms par acquisition. Le tout doit pouvoir être relié à un PC pour lui communiquer les données acquises.

Capteur(s) à effet HallAfin d'obtenir une étendue de mesure plus grande, il faut d’abord remplacer le capteur initial par une sonde de Hall plus performante, et passer ainsi d'une étendue de mesure de ± 0,2 mT à au moins ± 20 mT. Cette sonde doit également être biaxiale afin d'économiser le coup de l'achat de deux capteurs pour effectuer les mesures sur deux axes. Cette dernière exigence dépend en grande partie de la disponibilité des composants existants sur le marché.

Convertisseur analogique-numériqueLe convertisseur l0 bits intégré au PIC18F2550 n'ayant plus la résolution suffisante, il est donc nécessaire d'implémenter un convertisseur de plus grande résolution - au moins 18 bits, pour atteindre les objectifs. Ce convertisseur serait piloté par le PICl8F2550 par liaison I2C ou SPI. Il devait également avoir une vitesse d’échantillonnage d’au moins 100 échantillons par seconde.

4/29

Pinguino : matériel et logiciel Pour préserver un minimum la structure des travaux précédents, le projet se base sur le système Pinguino. Il s’agit d’un micro-contrôleur PIC dans lequel est chargé un bootloader. Celui-ci permet d’interpréter du code écrit dans un langage s’apparentant au C.

Ce système est avant tout destiné aux débutants afin de les initier progressivement au développement informatique embarqué. Ce principe est inspiré de celui d’Arduino, utilisant du matériel AVR d’Atmel.

L’avantage de ce système est qu’il est entièrement gratuit et libre. Cela permet, au niveau matériel, d’utiliser les plans d’origine pour l’adapter à sa propre utilisation, et au niveau logiciel, d’utiliser les outils de développement fournis.

En revanche, ce système est relativement naissant et assez peu élaboré. Certaines fonctionnalités manquent ou ne fonctionnent pas encore de manière satisfaisante. Nous avons également pu constater certains problèmes au niveau de l’installation de l’outil de développement, comme par exemple, une mauvaise prise en charge des architectures 64 bits.

Budget et délaiLa seule contrainte budgétaire du projet était que le nouveau système devait être le moins coûteux possible, en prenant en compte le fait qu’il devrait pouvoir être produit en série.

Concernant le délai, nous avions jusqu’à la fin de la période allouée par l'Université pour terminer le projet.

3. Répartition des tâches et planningLe projet s’est fait en binôme. Néanmoins, parmi les différentes étapes du projet, seules quelques unes permettaient de s’organiser en tâches séparées, les autres durent se faire de manière collective.

Le projet s’est déroulé essentiellement dans le bureau de notre tuteur, Didier ROBBES. Celui-ci étant présent durant la quasi-totalité du projet, il nous était facile de rendre compte de l’avancement du projet et de lui soumettre toute question, remarque ou suggestion.

5/29

III. Déroulement du projetIII. Déroulement du projet

1. Recherche et études des composantsIl nous fallait rechercher sur internet, principalement sur les sites des constructeurs de composants et sur les sites de leurs revendeurs, les composants dont nous avions besoin pour la réalisation de ce projet.

La contrainte commune pour tous ces composants était de pouvoir être alimentée sous 5V, tension fournie par la liaison USB.

Capteurs à effet HallLe but était de rechercher un capteur à effet Hall linéaire ayant une étendue de mesure de ± 20mT au minimum et permettant de mesurer les variations d’un champ magnétique sur deux axes.

Lors de cette recherche, nous avons pu constater qu’il n’existait pas de sonde biaxiale correspondant aux caractéristiques demandées. Nous avons donc été contraints de revoir nos exigences et de compenser ce manque en recherchant deux sondes de mêmes caractéristiques positionnées chacune sur un axe différent.

En nous basant également sur quelques échantillons de sondes de Hall que nous avions à notre disposition, nous avons pu faire une sélection après avoir étudié leurs caractéristiques.

Finalement, notre choix s’est porté sur deux sondes SS495A1 de Honeywell, avec une étendue de mesure d’environ ± 60mT.

Convertisseur analogique-numériqueLe choix du convertisseur devait répondre à plusieurs critères :

Le convertisseur devait être de type sigma-delta pour réduire le bruit au maximum. Il devait également posséder au moins deux voies afin de prendre en charge deux conversions asynchrones, avoir une résolution de minimum 18 bits, un taux d'échantillonnage de 100 échantillons par seconde minimum et devait coûter le moins cher possible.

Le choix s'est porté sur le CAN AD7799 de la marque Analog Devices avec un taux

6/29

Référence SS49E SS59ET SS495A SS495A1

Axes 1 1 1 1

Étendue (G (10 G = 1 mT)) ±600G ~ ±1000G ±600G ~ ±1000G ±600G ~ ±670G ±600G ~ ±670G

Sensibilité (mV/G) 1,0 / 1,4 / 1,75 1,0 / 1,4 / 1,75

Output @ 0 G (V)

Gain (pour 50 mT) 36 36 16 16

Voltage (V) 3 ~ 6,5 3 ~ 6,5 4,5 ~ 10,5 4,5 ~ 10,5

Linéaire Oui Oui Oui Oui

Oui Oui NC NC

3.125 ± 0.125 3.125 ± 0.094

2.50 ± 0.250 2.50 ± 0.250 2.50 ± 0.075 2.50 ± 0.075

Low-noise

d'échantillonnage de 470 échantillons par seconde une résolution de 24 bits, 3 voies et un faible coût d'achat. Une autre particularité intéressante est qu’il permet d’avoir un gain programmable.

Référence de tensionPour effectuer nos mesures, il fallait donner au convertisseur une tension de référence qui correspondrait à l'échelle de mesure que nous souhaitions obtenir. Pour cela, nous avons ajouté au système une référence de tension, un composant permettant de délivrer une tension constante, celle-ci pouvant alors servir de référence pour des mesures.

Sur les conseils de notre tuteur, notre choix s'est porté sur deux références de tension : REF3012, délivrant une tension de 1,25V, et REF3040, délivrant une tension de 4,096V, toutes deux de Texas Instruments. Nous avons choisi ces deux références pour déterminer si l'échelle de tension à utiliser devait être la plus haute – 1,25V ~ 5V – ou la plus basse – 0V ~ 4,096V.

2. Schéma électroniqueEn nous basant sur le schéma du projet de l’année précédente, nous avons réalisé un nouveau schéma électronique pour permettre la réalisation du prototype.

Au niveau du micro-contrôleur, le schéma n’a presque pas été modifié. Seules les connexions CHIPS, CLOCK, OUTPUT et INPUT – respectivement Chip Select, Serial Clock, Data Output et Data Input – de la liaison SPI entre le micro-contrôleur et le convertisseur ont été ajoutées.

Les deux sondes sont reliées respectivement aux voies 1 et 2 du convertisseur. Pour pallier la différence de tension entre les sondes et le système, nous avons placé un pont diviseur de tension pour relier les voies analogiques du convertisseur à la masse. En sortie de chaque sonde, nous avons placé une résistance de 2kΩ et un condensateur, le tout pour filtrer le signal émis par la sonde.

Les deux références de tension sont reliées au convertisseur par l’intermédiaire d’un bornier qui nous permet de décider laquelle sert de référence.

Le bouton MCLR servira à réinitialiser le système.

7/29

référence résolution (bits) nombre de voies nombre de brochesAD7608 18 200000 8 64 20,5ADS1247 24 2000 3 20 4,45ADS1248 24 2000 7 28 4,95ADS1253 24 20000 4 16 8,4ADS1254 24 20000 4 20 7,2ADS1255 24 30000 2 20 7AD7799 24 470 3 16 6AD7191 24 120 2 24 4,96AD7190 24 4800 2 24 8,32LTC2424 20 100 4 28 5,31AD7793 24 470 3 16 6,9

échantillonnage (sps) prix $/ku

8/29

. Le schéma réalisé lors du projet de l'année précédente

9/29

. Le schéma du nouvel appareil de mesure

3. Tests des sondesAvant d'intégrer le convertisseur, nous devions nous assurer que leur fonctionnement correspondait bien à nos attentes et qu'elles n'avaient aucun défaut majeur. Notre tuteur nous a fourni le matériel nécessaire pour procéder aux tests des sondes de Hall.

Nous avons avant tout dressé un tableau contenant les tensions estimées pour certaines valeurs – en se basant sur la documentation des capteurs.

Pour procéder aux tests, nous avons alimenté la bobine pour qu'elle génère un champ magnétique que nous pouvions mesurer. Pour chaque valeur magnétique générée par la bobine, nous mesurions la tension en sortie de chaque sonde pour la noter et la comparer avec la valeur attendue.

Au final, hormis un décalage négligeable par rapport à la documentation, les valeurs correspondaient aux valeurs attendues.

10/29

Valeur mesurée (en G) -50 -20 -10 -2 -1 0 1 2 10 20 50 Sonde X

Tension min. Attendue (en mV) 2273 2364 2395 2419 2422 2425 2428 2431 2455 2486 2577

2344 2438 2469 2494 2497 2500 2503 2506 2531 2563 2656

Tension max. Attendue (en mV) 2414 2511 2543 2569 2572 2575 2578 2581 2607 2639 2736

Correspondance générateur (mA) 3350 1340 670 134 67 0 67 134 670 1340 3350

Intensité mesurée 3343 1334 1666 131 32 1 32 131 666 1334 3343

Tension mesurée (en mV) 2307 2380 2403 2421 2424 2426 2428 2430 2448 2472 2537

Valeur mesurée (en G) -50 -20 -10 -2 -1 0 1 2 10 20 50 Sonde Y

Tension min. Attendue (en mV) 2273 2364 2395 2419 2422 2425 2428 2431 2455 2486 2577

2344 2438 2469 2494 2497 2500 2503 2506 2531 2563 2656

Tension max. Attendue (en mV) 2414 2511 2543 2569 2572 2575 2578 2581 2607 2639 2736

Correspondance générateur (mA) 3350 1340 670 134 67 0 67 134 670 1340 3350

Intensité mesurée 3349 1330 669 130 75 1 75 130 669 1330 3349

Tension mesurée (en mV) 2307 2374 2396 2415 2417 2419 2422 2424 2442 2465 2535

Tension moy. Attendue (en mV)

Tension moy. Attendue (en mV)

4. ProgrammationLa programmation du système a débuté par une phase d'analyse du fonctionnement du CAN, cette analyse a donné suite à un organigramme du cycle d'exécution (voir annexe) permettant de définir l'initialisation ainsi que de faire le point sur les fonctions à coder.

Les bases d’un programme PinguinoLe squelette de base d’un programme Pinguino se compose tout d’abord des déclarations des broches utilisées par le micro-contrôleur...

/* * * * * * * * * * * * * * * * * * ** Déclarations * * * * * * * * * * * * * * * * * * */int sdi = 0; /* DOUT/RDY */int sclk = 1; /* Horloge */int cs = 2; /* Chip select */int sdo = 9; /* DIN */

...puis de deux fonctions :/* * * * * * * * * * * ** Initialisation * * * * * * * * * * * */void setup() {

pinMode(sdi, INPUT);pinMode(sclk, OUTPUT);pinMode(cs, OUTPUT);pinMode(sdo, OUTPUT);

}

void loop() {

...}

void setup() : Elle permet d’initialiser des variables – ici celles correspondant aux broches – avant l’exécution du programme principal.

void loop() : C’est le programme principal. Toutes les instructions comprises dans cette fonction seront répétées cycliquement jusqu’à l’arrêt – coupure de courant - ou la réinitialisation – appui sur le bouton Reset – du système.

Cycle d'acquisitionLe programme du micro-contrôleur procède par requêtes SPI pour contrôler le convertisseur.

Dès qu’il prend la main sur le celui-ci, il peut lui envoyer une première trame visant à lui indiquer sur quel registre il aimerait agir, avant d’envoyer une autre trame pour agir sur ce registre (en écriture) ou d’attendre une trame envoyée par le convertisseur (lecture).

11/29

/* * Tableau qui contiendra les mesures. * On utilise un long (32bits) pour la résolution de 24 bits.*/long t_mesures[2];

[…]

/* Chip Select */digitalWrite(cs, 0);

/* Mode register : Conversion simple et fréquence d'échantillonnage de 250Hz */SpiWrite8(sdo, 0x08);SpiWrite16(sdo, 0x2002);

/* Voie 1 */SpiWrite8(sdo, 0x09);SpiWrite16(sdo, 0x2230);/* Attente de RDY */while(digitalRead(sdi) != 0);/* Lecture de /DOUT */SpiWrite8(sdo, 0x58);t_mesures[0] = SpiRead(sdi);

/* Voie 2 */SpiWrite8(sdo, 0x09);SpiWrite16(sdo, 0x2231);/* Attente de RDY */while(digitalRead(sdi) != 0);/* Lecture de /DOUT */SpiWrite8(sdo, 0x58);t_mesures[1] = SpiRead(sdi);

/* Chip Select */digitalWrite(cs, 1);

Le programme d'acquisition se compose ainsi :

– Prise en main du convertisseur

digitalWrite(cs, 0);

– Demande d’écriture dans le registre de mode

SpiWrite8(sdo, 0x08);

– Écriture dans le registre de mode, pour définir le mode de conversion – en l’occurrence une simple conversion – et la fréquence d’échantillonnage souhaitée – 250Hz dans notre cas.

SpiWrite16(sdo, 0x2002);

– Demande d’écriture dans le registre de configuration

SpiWrite8(sdo, 0x09);

– Écriture dans le registre de configuration, pour définir le type de conversion – bipolaire –, programmer le gain – ici, 4 – et définir pour quelle voie nous allons acquérir des données –

12/29

voie 1 pour la sonde d’axe X et 2 pour la sonde d’axe Y.

SpiWrite16(sdo, 0x2230);[…]SpiWrite16(sdo, 0x2231);

– Attente de la disponibilité de la sortie du convertisseur.

while(digitalRead(sdi) != 0);

– Demande de lecture dans le registre de données.

SpiWrite8(sdo, 0x58);

– Lecture du registre de données pour récupérer les données de la mesure, codées sur 24 bits.

t_mesures[0] = SpiRead(sdi);[…]t_mesures[1] = SpiRead(sdi);

– Libération du convertisseur

digitalWrite(cs, 1);

Fonctions SPILa librairie de Pinguino fournit deux types de fonctions lecture et écriture de base. Ces deux fonctions sont digitalRead() et digitalWrite() et ont les prototypes, paramètres et retour suivants :

void digitalWrite(int pin, int level)

pin : numéro de la patte sur laquelle écrire

level : valeur du bit à écrire (0 ou 1)

int digitalRead(int pin)

pin : numéro de la patte sur laquelle lire

retour : renvoie un entier correspondant au bit lu.

Les fonctions de liaison SPI étant encore en phase de test, il a fallu utiliser ces deux fonctions pour programmer les fonctions nécessaires à la communication avec le CAN, une fonction d'écriture et une fonction de lecture qui sont SPIWrite() et SPIRead().

13/29

Fonctions SpiWrite

Les fonctions SpiWrite8 et SpiWrite16 permettent d'envoyer en SPI des valeurs hexadécimales sur 8 bits pour SpiWrite8 et sur 16 bits pour SpiWrite16.

Les prototypes de ces fonctions sont les suivants :

void SpiWrite8(int pin, char dat);void SpiWrite16(int pin, char dat);

Elles prennent en paramètres :

int pin : un entier correspondant au numéro de la brochechar dat : la valeur en hexadécimal à envoyer au CAN

Il n'y a pas de retour pour ces deux fonctions.

Les variables interne des fonctions sont :

int i : entier servant de variable pour la boucleint mask : masque à appliquer à chaque décalage pour envoyer la valeur du bit de poids faible. Valeur du masque à 0x01 pour un envoi de 8 bits et à 0x0001 pour un envoi de 16 bits.int type : entier correspondant au nombre de bits à envoyer.char temp : variable temporaire alignée sur la valeur à écrire.

int i;int mask=0x01; //0x001;int type=8; //16;char temp = dat;

Le fonctionnement de la boucle se présente ainsi :

La boucle se décrémente de type-1 jusqu'à zéro, donc de l'octet de poids fort jusqu'à l'octet de poids faible. À chaque passage dans la boucle, on commence par mettre la valeur de la broche SCLK (Serial Clock) à zéro avec la fonction digitalWrite(). Ensuite on récupère la valeur de dat dans temp et on décale la valeur de temp vers la droite du nombre de bits caractérisé par i, puis on applique le masque, ce qui nous permet de connaître la valeur du bit en évalué qui correspond alors à temp qui vaut 1 ou 0. En fonction de la valeur de temp, on envoie 1 ou 0 à la broche caractérisée par la variable pin. On remet la valeur de la broche SCLK à 1 et on reboucle jusqu'au dernier bit.

for(i=type-1;i>=0;i--){

/* Serial Clock */digitalWrite(sclk, 0);

temp=dat;temp=(temp>>i)&mask;if(temp==0) digitalWrite(pin,0);else digitalWrite(pin,1);

/* Serial Clock */digitalWrite(sclk, 1);

}

14/29

Fonction SpiReadLa fonction SpiRead() permet de lire les 24 bits d'un échantillon envoyés depuis le CAN par liaison SPI.

Le prototype de la fonction est le suivant :

long SpiRead(int pin);

Elle prend en paramètre :

int pin : numéro de la broche sur laquelle lire.

Le retour est un long correspondant à la valeur binaire convertie en décimal.

Les variables internes de la fonction sont :

int bits[24] : tableau d'entier pour contenir les bits récupérés.int i : variable de boucle.long pow2 : variable correspondants au puissances de 2 de 0 à 23.long somme : variable correspondant à la valeur traduite en décimal.

int bits[24];int i;long pow2 = 1; //initialement à 1 pour 2 à la puissance 0long somme=0; //somme initialement à zéro

Le fonctionnement de la première boucle se présente ainsi :

La boucle va de 0 à 24 permettant de récupérer un bit à chaque passage.On met la valeur du SCLK à zéro avec la fonction digitalWrite(), on récupère un bit avec digitalRead() que l'on place dans le tableau bits[] avec pour indice celui de la boucle en cours.

for(i=0;i<24;i++){

/* Serial Clock */digitalWrite(sclk, 0);

bits[i]=digitalRead(pin);

/* Serial Clock */digitalWrite(sclk, 1);

}

Le fonctionnement de la seconde boucle se présente ainsi :

La boucle va de 0 à 24 pour parcourir tous les éléments du tableau et effectuer la conversion.À chaque passage on vérifie si l'élément bits[i] en cours vaut 1, si c'est le cas on ajoute la valeur de pow2 à somme. On multiplie pow2 par 2 et on reboucle jusqu'au dernier élément. Enfin, on renvoie la somme.

for(i=0;i<24;i++){

if(bits[i]==1)somme+=pow2;

pow2*=2;}return somme;

}

15/29

5. Phase de tests

Une fois le programme terminé, il nous a fallu vérifier que les échanges de données entre le micro-contrôleur et le convertisseur correspondaient à nos attentes. Pour se faire, nous avons visualisé sur un oscilloscope numérique les trames échangés sur les quatre voies représentant le bus SPI : Chip Select, Serial Clock, Data Input et Data Output.

En premier lieu, nous avons vérifié que la durée d’acquisition respectait bien l’exigence du cahier des charges, à savoir 10 millisecondes maximum. En utilisant un programme de test pour vérifier que les fonctions SPI fonctionnaient correctement, nous avons pu visualiser chaque bit pour connaître sa durée.

Ces mesures effectuées et après calculs, nous avons pu évaluer la durée d’une acquisition à approximativement 3,4 ms – 3353,5 µs plus précisément.

Par la suite, nous avons utilisé le programme final et avons visualisé sur l’oscilloscope les trames échangées de manière globale. Pour cela, nous avons inséré un délai de 100 ms en fin de cycle afin de nous permettre de l’isoler.

16/29

Les trames échangées entre le micro-contrôleur et le convertisseur

Nous pouvons observer ici la globalité de l’acquisition avec les quatre voies du bus SPI:

- Chip Select (voie 1, en haut),

- Serial Clock (voie 2, milieu mi-haut),

- Data Input (voie 4, milieu mi-bas)

- et Data Ouput (voie 3, en bas).

17/29

La phase de configuration du convertisseur

Cet agrandissement montre la première phase de l’acquisition. Nous demandons au convertisseur de pouvoir écrire dans le registre de mode (0x08) puis nous envoyons une trame pour écrire dans ce registre (0x2002). Dans le détail, cette trame indique au convertisseur que nous allons utiliser le mode de conversion simple et une fréquence d’échantillonnage de 250Hz pour chaque acquisition.

Puis, nous demandons à pouvoir écrire dans le registre de configuration (0x09). En écrivant dans ce registre (0x2230), nous allons indiquer d’abord au convertisseur que la conversion doit être bipolaire - une mesure négative sera comprise entre 0V et 2,5V et une mesure positive entre 2,5V et 5V. Ensuite, nous programmons un gain de 4 pour la mesure et enfin, nous indiquons la voie sur laquelle la mesure doit être faite (ici, la voie 1).

18/29

L'acquisition de mesure de la sonde 1 à vide.

Ici, nous observons une mesure du capteur d’axe X lorsque aucun champ magnétique n’est à proximité (hormis celui de la Terre).

De façon détaillée, nous attendons que la voie Data Output laisse indiquer qu’elle est prête (état bas) puis le micro-contrôleur demande au convertisseur de lire dans le registre de données.

Les données sont alors transmises par le convertisseur via Data Ouput.

19/29

L'acquisition de mesure de la sonde 1 à proximité d'un champ magnétique

Nous avons ensuite approché un aimant pour observer les données en temps réel. Cette action a influé sur les données transmises et nous observons actuellement la mesure à proximité d’un champ magnétique.

20/29

Demande d'acquisition de la sonde 2 (configuration)

Une fois les données de la première sonde acquises, nous reconfigurons le convertisseur pour qu’il convertisse à présent les mesures de la sonde 2 (0x09 puis 0x2231). Il s’agit de la même trame que précédemment à la différence du dernier bit qui représente la voie analogique du convertisseur que nous souhaitons utiliser.

21/29

L'acquisition de mesure de la sonde 2 à vide

Nous observons ici la mesure de la sonde d’axe Y à vide. Là encore, le seul champ magnétique à proximité est celui de la Terre.

22/29

L'acquisition de mesure de la sonde 2 à proximité du même champ magnétique

Nous approchons l’aimant de l’appareil et constatons le même changement que pour la sonde 1.

23/29

La fin de l'acquisition des mesures est marquée par la libération du Chip Select (en haut)

Une fois la dernière acquisition terminée, le Chip Select repasse à un, signifiant que l’on n’utilise plus le convertisseur.

24/29

IV. ConclusionIV. Conclusion

Actuellement, le système semble opérationnel selon les trames observées à l'oscilloscope. Nous regrettons toutefois de ne pas avoir pu réaliser une application pour acquérir les données et les afficher pour l'utilisateur.

Une telle application aurait pu nous aider à vérifier et démontrer que les données obtenues par le système correspondent bien à des mesures cohérentes d’un champ magnétique.

Néanmoins ce projet nous aura permis d'appliquer une majeure partie des connaissances acquises en formation pour concevoir et réaliser un système embarqué.

25/29

AnnexesAnnexes

Organigramme de l’exécution

26/29

Code source complet/** GREYC & UNICAEN* Paul LE GUERINEL & Nicolas SAN AGUSTIN* 2011 / 2012*/

#define PIC18F2550

/* * * * * * * * * * * * * * * * * * ** Déclarations * * * * * * * * * * * * * * * * * * * */int sdi = 0; /* DOUT/RDY */int sclk = 1; /* Horloge */int cs = 2; /* Chip select */int sdo = 9; /* DIN */

long t_mesures[2]; /* Tableau qui contiendra les mesures. On utilise un long (32bits) pour la résolution de 24 bits. */char donnees[4];

/* * * * * * * * * * * * * * * * * * * ** Écrire sur le convertisseur via SPI * * * * * * * * * * * * * * * * * * * * */void SpiWrite8(int pin, char dat){ int i; int mask=0x01; int type=8; char temp = dat;

for(i=type-1;i>=0;i--) { /* Serial Clock */ digitalWrite(sclk, 0);

temp=dat; temp=(temp>>i)&mask; if(temp==0) digitalWrite(pin,0); else digitalWrite(pin,1);

/* Serial Clock */ digitalWrite(sclk, 1); }}

void SpiWrite16(int pin, short dat){ int i; int mask=0x0001; int type=16; short temp = dat;

for(i=type-1;i>=0;i--) { /* Serial Clock */ digitalWrite(sclk, 0);

temp=dat; temp=(temp>>i)&mask; if(temp==0) digitalWrite(pin,0); else digitalWrite(pin,1);

27/29

/* Serial Clock */ digitalWrite(sclk, 1); }}

/* * * * * * * * * * * * * * * * * * * ** Lire depuis le convertisseur via SPI * * * * * * * * * * * * * * * * * * * * */long SpiRead(int pin){ int bits[24]; int i=0; long pow2 = 1; long somme=0;

for(i=0;i<24;i++) { /* Serial Clock */ digitalWrite(sclk, 0);

bits[i]=digitalRead(pin);

/* Serial Clock */ digitalWrite(sclk, 1); }

for(i=0;i<24;i++) { if(bits[i]==1) somme+=pow2; pow2*=2; }

return somme;}

/* * * * * * * * * * * * * * * * * * * * * ** Acquisition des données des sondes en X * * * * * * * * * * * * * * * * * * * * * * */void AcquisitionSonde(){ /* Chip Select */ digitalWrite(cs, 0);

/* Mode register : Conversion simple et fréquence d’échantillonnage de 250Hz */ SpiWrite8(sdo, 0x08); SpiWrite16(sdo, 0x2002);

/* Voie 1 */ SpiWrite8(sdo, 0x09); SpiWrite16(sdo, 0x2230); /* Attente de RDY */ while(digitalRead(sdi) != 0); /* Lecture de /DOUT */ SpiWrite8(sdo, 0x58); t_mesures[0] = SpiRead(sdi);

/* Voie 2 */ SpiWrite8(sdo, 0x09); SpiWrite16(sdo, 0x2231); /* Attente de RDY */ while(digitalRead(sdi) != 0);

28/29

/* Lecture de /DOUT */ SpiWrite8(sdo, 0x58); t_mesures[1] = SpiRead(sdi);

/* Chip Select */ digitalWrite(cs, 1); /* Estimation de la durée d'acquisition : ~3,4ms (3353,5µs) */ delayMicroseconds(100);}

/* * * * * * * * * * * ** Initialisation * * * * * * * * * * * * */void setup(){ pinMode(sdi, INPUT); pinMode(sclk, OUTPUT); pinMode(cs, OUTPUT); pinMode(sdo, OUTPUT);}

/* * * * * * * * * * * * ** Programme principal * * * * * * * * * * * * * */void loop(){ int i;

AcquisitionSonde();

/* Envoi données X */ for(i=0;i<4;i++) donnees[i]=((t_mesures[0]>>4)&0xFF); USB.send(donnees, 24);

/* Envoi données Y */ for(i=0;i<4;i++) donnees[i]=((t_mesures[1]>>4)&0xFF); USB.send(donnees, 24);}

29/29