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.
|
|
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.
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.
Avec quartz 4 MHz externe et led D1 sur sortie Out5
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).
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.