A.M.F.N.
Association des Modélistes Ferroviaires de Nice

Le port parallèle: exemples d'utilisation des lignes de sortie.


Les lignes de sortie peuvent être utilisées pour commander des accessoires. (Des exemples d'utilisation des convertisseurs numériques-analogiques sont donnés sur une autre page).

Commande d'accessoires simples: relais, lampes ou LEDs:
 
Le 74HCT245 a 3 rôles:
- remettre en forme les signaux TTL déformés par leur parcours dans le câble,
- fournir un peu plus de courant pour pouvoir commander plusieurs circuits
(ici il n'y en a qu'un, mais ça ne va pas durer),
- isoler le port parallèle du PC de nos bricolages, par mesure de sécurité.

L'ULN2804 est conçu pour commander 8 charges sous 50V, 500mA.
Pour le cas où ces charges seraient inductives (relais), des diodes de "roue libre" on été incluses dans le boîtier. Leur point commun (patte 10) doit être connecté au pole positif de l'alimentation de ces relais.

Exemple de programmation en BASIC: (voir principe sur la page "principes de programmation")
DEFINT A-Z         'toutes les variables sont entières
...
DEF SEG=&h40           'chargement du pointeur de segment
A0=PEEK(8)+256*PEEK(9) 'lecture de la valeur entière sur 2 octets
DEF SEG                'restauration du pointeur de segment
A1=A0+1: A2=A1+1       'calcul des adresses des 2 autres registres
...
'la variable ValeurDuPort0 conserve l'état des sorties entre deux commandes
...
'On veut allumer la lampe:
Bit=3                              'rang du bit en commençant à 0
ValeurDuPort0=ValeurDuPort0 OR 2^Bit 'mise à 1 du bit 3
OUT A0,ValeurDuPort0                'écriture dans le registre A0
...
...
'On veut faire retomber le relais:
Bit=6                                   'idem...
ValeurDuPort0=ValeurDuPort0 AND NOT 2^Bit 'mise à 0 du bit 2
OUT A0,ValeurDuPort0                     'écriture dans le registre A0
...

Commande d'un moteur pas-à-pas:
 
Ce schéma est celui que nous avons utilisé à plusieurs reprises pour commander des plaques tournantes.

Le moteur utilisé est du type unipolaire: les quatre enroulements ont un point commun (connecté ici, au "plus") et sont alimentés avec la même polarité.
Pour le faire tourner, il faut alimenter les enroulements à tour de rôle, mais en faisant se chevaucher les phases d'alimentation.
En numérotant les enroulements de 1 à 4 cela donne:
- phase 1: enroulement 1 seul,
- phase 2: enroulement 1 + enroulement 2,
- phase 3: enroulement 2 seul,
- phase 4: enroulement 2 + enroulement 3,
- etc, jusqu'à la phase 8.
 


 

Exemple de programmation en BASIC:
DEFINT A-Z             'toutes les variables sont entières
...
DEF SEG=&h40           'chargement du pointeur de segment
A0=PEEK(8)+256*PEEK(9) 'lecture de la valeur entière sur 2 octets
DEF SEG                'restauration du pointeur de segment
A1=A0+1: A2=A1+1       'calcul des adresses des 2 autres registres
...
'phases d'alimentation des enroulements
DIM PHASE(7)'les phases sont numérotées de 0 à 7
Phase(0)=1  'binaire 00000001
Phase(1)=3  'binaire 00000011
Phase(2)=2  'binaire 00000010
Phase(3)=6  'binaire 00000110
Phase(4)=4  'binaire 00000100
Phase(5)=12 'binaire 00001100
Phase(6)=8  'binaire 00001000
Phase(7)=9  'binaire 00001001
...
...
'rotation de N pas dans le sens positif
'la variable NbPas contient le nombre de pas à exécuter
for N=1 to NbPas
   gosub UnPasPositif  'déplacement d'un pas
   gosub Temporisation 'attente avant de faire le pas suivant
Next
...
...
UnPasPositif: 'déplacement de un pas dans le sens positif
Phase=Phase+1 'la variable Phase conserve la position du moteur
if Phase=8 then Phase=0
out A0, Phase 'exécution du mouvement
return
...
...
UnPasNegatif: 'idem dans l'autre sens
Phase=Phase-1 'la variable Phase conserve la position du moteur
if Phase<0 then Phase=7
out A0, Phase 'exécution du mouvement
return
...

Commentaires sur ce programme:

Deux fonctions essentielles n'ont pas été détaillées dans cet exemple:

1: la fonction qui conserve la position du mécanisme entraîné par le moteur, et qui permet donc de calculer de combien de pas il faut tourner. Par exemple, s'il s'agit de faire tourner une plaque tournante d'une voie à une autre, il faut savoir où est la plaque au départ et où elle doit se retrouver à l'arrivée. La différence entre ces deux positions, exprimée en pas, donne le déplacement à effectuer.

2: la fonction temporisation, qui définit combien de temps le moteur va rester dans une même position, et donc sa vitesse de rotation. On peut réaliser cette temporisation de différentes façons, et il est impossible de rentrer ici dans le détail. Dans le cas le plus compliqué, on peut souhaiter avoir des démarrages et des arrêts progressifs, et la temporisation est donc variable, et fonction du nombre de pas déjà parcourus.

Note sur les moteurs pas-à-pas:
Il existe toutes sortes de moteurs pas-à-pas. Ils se distinguent par le nombre de pas par tour, la tension d'utilisation, la façon dont ils sont alimentés (unipolaires et bipolaires) et bien sûr par la puissance.
En attendant une page sur le sujet, disons qu'il est plus facile de bricoler avec des moteurs:
- unipolaires (pas besoin de composants spéciaux pour les commander),
- de tension "élevée" (12 et 24V, d'où courant réduit. Eviter les moteurs en 2, 3 et 5V),
- avec un grand nombre de pas par tour (p.ex. 200)

Commande d'un convertisseur numérique-analogique:

Commande d'un convertisseur simple:
Ce schéma utilise comme convertisseur un vieux classique à 8 bits: l'AD558, d'Analog Devices.

L'AD558 est une convertisseur monolithique, c'est-à-dire qu'il intègre dans un seul boîtier: le registre d'entrée, une référence de tension, le convertisseur proprement dit, et l'ampli de sortie.

En jouant sur les connexions, on peut lui faire délivrer une tension comprise entre 0 et 2,56V, ou bien une tension comprise entre 0 et 10V. C'est ce dernier montage qui est représenté ici.

Télécharger les spécifications de l'AD558

La page suivante donne des exemples d'utilisation de ce convertisseur pour commander une alimentation traction pour train.


 

Exemple de programmation en BASIC:
DEFINT A-Z             'toutes les variables sont entières
...
DEF SEG=&h40           'chargement du pointeur de segment
A0=PEEK(8)+256*PEEK(9) 'lecture de la valeur entière sur 2 octets
DEF SEG               'restauration du pointeur de segment
A1=A0+1: A2=A1+1       'calcul des adresses des 2 autres registres
...
'la tension de sortie est égale à 10V x (X/255)
out A0, X 'affichage de la valeur
out A1, 1 'validation par C0
out A1, 0 'fin de validation
...

Commentaires sur ce programme:
Lorsqu'on charge dans le registre d'entrée du convertisseur une valeur binaire X comprise entre 0 et 255, il délivre en sortie une tension égale à 10V x (X/255) (dans la configuration ci-dessus).

Le registre est validé par -CS, actif bas, commandé par la ligne -C0 du port parallèle. Comme cette ligne inverse les signaux, il faut écrire un 1 pour valider le registre.

Commande d'un convertisseur quadruple:
Le convertisseur utilisé ici est un des plus récents de Texas Instruments.

C'est également un convertisseur monolithique, mais dont la référence de tension est externe.

Il peut également fonctionner comme un potentiomètre. Cette caractéristique le rend extrêmement intéressant pour la réalisation d'alimentations traction pour train. Le montage ci-contre permet de délivrer en sortie des tensions comprises entre Vdec (p.ex. 5V) et Vref (p. ex. 10V). L'alimentation Vdd doit être supérieure d'au moins 4V à Vref.

Un autre de ses avantages est son prix: le boîtier coûte cinq fois moins qu'un AD558, mais comme il est quadruple, le convertisseur revient 20 fois moins cher que le précèdent.

Télécharger les spécifications du TLC7226

La page suivante donne des exemples d'utilisation de ce convertisseur pour commander une alimentation traction pour train.


 

Exemple de programmation en BASIC:
DEFINT A-Z         'toutes les variables sont entières
...
DEF SEG=&h40           'chargement du pointeur de segment
A0=PEEK(8)+256*PEEK(9) 'lecture de la valeur entière sur 2 octets
DEF SEG                'restauration du pointeur de segment
A1=A0+1: A2=A1+1       'calcul des adresses des 2 autres registres
...
'on utilise un sous-programme pour commander le convertisseur
'les arguments passés à l'appel du sous programme sont:
'1: le numéro du convertisseur (0 à 3)
'2: la valeur X à écrire dans le registre d'entrée (0 à 255)
'la tension de sortie obtenue est égale à Vdec + (Vref-Vdec)x(X/255)
...
call Commande7226 (N, X)
...
Sub Commande7226(Numéro, Valeur) Static
Shared A0, A1
out A0, Valeur        'affichage de la valeur
out A1, (3-Numéro)    'affichage du numéro de convertisseur sur -C0/-C1
out A1, (3-numéro) +8 'validation par -C3
out A1, (3-Numéro)    'fin de validation
End Sub

Commentaires sur ce programme:
Lorsqu'on charge dans le registre d'entrée d'un convertisseur une valeur binaire X comprise entre 0 et 255, il délivre en sortie une tension égale à Vdec + (Vref-Vdec)x(X/255) (dans la configuration ci-dessus).

Le même registre A1 du port parallèle est utilisé pour sélectionner l'un des 4 convertisseurs du TLC7226 et pour valider le registre d'entrée correspondant.

La sélection se fait par les lignes C0- et C1-. Comme ces lignes inversent la valeur du bit correspondant, il faut complémenter la variable Numéro avant utilisation.

La validation se fait par la ligne C3-, inversée comme précédemment.

Utilisation des CNA pour la commande d'alimentations tractions: voir notre page sur le sujet.

Commande d'un grand nombre d'accessoires:
 
Voici une façon simple de commander 5x8=40 sorties à niveaux TTL (0/5V) avec des registres adressables 74HCT259.

Le numéro du point à commander est donné par les bits D0 à D5, et l'état de ce point par le bit D7.

Les bits D0 à D2 sont décodés par le 259 lui-même, et les bits D3 à D5 par le 138 en tête.

La valeur à charger dans le registre est donnée par le bit D7.

Ce montage est extensible à 64 points simplement en rajoutant trois autres 74HCT259. On a été limité ici par la taille du dessin.

Bien entendu, derrière les sorties TTL on doit ajouter l'interface de puissance adéquat pour commander l'accessoire correspondant. Des ULN2804 conviennent bien pour des lampes, des relais, ou même des LEDs.

Commentaires sur ce schéma: Il existe en fait de multiples solutions pour commander un grand nombre de points de sorties, et il n'y a pas de limite théorique: il suffit d'introduire de nouveaux étages de 138. Le schéma présenté est beaucoup plus économique et beaucoup plus simple à mettre en oeuvre que ceux utilisant un PIO 8255 ou équivalents. Il s'applique aussi aux micro-processeurs classiques. Mais, si on utilise des micro-contrôleurs récents, il est plus simple d'utiliser des composants "série", fonctionnant sur le principe du registre à décalage: le circuit imprimé s'en trouve simplifié.
 

Exemple de programmation en BASIC:
DEFINT A-Z         'toutes les variables sont entières
...
DEF SEG=&h40           'chargement du pointeur de segment
A0=PEEK(8)+256*PEEK(9) 'lecture de la valeur entière sur 2 octets
DEF SEG                'restauration du pointeur de segment
A1=A0+1: A2=A1+1       'calcul des adresses des 2 autres registres
...
out A0, 0 'au départ, l'interface est inhibé: -C0 = 1
...
'on utilise un sous-programme pour commander les sorties
'les arguments passés au sous-programme sont:
'1: le numéro de la ligne d'entrée-sortie à commander (0 à 39)
'2: l'état dans lequel on veur mettre cette ligne (0/1)
...
call CommandeES (N, E)
...
Sub CommandeES(Numéro, Etat) Static
Shared A0, A1
out A0, Numéro + 128*Valeur 'la valeur correspond au bit D7, de poids 128
out A2, 1 'validation par -C0
out A2, 0 'fin de validation
End Sub

Page suivante: utilisation des lignes d'entrée.


sommaire pages techniques sommaire port parallèle page suivante

Retour à la page d'accueil