Ajouter un quartz à une arduino mega

Bonjour à tous,

Je cherche a gérer le temps de la façon la plus précise possible sur une arduino mega. D'après ce que j'ai lu, il faut ajouter un quartz au resonateur ceramic de l'arduino qui n'est pas assez precis pour ce que je veux faire. Il existe donc des modules RTC externes pour le faire, mais j'aimerai votre avis sur une idée différente.

Je cherche a compter le temps sur plusieurs heures avec une precision diabolique (avec le timer0 à un prescaler de 64, cela me fait un increment de TCNT0 toutes les 4us, ce qui est pas mal), mais il y a une derive importante du resonateur sur plusieurs heures, et je voudrai recaller mon compteur periodiquement pour eviter cette derive.

Je precise que je n'en ai besoin que lorsque l'arduino est alimentée, il ne s'agit donc pas d'une horloge.

Alors pensez-vous qu'il soit possible d'imaginer un montage géré par un quartz haute précision, qui génère un PULSE à intervalle régulié, que je récupère sur un vecteur d'interruption externe pour recaller mon horloge précisemment (TCNT0).

De cette façon je conserve la precision de la resolution du timer interne au MCU tout en évitant la dérive non ?

Merci d'avance pour vos réponses

neoirto:
Bonjour à tous,

Je cherche a gérer le temps de la façon la plus précise possible sur une arduino mega. D'après ce que j'ai lu, il faut ajouter un quartz au resonateur ceramic de l'arduino qui n'est pas assez precis pour ce que je veux faire. Il existe donc des modules RTC externes pour le faire, mais j'aimerai votre avis sur une idée différente.

Je cherche a compter le temps sur plusieurs heures avec une precision diabolique (avec le timer0 à un prescaler de 64, cela me fait un increment de TCNT0 toutes les 4us, ce qui est pas mal), mais il y a une derive importante du resonateur sur plusieurs heures, et je voudrai recaller mon compteur periodiquement pour eviter cette derive.

Je precise que je n'en ai besoin que lorsque l'arduino est alimentée, il ne s'agit donc pas d'une horloge.

Alors pensez-vous qu'il soit possible d'imaginer un montage géré par un quartz haute précision, qui génère un PULSE à intervalle régulié, que je récupère sur un vecteur d'interruption externe pour recaller mon horloge précisemment (TCNT0).

De cette façon je conserve la precision de la resolution du timer interne au MCU tout en évitant la dérive non ?

Merci d'avance pour vos réponses

bonjour
Je suppose que des BdT cesium ou rubidium sont hors budget ? :grin:

Un bon compromis pour la génération d'un pulse "bien en forme et calibré" est aujourd'hui d'utiliser la sortie 1PPS de module GPS (il en existe même des prévus pour cette application à poste fixe pour faire de l'asservissement/secours de BdT en metrologie) le flanc raide de la sortie 1PPS permet aussi le datum "top" de la trame temps.

il y a plusieurs méthode enisageable selon la precision demandée
Mais si c'est juste pour avoir une (relative) bonne precision entre 2 pulses successifs l'utilisation directes des sorties 1PPS est souvent très suffisante.
C'est comme en tout, il déjà dimensionner les contraintes et faire un début de cahier des charges.
Quelle tolérance maxi sur la gigue du 1PPS ?

je prendrais le timer2, il propose les pins TOSC1 et TOSC2 pour y coller un quartz de 32,768 par exemple. bien qu'en 8 bits, mais avec un prescaler de 128, alors tu te retrouves avec ton timer qui fera un tour toutes les secondes (de là, tu incrémentes un compteur word interne : tu pourras compter jusqu'à plus de 18 heures). (presc à 256, un tour toutes les 2 secondes, presc à 1024, un tour toutes les 8 secondes...)

Vois page 174 (chapitre 20) du datasheet du mega 2560 pour les détails de ce timer.

Edit : pourquoi acheter un GPS uniquement pour avoir un signal 1PPS? ça fait lourd l'investissement...

Super_Cinci:
Edit : pourquoi acheter un GPS uniquement pour avoir un signal 1PPS? ça fait lourd l'investissement...

bonjour Super_Cinci
investissement lourd , peut être ou pas :slight_smile:
Tout dépend du taux de criticité de l'info delta T souhaitée
entre le QZ horloger qui dérive de plusieurs secondes par jour mais qui coute 0.05 '€ en industrie (celui sur ta cible)
et les horloges cesium ou rubidium qualifiée spatiales à xK€ , il reste de la marge pour discuter.

par principe, j'essaie toujours de savoir où se situe la(les) contrainte impérative d'un projet, après et après seulement ensuite tout se discute.

