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

De Wiki_du_Réseau_des_Electroniciens_du_CNRS
Aller à la navigationAller à la recherche
 
(423 versions intermédiaires par le même utilisateur non affichées)
Ligne 1 : Ligne 1 :
<div class="subtab">[[Accueil]] - [[Le groupe DDS]]</div><hr/>
<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 =
= Introduction =


Le but de ce tutoriel 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".
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]


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  
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.
à base d'AD9834 (faible consommation, MCK=75 MHz) commandé par STM32F410.


= Projets LPL 2020=
=Généralités sur les DDS=
Les "Direct Digital Synthesizers" (DDS) sont des synthétiseurs qui peuvent générer des formes d'ondes arbitraires à diverses fréquences à partir d'une fréquence de référence fixe.


<center><font face="Comic Sans MS" color=#0000AA size=5>Développements électroniques autour des applications DDS "digital signal synthesis".</font></center>
Un synthétiseur de fréquence est par extension un instrument qui permet de générer, dans une gamme de fréquences donnée, un signal dont on peut ajuster la fréquence et l’amplitude
'''Générateur DDS pour asservissement Oscillateur YIG 8-18GHz'''
et auquel il peut être imposé une modulation de fréquence, de phase ou d’amplitude.  
[[Fichier:GeneYIG.pdf]]


'''General Note on the DDS card and on the BUS driver with labview for AOM control'''
Une bonne note Analog device expliquant le fonctionnement des DDS se trouve ici :
[[Fichier:NoteBusDDS25042014_2.pdf]]
'''[[Média:Tuto_dds.pdf]]'''
[[Fichier:DDS ACCU.png|400px|thumb|left]]


'''Phase shifter with DDS AD9959'''
=Principe=
[[Fichier:CARTE_AD9959_on_USB_port_pour_detection_synchrone@30MHz.pdf]]
1.Le mot d'accord fixe la taille de palier de l'incrément du compteur. Celui ci détermine la fréquence de la forme d'onde de sortie.


'''Quad SPI control for DDS board with ARM TM4C1294 120MHz'''[[Fichier:DDS board Quad SPI@60MHz.pdf]]
2.L'accumulateur de phase présente généralement entre 24 et 48 bits. Ce nombre représente le nombre de valeurs de phase entre 0 et 2p radians, ou l'incrément de phase réalisable.


'''Projet 2020 : DDS board AD9910 for acousto-optique @250MHz'''
3.La table de sortie phase amplitude est envoyée vers un convertisseur numérique analogique (CNA) et elle est convertie en une forme d'onde analogique, le plus souvent sinusoïdale
Pilotage avec ARM TM4C123, contrôle numérique de la fréquence au pas de 1MHz et affichage sur LCD.
[[Fichier:AD9910.pdf]]
'''Projet 2020 : DDS board AD9959 and FPGA  Artix7''' développement d'une carte DDS + uC + FPGA pour les projets mixtes du laboratoire.
[[Fichier:Carte mixte FPGA DDS 2020.pdf]]


<center><font face="Comic Sans MS" color=#0000AA size=5>Développements électroniques autour des expériences atomes froids.</font></center>
4.L'entrée vers le CNA est une série de valeurs échantillonnées, la sortie présente des paliers de quantification.


'''Asservissement numérique de température sur cavité laser ultra-stable (projet 2018)'''
5.Ces paliers produisent des images spectrales en fonction de multiples de la fréquence d'échantillonnage dans le domaine fréquentiel, qui ne sont pas souhaitées.
Asservissement en température numérique d'une cavité ultra-stable au LPL pour le Strontium condition de stabilité +/- 10mK Résultas obtenus : <1mk sur la journée


Compte tenu des constantes de temps d'intégration nous avons opté pour un lock numérique avec un uC 16 bits. ADC et DAC 12 bits
6.Un filtre passe bas placé après le CNA supprime ces réponses spectrales non souhaitées.
MSP430F169 16bits Texas instruments, and IAR Workbench for MSP430 or Code composer studio Cahier des charges: La précision du lock en température devrait être de l'ordre de 10 mK, pour assurer une stabilité en fréquence du laser de l'ordre de quelques kHz. L'élément chauffant a une résistance de 6 Ohm. Un courant de l'ordre de 0.6 A devrait fournir la puissance pour nous amener au point de fonctionnement vers 27°C. Élément de mesure : thermistor MC65F103B


Ci-joint le code C du projet: gestion affiche LCD + calcul température + fonction standby + contrôle de la consigne de température + lock + timer + déclaration des variables + déclaration prototypes + fichier init système (ADC-DAC TIMER-PORT IN OUT)
7.La plage de fréquences de sortie du DDS varie de 0 Hz jusqu'à la limite de Nyquist à f c /2.
[[Fichier:vh6010-4_inst_manual.pdf]]
[[Fichier:Asservissement en température numérique pour cavité laser ultra-stable.pdf|thumb|center]]


'''PID analogique compact pour Peltier diode laser +/-1A''':  [[Fichier:PID analogique pour Peltier.pdf]]
=La fréquence de sortie du DDS est exprimée par l'Équation ci dessous =


'''double régulation DC pour four strontium pour des expériences de gaz quantiques dégénérés''': alimentation Maitre-esclave 2 x 180W gestion avec uC 16 bits et CPLD pour horloge numérique  [[Fichier:Projet_four.pdf]][[Fichier:electronique four Master.pdf]]
1. '''fout :''' est la fréquence de sortie DDS 
   
2. '''M :''' valeur du mot d'accord    -> attention exprimé en Hexadécimal


'''Manipulations d'atomes froids piège magnéto-optique''':  Interrupteurs IGBTS-MOSFETS pour coupure rapide de bobine 100-400A refroidissement eau Projet complet:  [[Fichier:driverigbt.pdf]]
3. '''fc :''' fréquence d'horloge système


'''Lock Laser du type Pound Drever Hall avec DDS AD9959''': Module complet d'asservissement laser [[Fichier:locklaser.pdf]]
4. '''N :''' la longueur de l'accumulateur de phase
[[Fichier:Formule frequence DDS.png|100px|thumb|left]]


