Général Ajuster la fréquence quartz d'un Arduino

  • Auteur de la discussion JCS
  • Date de début
JCS
JCS
Compagnon
22 Juin 2007
2 556
Cher
  • Auteur de la discussion
  • #1
Salut à tous,

Je cherche à savoir s'il est possible d'ajuster la fréquence du quartz d'un Arduino. J'ai constaté une dérive d'environ 0,6 % sur le mien. C'est à dire que si je commande une horloge avec mon Arduino, je vais avoir un écart d'environ 8 mn par jour, soit environ une heure en 1 semaine !
J'ai besoin de mesurer des temps courts avec une grande précision. Je suis obligé de bidouiller et d'utiliser, une "variable d'ajustement", dans laquelle j'indique le nombre de micro secondes pour une seconde. Mais c'est pas top et après traitement, le résultat est faussé !
La solution serait de pouvoir ajuster le quartz afin qu'une microseconde soit vraiment une microseconde.

Merci pour votre aide.
@+
JC.
 
Le débutant
Le débutant
Compagnon
16 Sept 2013
2 721
Cotes d'Armor 22160, (à coté de la France ...)
bonjour
...ajuster la fréquence d'oscillation d'un quartz est effectivement possible, dans des limites relativement faibles autour de la fréquence nominale (appelée "résonnance") mais ! .... c'est l'ajout (ou le retrait) d'un composant (condensateur ) qui va modifier cette fréquence, avec tout les désagréménts que cela peut apporter (en fonction de la qualité de cet élément), dérive en fonction de la température, dérive en fonction du taux d'humidité, dérive en fonction des "parasites externes" ...Si le quartz est extérieur au circuit,,il y a la possibilité d'implanter un quartz de "haute qualité...(fréquence, stabilité)"... ou d'implanter un quartz de référence (enceinte thermostatée) qui est conçu pour assurer une stabilité à long terme. Une autre solution consiste, à obtenir cette fréquence par "un synthétiseur de fréquence" qui, lui, est capable d'assurer cette stabilité.
Ils existent d'autres solutions techniques mais qui ne sont pas à la portée des amateurs que nous sommes.
Cordialement
 
M4vrick
M4vrick
Compagnon
12 Août 2015
1 135
Si tu as besoin de mesurer des temps court avec une grande précision un Arduino ne sera pas une bonne solution.
Ce que je te conseille c'est de développer une carte avec un Atmega 328P en standalone et à ce moment tu pourras choisir un quartz externe avec une précision correspondand à tes besoins.
Ca se programme avec un programmateur USB type USBASP et l'environnement Arduino, tu peux même le faire sur une breadboard pour tes essais.
 
coredump
coredump
Compagnon
8 Jan 2007
4 505
FR-06
Le plus simple c'est d'utiliser un tcxo au lieu d'un quartz, ou bien un oscillateur MEMS.
Dans les deux cas ça pilote directement l'entrée clock externe du CPU sans avoir besoin de capa comme un quartz
 
M4vrick
M4vrick
Compagnon
12 Août 2015
1 135
Oui suivant la précision demandé il faut choisir la bonne méthode de cadencage du µC.
L'important c'est de s'affranchir de la carte Arduino en elle même, de ne garder que l'Atmega en standalone avec l'environnement Arduino.
 
