Outils pour utilisateurs

Outils du site


tdethindus1

TD 1 Ethernet industriel : SPI, DAC et EEPROM

DAC

Etude du composant TLV5637

Analyser la documentation du composant: http://www.ti.com/lit/ds/symlink/tlv5637.pdf

  1. A quoi sert le TLV5637 ?
  2. Quelle interface de communication permet de connecter le TLV5637 à un micro-contrôleur
  3. Donner les attributs de cette communication : type, connections, mode (0,1,2 ou 3), vitesse maximum, ordre des bits (MSB ou LSB first)
  4. A quoi sert l'entrée/sortie REF du composant ?
  5. Proposer un montage intégrant le TLV5637 pour la génération d'un signal avec une résolution de 2mv
  6. Proposer un montage intégrant le TLV5637 pour la génération d'un signal avec une résolution de 3.2mv

Carte d'extension pour le TD

Schéma de la carte:

fichiers eagle: http://homepages.laas.fr/bvandepo/files/iut/tp_dacspi/carte-arduino-tlv56-8.sch et http://homepages.laas.fr/bvandepo/files/iut/tp_dacspi/carte-arduino-tlv56-8.brd

La carte d'extension utilisée pour ce TP permet de connecter le composant TLV5637 (ou TLV5626 ou autre) à l'Arduino. Elle dispose:

  1. du DAC deux voies.
  2. de 2 connecteurs BNC et de 2 sorties au pas de 2.54mm pour les sorties du DAC.
  3. de 2 potentiomètres rotatifs pour régler les tensions analogiques en entrée des entrées analogiques (ADC) de l'Arduino. Ces 2 potentiomètres peuvent être déconnectés des ADC en retirant les cavaliers correspondant.
  4. d'une led connectée à la sortie 8 de l'Arduino et active sur l'état haut.
  5. d'un bouton connecté à l'entrée 9 de l'Arduino, générant un état bas lorsqu'il est pressé.

Utilisation d'une Librairie pour le TLV5637

Vous allez dans un premier temps utiliser une librairie objet pour piloter le DAC. Récupérer le fichier: http://homepages.laas.fr/bvandepo/files/iut/tp_dacspi/Tlv5637.zip et l'installer de la manière suivante: Copiez-collez dans une console après l'avoir ouverte avec ALT+F2 lxterm :

mkdir ~/sketchbook
cd ~/sketchbook
mkdir libraries
cd libraries
wget http://homepages.laas.fr/bvandepo/files/iut/tp_dacspi/Tlv5637.zip
unzip -o Tlv5637.zip
rm Tlv5637.zip
arduino

La librairie ainsi installée déclare la classe TLV5637:

Tlv5637.h
/*
 * Copyright (c) 2014 by Bertrand VANDEPORTAELE <bvdp@free.fr>
 * TLV5637 library for arduino.
 *
 * This file is free software; you can redistribute it and/or modify
 * it under the terms of either the GNU General Public License version 2
 * or the GNU Lesser General Public License version 2.1, both as
 * published by the Free Software Foundation.
 */
// For details on the sensor, see:
// www.ti.com/cn/lit/gpn/tlv5637
#ifndef _TLV5637_H_INCLUDED
#define _TLV5637_H_INCLUDED
#include <stdio.h>
#include <Arduino.h>
#include <avr/pgmspace.h>
// the sensor communicates using SPI, so include the library:
#include <SPI.h>
#define REF_EXTERNAL_TLV5637 0
#define REF_1024MV_TLV5637 1
#define REF_2048MV_TLV5637 2
class TLV5637  {
public:
    TLV5637(uint8_t PIN_CS_init,uint8_t REF_init); //class constructor: PIN_CS_init is the pin number used to chip select the component. REF_init should be either REF_EXTERNAL_TLV5637, REF_1024MV_TLV5637 or REF_2048MV_TLV5637
    void powerOn();       //turn on the device
    void powerOff();      //turn off the device
    void speedFast();     //activate fast mode
    void speedSlow();     //deactivate fast mode
    void setRef(uint8_t REF_init); //change the DAC reference, REF_init should be either REF_EXTERNAL_TLV5637, REF_1024MV_TLV5637 or REF_2048MV_TLV5637
    void writeDACA(uint16_t Value); //Write Value to DAC A channel, also update DACB with value in the buffer that has been set with writeDACB
    void writeDACB(uint16_t Value); //Write Value to DAC B channel, also update buffer value
    void writeDACAB(uint16_t ValueA,uint16_t ValueB); //Write Values to both DAC channels
    void writetlv5637(uint8_t R, uint16_t  Value); //Write the Value to the R register
private:
    uint8_t SPD;
    uint8_t PWR;
    uint8_t REF;
    uint8_t PIN_CS;
};
#endif

Configurer l'IDE Arduino pour travailler dans le dossier sketchbook,

Fichier->Préférence: Emplacement du carnet de croquis:

Vérifier que vous ayez une valeur comme celle-ci (en remplaçant bertrand.vandeportae par votre login)

/home/IUT/bertrand.vandeportae/sketchbook

Créer ensuite un nouveau sketch arduino dans lequel vous inclurez la librairie Tlv5637 (voir exemple DACSPI.ino plus bas). Implémentez la fonction setup pour activer le composant DAC et le faire fonctionner en mode rapide. Dans la fonction loop, faire en sorte de générer des échantillons de la fonction sinus(w.t) sur la voie A et cosinus(w.t) sur la voie B. Visualiser à l'oscilloscope les signaux générés.

Il est demandé d'utiliser le mode SPI 2 même si l'analyse de la documentation du composant nous dit que les modes 1 et 2 conviennent, sinon la commande simultanée des 2 voies du DAC ne fonctionne pas!

DACSPI.ino
#include <SPI.h>
#include <Tlv5637.h> 
#define DAC_CS  3  //Chip select du TLV5637
TLV5637 dac(DAC_CS,REF_2048MV_TLV5637);
// the setup routine runs once when you press reset:
void setup() {    
}
// the loop routine runs over and over again forever:
void loop() {
}

Commande à bas niveau du DAC en utilisant l'USART de l'arduino et les fonction de la librairie SPI

Vous allez maintenant devoir coder vous même les fonctions permettant de piloter le DAC. Vous utiliserez les fonctions présentées sur la documentation locale d'Arduino: file:///usr/share/arduino/reference/SPI.html (copier le lien dans le navigateur)

La documentation de la dernière version des librairies est consultable sur: http://arduino.cc/en/Reference/SPI

Implémentez les fonctions suivantes:

void initSPIforTLV5637();

Fonction qui initialise l'interface SPI pour pouvoir communiquer avec le TLV5637

void send16bitsTLV5637(unsigned short int value);

Fonction qui  envoie la valeur value au  TLV5637

Pour les questions suivantes, le TLV5637 sera toujours en mode fast et power-on.

void setIntRefTLV5637(unsigned char val);

Fonction de sélection et configuration de la référence interne du TLV5637
val : 0 pour 1.024v, 1 pour 2.048v

void setExtRefTLV5637(void);

Fonction de sélection de la référence externe du TLV5637

void writeTLV5637DACA(unsigned int value);

Fonction d'écriture d'une valeur sur la canal A du TLV5637
value : valeur à écrire sur 10 bits

void writeTLV5637DACB(unsigned int value);

Fonction d'écriture d'une valeur sur la canal B du TLV5637
value : valeur à écrire sur 10 bits

void writeTLV5637DACA_B(unsigned int a_value, unsigned int b_value);

Fonction d'écriture synchrone sur le canal A et B du TLV5637
a_value : valeur à écrire sur le canal A
b_value : valeur à écrire sur le canal B

Utilisez vos propres fonctions pour:

  1. Configurer l'horloge SPI à 125Khz
  2. Générer un signal carré de période 200ms et d'amplitude 1V

Une fois ce signal validé, réaliser le même exemple que dans l'exercice précédent (sinus et cosinus sur les 2 voies).

EEPROM SPI

Vous allez maintenant utiliser la carte présentée en tdcom2 pour piloter une mémoire EEPROM via un bus SPI. La documentation du composant est disponible sur: http://ww1.microchip.com/downloads/en/DeviceDoc/21204E.pdf

Etude du composant 25C040

  1. Proposer un schéma pour connecter deux eeprom 25C040 à la plateforme Arduino
  2. Déterminer la fréquence maximale de l'horloge spi utilisable pour ce composant
  3. Indiquer le rôle de la broche /WP
  4. Indiquer le rôle de la broche /HOLD
  5. Indiquer le nombre de bits d'adresse utilisés pour sélectionner une case de la mémoire
  6. Indiquer la suite d'opérations nécessaires pour effectuer une lecture
  7. Indiquer la suite d'opérations nécessaires pour effectuer une écriture
  8. que faut il faire pour s'assurer que l'eeprom est prête à recevoir un ordre d'écriture?
  9. quel est le nombre maximum de données que l'on peut écrire en une fois?

Codage des accès à la mémoire

Décrire et implémenter les fonctions suivantes:

char * readEEPROM(unsigned int addr, unsigned char * buffer, unsigned char size):

addr : l'adresse de la première case à écrire sur l'EEPROM
buffer : le pointeur sur une zone mémoire pour le résultat de la lecture
size : la taille de la zone à lire

void writeEEPROM(unsigned int addr, unsigned char * buffer, unsigned char size)

addr : l'adresse de la première case à lire sur l'EEPROM
buffer : le pointeur sur une zone mémoire contenant les valeurs à écrire
size : la taille de la zone à écrire

Ecrire un sketch arduino permettant de tester vos fonctions.

tdethindus1.txt · Dernière modification: 2017/02/21 10:35 par bvandepo