:grin:

Le PCF8583, ci RTC moins connu que le DS1307 dans l'univers Arduino a quelques avantages
L'un de ses points forts se situe dans les fonctions d'alarme variées liées à sa sortie INT.

==> Sans programmation, sorti d'usine, config par défaut, sans batterie de sauvegarde ...un PCF8583 avec son quartz horloger donne un beau signal carré à 1 Hz sur sa sortie INT. On peut même ajuster la fréquence avec un petit condensateur ajustable.

(La précision après ajustage sera-t-elle suffisement diabolique ? C'est à voir !!)

  • Rien n'empèche par la suite de l'utiliser pleinement en RTC / RAM avec une des librairies Arduino disponibles .

Vos 2 réponses me semblent interessantes, merci !

Je comprends qu'un bete GPS est capable (sous reserve d'acquisition d'un signal tout de meme), d'une precision egale ou superieur à un quartz composé d'elements au nom aussi imprononçable que leur tarif est prohibitif ?
C'est bon à savoir.

Bon sinon, je note que le timer2 est deja prevu pour ce que je souhaite faire (et donc inutile de passer par des interruptions externes), la encore, c'est une bonne nouvelle ! Mais alors du coup, il me faudrait une précision de l'ordre de la usec (au niveau de TCNT2). Avec un multiple de la seconde ce serait encore plus pratique, et donc avec une dérive très faible, sans aller jusqu'à des sommes folles si possible.

Pensez-vous que ce soit réalisable et surtout avez-vous un lien sur la façon de procéder pour relier à TOSC1 et TOSC2, quel schéma électronique, quel type de condo tout ça... J'ai encore jamais bidouillé de quartz.

@al1fch : j'aurai plutot besoin de usec (je pense pas que ce soit si diabolique que ca... c'est sur), mais merci pour la ref

Merci en tout cas :slight_smile:

@neoirto
pour avancer vers un choix de solution et de composants il faudra nécessairement fixer une exigeance chiffrée en ppm. C'est sous cette forme que sont spécifiées les erreurs, dérives..... des quartz.

1µS pour 1s ça fait 1ppm

Pour garantir +/- 1ppm dans le temps (viellissement) et avec des variations de température ambiante il faut déjà très bon oscillateur compensé en température (TCXO)

Bonjour,

al1fch:
Sans programmation, sorti d'usine, config par défaut, sans batterie de sauvegarde ...un PCF8583 avec son quartz horloger donne un beau signal carré à 1 Hz sur sa sortie INT. On peut même ajuster la fréquence avec un petit condensateur ajustable.

T'est sur de ton coup ? Mes PCF8583 sortis d'usines donne pas de signal sur INT, il faut que je les reconfigurent moi même pour qu'ils sortent le signal 1Hz sur INT ...

