Mesurer la fréquence d'un Arduino avec Processing

Bonjour,

Je vous propose en partage ici un petit programme de mesure de la fréquence de votre Arduino avec votre PC en utilisant Processing (Processing est un IDE gratuit dont c'est inspiré Arduino).

Pourquoi?
Les Arduino sont sensés être cadencé à 16MHz, cependant ils comportent souvent un SWF à la place du quartz qui n'est pas très précis.

Limite du programme:
Windows n'étant pas un OS orienté temps réel, les mesures sont assez longues. De plus la précision est limitée par celle du quartz de votre PC.
On peut espérer une précision de l'ordre de 0,01%.

Avantage:
ne nécessite aucun composant externe.

Note: dans la cas d'un Arduino pro 8MHz, il faut diviser le résultat par deux.

Code Arduino:

void setup() {
  Serial.begin(115200);
}

void loop() {
  static uint32_t t = micros();

  while (micros() - t < 16000000);
  t += 16000000;
  Serial.write('1'); // envoi un octet sur le port série toutes les 16 secondes
}

Code Processing:

import processing.serial.*;

Serial Port;
int t1,t2;

void setup() {
  int i;
  Port = new Serial(this, "COM7", 115200); // remplacez COM7 par le port occupé par l'Arduino, sinon bug!
  
  t1 = millis();
  while(true) {
    while(Port.available() > 0) {
      i = Port.read();
      t2 = millis();
      println(256000000 / (t2-t1) + "KHz"); // affiche la fréquence du quartz de l'Arduino en KHz toutes les 16 secondes (la première mesure n'est pas fiable).
      t1 = t2;
    }
    delay(1);
  }
}

void draw() {
}

Edit du 14/08:
Correction dans le programme Processing.

Quelques résultats:
uno original: 16000KHz (pas fait exprès) :slight_smile:
uno générique: 15880KHz
mega générique: 15895KHz
nano générique: 16004KHz
pro 5v générique: 16013KHz
pro 3.3v générique: 15990KHz

On remarquera une dérive plus importante sur les grande cartes, probablement liée à la présence d'un filtre à ondes de surface (SWF), qui se traduit par un boîtier plus grand.
Les petites cartes ayants un quartz par manque de place.

J'ai testé la dérive en exposant les cartes à un sèche-cheveux (air chaud). On observe une dérive d'environ -10 KHz sur l'ensemble des cartes.

Sympa comme astuce! :slight_smile:

Testé à l'instant chez moi avec une carte d'imprimante 3D MKS MINI V2.0 Makerbase et une carte Arduino MEGA de chez SUNFOUNDER:

  • La MKS MINI est parfaitement calibrée à 16000KHz.
  • La SUNFOUNDER tourne à 15996KHz (avec +-1 KHz de variation entre les mesures).

PS: attention pour le prog processing, il manque l'import de la librairie serial et les déclarations pour que cela compile...

import processing.serial.*;

Serial Port; 
int t1,t2;

Par curiosité, je viens de tester aussi le sèche cheveux:

  • La carte SUNFOUNDER perd quasi instantanément 10Khz et elle descend encore un peu pour se stabiliser autour des 15983Khz au bout de quelques minutes.
  • La MKS MINI ne bronche pas et reste parfaitement stable à 16000KHz.

A noter que les deux cartes sont équipées de quartz.

marscaper:
PS: attention pour le prog processing, il manque l'import de la librairie serial et les déclarations pour que cela compile...

Merci du signalement, petite erreur de copier-coller, je viens de corriger. :slight_smile:

Merci pour cette réalisation intéressante qui permet de sensibiliser aux deux types principaux de composants associés aux oscillateurs de nos cartes Arduino, et de mettre en évidence leur précisions et dérives......

-les quartz (2 pins le plus souvent), associés à deux condensateurs extérieurs de qq pF
-les résonateurs céramiques (plus de 2 pins , vu qu'il intègrent la pluspart du temps deux petits condensateurs en plus de l'élément céramique résonnant)

la dérive en fréquence est généralement plus importante sur les seconds
Les notices des composants mentionnent en ppm les écarts pour les premiers , et en % pour les seconds.

Il me semble que les dispositifs à onde de surface, évoqués plus haut, servent dans un autre domaine, à des fréquences plus élevées pour lesquelles il ne serait pas possible de tailler un quartz assez fin , d'où le besoin d'un autre mode de vibration plus complexe à mettre en oeuvre)

le dernier essai de marscaper est parlant. (Pour ma part sur les cartes SUNFOUNDER, photos du site, je vois des résonnateurs céramiques en boitier métallique à condensateutrs incorporés).
Avec la différence de comportement attendue : quartz vs résonnateur céramique.

Merci de la précision al1fch. C'est bon à savoir! Je pensais que le boitier métallique était typique d'un quartz.