gégé62
gégé62
Compagnon
26 Fev 2013
2 921
Harnes (Pas de Calais)
Je ne suis pas expert en bidouille, donc j'utilise les armes que je connais....
Est-ce que cet écart (0.6% parait effectivement un peu gros pour un quartz) est toujours le même, à ce moment tu pourrais le corriger par le programme (avec des jours de 1432 minutes (ou 1448, selon...) :wink:
Sinon peux-tu remplacer le quartz présent sur ta carte ? dans la mesure où tu est certain d'avoir bien mesuré, je ne sais pas si c'est facile ou non, il pourrait y voir un écart dû au déroulement du programme lui-même ? comment as-tu fait la mesure ?

si l'écart n'est pas constant, certes cela semblerait bien mettre en cause le quartz.
 
pinou29
pinou29
Compagnon
18 Mar 2009
2 877
Toulon ( Var )
Bonjour.
Je vais sûrement dire une grosse bêtise mais il n'est pas possible d'utiliser la fréquence secteur comme on fait (faisait) pour les pendules à affichage digital ?
J'ai toujours entendu dire que cette fréquence était plutôt précise.
Bernard.
 
Earthwalker
Earthwalker
Compagnon
7 Déc 2013
1 211
45
Bonjour,
a mon avis une dérive aussi grande est surement due à un composant défectueux (condensateur) de la carte Arduino.
avez vous un schéma de cette carte ?
 
S
stanloc
Compagnon
29 Oct 2012
5 120
J'ai comme l'impression qu'il y a mauvaise interprétation par nos électroniciens de ce qu'a voulu exprimer JCS car il n'a pas utilisé le bon vocabulaire. Vous êtes tous partis sur le terme dérive alors que moi je comprends que c'est d'un écart entre la fréquence observée et la fréquence souhaitée que JCS veut parler. Si c'est de cela qu'il s'agit il n'y a que deux solutions : un ajustage dans une certaine mesure par un condensateur au mica ou un tri jusqu'à trouver le bon quartz.
Stan
 
M4vrick
M4vrick
Compagnon
12 Août 2015
1 135
C'est bien une dérive, le microcontrolleur se base sur la fréquence du quartz (ou du résonateur, ou de l'oscillateur.. ) pour faire sa base de temps. La précision de cette fréquence conditionne la précision de la mesure de temps, plus cette différence entre la fréquence réelle et la fréquence que pense avoir le microcontroleur est importante et plus cela amène une dérive de plus en plus grande au fur et à mesure du déroulement du programme.
Pour mesurer plus ou moins une seconde ce n'est pas critique, quand tu dois mesurer plusieurs intervals de quelques microsecondes avec précision c'est rapidement handicapant.
Et il n'y a pas de tri à faire, il faut simplement choisir un composant avec la technologie et la tolérance correspondant au besoin. On sait faire des bases de temps extrêmement précise sans devoir en acheter une douzaine en espérant avoir le "bon".
 
L
Loulou31
Compagnon
21 Jan 2010
1 978
Toulouse.. coté Est
Bonjour,
La question est de savoir si c'est une erreur ou une derive ( la fréquence était bonne et s'est décalée). Quoiqu'il arrive il faut remplacer le quartz ou mettre un oscillateur précis : TCXO.
0,6% ne peut être corrigé sur un quartz quoiqu'il arrive. On arrive à quelques dizaines de ppm en general en modifiant la valeur du condensateur en série.
Est ce que tu as un moyen de mesurer cette fréquence car je suis étonné d'une telle imprecision, même avec un quartz de mauvaise qualité.
Pour mesurer avec precision des temps il vaut mieux utiliser des interruptions et les fonctions timer.

Jean-Louis
 
Dernière édition:
JCS
JCS
Compagnon
22 Juin 2007
2 556
Cher
  • Auteur de la discussion
  • #12
Merci à tous pour vos réponses et suggestions.
Stan a parfaitement résumé ma demande mal exprimée.

Pour faire simple, je vais garder ma variable d'ajustement qui donne néanmoins de bons résultats.
Je la détermine à partir du signal d'un module d'horloge à quartz analogique.

En fait, j’espérais une possibilité de recaler la fréquence du quartz de l'Arduino par le soft.

Merci encore à tous.

JC.
 