al1fch:
(La précision après ajustage sera-t-elle suffisement diabolique ? C'est à voir !!)

  • Rien n'empèche par la suite de l'utiliser pleinement en RTC / RAM avec une des librairies Arduino disponibles .

Je pense pas que la précision du PCF8583 soit suffisante pour son application, il lui faudrait presque un micro-contrôleur avec PLL/RTC intégré (genre PIC32, STM32, LPCx, etc ...) ou alors un circuit oscillateur de trés grande qualité/précision ...

Ps: Je suis en train d'écrire un article/tutoriel au sujet du PCF8583 (utilisation en horloge, avec/sans alarme, + ram) en extension de mon article sur le DS1307 :wink:

al1fch:
Le PCF8583, ci RTC moins connu que le DS1307 dans l'univers Arduino a quelques avantages
L'un de ses points forts se situe dans les fonctions d'alarme variées liées à sa sortie INT.
Clock and calendar with 240 x 8-bit RAM | NXP Semiconductors

==> Sans programmation, sorti d'usine, config par défaut, sans batterie de sauvegarde ...un PCF8583 avec son quartz horloger donne un beau signal carré à 1 Hz sur sa sortie INT. On peut même ajuster la fréquence avec un petit condensateur ajustable.

(La précision après ajustage sera-t-elle suffisement diabolique ? C'est à voir !!)

  • Rien n'empèche par la suite de l'utiliser pleinement en RTC / RAM avec une des librairies Arduino disponibles .

bonjour Al1
compo intéressant mais il faut cibler sa catégorie de precision et savoir à quoi et dans quelles conditions il peut être employé.

déjà :

The frequency tolerance depends on the quartz
crystal tolerance, the capacitor tolerance and the device-to-device tolerance. Average
deviations of ±5 minutes per year are possible.

Il faut savoir ce qui est important :
en métrologie temporelle il est très différent de savoir/connaitre si un signal apparait du mieux possible tous les débuts (ou fin) de période (là la seconde) ou s'il apparait reparti dans l'intervalle.
pour résumer, c'est très différent selon si l'on souhaite compter les secondes ou si l'on souhaite s'assurer de la durée reproductible d'une seconde. (seconde prise la pour demo) .

dans le premier cas la gigue n'est pas très importante, et peut être même être ignorée .
dans le second sa prise en compte elle est très importante.

Neoirto : si vous exposiez un peu plus ce que vous voulez réaliser ? où se situe exactement la contrainte temporelle ?

T'est sur de ton coup ? Mes PCF8583 sortis d'usines donne pas de signal sur INT, il faut que je les reconfigurent moi même pour qu'ils sortent le signal 1Hz sur INT ...

Sur de mon coup ? pas à 100% vu que mes manips remontent à presque 2 ans. J'avais été surpris de constater le signal 1Hz avant programmation dès la mise sous tension. Tout à l'heure avant de poster j'ai juste jeté un coup d'peuil à la doc et au §7.9 de la doc NXP j'ai eu l'impression de voir la confirmation.
Je veux bien revérifier.
Bonne idée de faire un tuto sur ce composant trop méconnu içi vu ses points forts.
Outre les alarmes variées (alarmes Timer et alarmes Calendrier) il y a la possibilité de fonctionner sous un Vcc 3,3V . J'avais gardé l'idée qu'il n'y a rien à faire pour avoir un carré d 1Hz sur INT mais que par contre il fallait se coltiner attentivement la doc pour obtenir volontairement autre cette sortie (programmation pas évidente.)

Il faut voir ce que tu attends réellement d'une base de temps dans ton projet.

Tu veux une résolution ou une précision à la µs ? la résolution c'est que tu auras accès à une valeur représentant le nombre de µs, la précision, c'est qu'au bout de 1 million de secondes (temps officiel), ton compteur affichera entre 999 999 et 1 000 001 secondes... (+/- 1 ppm quoi).

Dois-tu connaître l'heure réelle (UTC) ou l'heure relative (h = 0:00:00 au démarrage de l'arduino)?

combien de temps ton montage restera-t-il allumé, et au bout de ce temps, quelle tolérance de dérive autorises-tu?

En gros, pour avoir des idées cohérentes, il nous faudrait les réponses à ces questions, voire d'autres...

Au pire, on peut utiliser le 50Hz du secteur sur l'entrée T5 (timer5) (ce que font les radio-réveils u supermarché), qui peut produire (une fois redressé en double alternance) un signal carré de 100Hz relativement précis, soit une résolution de 10 ms...

al1fch:
Sur de mon coup ? pas à 100% vu que mes manips remontent à presque 2 ans. J'avais été surpris de constater le signal 1Hz avant programmation dès la mise sous tension. Tout à l'heure avant de poster j'ai juste jeté un coup d'peuil à la doc et au §7.9 de la doc NXP j'ai eu l'impression de voir la confirmation.
Je veux bien revérifier.

Je vais faire le test, mais il me semble bien que je n'avais pas 1Hz sur INT, mais avec ma mémoire de poisson rouge ...
J'ai rien dit, t'as raison ya bien 1Hz sur INT avec un PCF8583 vierge ... comment j'avais bien pu fait pour pas l'avoir l'autre fois ...

al1fch:
Bonne idée de faire un tuto sur ce composant trop méconnu içi vu ses points forts.
Outre les alarmes variées (alarmes Timer et alarmes Calendrier) il y a la possibilité de fonctionner sous un Vcc 3,3V . J'avais gardé l'idée qu'il n'y a rien à faire pour avoir un carré d 1Hz sur INT mais que par contre il fallait se coltiner attentivement la doc pour obtenir volontairement autre cette sortie (programmation pas évidente.)

Il peut servir de compteur aussi :wink: pour mon tuto je ferai : mode horloge, avec et sans alarme, génération de fréquence, utilisation comme ram "tout usage".
Je ferais peut être une parenthèse sur le mode compteur et le mode "synchro 50Hz" mais dans ce cas juste un truc en passant.

Testé à l'instant sur plaque d'essai : 1Hz avec juste le quartz, un petit condensateur de qq pF, le pull up pour INT et les broches I2C en l'air => 1Hz

Woussssch, merci pour toutes vos réponses :

Alors bien sur, c'est plus compliqué et couteux que ce que j'imaginai, mais ça doit être jouable. Voila le but :
Je cherche à synchroniser precisemment :

  • des mesures de capteurs divers enregistrés par l'arduino embarqué dans un parapente (notamment accelerometre), avec
  • les images d'une video NTSC 29,97 Hz, dont je crois que la precision est très élevée (les standards ne rigolent pas avec le timing si j'ai bien compris)

J'ai donc besoin qu'après 1 heure d'enregistrement, la precision soit encore globalement bonne (environ 1us), c'est donc la derive dans le temps qui compte pour moi, en heure relative.

Voila, et donc pas de secteur sur le parapente !

Merci encore à tous

Pour refaire une horloge de voiture j'avais besoins d'un signal de 2 Hz que j'ai obtenu en utilisant un DS32KHz dont la fréquence était ensuite "découpée" par un CD4060.

De la même manière 1Hz est possible.

Super_Cinci:
Au pire, on peut utiliser le 50Hz du secteur sur l'entrée T5 (timer5) (ce que font les radio-réveils u supermarché), qui peut produire (une fois redressé en double alternance) un signal carré de 100Hz relativement précis, soit une résolution de 10 ms...

Super_Cinci
si la derivation BdT par le 50Hz (et 60Hz) a bien existée, je te mets au defi de trouver aujourd'hui un radio reveil ou une horloge grand public neuf (et produit dans les 15 dernières années) qui utiliserais encore cette méthode. :grin:

mondialisation oblige : cette méthode (qui avait d'ailleurs ses " propres limites") n'est plus et depuis longtemps utilisée en production de masse, ne serait ce que pour évacuer les # productions zones en 50 ou 60 Hz.

Utiliser un QZ horloger Vs circuit adaptation/detection secteur au bas mot doit etre d'un facteur mini de 1/50 voir 100 en fabrication industrielle.

par 10K unités les qz horlogers lambda se négocient autour de qq cents $ ou centimes d'€

lien sympa sur la F° du réseau interconnecté européen

Je cherche à synchroniser precisemment :

  • des mesures de capteurs divers enregistrés par l'arduino embarqué dans un parapente (notamment accelerometre), avec
  • les images d'une video NTSC 29,97 Hz

Dans ce cas il est peut etre envisageable de synchroniser les acquisitions de l'Arduino SUR le signal video lui même. Synchroniser l'un sur l'autre, pas nécessairement les deux sur un troisième ...

Quel est l'accès aux signaux video ? S'il s'agit d'un signal video composite l'extraction des top trame ou ligne peut se faire (LM1881, 8 pins simple à utiliser) , si les signaux synchro sont accessibles directement c'est encore plus simple. Une belle impulsion 5V à 29,97Hz (synchro verticale') peut etre extraite par un LM1881 du signal video lui-même il me semble.
L'Arduino compte alors les trames/images pour caler ses acquisitions.
http://www.national.com/profile/snip.cgi/openDS=LM1881

Pas d'expérience personnelle dans ce domaine .... depuis les débuts de C+ :wink:
Des 'arduinistes' ont bossé sur la video et sauront répondre sur la faisabilité de cette piste....

al1fch:
Quel est l'accès aux signaux video ? S'il s'agit d'un signal video composite l'extraction des top trame ou ligne peut se faire (LM1881...) , si les signaux synchro sont accessibles directement c'est encore plus simple.

Si c'est du composite cette shield devrait t'intéresser !
-> Video Experimenter Shield : http://www.watterott.com/en/Video-Experimenter-Kit
Site officiel : Video Experimenter: Arduino shield that lets you do all kinds of experiments with video
Test de la bête par mes soins :stuck_out_tongue: : [Test] Video Experimenter Shield (arduino) | Skyduino - Le DIY à la française

En gros la shield est composé d'un LM1881 qui déclenche une interruption lorsque qu'il détecte un "top" de synchronisation, et de quelques composants pour assurer son bon fontionnement.

A oui, c'est vachement interessant ça, je vai creuser la datasheet en profondeur, parce que j'ai effectivement une sortie composite !
Vu que je n'ai besoin que du top de synchronisation, il faut que je trouve comment le recuperer de la facon la plus simple.
Je pourrai recuperer ca directement sur un vecteur d'interruption externe donc ?

C'est le pied ce composant ! Merci :slight_smile:

neoirto:
A oui, c'est vachement interessant ça, je vai creuser la datasheet en profondeur, parce que j'ai effectivement une sortie composite !
Vu que je n'ai besoin que du top de synchronisation, il faut que je trouve comment le recuperer de la facon la plus simple.
Je pourrai recuperer ca directement sur un vecteur d'interruption externe donc ?

Regarde comment fonctionne (et comment est câblé) la video experimenter shield, c'est tout bête, un LM1881, une interruption et hop !