'''Boucle de régulation pour alimentation bas bruit pour diode laser (0-1A)'''  générateurs de courant constant pour le Sodium et la puce à atomes alimentation pilotée sur liaison USB-série
[[Fichier:current source.pdf]]


'''Carte uC ARM cortex4 TI TIVA TM4C1294 générique pour pilotage multifonction sur port SPI''' ARM 120MHz, liaison USB-Série, Ethernet (serveur web léger pour uC de TI), encodeur numérique. [[Fichier:Carte_uC_tm4c1294.pdf]]


'''Générateur de courant bas bruit pilotable numériquement''' Version 1 uC 16 bits : Pilotage numérique via encodeur pour réglage I local ou à distance via USB et programme Python: ci-joint code de base pour DAC 12 bits ou 16 bits control SPI. [[Fichier:dac control.pdf]]


Version 2 ci-dessous uC 32 bits: Pilotage numérique via encodeur pour réglage I local ou à distance via USB et programme Python ainsi que par liaison Ethernet : DAC 20 bits  sur liaison SPI =résolution 1uA sur le courant!




[[Fichier:PROTO-20296-T.jpg|200px|thumb|left]]
[[Fichier:Comparatif low noise source.png|200px|thumb|left]]   
[[Fichier:Capture Ethernet.png|200px|thumb|left]]
=Généralités sur les DDS=
Les "Direct Digital Synthesizers" (DDS) sont des synthétiseurs qui peuvent générer des formes d'ondes arbitraires à diverses fréquences à partir d'une fréquence de référence fixe.


Une bonne note expliquant le fonctionnement des DDS se trouve ici :
=Conception avec des circuits intégrés DDS commerciaux=
'''[[Média:Tuto_dds.pdf]]'''
Plusieurs aspects doivent être pris en compte lors de la sélection et de
l'utilisation d'un DDS:
la plage de fréquences requise, la plage d'amplitudes et de décalages, la forme d'onde, la résolution, la capacité de modulation.


[[Fichier:DDS.jpg]]
La pureté du signal constitue généralement un facteur de sélection d’une source de signaux.


= Pourquoi les DDS: Visualisation d'une sortie et programmation=
= Pourquoi les DDS ?=
Depuis quelques années pour les équipes de recherches du Laboratoire de Physique des Lasers (LPL), nous utilisons la technologie DDS pour développer des '''''générateurs radiofréquences de quelques MHz à plusieurs centaines de MHz''''' nécessaires au fonctionnement des expériences, ainsi qu'à l'étude et au développement des Condensats d'atomes froids (BEC).
Depuis quelques années pour les équipes de recherches du Laboratoire de Physique des Lasers (LPL), nous utilisons la technologie DDS pour développer des '''''générateurs radiofréquences de quelques MHz à plusieurs centaines de MHz''''' nécessaires au fonctionnement des expériences, ainsi qu'à l'étude et au développement des Condensats d'atomes froids (BEC).
Cette technologie au travers de composants spécifiques, nous permet de réaliser des cartes électroniques adaptées aux expériences du laboratoire.
Cette technologie au travers de composants spécifiques, nous permet de réaliser des cartes électroniques adaptées aux expériences du laboratoire.
Ligne 84 : Ligne 69 :
Les applications: Générateurs de fonctions, oscillateur local, PLL, driver AOM...
Les applications: Générateurs de fonctions, oscillateur local, PLL, driver AOM...


 
'''Ci-dessous schéma fonctionnel de l'AD9852'''
#Ci-dessous schéma fonctionnel de l'AD9852.
 


[[Fichier:schéma bloc AD9852.png|400px|thumb|left]]
[[Fichier:schéma bloc AD9852.png|400px|thumb|left]]
Ligne 92 : Ligne 75 :
::1.1 Description des principales fonctions d'entrées et de sorties.
::1.1 Description des principales fonctions d'entrées et de sorties.


   '''REFERENCE CLOCK IN''' si l'horloge externe = 20MHz PLL activée x 15 = 300MHz (fréquence du system clock) ou si PLL off horloge  
   '''REFERENCE CLOCK IN''' si l'horloge externe = 20MHz PLL activée x 15 = 300MHz (fréquence du system clock) ou si PLL off horloge externe max =300MHz.
  externe max =300MHz.
   '''MASTER RESET ''' bit actif sur front logic 1 initialise le DDS et met la sortie RF à zéro.
   '''MASTER RESET ''' bit actif sur front logic 1 initialise le DDS et met la sortie RF à zéro.
   '''ANALOG OUT''' est la sortie RF principale 0dBm en général.
   '''ANALOG OUT''' est la sortie RF principale 0dBm en général.
Ligne 108 : Ligne 90 :


Visualisation d'une sortie d'un DDS (AD9852)
Visualisation d'une sortie d'un DDS (AD9852)
                 [[Fichier:Continuité de phase DDS.jpg]]  
                 [[Fichier:Continuité_de_phase_DDSad9852.jpg]]


  Ci-dessus visualisation du changement de la fréquence de sortie d'un DDS sans saut de phase.
  Ci-dessus visualisation du changement de la fréquence de sortie d'un DDS sans saut de phase. Mode de programmation parallèle: en bas de l'écran bus de données(B1) et bus d'adresses(B2).  
