Electronique > Réalisations > Générateurs > Base de temps 004

Dernière mise à jour : 02/05/2010

Présentation

Première base de temps que je réalise avec un composant programmable, et qui délivre des signaux stables à 1 KHz, 100 Hz, 10 Hz, 1 Hz, 1/60 Hz et 1/3600 Hz. Le composant programmable utilisé est un microcontrôleur PIC 16F628A, et le signal d'horloge qui permet de le cadencer est soit généré en interne, soit généré avec un quartz externe associé à un petit condensateur ajustable pour peaufiner la fréquence de sortie si le besoin s'en fait sentir.

base_temps_004_pcb_3d_a base_temps_004_pcb_3d_b
Avec quartz 4 MHz externe
et led D1 sur sortie Out5
Plus précis
Sans quartz externe
(oscillateur 4 MHz interne)
Moins précis

Schéma

Si on exclue la led et la section optionnelle avec le quartz et ses deux condensateurs associés, le système ne comporte que deux composants, en comptant le condensateur de découplage d'alim. Difficile de faire plus simple, pour moi en tout cas.

base_temps_004

Horloge du PIC
Le PIC peut ici être cadencé selon deux méthodes :
- avec l'horloge interne 4 MHz, et dans ce cas vous pouvez omettre le quartz X1, le condensateur fixe C2 et le condensateur ajustable VC1. L'avantage de cette méthode est la simplicité de mise en oeuvre, il n'y a que deux composants en tout ! Par contre, la fréquence de l'horloge interne de 4 MHz ne peut pas être ajustée de façon précise. Sur mon premier proto, la fréquence du signal sortant Out1 était très exactement de 1000 Hz, ce qui me convenait tout à fait. Puis sur un autre proto réalisé pour une tièrce personne, la fréquence était de 998 Hz.
- avec le quartz externe X1 de 4,000 MHz et ses deux condensateurs C2 et VC1. Là, vous pouvez ajuster précisement la fréquence de l'horloge 4 MHz. Mais entre nous soit dit, la variation joue peu autour de 4 MHz, et après division par 4000, ça joue encore moins sur le 1000 Hz (puisqu'on reste en pourcentage de variation, la variation est 4000 fois plus faible). A réserver à ceux qui ont un fréquencemètre capable d'afficher 3 chiffres après la virgule (1000,000 Hz). Cette façon de faire (avec quartz) reste conseillée même si vous ne possédez pas de fréquencemètre. Sur mon proto avec quartz 4 MHz, j'ai mesuré 1001 Hz sur la sortie 1 KHz. On peut toujours avoir un petit écart par rapport à la valeur attendue, c'est normal. Mais une chose est sûre, la variation de fréquence est moindre quand la température ambiante change.