T
tronix
Compagnon
6 Mar 2012
1 486
Toulouse
Si c'est un quartz externe (bien lire jusqu'au bout...), habituellement taillé pour une résonance parallèle, il n'oscille à la bonne fréquence que s'il est chargé par la bonne capacité. En jouant sur les 2 capacités en parallèle, on peut ajuster la fréquence, mais cela reste délicat car les valeurs sont faibles, et il faut une référence. Si c'est un oscillateur externe, c'est plus simple, il suffit de prendre la bonne référence. Passer d'un quartz à un oscillateur ne pose normalement pas de problème, il est même probable que l'on puisse se passer de changer la configuration, en utilisant la bonne broche. Reste à trouver le bon oscillateur. Selon les fréquences, on peut trouver du très bon oscillateur, à moins de 1ppm, ou même du TCXO, pour moins de 2€. C'est vraiment la solution que je préconise. Quant à la précision liée au processeur, si on sait bien utiliser les périphériques (et programmer...), on peut avoir des résultats étonnants sans sortir la grosse artillerie (processeur rapide ou fpga).
 
S
stanloc
Compagnon
29 Oct 2012
5 120
Stan
 
Dernière édition:
f6exb
f6exb
Compagnon
13 Juin 2013
1 730
Est-ce vraiment un problème de base de temps ou est-ce que le code n'introduirait pas des biais de temps en temps ?
J'ai essayé le programme de la réponse N°12 en adaptant l'affichage pour un I2C, mais étant donné que je n'ai pas de pendule pour tester, j'ai juste mis la sortie d'un 555 comme signal. Faudrait voir ce que ça vaut :
http://www.gammon.com.au/forum/?id=11504&reply=12#reply12
 
JCS
JCS
Compagnon
22 Juin 2007
2 556
Cher
  • Auteur de la discussion
  • #16
Mon système fonctionne parfaitement bien :


Toutefois, je me suis rendu compte en mesurant la fréquence d'une pendule qui bat la seconde et qui règle parfaitement, qu'au lieu d'avoir 3600 A/H
j'en avais 3622.
Mais cela ne m'a pas trop surpris. J'imagine bien que sur une carte Arduino à quelques dizaines d'€ on ne peut pas avoir un quartz horloger de haute précision, taillé exactement à la bonne fréquence.
J'espérais une "botte secrète" capable d'ajuster, via le soft, la fréquence du quartz. L'Arduino est capable de temps de choses que je ne connais pas encore ...

Le principe de fonctionnement de mon appareil est très simple ( je ne sais faire que des choses simples ) une capteur réflectif optique, un bistable avec un ATtiny85.
La fonction PulseIn du sketch attend et mesure en microsecondes le temps d'une oscillation. Pendant l'oscillation suivante, il affiche le temps de l'oscillation, mesurée
calcule la moyenne et affiche le nombre de mesures, puis recommence sa mesure ( une oscillation sur deux, donc aucune perturbation due au sketch).