Mode de programmation parallèle: en bas de l'écran bus de données(B1) et bus d'adresses(B2).  
  Attention dans cet exemple je ne programme que l'octet de poids fort pour la fréquence et l'amplitude.
  Attention dans cet exemple je ne programme que l'octet de poids fort pour la fréquence et l'amplitude.
  '''En jaune''' signal d'actualisation des données et adresses, '''en rouge''' sortie RF sur 50ohms.
  '''En jaune''' signal d'actualisation des données et adresses, '''en rouge''' sortie RF sur 50ohms.
  '''En vert''' signal WR/SCLK bit de chargement dans I/O port buffers actif sur front descendant et durée minimale programmable = 50ns.
  '''En vert''' signal WR/SCLK bit de chargement dans I/O port buffers actif sur front descendant et durée minimale programmable = 50ns.
  '''En bleu''' I/O UPDATE données transmises au DDS actif sur front montant et durée minimale programmable  = 50ns.
  '''En bleu''' I/O UPDATE données transmises au DDS actif sur front montant et durée minimale programmable  = 50ns.
 
  Les courbes en vert et bleu sont volontairement décalées suivant la procédure de chargement des données fournie dans le datasheet du DDS(page 18 du datasheet AD9852).le mot de fréquence pour ce DDS est codé sur 48 bits et donc 6 Octets avec pour parallel address: 0x04;0x05;0x06;0x07;0x08;0x09 (0x04 Octet de poids fort)ou serial address= 0x02 en mode SPI. le mot d'amplitude pour ce DDS est codé sur 12 bits et donc 2 Octets avec pour parallel address:0x21;0x22;(0x21 Octet de poids fort) ou serial address= 0x07 en mode SPI.
  Les courbes en vert et bleu sont volontairement décalées suivant la procédure de chargement des données fournie dans le
datasheet du DDS(page 18 du datasheet AD9852).le mot de fréquence pour ce DDS est codé sur 48 bits et donc 6 Octets avec  
pour parallel address: 0x04;0x05;0x06;0x07;0x08;0x09 (0x04 Octet de poids fort)ou serial address= 0x02 en mode SPI.
le mot d'amplitude pour ce DDS est codé sur 12 bits et donc 2 Octets avec pour parallel address:0x21;0x22;
(0x21 Octet de poids fort) ou serial address= 0x07 en mode SPI.


Comment programmer un DDS
Comment programmer un DDS
Une des pages importantes dans un datasheet de DDS est la page ''register layout table''.
Une des pages importantes dans un datasheet de DDS est la page ''register layout table''. celle-ci définie tous les registres à utiliser pour programmer l'ensemble des fonctions de bases.
 
celle-ci définie tous les registres à utiliser pour programmer l'ensemble des fonctions de bases.


[[Fichier:Register layout table AD9852.png]]  
[[Fichier:Register layout table AD9852.png|300px]]  
              
              
  En rouge le mot de fréquence f1 programmable 48 bits soit sur 6 Octets.
  En rouge le mot de fréquence f1 programmable 48 bits soit sur 6 Octets.
Ligne 137 : Ligne 108 :
  Ce sont les deux paramètres à programmer à minima pour générer un signal RF en sortie.
  Ce sont les deux paramètres à programmer à minima pour générer un signal RF en sortie.


un DDS utilisé au LPL : l'AD9959
'''un DDS utilisé au LPL : l'AD9959'''
 
[[Fichier:ad9959.jpg|400px|thumb|left]]
 
= Une Application concrète au service électronique du LPL = Un MICROCONTROLEUR 16bits MSP430F169 avec un DDS 4 voies l'AD9959
 
[[Fichier:MSP430 et AD9959.jpeg|400px|thumb|left]]


Comment programmer le DDS
[[Fichier:ad9959.jpg|300px|thumb|left]]


La programmation sur ce DDS est uniquement en mode SPI:


[[Fichier:MSP430 et AD9959.jpeg|300px|thumb|left]]


    Comment programmer le DDS :La programmation sur ce DDS est uniquement en mode SPI
     Single-bit serial 2-wire mode (default mode)
     Single-bit serial 2-wire mode (default mode)
     Single-bit serial 3-wire mode
     Single-bit serial 3-wire mode
Ligne 156 : Ligne 122 :
[[Fichier:SPI MODE.jpg]]
[[Fichier:SPI MODE.jpg]]


Côté MSP430F169 : Les sorties SIMO1 P5.1, UCLK1 P5.3 et ACLK P5.6 sont utilisées pour programmer en mode SPI 2 fils (mode par défaut du DDS)
Côté MSP430F169 : Les sorties SIMO1 P5.1, UCLK1 P5.3 et ACLK P5.6 sont utilisées pour programmer en mode SPI 2 fils (mode par défaut du DDS),Côté DDS AD9959: SCLK, SDIO_0 et CS/ sont à connecter au microcontrôleur. ci-dessous le mode par défaut.SDIO_1,2 et 3 sont connectés au microcontrôleur pour réaliser si on le souhaite, des profiles de rampes de fréquences ou de phases.
 
Côté DDS AD9959: SCLK, SDIO_0 et CS/ sont à connecter au microcontrôleur. ci-dessous le mode par défaut.SDIO_1,2 et 3 sont connectés au  
microcontrôleur pour réaliser si on le souhaite, des profiles de rampes de fréquences ou de phases.


     SCLK = serial clock pin 48 du DDS
     SCLK = serial clock pin 48 du DDS
Ligne 165 : Ligne 128 :
     SDIO_0 = Serial data I/O pin 50 du DDS
     SDIO_0 = Serial data I/O pin 50 du DDS


= Quel microcontrôleur? =
= Quel microcontrôleur pour piloter les DDS ? =
le DDS est programmé par l'intermédiaire d'un microcontrôleur 16 bits de chez TI,le MSP430F169 @8MHz d'horloge.
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 gratuite dans sa version de base.
Je conseil d'acheter le kit de débogage MSP430USB MSP-FET430UIF qui permet un débogage pas à pas pratique.
Bien entendu bien d'autres microcontrôleurs (STM32,TIVA séries...) peuvent êtres utilisés à partir du moment que l'on dispose au moins d'un port SPI.
Un développement récent avec l'AD9959 à été réalisé avec un microcontrôleur ATMEL ARDUINO DUE,microcontrôleur 32 bits ARM @84MHz.
avec chargement SPI 4 fils.
Les dernières cartes développées utilisent un microcontrôleur TEXAS TM4C123GH6PM ARM® Cortex®-M4F Based MCU TM4C123G et TM4C1294@120MHz.


Les différents registres du DDS l'AD9959
l'environnement de programmation du MSP430 est IAR Embedded Workbench téléchargeable gratuitement dans sa version de base avec un code limité @8Ko
table 28 du datasheet de l'AD9959
 
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)
     registre CSR (channel select register)
Ligne 231 : Ligne 196 :
     ...
     ...


=Programme en C écrit dans un microcontrôleur, le MSP430F169=
=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:
initialisation et chargement des registres CSR et CFTW0:


Ligne 259 : Ligne 224 :


Commentaires sur le programme:
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.
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
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


Ligne 382 : Ligne 343 :
   }
   }