Signaux produits
Il y en a plusieurs, ce qui explique un connecteur avec autant de bornes pour le raccordement au PIC. A la base, je tenais à produire en même temps les fréquences de 1 KHz, 100 Hz, 10 Hz et 1 Hz. Ces signaux sont disponibles respectivement sur les sorties RA0 à RA3 du PIC :
- Out1 : 1000 Hz
- Out2 : 100 Hz
- Out3 : 10 Hz
- Out4 : 1 Hz
- Out5 : 1 Hz, mais avec logique inversée par rapport à Out4. Cela permet d'y coller une led qui clignote au rythme du changement d'état de Out4, et qui s'allume quand Out4 est à l'état logique haut.La sortie Out5 (port d'entrée / sortie RA4 du PIC) est en effet de type drain ouvert. Un emplacement est prévu pour mettre la led et sa résistance série sur le circuit imprimé, mais vous n'êtes pas obligé de la mettre. Dans ce cas, remplacer la résistance série de la led par une résistance de 4K7 à 10K et faites un strap à la place de la led. Vous aurez ainsi une sortie logique directement exploitable.
- Out7 : 1/60 Hz - un créneau toutes les minutes, et donc un changement d'état toutes les 30 secondes
- Out8 : 1/3600 Hz - un créneau toutes les heures, et donc un changement d'état toutes les 30 minutes
Les autres sorties ne sont actuellement pas utilisées, mais il ne faut pas grand chose pour que ça change...

Comment obtenir ces fréquences précises avec un PIC ?
Il existe deux façons de procéder :
- en faisant tourner une boucle à l'infini, dans laquelle on inclue un retard dont la grandeur dépend de la fréquence à obtenir (par exemple retard de 1 ms pour obtenir une récurence de boucle voisine de 1000 Hz). Cette solution est très simple, mais elle ne permet pas toujours d'obtenir une grande stabilité du signal de sortie, notemment pour des fréquences assez "élevées".
- en utilisant les interruptions générées par le débordement d'un timer. C'est cette solution que j'ai choisie, même si elle est un poil moins simple (quoi que). Pour utiliser cette méthode, il faut faire des calculs savants, ce pour quoi je ne suis pas né. Alors je fais comme beaucoup, j'utilise un calculateur spécialement fait pour l'usage. Il en existe plusieurs, mais celui que j'utilise est appelé "Pic Timer Calculator", que l'on peut télécharger à l'adresse suivante :
http://pictimer.picbingo.com/
Ce logiciel permet de choisir le type de timer à employer (Timer 0, Timer 1 ou Timer 2 par exemple), et de spécifier les valeurs à attribuer au timer choisi au moment où à lieu l'interruption provoquée par le débordement du timer. On peut ainsi rapidement connaitre les paramètres à saisir dans le code pour obtenir telle ou telle fréquence de récurence de l'interruption du timer. Bien entendu, toutes les fréquences ne peuvent être obtenues de façon exacte, il faut parfois se contenter d'une valeur approchée. Mais dans le cas qui nous concerne, la fréquence de 1000 Hz peut être obtenue de façon précise, ce qui tombe sacrément bien (si ça n'avait pas été le cas, j'aurais pleuré une nuit entière et aurait fini par utiliser un quartz externe de valeur adéquate pour obtenir ce que je voulais).

Ca ne marche pas tout à fait bien du premier coup...
L'utilisation d'un calculateur ne donne pas toujours un résultat exact du premier coup. Pour cette réalisation, j'ai essayé d'obtenir mon 1 KHz avec les trois timers 0, 1 et 2 (j'ai laissé toutes les lignes dans mon code source pour que vous voyez de vous-même ce qui a été tenté).
Les valeurs à attribuer aux timers choisis, obtenues par calcul, étaient les suivantes :
cTimer0Preload  = $06;   // preload value for timer0
cTimer1PreloadH = $FE;   // preload High value for timer1
cTimer1PreloadL = $0C;   // preload Low value for timer1
cTimer2Preload  = $FA;   // preload value for timer2
Telles quelles, j'ai obtenue les fréquences suivantes (en simulation et en réel) :
- Avec le timer 0 : 930 Hz en simulation et 930 Hz en réel, au lieu de 1000 Hz dans les deux cas
- Avec le timer 1 : 930 Hz en simulation et 930 Hz en réel, au lieu de 1000 Hz dans les deux cas
- Avec le timer 2 : 996 Hz en simulation et 998 Hz en réel, au lieu de 1000 Hz dans les deux cas
Et celles que j'ai finalement utilisées, après ajustement, sont les suivantes :
cTimer0Preload  = $20;   // preload value for timer0
cTimer1PreloadH = $FE;   // preload High value for timer1
cTimer1PreloadL = $30;   // preload Low value for timer1
cTimer2Preload  = $F9;   // preload value for timer2
Avec ces valeurs corrigées, j'ai obtenue les fréquences suivantes (en simulation et en réel) :
- Avec le timer 0 : 1000 Hz en simulation et 1000 Hz en réel
- Avec le timer 1 : 1000 Hz en simulation et 1000 Hz en réel
- Avec le timer 2 : 1000 Hz en simulation et 1000 Hz en réel
Remarques
- Pour le Timer 2, le calculateur "Pic Timer Calculator" indique clairement qu'il faut apporter une compensation pour obtenir la valeur désirée. J'ai essayé avec les deux valeurs et tout était conforme. Pour les timers 0 et 1, j'ai du procéder par tatonnements successifs jusqu'à obtention des bonnes valeurs. J'utilise cependant toujours le calculateur car les valeurs proposées conviennent généralement, et quand ce n'est pas le cas, il permet de dégrossir la plage de valeurs dans laquelle piocher.
- J'ai fait des essais en activant les timers soit de façon individuelle (c'est à dire un seul à la fois), soit de façon combinée (deux ou trois timers à la fois). Dans le simulateur, j'ai toujours obtenu les mêmes résultats (même fréquence de sortie) quelque soit la configuration adoptée. Mais en activant les trois timers en même temps, cela ne fonctionnait pas sur mon proto avec quartz externe, alors que ça fonctionnait avec oscillateur interne. De toute façon, je ne vois pas l'intérêt d'activer les trois timers en même temps dès l'instant où un seul suffit. J'ai toutefois laissé en commentaire la totalité du code pour les trois timers, vous pourrez ainsi faire les tests qui vous plaisent si le coeur vous en dit. Pour ma part je n'ai laissé actif que le timer2.

Soucis de démarrage ?
Le montage peut ne pas démarrer pour certaines positions du condensateur ajustable CV1. Si l'oscillateur peine à démarrer, il suffit de tourner lentement l'axe du condensateur jusqu'à ce que tout rentre dans l'ordre. Si cela ne démarre pas quelque soit la valeur du condensateur ajustable, alors il y a sans doute un soucis ailleurs... Paramètres de configuration d'horloge du PIC, peut-être ?

Circuit imprimé

Réalisé en simple face. J'ai tracé le circuit avant de finir le schéma, afin de simplifier le routage. C'est ce qui explique ces fils un peu tordus entre le PIC et le connecteur J1, sur le schéma. Notez l'emplacement des trois composants X1, C2 et VC1, qui ne seront pas comblés si vous optez pour l'oscillateur interne du PIC.

base_temps_004_pcb_composants  base_temps_004_pcb_3d_a
Avec quartz 4 MHz externe et led D1 sur sortie Out5

base_temps_004_pcb_composants_002  base_temps_004_pcb_3d_b
Sans quartz externe (oscillateur 4 MHz interne)

Typon aux formats PDF, EPS et Bitmap 600 dpi

Fichiers binaires compilés et codes source

L'archive dont le lien suit comporte trois versions de code source et fichier compilé. Attention de choisir le bon fichier, selon oscillateur choisi !
Base de temps 004 - 16F628
- Fichier electronique_base_temps_004_quartz.ppp = MikroPascal V8.3 pour quartz externe 4 MHz
- Fichier electronique_base_temps_004_oscint.ppp = MikroPascal V8.3 avec oscillateur interne 4 MHz
- Fichier electronique_base_temps_004_16f628.mpppi = MikroPascal Pro V3.20 pour quartz externe 4 MHz (préféré)
Si vous souhaitez recevoir par la poste un PIC préprogrammé et prêt à utiliser, merci de consulter la page PIC - Sources.

Proto Hervé

Hervé a réalisé cette base de temps 004 dont la sortie 1 Hz est utilisée pour cadencer une horloge à tubes Nixies. Voici des photos qu'il m'a fait parvenir, on peut voir la base de temps à l'arrière du coffret (gros plan sur la troisième photo).

base_temps_004_proto_herve_001a base_temps_004_proto_herve_001b base_temps_004_proto_herve_001c

Merci à lui pour son retour et pour les photos, on a là un bien bel objet ! Moi-même ai possédé des tubes Nixies par le passé, mais je m'en suis séparé en me disant que ça ne me servirait jamais vraiment.