Pour établir ma variable d'ajustement afin de compenser l'écart, à la place du signal de mon capteur optique, j'envoie un signal issu d'un mouvement de pendule à quartz
( un signal toutes les 2 secondes, soit la durée d'une oscillation d'un balancier qui bat la seconde, avec une précision d'environ 1 mn pour 6 mois ).
Une petit règle de 3 et j'obtiens le nombre de microsecondes dans une heure a intégrer dans mon sketch, afin d'avoir un résultat juste. Et ça marche !

Ici la discussion concernant mon système :

https://www.usinages.com/threads/projet-frequencemetre-periodemetre-horloger.98562/

Merci encore à tout ceux qui m'ont proposé des bonnes solutions, mais c'est beaucoup trop compliqué pour moi.

@+
JC
 
Earthwalker
Earthwalker
Compagnon
7 Déc 2013
1 211
45
pour préciser : une arduino est cadencée avec un quartz à 16 Mhz (16 000 000), une montre à quartz à 32 Khz (32 000) donc il parait très improbable que l'arduino soit aussi imprécise ( sachant que plus la fréquence est élevée plus la dérive ou erreur sera divisée)
Je douterais plus de la pendule (ou peut-être d'un biais de la programmation).
 
CNCSERV
CNCSERV
Compagnon
27 Déc 2007
5 866
FR-28360
Bonjour
Pas certain que l'on puisse avoir une horloge precise sans utiliser un circuit RTC avec un quartz de 32,768 Mhz. Ca doit exister en I2C.
 
Dernière édition:
JCS
JCS
Compagnon
22 Juin 2007
2 556
Cher
  • Auteur de la discussion
  • #19
pour préciser : une arduino est cadencée avec un quartz à 16 Mhz (16 000 000), une montre à quartz à 32 Khz (32 000) donc il parait très improbable que l'arduino soit aussi imprécise ( sachant que plus la fréquence est élevée plus la dérive ou erreur sera divisée)
Je douterais plus de la pendule (ou peut-être d'un biais de la programmation).
En horlogerie, on utilise généralement des quartz de 32 768 Hz, comme l'a indiqué CNCSERV et aussi 4 194 304 Hz, soit 2^15 et 2^22.
Toutefois, dans le langage Arduino, la fonction PulseIn est sensée gérer la microseconde http://www.mon-club-elec.fr/pmwiki_reference_arduino/pmwiki.php?n=Main.PulseIn

Mais j'ai résolu le problème comme indiqué plus haut et tout fonctionne à merveille !

@+
JC.
 
JCS
JCS
Compagnon
22 Juin 2007
2 556
Cher
  • Auteur de la discussion
  • #21
Merci CNCSERV,

Je connais ce module, j'en ai même un.
Si sa base de temps est précise, je ne vois pas comment mesurer des temps courts en microsecondes avec !

Ce module sert à faire des horloges et éventuellement à mesurer des temps longs.

@+
JC.
 
CNCSERV
CNCSERV
Compagnon
27 Déc 2007
5 866
FR-28360
Excuse moi, alors.
Au départ tu parlais de décalage sur un jour ou sur une semaine, c'est pour cela que j'ai pensé à un circuit RTC.
J'avoue ne pas avoir épluché les 6 pages de ton projet.:oops:
L'arduino c'est pas un peu lent pour mesurer des temps très court ?
Sur un autre sujet on parle d'un module arduino à base de STM32, c'est beaucoup plus rapide, en revanche je ne sais pas si c'est plus prècis car à la base c'est un quartz de 8 ou 16Mhz, la fréquence finale est optenue par PLL.
Le STM32 à une RTC avec un registre subseconde mais c'est une usine à gaz.
 
Dernière édition:
JCS
JCS
Compagnon
22 Juin 2007
2 556
Cher
  • Auteur de la discussion
  • #23
Le rapport à la journée et à la semaine c'était pour mieux visualiser l'écart.
En résumé, l'Arduino, que je commence à maîtriser, est parfait pour mesurer la microseconde. Il est normal que les quartz de ces cartes très peu chères ne soient pas taillés exactement à la bonne fréquence. Il suffit de déterminer l'erreur et d'en tenir compte dans le sketch. On arrive alors, avec des moyens très simples à faire des choses très pointues.

@+
JC.
 
T
tronix
Compagnon
6 Mar 2012
1 486
Toulouse
Si JCS est satisfait, c'est parfait.

Un quartz seul, qu'il soit "d'horlogerie" ou non, et quelle que soit sa fréquence, sera moins performant qu'un oscillateur intégré, qui va atteindre sans problème pour un coût faible une erreur inférieure à 1ppm (moins de 3 secondes par mois). Et si on veut faire des mesures précises avec un processeur, c'est possible, mais il ne faut pas compter sur le logiciel, que le processeur fonctionne à 10 ou 200MHz. C'est le bon usage des périphériques qui va le permettre, et là, un processeur "normal" doit suffire.
 
S
stanloc
Compagnon
29 Oct 2012
5 120
Je ne vois pas bien le distinguo entre "quartz seul" et "oscillateur intégré". A part utiliser une horloge atomique je ne crois pas qu'il existe une autre méthode pour faire un oscillateur stable de qualité que de partir d'un quartz que l'on monte en oscillateur.
Stan
 
T
tronix
Compagnon
6 Mar 2012
1 486
Toulouse
Il y a pourtant une énorme différence. Dans un cas, on fait un oscillateur avec quelques composants standards, sans forcément bien connaître les caractéristiques de chaque composant ni avoir optimisé le schéma, bien souvent en mode parallèle où il faudrait ajuster précisément les condensateurs associés. Un oscillateur tout intégré a une température homogène et peut être plus ou moins compensé en température, et pourra avoir un schéma bien plus complexe sans inconvénient.

Par exemple : http://www.mouser.fr/ProductDetail/...8oz/HeiymAJuQj90JDo52fsCYmCUNzOhcUY51tUGGqQ==
Pour avoir des performances équivalentes en discret, il faut déjà s'accrocher.
 
coredump
coredump
Compagnon
8 Jan 2007
4 505
FR-06
Je ne vois pas bien le distinguo entre "quartz seul" et "oscillateur intégré". A part utiliser une horloge atomique je ne crois pas qu'il existe une autre méthode pour faire un oscillateur stable de qualité que de partir d'un quartz que l'on monte en oscillateur.
Stan
Il y a les OCXO: quartz dans un four régulé en température
TCXO: quartz avec sonde de température et table de compensation.
MEMS: oscillateur mécanique en silicium avec circuit de PLL pour sortir une fréquence programmable et compensé en température.

Bref ça a beaucoup évolué (surtout avec les MEMS)
 
J
jfp91
Nouveau
15 Avr 2017
2
Bonjour à tous,

ceci est mon premier post sur le forum, donc soyez indulgent :)

Quelques, bref, compléments :

- en simplifiant, la gestion du temps sur Arduino utilise une interruption pour incrémenter un compteur, ce qui veut dire que si le programme en utilise également et que le traitement de ces dernières est long cela fait dériver l'horloge, et donc accessoirement les primitives du type millis, pour info delayMicroseconds désactive les interruptions et donc peuvent faire dériver l'horloge
Il y a de nombreux threads là-dessus, si nécessaire je peux donner quelques pointeurs.
Comme début, 3 points d'entrée :
https://arduino.stackexchange.com/questions/242/arduino-time-clock-accuracy
https://arduino.stackexchange.com/q...eping-using-millis-is-not-accurate-or-correct
https://arduino.stackexchange.com/questions/27/how-do-i-get-an-accurate-time?rq=1

Il y en a de nombreux autres, sur les forums arduino entre autres, si ma mémoire est bonne il y a plusieurs vidéos la-dessus sur youtube.


- Si on n'est pas pressé, un module RTC pour Arduino coute moins un € sur ebay, aliexpress, etc...
Ces modules sont basés sur des chips DS1002, DS1307 ou DS3231

http://datasheets.maximintegrated.com/en/ds/DS1302.pdf
http://datasheets.maximintegrated.com/en/ds/DS1307.pdf
https://datasheets.maximintegrated.com/en/ds/DS3231.pdf



- Autre possibilité, utiliser une carte Arduino avec une connexion Wifi et synchroniser périodiquement l'horloge par un appel NTP.


Un shield Wifi ESP8266, coute moins de 2 €

Il existe également de cartes au format Arduino Uno, pour un prix du même ordre de grandeur qu'une carte Arduino classique qui embarque le chip ESP8266, en plus ou à la place du chip Atmega.
Celle qui ne comporte que le chip ESP8266 dans un format compatible Uno on a beaucoup moins de port d'E/S en autre seul A0 est disponible,
mais offre un accès réseau plus intégré. Celles qui ont les 2 sont plus chères, je n'en connais qu'une.

Idéalement, la combinaison des 2, RTC plus NTP.


Voilà, en espérant que cela sera de quelque utilité.


JFP
 
Haut