« Le groupe DDS » : différence entre les versions

De Wiki_du_Réseau_des_Electroniciens_du_CNRS
Aller à la navigationAller à la recherche
Wiotte fabrice (discussion | contributions)
Wiotte fabrice (discussion | contributions)
Page blanchie
Balises : Blanchiment Révocation manuelle
 
(14 versions intermédiaires par le même utilisateur non affichées)
Ligne 1 : Ligne 1 :
<div class="subtab">[[Accueil]] - [[Wiki DDS]]</div>
<hr/>
<div class="subtab">[[Le_groupe_DDS_:_Introduction|Introduction]] - [[Projet DDS]] - [[Aperçu des Projets électroniques au LPL]]</div>
<hr/>


= Introduction =
Le but de ce wiki est de donner les outils de bases pour démarrer un projet autour d'un DDS, de la programmation à l'implémentation sur circuits imprimés : réalisation de cartes "propriétaires" ou utilisation de kits de développement commerciaux.
Vous pouvez aussi participer à l'enrichissement de cette page avec vos sources ou partager vos projets.[mailto:fabrice.wiotte@univ-paris13.fr?subject=Groupe%20FPGA Contacter l'animateur du Groupe DDS par mail Fabrice.wiotte@univ-paris13.fr]      [http://www-lpl.univ-paris13.fr/FR/ LPL Université Paris 13]
http://jmfriedt.free.fr/network_analyzer.pdf : travaux pratiques de Master1 EEA Besançon pour réaliser un petit analyseur de réseau
à base d'AD9834 (faible consommation, MCK=75 MHz) commandé par STM32F410.
= Quel microcontrôleur pour piloter les DDS ? =
Sur le schéma plus haut, le DDS a été programmé par l'intermédiaire d'un microcontrôleur 16 bits de chez TI, le MSP430F169 @8MHz d'horloge.
l'environnement de programmation du MSP430 est IAR Embedded Workbench téléchargeable gratuitement dans sa version de base avec un code limité @8Ko
Aujourd'hui je conseil d'utiliser un CPU ARM pour tous les développement uC (STM32, ARDUINO, TI TIVA séries...).
Un développement récent avec l'AD9959 à été réalisé avec un microcontrôleur ATMEL ARDUINO DUE, microcontrôleur 32 bits ARM @84MHz et un STM32F437 ARM @180MHz.
Les dernières cartes développées au LPL utilisent principalement des microcontrôleurs TEXAS INSTRUMENT TM4C123GH6PM ARM@80MHz Cortex®-M4F et TM4C1294 ARM@120MHz
'''Ci dessous Les différents registres du DDS l'AD9959
table 28 du datasheet de l'AD9959'''
    registre CSR (channel select register)
    One byte is assigned to this register:  le  nombre d'octets du registre ici 1 octet.
    CSR serial address = 0x00;
    CSR defaut value = 0xF0;
Ce registre active les voies de sorties et les modes SPI: Par défaut toutes les voies sont activées et le mode SPI Single-bit serial 2-wire est sélectionné. Il est évidemment possible de redéfinir ce registre suivant son application.
    Le second registre est le registre FR1: table 28 du datasheet
    registre FR1 (fonction register 1)
    three bytes is assigned to this register: nombre d'octets du registre
    FR1 serial address = 0x01;
    FR1 defaut value = 0x00;
Ce registre permet en autres de définir la PLL interne et le coefficient multiplicateur x4 à x20. Pour exemple la valeur à fournir pour activer la PLL x20 ⇒ FR1 = 0xD00000; Dans ce cas il suffit de fournir un quartz à 25MHz avec la PLL activée x20 on a 500MHz d'horloge PIN 22 et 23 du DDS.
    Le troisième registre est le registre CFR table 29 du datasheet
    registre CFR (Channel Function Register)
    three bytes is assigned to this register: nombre d'octets du registre
    CFR serial address = 0x03;
    CFR defaut value =0x302;
Ce registre défini les différents mode de fonctionnement du DDS.Ce registre est important si vous utiliser certains modes de fonctionnement: balayage de fréquence, de phase, ou d'amplitude. Important par défaut les sortie sont en mode DAC full-scale current.
    Le quatrième registre est le registre CFTW0: table 29 du datasheet
    registre CFTW0 (Channel Frequency Tuning Word 01)
    four bytes is assigned to this register: nombre d'octets du registre
    CFTW0 serial address = 0x04;
    CFTW0 defaut value =0x00;
Ce registre permet de rentrer la fréquence désirée suivant la relation ci-dessous:
    FTW0 = frequency output x 2^32 /frequency clock en Hexadecimal
    Le cinquième registre est le registre CPOW0 table 29 du datasheet
    registre CPOW0 (Channel Phase Offset Word 01)
    two bytes is assigned to this register:  nombre d'octets du registre
    CPOW0 serial address = 0x05;
    CPOW0 defaut value =0x00;
Ce registre définie la phase du signal de sortie codé sur 14 bits avec la relation ci-dessous:
    CPOW0 = Delta phi x 2^14 /360°
    Le sixième registre est le registre ACR: table 29 du datasheet
    registre ACR (Amplitude Control Register)
    two bytes is assigned to this register:  nombre d'octets du registre
    ACR serial address = 0x06;
    ACR defaut value =0x00;
Ce registre permet de définir l'amplitude. Par défaut l'amplitude est en mode full scale mais programmable si on modifie le registre CFR.
Les autres registres sont utiles pour programmer le DDS pour des balayages de fréquences, de phases et d'amplitudes en autres.
    Registre FR2 (Function Register 2)
    Registre LSRR (Linear Sweep Ramp Rate1)
    Registre FDW (LSR Falling delta Word1)
    Registre RDW (LSR Risingdelta Word1)
    Registre CW1 (Channel Word 1)
    ...
=Programme en C écrit dans un microcontrôleur, le MSP430F169 pour contrôler une DDS l'AD9959=
initialisation et chargement des registres CSR et CFTW0:
<syntaxhighlight lang="c">
    int  CSR_ADDRESS = 0x00;  AD9959 CSR adresss Byte
    int CSR_NUM_BYTE = 0x01;  CSR nombre d'octet du registre
    long CSR0 = 0x10;          AD9959 du channel 0 MSB first SPI par défaut
     
    int  FTW_ADDRESS = 0x04;  AD9959 FTW adresss Byte
    int FTW_NUM_BYTE = 0x04;  FTW nombre d'octet du registre
    long FTW0 = 0x28F5C28F;    frequence en hex = fout x2^32/fclock
</syntaxhighlight>
dans le main
<syntaxhighlight lang="c">
    P4OUT = 0x40;          AD9959 master reset bit de validation du MSP430
    P4OUT = 0x00;          AD9959 master set  bit de validation du MSP430
   
    write_serial_port(CSR_ADDRESS, CSR0, CSR_NUM_BYTE);
    P5OUT = 0x40;          I/O update du DDS bit de validation du MSP430
    P5OUT = 0x00;          I/O update du DDS bit de validation du MSP430 
   
    write_serial_port(FTW_ADDRESS, FTW0, FTW_NUM_BYTE);
    P5OUT = 0x40;          I/O update du DDS bit de validation du MSP430
    P5OUT = 0x00;          I/O update du DDS bit de validation du MSP430
</syntaxhighlight>
Commentaires sur le programme:
on fait un RESET du DDS (pin 3), on charge les données de chaque registre au travers du port SPI write_serial_port… Puis on réalise un I/O UPDATE pin 46 du DDS pour la validation et le transfert des données. Ce bout de programme permet de charger le channel 0 avec une fréquence de 80MHz et une amplitude par défaut FULL DAC. I/O_UPDATE is synchronous to the SYNC_CLK (Pin 54) = Master clock/4. Voir figure 40 du datasheet du DDS.
Ci-dessous le sous programme d'initialisation des ports du microcontrôleur et du SPI pour le MSP430F169 : TI fourni de nombreux exemples de codes de bases pour configurer les modes SPI, I2C et utiliser la mémoire Flash: slac015p.zip
<syntaxhighlight lang="c">
#include  <msp430x16x.h>
    void DDS_quartz_oscillator_init(void)
    {
      BCSCTL1 |= XTS;              ACLK= LFXT1= HF XTAL
      BCSCTL2 |= SELM_3;            MCLK = LFXT1 (safe) pin 8,9 du MSP430
      P1SEL = 0x00;                P1 I/O select
      P2SEL = 0x00;                P2 I/O select
      P3SEL = 0x00;                P3 I/O select
      P4SEL = 0x00;                P4 I/O select
      P5SEL = 0x0A;                P5.1,3 SPI option select
      P6SEL = 0x00;                P6 I/O select
      P1DIR = 0xFF;                P1.output direction
      P2DIR = 0xFF;                P2 output direction
      P3DIR = 0xFF;                P3 output direction
      P4DIR = 0xFF;                P4 output direction
      P5DIR = 0xFF;                P5 output direction
      P6DIR = 0xFF;                P6 output direction
      ME2 |= USPIE1;                Enable USART1 SPI
      UCTL1 |= CHAR + SYNC + MM;    8-bit SPI Master **SWRST**
      UTCTL1 = CKPH + SSEL1 + STC;  SMCLK delayed, 3-pin
      UBR01 = 0x2;                  ACLK/2 for baud rate
      UBR11 = 0x0;                  ACLK/2 for baud rate
      UMCTL1 = 0x0;                Clear modulation
      UCTL1 &= ~SWRST;              Initialize USART state machine
    }
</syntaxhighlight>
BCSCTL1 |= XTS; et BCSCTL2 |= SELM_3; permet d'être en mode HF XTAL le MSP430 fonctionnera à 8MHZ au lieu de 32KHz par défaut.
  MSP430F169
          -----------------
      /|\|              XIN|-
        | |                | HF XTAL (455k - 8Mhz)
        --|RST          XOUT|-
          |                |
          |            P5.4|-->MCLK = XTAL
D'après : M. Buccini Texas Instruments Inc. Feb 2005 Built with CCE Version: 3.2.0 and IAR Embedded Workbench Version: 3.21A
le sous programme pour le chargement des données en mode SPI du MSP430F169
<syntaxhighlight lang="c">
      void write_serial_port(int instruction, long data, int num_byte)
      {
      int i=0;
      TXBUF1 = instruction;
        do
      {
      TXBUF1 = data >>(num_byte-1-i)*8;
      i++;
      }
        while (i < num_byte);
      }
</syntaxhighlight>
Un code complet pour charger le DDS avec le MSP430F169
<syntaxhighlight lang="c">
  #include <msp430x16x.h>
  #include "DDS_quartz_oscillator.h"
  void init_sys(void);                MSP430 Initialisation routine
  void tempo_loop(int loop_number);  wait loop
  void write_serial_port1(int instruction, long data, int num_byte);
          /  main() variable declarations  /                                     
        / configuration Channel Select Register /                 
                Channel Select Register                             
  int  CSR_ADRESS = 0x00;          AD9959 CSR adresss Byte
  long CSR = 0x10;                  AD9959 CH0 only MSB first
  int CSR_NUM_BYTE = 0x01;          AD9959 byte number by CSR
  int  FTW0_ADRESS = 0x04;          AD9959 FTW0 adresss Byte
  long FTW0 = 0x38C9138C;          AD9959 Frequency Tuning Word0 122MHz
  int FTW_NUM_BYTE = 0x04;          AD9959 byte number by FTW
  void main(void)
  {
            / initialisation du msp430  /
  init_sys();                      Initialise the MSP430
  tempo_loop(10000);                wait loop
  P5OUT = 0x00; 
  P4OUT = 0x40;                    Reset AD9959 
  tempo_loop(10000);                wait loop 
  P4OUT = 0x00;                    Set AD9959
  write_serial_port1(CSR_ADRESS, CSR, CSR_NUM_BYTE);
  tempo_loop(100);                  wait loop
  P5OUT = 0x40;                    AD9959 I/O update
  P5OUT = 0x00;                       
  write_serial_port1(FTW0_ADRESS, FTW0, FTW_NUM_BYTE);                                       
  tempo_loop(10);                  wait loop
  P5OUT = 0x40;                    AD9959 I/O update
  P5OUT = 0x00;                       
  }
  void init_sys(void)
  {
  WDTCTL = WDTPW + WDTHOLD;      // stop Watch Dog Timer
  DDS_quartz_oscillator_init();  // init usart1, spi mode, 2wire
  }
  void write_serial_port1(int instruction, long data, int num_byte)
  {
    int i=0;
    TXBUF1 = instruction;
  do
  {
    TXBUF1 = data >>(num_byte-1-i)*8;
    i++;
  }while (i < num_byte);
  }
  void tempo_loop(int loop_number)
  {
  int i;
  int j;
  for(i = 0; i < loop_number; ++i)          wait loop
  {
    j=j+i;
  }
  }
</syntaxhighlight>
= Différentes cartes de développement : MSP430 - ARM TI - STM32 - Arduino =
[[Fichier:tivaTM4C123.jpg|250px]]
[[Fichier:KITmsp430.jpg|250px]]
[[Fichier:512YMs-THNL._AC_SX522_.jpg|250px]]
[[Fichier:Arduino due.png|250px]]
=Environnement de programmation : IAR for MSP430 & ARM, code composer studio for MSP430 & ARM, IDE cube for STM32...=
[[Fichier:IAR for MSP430.jpg|500px]] IAR for MSP
[[Fichier:IAR ARM.png|600px]] IAR for ARM
[[Fichier:CCS10.png|600px]] Code Composer Studio for ARM or MSP
[[Fichier:STM32.png|600px]]  ide Cube for STM32
[[Fichier:cubemx.png|600px]] ide Cube MX for STM32
= Conception CAO électronique -> Tuto prise en main d'Altium Designer 20: support TP Ingénieur Instrumentation Galilée USPN =
Les kits de développement c'est bien ! mais des cartes maisons c'est pas mal aussi ! 
Pour ceux qui veulent se lancer dans la CAO. Un tutoriel simple et une prise en main rapide du logiciel Altium designer 20
[[Fichier:maxresdefault.jpg|500px]]  [[Fichier:CAO Electronique_Fabrice_Wiotte 2020.pdf]]
= Conception CAO électronique avec projet moteur pas à pas sous Xilinx ISE et communication Python: Support TP ingénieurs instrumentation =
Un tutoriel ISE XILINX pilotage d'un moteur pas à pas avec conception de cartes filles autour d'une carte Digilent Nexys 4 et Nexys A7 avec Artix7.
[[Fichier:ise moteur pas a pas.png|400px]]
[[Fichier:TP moteur pas a pas.png|400px]]
[[Fichier:TP 2021 FPGA2 moteur pas à pas Ingénieurs Instrumentation Galilée.pdf]]
Mise à jour des TP et correctifs:
[[Fichier:TP 2022 Ingénieurs Instrumentation 2 Galilée mise a jour du 04 02 2022.pdf]]
Conception CAO électronique communication Python sur Raspberry pi 4 et programmation FPGA:
J'ai adapté le TP FPGA 2 ci-dessus pour que le puisse piloter à distance sur le réseau le moteur pas à pas.
Dans notre TP nous pouvions piloter le moteur grâce à une liaison USB-Série avec un PC à proximité.
Pour un pilotage réseau j'ai donc connecté ma carte FPGA avec une Raspberry PI 4 et j'ai pu donc contrôler le moteur à distance via une liaison SSH.
Le mieux est évidemment je pense de  travailler en ligne de commande avec le terminal LX de la Raspberry Pi et il a de nombreux tuto pour installer et utiliser la Raspberry Pi.
[[Fichier:TP_FPGA3.jpg|200px]]
'''Mise à jour du TP sous Vivado 2021.2 : environnement Vivado'''
= TP VIVADO 2020 CmodA7 board digital clock=
Ci-joint le lien pour le projet:  https://github.com/fabzz60/Cmod-A7-Horloge-Demo-
=TP réalisation de carte électronique, réalisation avec Altium Designer AD21: carte Spartan 6 LX4=
[[Fichier:Spartan 6 lx4.png|400px]]
[[Fichier:TP_FPGA3.pdf]]
=Raspberry pi et cartes maisons connectées à la pi 4 projets 2021=
Utilisation d'une Raspberry pi 4 pour contrôler les cartes maisons et des cartes DDS
Procédure de communication avec une pi 4:
[[Fichier:SSH Raspberry Pi.pdf]]
Communication avec des cartes maisons et une liaison USB-série avec la pi 4
J'ai du tout de même installé ce paquet pylibftdi sous Raspbian qui est une interface Pythonic minimale pour les périphériques FTDI utilisant libftdi  car je souhaite connecter '''plusieurs appareils disposant d'une puce FTDI serial-UART'''.
J'ai deux cartes électroniques connectées à ma Raspberry Pi 4:
--'''Une carte FPGA  Artix 7''' qui pilote le moteur pas à pas et communique via une puce FTDI double pont FT2232HQ pour l'UART et le JTAG.
--'''Une carte uC ARM TI puce TM4C1294''' pour un projet générateur multi-voies à base de DDS (voir ce Wiki DDS), carte développée avec Altium au LPL qui est connectée avec une liaison USB-série, UART puce FTDI FT232.
J'ai donc un programme Python pour la carte DDS multivoie et un programme Python pour le moteur pas à pas que l'on a étudié.
Sur ma Raspberry Pi 4 les programme Python sont modifiable à distance sous le terminal grâce à l'outil intégré à Raspbian nano -> éditeur de texte qui me permet de modifier et d'enregistrer mon code Python et de lancer les programmes.
Normalement je peux également charger la puce FPGA (bit file) avec la Raspberry Pi grâce à l'outil développé par Digilent (Adept2) qui est
l'équivalent d'Impact sous ISE mais en version linux 32 bits pour Raspberry.
La suite pour moi c'est d'utiliser les GPIO de la Raspberry Pi 4 notamment les ports SPI, I2C et Uart pour des projets d'électroniques embarqués...et d'intégrer des cartes filles maisons sur la Raspberry Pi.
[[Fichier:Raspberry pi 4 et carte FPGA Artix 7.jpg|400px]]
[[Fichier:Raspberry pi 4 et carte DDS 8 voies.jpg|400px]]
=Projet DDS's Strontium 2  Laser Superradiant 2022=
Pour une nouvelle expérience du laboratoire utilisant de nombreux DDS synchronisés ou pas sur un signal d'horloge externe:
Rack multivoies DDS AD9852 & AD9858 : programmation uC ARM TM4C1294 and server TCP/IP Rack à droite de l'image:
Raspberry Pi 4 sur bus SPI DDS à gauche de l'image ci-dessous:
[[Fichier:Slide1.PNG|400px]]
Carte DDS sur uC TI ARM TM4C1294 et serveur TCP-IP pour microcontrôleur développé par Texas Instruments.
[[Fichier:Interface web DDS rack.jpg|400px]]
[[Fichier:Script python.jpg|400px]]
''Ci-dessous script Python pour la Raspberry Pi4 qui pilote le rack DDS: Script pour la liaison USB-serial (UART0 de la pi4)''
[[Fichier:Code_python_liaison_série_UART0_pi4_.pdf ‎]]
''Ci-dessous script dans la Raspberry pi 4 : activation des broches GPIO, SPI, UART0 de la  pi 4 qui contrôle les DDS''
[[Fichier: Code Raspberry pi 4.pdf]]
''Ci-dessous les cartes développées pour le projet Laser super radiant (Strontium 2) carte Format Europe 4 couches FR4 35um''
Raspberry Pi4 sur carte Europe et fond de panier
[[Fichier: RASPBERRY PI 4 ON DDS BUS AD9852.jpg|300px]]
Carte DDS AD9852 ou AD9858 sur fond de panier
[[Fichier: DDS board AD9852 bus.jpg|300px]]
Carte uC ARM TM4C1294, USB-sérial et Ethernet TCP-IP
[[Fichier: Carte uC pour bus DDS AD99852.jpg|300px]]
=General Note on the DDS card and on the BUS driver 2014 & update 2022=
Présentation de l'architecture BUS DDS, communication parallèle pour le pilotage de 24 DDS sous Labview
[[Fichier:NoteBusDDS LPL Strontium.pdf ‎]]

Dernière version du 12 octobre 2024 à 12:43