</syntaxhighlight>
</syntaxhighlight>
ne pas oublier le fichier DDS_quartz_oscillator.h dans le projet pour compiler le programme.
= Un kit de prototypage ARM TI & MSP430 TI =
[[Fichier:tivaTM4C123.jpg|300px]]
[[Fichier:KITmsp430.jpg|300px]]
=IAR for MSP430: code size limited (8Ko) ou code composer studio for MSP430 =
'''Programme principal sous IAR for MPS430 et fichier Init MSP430F169'''
[[Fichier:IAR for MSP430.jpg|200px|thumb|left]]
[[Fichier:Init MSP430F169.jpg|200px|thumb|left]]
=DDS Card AD9858 on ARM uC TM4C123GH6PM with USB-serial interface@1MHz Baud Rate=
[[Fichier:DDS Card.png|400px|thumb|left|CARTE DDS sur BUS USB-SERIE 1MHz]]
Pour remplacer des cartes d'évaluations Analog device avec un programme souvent non versatile on a développé une source RF entièrement pilotable numériquement
grâce à une interface USB-Série et un programme pour microsoft PC C-sharp (dérivé du C++ et très proche du Java,utilisé notamment pour développer des applications web sur la plateforme ASP.NET.).
La partie hardware se compose d'un DDS AD9858 @1GHz Clock et d'un uC TEXAS INSTRUMENT TM4C123 @80MHz d'horloge.
Un firmware en C à été développé pour le uC qui pilote directement le DDS en mode SPI 3fils @10MHz. L'environnement de programmation est le même que pour le uC développé plus haut, c'est à dire sous IAR Embedded pour ARM.
Le programme envoi donc le mot de fréquence (4 Octets) en mode continu ou en single mode, pour réaliser des balayages de fréquences dont la résolution est définie par le nombre de points et le pas entre deux fréquences envoyées par le programme sous C-sharp.
[[Fichier:Données sur bus serie.png|400px|thumb|left|DONNEES SUR BUS USB-SERIE 1MHz  MOT DE FREQUENCE SUR 4 OCTETS]]
code C firmware pour SPI sur uC TM4C123GH6PM
<syntaxhighlight lang="c">
void ssi0PutData( int instruction,long data,int num_byte)
  {
  int i=0;
  SSI0_DR_R =  instruction;
    while( num_byte )
    {
          while(!(SSI0_SR_R & SSI_SR_TNF)) {} // wait until there is space to write in the buffer
          SSI0_DR_R =  data >>(num_byte-1-i)*8;
          num_byte--;         
    }
   
    while( !( SSI0_SR_R & SSI_SR_TNF ) )
          {
            ;
          }
    }
void init_SPI0(void)
    {
    // Enable Peripheral SSI0
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); //Enable GPIO port A pins which are used for SSI0.
    SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI0);
    GPIOPinConfigure(GPIO_PA2_SSI0CLK);
    //GPIOPinConfigure(GPIO_PA3_SSI0FSS);
    GPIOPinConfigure(GPIO_PA5_SSI0TX);
    //GPIOPinTypeSSI(GPIO_PORTA_BASE, GPIO_PIN_5 | GPIO_PIN_3 | GPIO_PIN_2);
    GPIOPinTypeSSI(GPIO_PORTA_BASE, GPIO_PIN_5 | GPIO_PIN_2);
    SSIConfigSetExpClk(SSI0_BASE, SysCtlClockGet(), SSI_FRF_MOTO_MODE_0, SSI_MODE_MASTER, 10000000, 8);
    SSIEnable(SSI0_BASE); // Enable the SSI
    }
</syntaxhighlight>
[[Fichier:VISUALISATION SIGNAL RF.png|400px|thumb|left|CARTE DDS sur BUS USB-SERIE 1MHz]]
code C pour initialiser le port série
<syntaxhighlight lang="c">
void init_UART0(void)
{
  // Enable Peripheral UART0
  SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
  SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
  GPIOPinConfigure(GPIO_PA0_U0RX);
  GPIOPinConfigure(GPIO_PA1_U0TX);
  GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
  UARTConfigSetExpClk(UART0_BASE, SysCtlClockGet(), 1000000,                     
  (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE));
}
</syntaxhighlight>
Routine pour les données reçus et transmises
<syntaxhighlight lang="c">
void UART0_send(void)
  {
  temp[t++] = UART_InChar(); //Read from buffer
  if(t >3)
    {  write_immediate();
        for(t=0;t<4;t++)
        {
        UART_OutChar(temp[i++]);
        }
        t = 0; //Reset read length
        i = 0;
    }
    }
</syntaxhighlight>
=DDS Card AD9852 and AD9858 sur NI Card DIO 32=
Description du projet
Pour une nouvelle expérience du laboratoire, nous avons développé de nouvelles cartes électroniques qui utilisent des composants DDS contrôlés par un ordinateur sur un bus de données numériques.
La carte numérique qui contrôle le bus est la carte DIO 32 HS de National Instrument.
Ces sources RF programmables à base de technologie DDS seront mises en œuvre sur la nouvelle expérience des atomes froids de l’équipe Gaz Quantique Dipolaire pour conduire les AOM de l'expérience.
Pour contrôler les cartes, un programme simple sous LABVIEW a été développé.
La principale motivation de ce projet était de construire un système de contrôle pour l'expérience qui permet d'intégrer de nombreuses fonctions avec une interface utilisateur.
Les cartes DDS permettront de contrôler avec une bonne synchronisation les différents AOM.
Le bus de données :
Le bus est un bus parallèle de 25 lignes qui est transféré avec un câble plat de 50 lignes, de sorte que les lignes de masses et les lignes de signaux sont alternées. La vitesse du bus dépend des caractéristiques des cartes NI fournies soit de l’ordre de 1/10MHz soit 100ns.
Les 16 premières lignes du bus sont les lignes des données et les huit dernières lignes correspondent aux adresses d’appareils (255 en théorie mais 6 bits en pratique et donc 64 appareils adressables).
Enfin, la dernière ligne (ligne 25) est l'horloge (STROBE) qui contrôle le débit de données qui est transmis sur le bus. Ce signal met à jour les données et les adresses sur le bus.
Ce signal d'horloge doit être présent sur le bus.
Programmation des DDS :
 
