[ESP32] : Générateur de fréquence Si5351

13 novembre 2022 rdorigny 0 commentaires

Le composant électronique Si5351 est une petit puce fabriquée par Silicon Labs capable de générer des fréquences d'horloge entre 8khz et 160Mhz. On la trouve sur des petites plaques PCB pour quelques euros. J'en ai donc acheté une pour la tester.

Le Si5351 est très riche en fonctionnalités, impossible de tout détailler, mais je vais vous montrer comment on l'utilise avec un ESP32.





1) Présentation

Le Si5351 est un générateur d'horloge, configurable par le protocole I2C, qui peut-être associé à un cristal de 25Mhz ou 27Mhz. Basé sur un diviseur fractionnaire MultiSynth haute résolution PLL/VCXO, il peut générer n'importe quelle fréquence jusqu'à 160 MHz sur chacun des ses sorties avec une erreur de 0 ppm théorique (selon la fiche commerciale...). Trois versions du Si5351 sont disponibles pour répondre à une grande variété d'applications. Il existe trois versions différentes A,B et C) du Si5351.



Je ne rentre pas trop dans le détail, le datasheet du Si5351 est ici si vous souhaitez plus de précisions. Mais ce composant est une vraie mine à idées!

2) Utilisation

J'ai trouvé une mini-plaquette sur Aliexpress pour quelques euros qui va nous permettre de tester facilement cette puce CMS. J'ai l'impression qu'il s'agit d'une copie chinoise d'une version du PCB Adafruit. A noter que la puce sur ce PCB est la version A.

Le Si5351 ne dispose pas de mémoire de stockage, il faut donc le piloter avec un microcontrôleur pour fixer les fréquences d'oscillations des trois sorties. Pour ce faire j'utilise un ESP32, mais d'autres solutions sont possibles, à vous de voir selon vos habitudes.

Le schéma de câblage avec l'ESP32 est assez basique. Juste un point, j'ai préféré mettre deux résistances (environ 5K ohms) de pull-up sur les entrées SDA et SCL afin d'être conforme avec le protocole I2C.


Quelques photos pour donner une idée du montage.


Pour la programmation, j'ai opté pour la librairie Adafruit_SI5351.h qui est fonctionnelle pour les ESP32, et simplement repris l'exemple principal en l'adaptant un peu. Vous la trouverez facilement dans l'IDE Arduino avec le mot clé Si5351 dans le gestionnaire de librairies.
#include 'Adafruit_SI5351.h'

Adafruit_SI5351 clockgen = Adafruit_SI5351();

/**************************************************************************/
/*
    Arduino setup function (automatically called at startup)
*/
/**************************************************************************/
void setup(void)
{
  Serial.begin(57600);
  Serial.println("Si5351 Clockgen Test"); Serial.println("");

  /* Initialise the sensor */
  if (clockgen.begin() != ERROR_NONE)
  {
    /* There was a problem detecting the IC ... check your connections */
    Serial.print("Ooops, no Si5351 detected ... Check your wiring or I2C ADDR!");
    while(1);
  }

  Serial.println("OK!");

  /* INTEGER ONLY MODE --> most accurate output */
  /* Setup PLLA to integer only mode @ 900MHz (must be 600..900MHz) */
  /* Set Multisynth 0 to 112.5MHz using integer only mode (div by 4/6/8) */
  /* 25MHz * 36 = 900 MHz, then 900 MHz / 8 = 112.5 MHz */
  Serial.println("Set PLLA to 900MHz");
  clockgen.setupPLLInt(SI5351_PLL_A, 36);
  Serial.println("Set Output #0 to 112.5MHz");
  clockgen.setupMultisynthInt(0, SI5351_PLL_A, SI5351_MULTISYNTH_DIV_8);

  /* FRACTIONAL MODE --> More flexible but introduce clock jitter */
  /* Setup PLLB to fractional mode @616.66667MHz (XTAL * 24 + 2/3) */
  /* Setup Multisynth 1 to 13.55311MHz (PLLB/45.5) */
  clockgen.setupPLL(SI5351_PLL_B, 24, 2, 3);
  Serial.println("Set Output #1 to 13.553115MHz");
  clockgen.setupMultisynth(1, SI5351_PLL_B, 45, 1, 2);
  
  //Pour avoir une fréquence de 10Mhz
  //clockgen.setupPLL(SI5351_PLL_B, 24, 0, 1);
  //Serial.println("Set Output #1 to 10 MHz");
  //clockgen.setupMultisynth(1, SI5351_PLL_B, 60, 0, 1);

  /* Multisynth 2 is not yet used and won't be enabled, but can be */
  /* Use PLLB @ 616.66667MHz, then divide by 900 -> 685.185 KHz */
  /* then divide by 64 for 10.706 KHz */
  /* configured using either PLL in either integer or fractional mode */

  Serial.println("Set Output #2 to 10.706 KHz");
  clockgen.setupMultisynth(2, SI5351_PLL_B, 900, 0, 1);
  clockgen.setupRdiv(2, SI5351_R_DIV_64);

  /* Enable the clocks */
  clockgen.enableOutputs(true);
}

