Mini-projets
Filière :
Master génie électrique et systèmes
intelligent industrielles (GESII)
Microcontrôleurs et DSP
Réalisé Par :
▪ BELKHOUKH Mohamed
Encadré Par :
▪ [Link]
Année Universitaire 2024 – 2025
Introduction
Ce mini-projet fait partie du module Informatique Industrielle Embarquée dans notre
formation en Master GESII. L’objectif est de mettre en pratique nos connaissances sur les
microcontrôleurs, en particulier le 68HC11, pour contrôler des systèmes industriels.
Le mini-projet est divisé en deux parties :
Dans la première partie, nous avons étudié le moteur pas à pas, un moteur utilisé pour
faire des mouvements précis, comme dans les imprimantes ou les robots. Le but est de le
contrôler avec le microcontrôleur : choisir le sens de rotation (droite ou gauche), le type de
pas (complet ou demi-pas), la fréquence et le nombre de pas. Nous avons aussi programmé
des temporisations pour contrôler la vitesse du moteur, et créé une rampe d’accélération et de
freinage.
Dans la deuxième partie, nous avons travaillé sur un système de ventilation dans un
tunnel routier. Ce système utilise plusieurs capteurs de pollution et un capteur de circulation.
Quand la pollution est élevée, des ventilateurs s’activent automatiquement. Si un
embouteillage est détecté, les ventilateurs se mettent tous en marche, et les feux de
signalisation passent au rouge. Le programme principal doit gérer toutes ces situations, selon
les capteurs, et contrôler les ventilateurs et les feux tricolores.
Ce projet nous a permis de mieux comprendre le lien entre la théorie et la pratique, et
d’apprendre à écrire des programmes en langage assembleur, à utiliser des entrées/sorties
numériques, et à contrôler un système automatisé complet.
Mini-projet 1 : Commande d’un moteur pas à pas
I. Introduction :
Dans cette première partie, nous avons appris à contrôler un moteur pas à pas avec le
microcontrôleur 68HC11.
Le moteur pas à pas tourne petit à petit, par petits mouvements appelés "pas". On peut
choisir :
• Le sens de rotation (droite ou gauche),
• Le type de pas (complet ou demi-pas),
• La vitesse (avec la fréquence),
• Le nombre de pas à faire.
Pour contrôler le moteur nous avons écrit des programmes en langage assembleur. Nous
avons aussi crée une pause de 100 millisecondes entre chaque pas, et programmé une
séquence de mouvements avec différentes vitesses et directions.
II. Le fonctionnement des moteurs pas-à-pas :
Un moteur pas à pas est un moteur électrique qui tourne par petits mouvements
appelés "pas". Contrairement aux moteurs classiques qui tournent en continu, le moteur pas
à pas se déplace étape par étape, ce qui permet un contrôle très précis de la position.
1. Principe de fonctionnement
Le moteur pas à pas est composé de deux parties :
• Le stator : la partie fixe avec des bobines
(électroaimants),
• Le rotor : la partie qui tourne, avec des
aimants.
Quand on envoie un courant électrique dans les
bobines du stator, cela crée un champ magnétique qui
attire le rotor. En activant les bobines l’une après
l’autre dans un certain ordre, le rotor tourne d’un pas
à chaque fois. La séquence des signaux permet de
choisir :
• Le sens de rotation (droite ou gauche),
• Le mode de fonctionnement :
o Pas complet : le rotor avance d’un grand angle,
o Demi-pas : il avance d’un plus petit angle pour plus de précision.
2. Types de moteurs pas à pas
Il existe plusieurs types de moteurs pas à pas :
À réluctance variable À aimant permanent Hybride
Constitution
Caractéristiques Le rotor n’est pas aimanté, Utilise des aimants simples, Mélange les deux précédents,
mais réagit au champ facile à contrôler. plus précis et plus courant.
magnétique
3. Avantages et inconvénient
- Avantages :
Très précis sans capteur de position,
Facile à contrôler avec un microcontrôleur,
Peut rester en position sans bouger.
- Inconvénients :
Peut vibrer à certaines vitesses,
Moins puissant qu’un moteur classique de même taille,
Chauffe un peu si maintenue longtemps sur place.
III. Instructions pour un pas à droite puis un à gauche :
Pour déplacer le moteur d’un pas à droite, il faut envoyer une impulsion à l’entrée CLOCK,
mettre SENS DE ROTATION à 1 et définir la PORTÉE.
Pour un pas à droite :
ldaa #%11100000 ; Demi-pas, droite, CLOCK = 1
staa PORT1
ldaa #%11000000 ; CLOCK = 0 pour déclencher le pas
staa PORT1
Pour un pas à gauche :
ldaa #%10100000 ; Demi-pas, gauche, CLOCK = 1
staa PORT1
ldaa #%10000000 ; CLOCK = 0 pour déclencher le pas
staa PORT1
IV. Sous-programme ‘DELAY’ (100 ms)
Le microcontrôleur a une fréquence de 8 MHz. Donc chaque cycle machine dure 0,5 µs. Pour
obtenir un délai de 100 ms, on doit faire une boucle assez longue.
DELAY_100MS:
LDX #4000 ; Compteur
LOOP1:
LDY #100 ; Compteur
LOOP2:
DEY ; Décrémenter Y
BNE LOOP2 ; Revenir à LOOP2 tant que Y ≠ 0
DEX ; Décrémenter X
BNE LOOP1 ; Revenir à LOOP1 tant que X ≠ 0
RTS ; Fin du sous-programme
V. Programme pour effectuer 10 pas à gauche
LDAB #10 ; Charger le compteur de pas
LOOP_LEFT:
LDAA #%00100000 ; demi-pas / gauche / horloge à 1
STAA PORTB
NOP
LDAA #%00000000 ; horloge à 0
STAA PORTB
JSR DELAY ; Appel de la pause de 100 ms
DECB
BNE LOOP_LEFT ; Répéter tant que B ≠ 0
VI. Contenu d’un tableau de mouvements + programme associé
Le tableau contient une série de commandes. Chaque
commande peut avoir :
• Mode (bit de direction et de type de pas),
• Nombre de pas à faire,
• Fréquence (ou délai entre les pas).
Il commence avec $FD et finit avec $FE pour indiquer début et
fin.
Programme simple pour lire le tableau :
tab:
fcb $FD
fcb $C0,$0A,$64 ; demi-pas droite, 10 pas, 100Hz
fcb $80,$05,$32 ; demi-pas gauche, 5 pas, 50Hz
fcb $FE
VII. Rampe d’accélération et de freinage (vers 250 Hz puis arrêt)
Pour faire une rampe :
• Commence avec une fréquence basse (grand délai),
• Réduis progressivement le délai jusqu’à 4 ms (≈250 Hz),
• Puis augmente de nouveau le délai pour simuler le freinage.
ORG $8000
PORTB EQU $1004
DELAYVAL EQU $0040
LDS #$00FF
LDX #100
LDY #100
ACCEL:
LDAA #%11100000
STAA PORTB
LDAA #%11000000
STAA PORTB
STY DELAYVAL
LDAB DELAYVAL
JSR DELAY_MS
DEY
CPY #4
BHI ACCEL
DECEL:
; Envoi d’un pas
LDAA #%11100000
STAA PORTB
LDAA #%11000000
STAA PORTB
STY DELAYVAL
LDAB DELAYVAL
JSR DELAY_MS
INY
CPY #101
BLO DECEL
SWI
DELAY_MS:
LDAA #0
DELAY_LOOP1:
LDX #4000
LOOP2:
DEX
BNE LOOP2
DECB
BNE DELAY_LOOP1
RTS
Mini-projet 2 : Commande d'un système d'aération de tunnel
I. Introduction
Ce mini-projet consiste à commander un système d’aération dans un tunnel routier.
Dans ce tunnel, 4 capteurs (I1 à I4) détectent la pollution de l’air, et 1 capteur (I5) détecte les
embouteillages.
Le système doit gérer automatiquement :
L’activation des 3 ventilateurs d’aération (M1, M2, M3) selon le niveau de pollution.
Le feu de circulation (rouge, orange, vert) selon la pollution et le trafic.
II. Analyse des problèmes et réponses aux questions
Q1.
Phase Binaire Hexadécimal Décimal
Rouge %10000000 $80 128
Orange %01000000 $40 64
Vert %00100000 $20 32
Rouge + Orange %11000000 $C0 192
Chaque phase correspond à un feu qui s’allume sur le Port 0 du microcontrôleur 68HC11.
Q2.
Le tableau de phases des feux est stocké à partir de l’adresse $0030 dans la RAM.
Chaque phase contient deux valeurs :
• 1 octet pour le feu (ex: $80 pour rouge),
• 1 octet pour la durée (ex: $0A pour 10 secondes).
Adresse | Valeur | Signification
$0030 | $80 : Feu Rouge
$0031 | $0A : 10 secondes
$0032 | $C0 : Rouge + Orange
$0033 | $02 : 2 secondes
$0034 | $20 : Vert
$0035 | $0A : 10 secondes
$0036 | $40 : Orange
$0037 | $02 : 2 secondes
$0038 | $FF : Fin du tableau
Q3.
La fin du tableau est marquée par la valeur spéciale $FF.
Le programme s’arrête de lire le tableau quand il lit cette valeur.
III. Sous-programme DELAY (temporisation)
Pour retarder les phases des feux, on utilise un sous-programme DELAY.
Le but est de faire une pause de 1 seconde à chaque appel, répétée selon un compteur.
Calcul
• Fréquence : 8 MHz
• Cycle : 0,5 µs
• 1 seconde = 2 000 000 cycles
ORG $0030
DelayTime FCB 10 ; Paramètre DelayTime = 10 secondes
ORG $F800
; === Sous-programme DELAY ===
; Fonction : Créer un délai total de DelayTime secondes
DELAY:
LDAA $0030 ; Lire le paramètre DelayTime depuis RAM
PSHA ; Sauvegarder le contenu de A
LOOP:
JSR DELAY1S ; Appeler le sous-programme de 1 seconde
DECA ; Diminuer le compteur
BNE LOOP ; Refaire tant que le compteur ≠ 0
PULA ; Restaurer A
RTS ; Retour au programme appelant
; === Sous-programme DELAY1S ===
; Fonction : Créer un délai d'environ 1 seconde
DELAY1S:
LDX #80 ; Boucle extérieure
BOUCLE_X:
LDY #4200 ; Boucle intérieure
BOUCLE_Y:
NOP ; Instruction vide (2 cycles)
NOP ; Instruction vide (2 cycles)
DEY
BNE BOUCLE_Y
DEX
BNE BOUCLE_X
RTS
IV. Sous-programme LIGHTS
ORG $F800
LIGHTS:
LDX #$0032 ; Adresse du tableau
NextPhase:
LDAA 0,X ; Lire valeur feu
CMPA #$00
BEQ EndLIGHTS ; Si $00, fin
STAA $1004 ; Afficher sur PORTB
LDAA 1,X ; Lire durée
STAA DelayTime
JSR DELAY ; Appel routine délai
INX
INX
BRA NextPhase
EndLIGHTS:
RTS
ORG $F820
DELAY:
LDAA DelayTime
LOOP_DELAY:
BEQ FIN_DELAY
JSR DELAY_1S
DECA
BRA LOOP_DELAY
FIN_DELAY:
RTS
DELAY_1S:
LDX #80
BOUCLE_X:
LDY #4200
BOUCLE_Y:
NOP
NOP
DEY
BNE BOUCLE_Y
DEX
BNE BOUCLE_X
RTS
Le sous-programme LIGHTS parcourt une table de phases de feux enregistrée en mémoire à
partir de l’adresse $0032.
Chaque phase est composée de 2 octets :
• un pour l’état du feu (par exemple feu rouge, vert, etc.),
• un pour la durée de la phase (en secondes).
• Lorsque la valeur lue est $00, cela indique la fin de la séquence.
Le délai est géré grâce à deux sous-programmes :
DELAY, qui répète un délai d’un seconde autant de fois que nécessaire,
DELAY_1S, qui crée un délai d’un seconde à l’aide de boucles .
V. Programme principal – Système tunnel
Fonctionnement attendu
• Si 1 capteur actif : M1 allumé.
• Si 2 capteurs : M1 + M2 allumés.
• Si 3 ou 4 capteurs : M1 + M2 + M3 allumés.
• Si 4 capteurs actifs : lancer le programme des feux LIGHTS.
• Si < 4 capteurs : allumer feu vert.
• Si embouteillage (I5 actif) :
- Tous les ventilateurs allumés,
- Feu rouge pendant 10 secondes,
- Si embouteillage continue : feu reste rouge.
Le programme :
ORG $0030
DelayTime: RMB 1 ; Réservation d'1 octet pour stocker la durée
ORG $F900
MAIN:
JSR LIGHTS ; Appel du sous-programme des feux
BRA MAIN ; Boucle infinie
; ----------------------------------------
ORG $F940
DELAY:
LDAA DelayTime
LOOP_DELAY:
BEQ FIN_DELAY
JSR DELAY_1S
DECA
BRA LOOP_DELAY
FIN_DELAY:
RTS
DELAY_1S:
LDX #80
BOUCLE_X:
LDY #4200
BOUCLE_Y:
NOP
NOP
DEY
BNE BOUCLE_Y
DEX
BNE BOUCLE_X
RTS
; ---------------------------------------
ORG $F980
LIGHTS:
LDX #$0032
NextPhase:
LDAA 0,X
CMPA #$00
BEQ EndLIGHTS
STAA $1004
LDAA 1,X
STAA DelayTime
JSR DELAY
INX
INX
BRA NextPhase
EndLIGHTS:
RTS
Conclusion générale
Dans ce travail, nous avons réalisé deux mini-projets pratiques utilisant le microcontrôleur
68HC11.
Le premier mini-projet portait sur la commande d’un moteur pas à pas. Nous avons
appris à contrôler le sens de rotation, le type de pas (complet ou demi-pas), et la fréquence
des impulsions. Ce projet nous a permis de mieux comprendre comment envoyer des
signaux précis à un actionneur, et comment utiliser des temporisations pour synchroniser les
mouvements.
Le deuxième mini-projet était centré sur la gestion automatique d’un système
d’aération dans un tunnel. Nous avons utilisé plusieurs capteurs pour détecter la pollution et
les embouteillages, et nous avons programmé la logique de commande pour activer les
ventilateurs et gérer les feux de circulation. Ce projet nous a aidé à appliquer les bases de la
programmation en assembleur dans une situation plus complexe, avec des conditions, des
sous-programmes, des boucles et des tableaux en mémoire.
Ces deux mini-projets nous ont permis de renforcer nos compétences en
programmation bas niveau, en logique combinatoire et en gestion des entrées/sorties. Ils
sont aussi une bonne préparation pour des systèmes embarqués réels dans le domaine de
l’automatique et de l’électronique industrielle.