Les huit premières lignes de données transmises au DDS sont les DATA : D0-D7
Les huit secondes lignes  transmises au DDS sont les ADRESSES : A0-A5 et  A6-A7  pour les modes FSK et OSK de l’AD9852 et PS0 PS1 pour l’AD9858.
Les huit dernières lignes permettent le décodage d’adresses : decodeA2-decodeA7
Décode au maximum 64 cartes.
Les lignes decodeA0 et decodeA1, sont utilisées pour initialisées le DDS de tel sorte que :
<syntaxhighlight lang="c">
  A1 A0 = 00 :  Master reset DDS
  A1 A0 = 01 :  Load data  DDS
  A1 A0 = 10 :  I/O update DDS  non utilisé  si  I/O  Update interne.
  A1 A0 = 11 :  non utilisé
</syntaxhighlight>
[[Fichier:Châssis 19 pouces.png|400px|thumb|left|CARTES DDS sur BUS NI and DIO32 Card]]
Pour initialiser les cartes DDS et transférer les données aux DDS via le bus nous utilisons des composants programmables du type CPLD (circuit logique programmable) associés à des translateurs de niveaux pour passer du niveau TTL (5v) au niveau LVCMOS (3.3v).
Le composant utilisé est un CPLD de la famille XILINX XC2C64A 64 cellules.
Ce composant initialise la carte DDS, assure le décodage d’adresses d’appareils, et surtout la synchronisation des pins du DDS (MASTER RESET, LOAD DATA et I/O UPDATE).
Les cartes DDS disposes de deux CPLD le premier en bas (CPLD1) de la carte pour la synchronisation et l’initialisation du DDS, le deuxième (CPLD2) recopie les données en entrée du bus après autorisation du CPLD1.
La programmation des CPLD se fait grâce à l’environnement ISE design suite 14 ou ultérieur téléchargeable gratuitement sur le site de XILINX (ISE WEB PACK) ;
Ci-joint dans ce document les codes sources pour charger les deux CPLD. Un câble JTAG-USB est indispensable pour la programmation.
[[Fichier:AD9852.png|400px|thumb|left|CARTES DDS AD9852 sur BUS NI and DIO32 Card]]
[[Fichier:ad9858.png|400px|thumb|left|CARTES DDS AD9858 sur BUS NI and DIO32 Card]]
BUS en fond de panier 25 lignes dont la fréquence de rafraîchissement est d'environ 10MHz et limité par la carte DIO 32 ancienne génération.
Chaque carte a une adresse propre (64 max). Le SWITCH DIP 8 sur la carte défini celle-ci.Le code VHDL pour les deux CPLD est simple et modifiable si nécessaire.
'''VHDL pour  CPLD1 carte DDS AD9852 et bus NI'''  [[Fichier:VHDL.pdf]]
Nous avons utilisé une carte FPGA indépendante pour tester les cartes DDS sans le bus numérique : kit utilisé spartan 6 CMODS6. avril 2019'''
[[Fichier:Carte spartan 6 test bus.png|400px|thumb|left]]
<syntaxhighlight lang="vhdl">
  library IEEE;
  use IEEE.STD_LOGIC_1164.ALL;
  use IEEE.STD_LOGIC_ARITH.ALL;
  use IEEE.STD_LOGIC_UNSIGNED.ALL;
  -- programme pour tester le bus parallèle et les cartes DDS AD9852--
  entity XILINX_DDS_AD9852 is
  Port (
  MASTER_CLOCK : in STD_LOGIC;
  reset : in STD_LOGIC;
  dout : out std_logic_vector(7 downto 0);
  d_address : out std_logic_vector(7 downto 0);
  BP0 : in STD_LOGIC;
  DECODE_A0_A1_IN : in STD_LOGIC_VECTOR (1 downto 0);
  ADDRESS_BUS_CARD_in : in STD_LOGIC_VECTOR (5 downto 0);
  ADDRESS_BUS_CARD : out STD_LOGIC_VECTOR (5 downto 0);
  DECODE_A0_A1_OUT : out STD_LOGIC_VECTOR (1 downto 0);
  OUTPUT_GND : out STD_LOGIC_VECTOR (15 downto 0)
  );
  end XILINX_DDS_AD9852;
  architecture Behavioral of XILINX_DDS_AD9852 is
  TYPE mem_data IS ARRAY (0 TO 7) OF std_logic_vector(7 DOWNTO 0);
  --déclaration de zone mémoire pour les datas--
  TYPE mem_address IS ARRAY (0 TO 7) OF std_logic_vector(7 DOWNTO 0);
  --déclaration de zone mémoire pour les adresses--
  SIGNAL count_1MHz : integer := 255; --déclaration d'un compteur 8 bits--
  SIGNAL clock_1MHz_int : STD_LOGIC :='0'; -- signal issus du  diviseur d'horloge--
  SIGNAL compte : STD_LOGIC_VECTOR (3 DOWNTO 0):="0000";
  constant data : mem_data := (
  ("01001111"), --data PLL x 15 clk = 20MHz x15= 300MHz
  ("00001111"), --data amplitude;
  ("00001000"), --Fout = 10MHz AD9852
  ("10001000"), --Fout = 10MHz AD9852
  ("10001000"), --Fout = 10MHz AD9852
  ("10001000"), --Fout = 10MHz AD9852
  ("10001000"), --Fout = 10MHz AD9852
  ("10001000")); --Fout = 10MHz AD9852
  constant address : mem_address := (
  ("00011110"), -- adresse HEX=0x1E; AD9852 parallel address
  ("00100001"), -- adresse HEX=0x21; AD9852 parallel address
  ("00001001"), -- adresse HEX=0x09; AD9852 parallel address
  ("00001000"), -- adresse HEX=0x08; AD9852 parallel address
  ("00001101"), -- adresse HEX=0x07; AD9852 parallel address
  ("00000110"), -- adresse HEX=0x06; AD9852 parallel address
  ("00000101"), -- adresse HEX=0x05; AD9852 parallel address
  ("00000100")); -- adresse HEX=0x04; AD9852 parallel address
  begin
  -- GND ----------
  OUTPUT_GND <= (others => '0');
  ADDRESS_BUS_CARD <= ADDRESS_BUS_CARD_in; --adresse de décodage des DDS--
  DECODE_A0_A1_OUT <= DECODE_A0_A1_IN; -- initialisation des  données à transmettre A0 A1--
  --STROBE_out <= clock_1MHz_int;
  --Diviseur par 50 50MHz/50 = 1MHz
  PROCESS
  BEGIN
  wait until MASTER_CLOCK'EVENT and MASTER_CLOCK = '1';
  IF count_1MHz < 50 THEN
  count_1MHz <= count_1MHz + 1;
  ELSE
  count_1MHz <= 0;
  END IF;
  IF count_1MHz < 25 THEN
  clock_1MHz_int <='0';
  ELSE
  clock_1MHz_int <='1' ;
  end if;
  end process;
  --compteur et envoi des datas sure le bus parallèle--
  process(clock_1MHz_int,reset)
  begin
  if reset ='1' then
  compte <= "0000";
  dout <="00000000";
  d_address <="00000000";
  elsif clock_1MHz_int'event and clock_1MHz_int='1' then
  IF compte < 8 and BP0 ='1' THEN
  dout <= data(CONV_INTEGER(compte));
  d_address <= address(CONV_INTEGER(compte));
  end if;
  IF compte > 7 THEN
  compte <= "0000";
  ELSE
  compte <=compte + 1;
  END IF;
  end if;
  end process;
  end Behavioral;
  </syntaxhighlight>
=Projet STRONTIUM antenne RF 375-400MHz=
Projet Antenne RF: RF CARD 375 to 400MHz Frequency Sweep control for RF antenna.
Le but est de générer des sweeps de fréquence arbitraire pour une antenne RF dans la gamme de fréquence 375 à 400 MHz avec des pas de qqs KHz.
J'utilise deux DDS , l'AD9911 pour asservir un VCO ultra low noise à 1GHZ (ROS-1000-519+) minicircuits et le second l'AD9858 pour générer
les fréquences arbitraires. Ce dernier est “clocké” grâce au 1GHz provenant du VCO sur la carte.
J'utilise également le MSP430F169 pour piloter les deux DDS en mode SPI 2wire single bit (bus SPI commun, un master et deux slaves en utilisant le chip select (CS) de chaques DDS).
[[Fichier:Générateur de rampe.png]]
Caractéristiques
Programmation en mode SPI  maître-esclave 2-wire mode single-bit.
L’AD9911 et l’AD9858 en mode esclaves via les Chip Select (CS).
Horloge commune le ROS-1000C-519@1GHz.
Pente de la rampe de fréquence programmée via l’interface CVI.
TTL externe commande rampe  up et rampe  down.
Nécessite un signal d’horloge externe 10MHz  5dBm.
Une sortie RF (AD9858) programmable 0-400MHz  0dBm.
=Projet diffusion Raman expérience CHROME=
Conception et réalisation d'un ensemble de deux pilotes acous-optiques d'une puissance unitaire de 2W. L'objectif est de régler le
décalage en fréquence de deux faisceaux "Raman" corrélés en phase. Réalisation de deux sources RF@80MHz en corrélation de phase avec
une fréquence centrale de 80MHz. Pilotage sur liaison USB-Série@10MHz (en cours de tests). Les signaux RF sont synchronisés sur une
même horloge@500MHz à l'aide d'un DDS AD9959 qui dispose de plusieurs sorties RF basse puissance (5dBm).Les circuits sont implémentés
sur des cartes au format Europe et insérées dans un châssis 19 pouces entièrement réalisé à l'atelier d'électronique.
[[Fichier:carte DDS ad9959.png|400px]]
=DDS pour détection synchrone et asservissement PDH=
Système de lock laser sur cavité ultra stable voir synoptique ci-dessous:
[[Fichier:PDH AD9959.png]]
DDS card for PDH AD9959 on uC TM4C123 and LCD 2x16 and codeur Gray
[[Fichier:AD9959 PDH 43.png|200px]]
[[Fichier:AD9959 PDH 45.png|200px]]
'''Même si l'encodeur est utilisé dans un programme en c je fourni pour les amateurs de VHDL le programme pour l'encodeur numérique.VHD''' [[Fichier:encodeur.pdf]]
[[Fichier:Encodeur 24 pas.png|vignette|300px|left]]
 
[[Fichier:State machine encodeur.png|400px]]
Programme ARM for PDH [[Fichier:Programme uC TM4C123GH6PM for PDH module.pdf]]
'''Carte partie Lock'''
[[Fichier:Carte lock PDH.png|200px|thumb|left]]
'''Carte partie DDS'''
[[Fichier:PDH card.png|200px|thumb|left]]
= Double DDS AD9959 sur port SPI quad @60MHz Projet 2019 avec interface graphique Python=
Développement 2019 : Piège RF
Pour des considérations de vitesse d’exécution et de chargement des données nous avons fait évoluer les cartes DDS pour l'expérience BEC du LPL. La programmation des DDS est réalisé en Quad SPI à une vitesse de 60MHz.
les données sont transmises au uC (ARM 120MHz) grâce à l'interface USB-UART non représentée sur le PCB ci-dessous à une vitesse de 10Mbps.
8 sorties RF programmables révision 1 2018: Code C pour les routines principales:  [[Fichier:code c routine principales.pdf]]
[[Fichier:Double DDS 2018.JPG|300px]]
 
Mesures double DDS 2019
Ci-joint une copie d'écran du taux de transfert en mode 4 fils SPI qui montre la vitesse max des datas sur le port SPI. CLK SPI 60MHz.
Test avec des liaisons SPI courtes sur une carte DDS AD9959 voie 0 et 1 activées.
En rouge : I/O Update
En jaune : CLK data SPI 2 coups d'horloge / Octet transmis.
En bleu et vert : chanel 0 et chanel 1.
[[Fichier:Scope 6.jpg|300px]]
Sous Altium 2019 4 couches et plan de masse interne 35um Alimentation +5v, consommation 0.6A  double DDS 2019.
[[Fichier:New dds board 2019.png|300px|thumb|left]]
[[Fichier:Double dds board 2019.png|300px|thumb|left]]
'''Programme Python pour la liaison USB-Série :''' Pour charger les fréquences et les amplitudes des sorties RF j'ai utilisé Pyserial et Python 3.7
Ci-dessous le code Python éditer avec l'IDE Thonny ( pour les débutants comme moi c'est pas mal ;) !)


il suffit d'installer Python 3.7 puis d'importer la bibliothèque PySerial.  
= Différentes cartes de développement : MSP430 - ARM TI - STM32 - Arduino =
 
[[Fichier:tivaTM4C123.jpg|250px]]
IMPORTANT : le code c pour transmettre et recevoir les données via l'UART ci-dessous un exemple:
[[Fichier:KITmsp430.jpg|250px]]
  <syntaxhighlight lang="c">
[[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




  void write_immediate()  //AD9959
[[Fichier:cubemx.png|600px]] ide Cube MX for STM32
  { 
  //frequency DDS0//
  frequency_value_f1_DDS0 = temp[3]<<24|temp[2]<<16|temp[1]<<8|temp[0];
  FTW0_DDS0 = frequency_value_f1_DDS0 * 4294967296 / 500000000; //Convert to command for DDS  //ad9959
 
  frequency_value_f2_DDS0 = temp[7]<<24|temp[6]<<16|temp[5]<<8|temp[4];
  FTW1_DDS0 = frequency_value_f2_DDS0 * 4294967296 / 500000000; //Convert to command for DDS  //ad9959
 
  frequency_value_f3_DDS0 = temp[11]<<24|temp[10]<<16|temp[9]<<8|temp[8];
  FTW2_DDS0 = frequency_value_f3_DDS0 * 4294967296 / 500000000; //Convert to command for DDS  //ad9959
 
  frequency_value_f4_DDS0 = temp[15]<<24|temp[14]<<16|temp[13]<<8|temp[12];
  FTW3_DDS0 = frequency_value_f4_DDS0 * 4294967296 / 500000000; //Convert to command for DDS  //ad9959


  ....
= 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 ! 
  //*****************************************************************************
  //
  //          The UART interrupt handler.
  //
  //*****************************************************************************
  void UARTIntHandler(void)
{
    uint32_t ui32Status;
    ui32Status = UARTIntStatus(UART0_BASE, true);
    UARTIntClear(UART0_BASE, ui32Status);
 
  while(UARTCharsAvail(UART0_BASE)) //loop while there are chars
    {
      //send data to uC via USB/Uart for change one output frequency ( 4 octets)
      temp[t++] = UART0_DR_R; //Read from buffer
          if(t >...)
            {
              write_immediate();
              t = 0; //Reset read length
            }
    }
  }


  </syntaxhighlight>
Pour ceux qui veulent se lancer dans la CAO. Un tutoriel simple et une prise en main rapide du logiciel Altium designer 20


  Code Python:  [[Fichier:code python.pdf]]
[[Fichier:maxresdefault.jpg|500px]]  [[Fichier:CAO Electronique_Fabrice_Wiotte 2020.pdf]]
   Code Python avec l'interface graphique [[Fichier:code python avec l'interface numérique.pdf]]
[[Fichier:Interface tkinter.png|600px|thumb|left]]


= 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]]


= DDS AD9852 sur port SPI 10MHz Projet 2019 avec interface graphique pour modulation FSK AOM@80MHz=
=General Note on the DDS card and on the BUS driver 2014 & update 2022=
    Objectif: remplacer un pilote acousto-optique analogique et un générateur de fonction arbitraire par une DDS programmable et modulé en fréquence (FSK) l'AOM autour d'une raie centrale@80MHz.
Présentation de l'architecture BUS DDS, communication parallèle pour le pilotage de 24 DDS sous Labview
  - modulation continue interne.
[[Fichier:NoteBusDDS LPL Strontium.pdf ]]
  - une fréquence de modulation autour de 100 kHz, réglable ; actuellement on utilise 110 kHz, une amplitude de modulation allant jusqu'à 500 kHz, réglable.
<gallery>
fsk and AD9852.jpg|dds board
INTERFACE GRAPHIQUE FSK MODULATION.jpg|soft '''la dernière version est sous python 3.7'''
</gallery>
Ci-joint code c pour le µC arm TM4C123: [[Fichier:code ARM modulation FSK.pdf]]

Dernière version du 18 août 2022 à 09:53



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.Contacter l'animateur du Groupe DDS par mail Fabrice.wiotte@univ-paris13.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.

Généralités sur les DDS

Les "Direct Digital Synthesizers" (DDS) sont des synthétiseurs qui peuvent générer des formes d'ondes arbitraires à diverses fréquences à partir d'une fréquence de référence fixe.

Un synthétiseur de fréquence est par extension un instrument qui permet de générer, dans une gamme de fréquences donnée, un signal dont on peut ajuster la fréquence et l’amplitude et auquel il peut être imposé une modulation de fréquence, de phase ou d’amplitude.

Une bonne note Analog device expliquant le fonctionnement des DDS se trouve ici : Média:Tuto_dds.pdf

Principe

1.Le mot d'accord fixe la taille de palier de l'incrément du compteur. Celui ci détermine la fréquence de la forme d'onde de sortie.

2.L'accumulateur de phase présente généralement entre 24 et 48 bits. Ce nombre représente le nombre de valeurs de phase entre 0 et 2p radians, ou l'incrément de phase réalisable.

3.La table de sortie phase amplitude est envoyée vers un convertisseur numérique analogique (CNA) et elle est convertie en une forme d'onde analogique, le plus souvent sinusoïdale

4.L'entrée vers le CNA est une série de valeurs échantillonnées, la sortie présente des paliers de quantification.

5.Ces paliers produisent des images spectrales en fonction de multiples de la fréquence d'échantillonnage dans le domaine fréquentiel, qui ne sont pas souhaitées.

6.Un filtre passe bas placé après le CNA supprime ces réponses spectrales non souhaitées.

7.La plage de fréquences de sortie du DDS varie de 0 Hz jusqu'à la limite de Nyquist à f c /2.

La fréquence de sortie du DDS est exprimée par l'Équation ci dessous

1. fout : est la fréquence de sortie DDS

2. M : valeur du mot d'accord -> attention exprimé en Hexadécimal

3. fc : fréquence d'horloge système

4. N : la longueur de l'accumulateur de phase




Conception avec des circuits intégrés DDS commerciaux

Plusieurs aspects doivent être pris en compte lors de la sélection et de l'utilisation d'un DDS: la plage de fréquences requise, la plage d'amplitudes et de décalages, la forme d'onde, la résolution, la capacité de modulation.

La pureté du signal constitue généralement un facteur de sélection d’une source de signaux.

Pourquoi les DDS ?

Depuis quelques années pour les équipes de recherches du Laboratoire de Physique des Lasers (LPL), nous utilisons la technologie DDS pour développer des générateurs radiofréquences de quelques MHz à plusieurs centaines de MHz nécessaires au fonctionnement des expériences, ainsi qu'à l'étude et au développement des Condensats d'atomes froids (BEC). Cette technologie au travers de composants spécifiques, nous permet de réaliser des cartes électroniques adaptées aux expériences du laboratoire. Ces dernières sont entièrement pilotable numériquement, on peut ainsi programmer les paramètres principaux tel que la fréquence, la phase et l’amplitude. Les caractéristiques de ces composants font qu’ils disposent d'une grande pureté spectrale, d’une grande stabilité, d’un faible bruit de phase et d’une grande agilité en fréquence sans saut de phase. Les applications: Générateurs de fonctions, oscillateur local, PLL, driver AOM...

Ci-dessous schéma fonctionnel de l'AD9852

1.1 Description des principales fonctions d'entrées et de sorties.
 REFERENCE CLOCK IN si l'horloge externe = 20MHz PLL activée x 15 = 300MHz (fréquence du system clock) ou si PLL off horloge externe max =300MHz.
 MASTER RESET  bit actif sur front logic 1 initialise le DDS et met la sortie RF à zéro.
 ANALOG OUT est la sortie RF principale 0dBm en général.
 I/O UPDATE CLOCK est le bit de chargement des données dans le DDS (par défaut généré en interne et synchronisé sur system clock.
 FSK/BPSK/HOLD bit actif sur front logic 1 lance les rampes de fréquences en autres.
 OSK bit actif sur front logic 1 lance les rampes d'amplitudes.
 8-BIT PARALLEL LOAD bus 8bits pour chargement des données actif si mode parallèle sélectionné.
 6-BIT ADDRESS OR SERIAL PROGRAMMING bus 6bits pour chargement des adresses en mode parallèle sinon utiliser seulement bit A0 pour
 le mode SPI. 
 SERIAL/PARALLEL SELECT bit de sélection des modes de programmation du DDS: = 1 si chargement parallèle, 0 si chargement série(pin
 70 du DDS).
 DIFF/SINGLE SELECT bit de sélection single ended or differential clock input. pin 64 du DDS.
 WRITE OR WR/SCLK si mode Parallèle => bit de chargement I/O port buffers, actif sur front descendant ou SCLK en mode SPI.

Visualisation d'une sortie d'un DDS (AD9852)

               
Ci-dessus visualisation du changement de la fréquence de sortie d'un DDS sans saut de phase. Mode de programmation parallèle: en bas de l'écran bus de données(B1) et bus d'adresses(B2). 
Attention dans cet exemple je ne programme que l'octet de poids fort pour la fréquence et l'amplitude.
En jaune signal d'actualisation des données et adresses, en rouge sortie RF sur 50ohms.
En vert signal WR/SCLK bit de chargement dans I/O port buffers actif sur front descendant et durée minimale programmable = 50ns.
En bleu I/O UPDATE données transmises au DDS actif sur front montant et durée minimale programmable  = 50ns.
Les courbes en vert et bleu sont volontairement décalées suivant la procédure de chargement des données fournie dans le datasheet du DDS(page 18 du datasheet AD9852).le mot de fréquence pour ce DDS est codé sur 48 bits et donc 6 Octets avec pour parallel address: 0x04;0x05;0x06;0x07;0x08;0x09 (0x04 Octet de poids fort)ou serial address= 0x02 en mode SPI. le mot d'amplitude pour ce DDS est codé sur 12 bits et donc 2 Octets avec pour parallel address:0x21;0x22;(0x21 Octet de poids fort) ou serial address= 0x07 en mode SPI.

Comment programmer un DDS Une des pages importantes dans un datasheet de DDS est la page register layout table. celle-ci définie tous les registres à utiliser pour programmer l'ensemble des fonctions de bases.

En rouge le mot de fréquence f1 programmable 48 bits soit sur 6 Octets.
En bleu le mot d'amplitude programmable sur 12 bits soit sur 2 Octets.
Ce sont les deux paramètres à programmer à minima pour générer un signal RF en sortie.

un DDS utilisé au LPL : l'AD9959


    Comment programmer le DDS :La programmation sur ce DDS est uniquement en mode SPI
    Single-bit serial 2-wire mode (default mode)
    Single-bit serial 3-wire mode
    2-bit serial mode
    4-bit serial mode (SYNC_I/O not available)

Côté MSP430F169 : Les sorties SIMO1 P5.1, UCLK1 P5.3 et ACLK P5.6 sont utilisées pour programmer en mode SPI 2 fils (mode par défaut du DDS),Côté DDS AD9959: SCLK, SDIO_0 et CS/ sont à connecter au microcontrôleur. ci-dessous le mode par défaut.SDIO_1,2 et 3 sont connectés au microcontrôleur pour réaliser si on le souhaite, des profiles de rampes de fréquences ou de phases.

   SCLK = serial clock pin 48 du DDS
   CS/  =  Chip select pin 47  du DDS
   SDIO_0 = Serial data I/O pin 50 du DDS

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:

    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

dans le main

    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

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

#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
    }

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

      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);
      }

Un code complet pour charger le DDS avec le MSP430F169

  #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; 
   } 
   }

Différentes cartes de développement : MSP430 - ARM TI - STM32 - Arduino

Environnement de programmation : IAR for MSP430 & ARM, code composer studio for MSP430 & ARM, IDE cube for STM32...

IAR for MSP

IAR for ARM


Code Composer Studio for ARM or MSP


ide Cube for STM32


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: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: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.

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: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.


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:

Carte DDS sur uC TI ARM TM4C1294 et serveur TCP-IP pour microcontrôleur développé par Texas Instruments.


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

Carte DDS AD9852 ou AD9858 sur fond de panier

Carte uC ARM TM4C1294, USB-sérial et Ethernet TCP-IP

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