/**************************************************************************/
/*
    Arduino loop function, called once 'setup' is complete (your own code
    should go here)
*/
/**************************************************************************/
void loop(void)
{
}
Alors les résultats sont assez différents selon la méthode de génération de la fréquence. En effet, les synthétiseurs génèrent des fréquences dérivées d'une fréquence de référence, cristal de 25 MHz pour ma plaquette. Afin de fournir une fréquence précise le Si5351 dispose d'un diviseur de fréquence mais son utilisation en fonction de la précision demandée va générer un glissement de phase ou une dispersion temporelle (gigue ou jitter). Au final, le signal sera plus ou moins bruité en fonction du nombre de divisions nécessaires pour produire la fréquence demandée. Les circuits synthétiseur et diviseur produisent plus de parasites et de bruit de phase lorsqu'ils fonctionnent en mode fractionnaire qu'en mode entier.

Pour illustrer ce phénomène, je vous propose quelques exemples :
  • 10Mhz bruitée du fait d'une forte utilisation du diviseur ;
  • une division entière par 8 de la PLLA (900/8=112.5Mhz) ;
  • une division mixte division mixte de la PLLB (616.666Mhz/900 puis une division entière par 64 ce qui donne 10.706Khz).



  • La fréquence de 112Mhz est bien moins bruitée que celle 10Mhz. En revanche, ma sonde d'oscilloscope n'a pas assez de bande passante ce qui explique l'arrondissement du signal qui n'existe pas dans les faits je pense. Le site https://rfzero.net/documentation/tools/si5351a-frequency-tool/ propose un outil permettant de calculer les diviseurs des PLL pour obtenir une fréquence particulière

    Conclusion

    Nous avons vu que le Si5351 permet de produire des fréquences jusqu'à 160Mhz, ce qui en fait un composant digne d'intérêt pour un faible coût.

    On peut imaginer de nombreux cas d'usage de ce synthétiseur de fréquence dans les domaines de la radiofréquence ou plus généralement de la HF. Vous trouverez dans les liens ci-dessous, un très bon exemple de ce qui peut-être fait.

    Liens utiles :
  • https://rfzero.net/tutorials/si5351a/
  • https://www.youtube.com/watch?v=KSovEpCmWY0
  • https://www.hackster.io/mircemk/universal-vfo-10-khz-160-mhz-with-retro-analog-scale-c7c5b6
  • https://www.youtube.com/watch?v=bFsgLVcUX_c&t=816s











  • Pseudonyme (obligatoire) :
    Adresse mail (obligatoire) :
    Site web :




    © 2022 www.doritique.fr par Robert DORIGNY