You are on page 1of 73

BRUYERE Philippe 2002-2003

GOMBERT Benjamin
VENCE Eric
Gp. P205
PROJET DE 2
me
ANNE
CONCEPTION ET RALISATION DUN MODULE
P.I.D. SORTIE ANALOGIQUE
ESME Sudria p.1/72
2003
SOMMAIRE
A DESCRIPTION DU PROJET 04
CAHIER DES CHARGES 04
PRINCIPE DE FONCTIONNEMENT 04
GUIDE DUTILISATION 06
B CONCEPTION MATRIELLE 08
CHOIX DES COMPOSANTS 08
SCHMA BLOC 09
DTAILS TECHNIQUES 09
Adaptateur dentre 09
CAN 11
Microcontrleur 18
Afficheur et Driver 19
Clavier 19
CNA 20
Adaptateur de sortie 27
RALISATION 29
Nomenclature 29
Schma de cblage 30
Procdures de tests 31
Montage final 33
ESME Sudria p.2/72
2003
C CONCEPTION LOGICIELLE 34
ORGANISATION DU PROGRAMME
ET FORMATAGE DES DONNES 34
CONFIGURATION DU PIC 38
Affectation des entres/sorties 39
Assignation des registres de configuration 40
MISE EN PLACE DE MACROS 43
DCLARATION DES CONSTANTES 43
ALLOCATION DE LESPACE MMOIRE 44
DTECTION ET TRAITEMENT DES INTERRUPTIONS 45
INITIALISATIONS 54
Initialisation des ports 54
Initialisation des registres dinterruptions 55
Initialisation des variables 55
ROUTINES 56
CAN 56
Addition 57
Soustraction 58
Multiplication 58
Calcul du P.I.D. 60
Conversion de chiffres en digits 66
Conversion des paramtres en digits 68
Affichage (transmission srie des donnes) 69
PROGRAMME PRINCIPAL 71
D SYNTHSE 72
AMLIORATIONS ENVISAGES 72
E SOURCES 73
ESME Sudria p.3/72
2003
A DESCRIPTION DU PROJET
Cahier des charges
L'objectif de ce projet est de concevoir un module effectuant les fonctions de
corrections numriques P.I.D. dun signal dentre analogique. Les valeurs Kd,
Kp et Ki sont rglables ou rinitialisables par lutilisateur tout instant et
affiches sur un cran LCD 4 chiffres. Le signal de sortie est analogique. La
structure gnrale de lapplication est celle du schma ci-dessous:
Les composants utiliser sont :
- Microcontrleur PIC 16F876
- Contrleur LCD de rfrence MM5452
- Afficheur LCD 4 digits
- Convertisseur Numrique-Analogique 8 bits
Principe de fonctionnement
Le module de correction P.I.D. (Proportionnelle Intgrale Drive) raliser
propose le rglage des valeurs Kp, Ki et Kd (paramtres du correcteur) par
l'utilisateur grce un clavier (touches plus et moins pour incrmenter et
dcrmenter les valeurs et touche de validation). Les rglages sont visualiss
sur un afficheur LCD 4 chiffres (ou digits) contrl par un driver.
Les corrections sont effectues par un microcontrleur qui prend en charge la
conversion analogique-numrique du signal d'entre. Le signal numrique
corrig est ensuite reconverti en signal analogique par un convertisseur
numrique-analogique. Enfin le signal est amplifi a l'aide d'un amplificateur de
gain avant de commander une machine courant continue (MCC).
Micro-
Contrleur
CNA MCC
Capteur
e
r
+
-
s e
ESME Sudria p.4/72
2003
La rponse est rcupre en sortie de la MCC et une fois filtre elle est
compare au signal d'entre afin de dterminer l'erreur pour effectuer la
correction souhaite.
Un correcteur alliant la combinaison des trois actions P.I.D. peut tre assimil
un correcteur srie au sein dun systme.
Dtails sur les 3 corrections :
La premire consiste dire que plus l'erreur est grande et positive et plus il faut
augmenter la tension aux bornes du moteur (pour rattraper cette erreur). La
tension aux bornes du moteur est alors directement proportionnelle l'erreur.
On a donc :

u t
( )
= K
p
.e t
( )
Kp tant un coefficient de proportionnalit.
On voit cependant apparatre des problmes. Il faut une certaine tension aux
bornes du moteur pour que celui-ci puisse se lancer. En rgime permanent,
l'erreur ne sera plus assez grande pour pouvoir faire avancer le moteur. Il y aura
donc une erreur qui subsistera et nous n'atteindrons pas exactement la position
souhaite (erreur d'ordre 0). De mme, pour qu'il puisse y avoir un mouvement,
il sera ncessaire que le moteur soit aliment, et donc qu'il y ait une erreur.
C'est pourquoi, on ajoute un autre lment qui va augmenter la tension aux
bornes du moteur lorsque l'erreur reste constante. chaque priode, on va
sommer l'erreur (intgration de l'erreur). Donc, si l'erreur reste constante, sa
somme va augmenter au fil du temps. On a alors :

u t
( )
= K
p
.e t
( )
+
1
K
i
e t
( )
dt
0
t

La valeur Ki est un coefficient qui va dterminer l'influence de ce paramtre


intgral.
Lorsque l'on applique une tension au moteur, il met un certain temps ragir
(constante de temps mcanique). Pendant ce temps lerreur continue
augmenter et la tension aux bornes du moteur crot alors que cela n'est pas
ncessaire. Pour diminuer ce phnomne, nous introduisons un 3me lment
qui permet d'en limiter les effets (il est souvent fait rfrence pour ce terme la
notion de viscosit, en augmentant ce terme c'est comme si on augmentait la
viscosit de la raction, on trempe le tout dans un liquide de plus en plus
visqueux). On se base sur la diffrence (la variation) de l'erreur entre 2
mesures. Il s'agit de la drive de l'erreur. On obtient au final lquation du
P.I.D. :

u t
( )
= K
p
.e t
( )
+
1
K
i
e t
( )
dt
0
t

+ K
d
de t
( )
dt
Avec Kd tant le coefficient du paramtre driv.
Chacun des paramtres Kp, Ki et Kd corrige le systme en vitesse, stabilit et
prcision. Par exemple avec un correcteur de type proportionnel on peut rendre
le systme plus rapide mais il devient en revanche moins stable. Il faut donc
trouver un compromis entre rapidit, stabilit et prcision. Do la ncessit
dutiliser un correcteur labor dont la programmation sera dtaille par la suite.
ESME Sudria p.5/72
2003
Guide dutilisation
Pour sassurer du bon fonctionnement du module dasservissement, il faut
suivre scrupuleusement les tapes suivantes lors de sa mise en marche.
Tout dabord vrifier le cblage dalimentation. Les bornes de couleurs bleu,
jaune, rouge et noire sont directement relies aux composants (PIC, CAN,
driver LCD, AOP) et les alimentent. Les douilles jaune et bleue fournissent
respectivement +12 et 12V pour les AOP et la douille rouge +5V pour le reste
des composants.
Il faut sassurer que toutes les alimentations sont bien branches, surtout au
niveau du +12 et 12V (jaune et bleue) afin de ne pas crer de diffrences de
potentiels trop importantes au sein du circuit gnral. Cest partir de ce
moment-l que lon peut allumer lalimentation et basculer linterrupteur gnral
du montage sur la position ON.
Aprs avoir rgl le GBF, on le relie laide de cbles coaxiaux branchs sur
les fiches BNC. On branche un oscilloscope en sortie pour visualiser le signal
corrig. Le signal dentre ne peut excder +5V et 5V et il doit rester en basses
frquences (50 Hz par exemple).
Une fois la maquette alimente et un signal dentre inject, il faut appuyer sur
le bouton Reset pour dmarrer la conversion analogique-numrique et par
consquent la correction P.I.D. Les paramtres sont directement visualiss sur
lafficheur LCD. Quatre digits sont utiliss, de gauche droite : Kp, Ki, Kd et la
limite dintgration de lasservissement. Le clavier est compos de 3 boutons
(+, -, v pour valider). Une premire pression sur v permet dactiver le
mode de slection du paramtre modifier. On se dplace sur lafficheur
laide des boutons + pour aller gauche, et - pour aller droite. Une fois le
ESME Sudria p.6/72
2003
choix du paramtre modifier effectu, on le valide par pression sur v. Ainsi
on passe dans le mode de slection de la valeur du paramtre qui peut varier
par pas de 1 entre 0 et 9. Le + et le - permettent dincrmenter ou
dcrmenter la valeur que lon valide avec la touche v. Lopration de
modification du ou des paramtres de corrections peut tre effectu tout
instant. Lorsque lon appuie sur la touche Reset, tous les paramtres sont
remis 0. On peut ainsi raliser un nouvel asservissement.
ESME Sudria p.7/72
2003
B - Conception matrielle
Choix des composants
Le cahier des charges nous impose dutiliser certains composants. Ils ont t
choisis pour leurs caractristiques techniques et les performances ncessaires
la bonne excution du systme.
Le microcontrleur est le cur du systme. Il doit effectuer en permanence le
calcul de la correction P.I.D., mais il doit aussi grer lenvoi de donnes au
driver LCD afin deffectuer un affichage cohrent des paramtres du correcteur.
Le PIC doit galement prendre en compte les interruptions engendres par les
modifications possibles des paramtres laide de boutons-poussoirs. Il est de
plus quip dun convertisseur analogique-numrique (CAN) 10 bits en entre.
En sortie du PIC nous avons choisi dutiliser un convertisseur numrique-
analogique (CAN) 8 bits de rfrence AD557. Il dlivre en sortie un signal
compris entre [0V ; +2,5V]. Ce convertisseur est plac avant ladaptateur de
sortie.
Lutilisation de ce PIC et du CAN impose quelques contraintes. Il ne peut
recevoir en entre quun signal compris entre 0 et 5 Volts. Or nous effectuons
lasservissement dune machine courant continue, nous avons donc un signal
compris entre 5 et +5 Volts en entre du PIC.
Il faut alors utiliser deux montages dadaptation. Un en entre pour rduire
lamplitude du signal de [-5V ; +5V] [0V ; +5V] et un autre en sortie pour
augmenter lamplitude de [0V ; +2,5V] sortie du CAN [-5V ; +5V].
ESME Sudria p.8/72
2003
Schma bloc
Dtails techniques
Adaptateurs dentre
Conversion [+5v ; -5v] => [+5v ; 0v]
Il faut adapter le signal dentre. Nous devons diminuer lamplitude du signal de
[+5v ; -5v] [+5v ; 0v].
quation raliser :

V
s
=
V
e
+ 5
( )
2
Pour raliser cette opration, on utilise deux amplificateurs oprationnels (AOP)
en srie. Le premier est utilis en montage amplificateur inverseur ; le second
en montage soustracteur recevant sur sa borne V- (borne inverseuse) la sortie
du premier AOP et sur sa borne V+ (borne non-inverseuse) le signal dentre
corriger.
ESME Sudria p.9/72
2003
Le choix des rsistances est fait de telle sorte que :
R
1
= R
2
= R
5
= R
6
R
3
= R
4
R
3
= 2 R
1
Une fois les calculs thoriques effectus, nous avons simul lensemble du
montage dadaptation laide du logiciel Design Capture. Voici les courbes que
nous obtenons aprs simulation :
Le signal dentre, une sinusode damplitude comprise entre 5 et +5 V, a t
adapt pour pouvoir tre inject au PIC.
ESME Sudria p.10/72
2003
CAN
Le principe de la conversion analogique-numrique est dattribuer une grandeur
numrique correspondant un tat physique. Le CAN convertit donc une
tension dite analogique en une valeur numrique.
Le PIC 16F876 utilis pour le calcul de la correction P.I.D. intgre un
convertisseur 10 bits. Il ne sera donc pas ncessaire dutiliser un circuit
supplmentaire pour la conversion analogique-numrique.
Rsolution dun convertisseur analogique-numrique
La rsolution dun CAN correspond la plus petite mesure ralisable par le
CAN, autrement dit la prcision du CAN.
Par exemple, si on utilise un CAN 8 bits, ce CAN ne pourra fournir que 255
valeurs diffrentes. La plus petite diffrence de tension mesurable ses bornes
va tre fonction de la plage de mesure en tension utilise. Si la tension est
comprise entre 0 et 5V, la mesure minimale correspond : 5/255 = 19,6mV. On
dira que la rsolution dun CAN 8 bits pour une tension de plage de mesure de
5V est de 19,6mV.
Dune faon gnrale, la rsolution est gale la plage de tension de la mesure
divise par le nombre de bits du CAN :

Rsolution =
plage _ de _ mesure
Nombre _ de _bits_ du_CAN
Par consquent, pour augmenter la rsolution dun systme, on a 2 possibilits :
- soit augmenter le nombre bits du CAN utilis
- soit diminuer la plage de mesure
On utilise dans ce projet un CAN 10 bits (celui contenu dans le PIC 16F876)
pour convertir le signal dentre. Nanmoins un CAN 8 bits aurait suffi car on
nglige les deux bits les moins significatif lors de la correction effectue par le
PIC.
ESME Sudria p.11/72
2003
chantillonnage de linformation
La premire tape du processus de numrisation est lchantillonnage. Cela
consiste passer d'un signal temps continu (un signal lectrique en
loccurrence), en une suite discrte de valeurs (valeurs mesures intervalles
rguliers). Cet chantillonnage est de lordre de la dizaine de microsecondes.
Une relation existe entre la frquence maximale du signal dentre et la
frquence chantillonnage. En effet, pour viter le phnomne de recouvrement
spectral il faut respecter le thorme de Shannon : F
e
> 2.F
max
Dtail de fonctionnement du CAN contenu dans le 16F876
Le microcontrleur 16F876 intgre un module de conversion analogique-
numrique qui est associ un multiplexeur analogique multivoie des entres.
Autrement dit on peut raliser des mesures sur plusieurs voies dentre
analogiques (jusqu 5). Ces voies analogiques correspondent aux broches du
port A.
Module CAN 10 bits implique que le rsultat de la conversion est un nombre de
10 bits, c'est--dire compris entre 000H et 3FFH (11 1111 1111 en binaire ou
1023 en dcimal). Ceci correspond donc 1023 niveaux de mesure, ce qui pour
5V donne une rsolution de 4,8mV, prcision largement suffisante.
Le temps de conversion de ce module est de lordre de : 40s ce qui permet en
pratique de raliser jusqu 25000 mesures par seconde.
ESME Sudria p.12/72
2003
Structure interne du CAN 10 bits des 16F876
Les registres et bits associs au module CAN
Il y a 4 registres associs au module CAN du 16F876 :
- ADRESH : le registre de rsultat Haut
- ADRESL : le registre de rsultat Bas
- ADCON0 : premier registre de contrle du module CAN
- ADCON1 : seconde registre de contrle du module CAN
ESME Sudria p.13/72
2003
Les registres ADRESH et ADRESL
Le convertisseur Analogique Numrique est 10 bits et par consquent 1 octet
(=8 bits) ne suffit pas pour contenir le rsultat de la mesure. Cest pour cela que
2 registres sont ncessaires et sont donc utiliss. De fait 6 bits restent inutiliss
sur les 16 disponibles. Il est possible de dfinir la justification du rsultat au
sein de ces 2 octets laide dun bit du registre ADCON1 : le bit ADFM. Voici la
disposition des bits de rsultats dans les 2 octets en fonction de la valeur du bit
ADFM :
Le registre ADCON0 :
Ce premier registre de contrle contient plusieurs bits qui configurent le
fonctionnement du module CAN :
- Bits ADCS1, ADCS0 : bits de slection de lhorloge utilise pour le module
CAN.
- Bits CHS2, CHS1, CHS0 : les bits de slection du canal analogique mesurer.
Avant toute conversion, il faut dfinir quel est le canal qui va tre utilis pour
cette conversion. Ceci se fait grce ces 3 bits selon le tableau suivant :
ESME Sudria p.14/72
2003
- Bit GO/DONE : Le bit de lancement de la conversion et tmoin de la fin de
conversion.
Ce bit nest actif que si le bit ADON=1, c'est--dire si le module CAN est actif. Il
sert lancer la conversion : en mettant ce bit 1, on lance la conversion partir
de la voie analogique slectionne par les bits CHS2, CHS1 et CHS0.
Une fois que la conversion est termine, ce bit passe 0 automatiquement. Il
sera donc possible dutiliser ce bit pour attendre la fin de la conversion en cours.
- Bit ADON : Le bit dallumage du module CAN.
Ce bit sert allumer le module CAN. Si ADON=0, le module CAN est inactif. Si
le bit ADON=1, le module est oprationnel.
Le registre ADCON0 :
Ce second registre de contrle contient plusieurs bits qui configurent le
fonctionnement du module CAN :
- Bit ADFM : Configuration du format du rsultat.
Ce bit sert configurer le rsultat au sein des 2 registres ADRESL et ADRESH
selon le tableau qui suit :
Les cases vertes reprsentent le rsultat sur 10 bits, X0 correspond au bit de
poids faible et X9 au bit de poids fort.
- Bits PCFG0 , CFG1, PCFG2 et PCFG3 : Bits de configuration des ports A (en
analogique ou numrique).
Les broches des ports A ( lexception de PA4) peuvent tre configures soit en
analogique soit en numrique.
Lorsquune broche de ce port est configure en analogique, elle devient un des
canaux de mesure utilisables par le CAN. Lorsquelle est configure en
numrique, elle est une broche E/S comme les autres broches des autres ports.
ESME Sudria p.15/72
2003
La configuration de la nature des broches du port A est dcrite dans le tableau
suivant :
Linterruption fin de conversion associe au module CAN
Il existe galement une source dinterruption lie au module CAN : la fin de
conversion. Comme toute interruption, celle-ci doit tre active pour tre
oprationnelle ce qui se fait par les bits :
- PEIE=1 (activation des interruptions priphriques)
- ADIE=1 (activation de linterruption fin de conversion)
Le bit de drapeau associ cette interruption est ADIF. Il faudra le mettre 0
avant toute activation de linterruption. Ce dernier est automatiquement mis 1
en fin de conversion si linterruption est active.
Cette interruption est intressante uniquement si lon souhaite optimiser la
vitesse de conversion au maximum.
ESME Sudria p.16/72
2003
Tableau de synthse issu de la datasheet du 16F876 :
Droulement dune conversion analogique-numrique
tudions comment le module CAN 10 bits ralise une conversion analogique
numrique. Le schma suivant rsume la squence dune conversion
analogique-numrique par le module utilis :
1. Lensemble de la conversion est lanc lorsque le bit GO/Done est mis 1
par lutilisateur.
2. Sen suit un temps de latence interne li la prsence dun condensateur
interne.
3. Puis la conversion commence avec le calcul des 10 bits
4. Lorsque la conversion analogique-numrique est termine :
a. le rsultat est stock dans les registres ADRESL et ADREH
b. le bit GO/Done est mis 0 automatiquement tmoignant de la fin
de la conversion
c. le drapeau de linterruption fin de conversion est mis 1 (si cette
interruption est active comme expliqu prcdemment)
ESME Sudria p.17/72
2003
Microcontrleur
Le microcontrleur que nous utilisons est un 16F876. Il a t choisi pour ses
caractristiques techniques intressantes.
Il possde une mmoire RAM de 368 octets, une EEPROM de 256 octets ainsi
quune FLASH de 8 kilo-octets. Cela nous assure un espace suffisant pour
stocker et excuter le programme afin de traiter le signal corriger.
En plus des entres/sorties programmables et des interruptions, il possde
certaines ressources internes telles que :
- Un convertisseur analogique-numrique 10 bits qui envoie directement les
chantillons du signal traiter aux registres internes du PIC afin
deffectuer la correction P.I.D. Lintgration de ce CAN simplifie le
routage, vite des problmes de compatibilit et fait gagner de la place
au montage.
- Des timers. Nous utiliserons le timer 1 pour grer le clignotement du
curseur. Le timer 1 est un compteur 16 bits. Lorsquil est coupl notre
oscillateur de 4MHz avec un pr-diviseur gal 8 on obtient une
interruption toutes les 0,5 secondes. La priode de clignotement sera
donc dune seconde.
- Des liaisons sries SCI, I2C, SPI qui ne sont pas utilises dans le cadre de
ce projet.
- Des sorties P.W.M. (Modulation de Largeur d'Impulsion) si lon veut
effectuer une commande numrique par exemple.
Pour fonctionner le PIC rclame une configuration hardware minimale
compose dun oscillateur et dun circuit reset :
ESME Sudria p.18/72
2003
Afficheur et Driver
Le driver LCD remplit une double fonction. Il commande l'affichage et d'autre
part se charge de la communication avec l'extrieur.
Il est pilot par le PIC qui lui transmet un signal dhorloge qui cadence lenvoi
des donnes afficher.
Le driver peut afficher jusqu 32 segments diffrents, ce qui correspond dans
notre cas 4 digits 7 segments ainsi que 4 points situs gauche des
chiffres. Lafficheur LCD ne pose pas de problme, le routage de chaque digit
se fait par paquet de 8 bits.
Clavier
Le clavier doit permettre la saisie et la modification des paramtres du
correcteur PID : Kp, Ki, Kd et la limite dintgration.
ESME Sudria p.19/72
2003
Il est constitu de trois boutons-poussoirs avec une capacit de dcouplage en
parallle pour limiter le phnomne de rebonds.
Les boutons sont connects au PIC sur le port B.
CNA
Les convertisseurs numrique-analogique convertissent les signaux logiques en
tensions analogiques. Plusieurs types de convertisseurs sont disponibles dans
chaque catgorie, ils se diffrencient par leur prcision, leur vitesse de
traitement de l'information, leur prix... On devra donc faire des compromis selon
ses besoins.
Il existe principalement deux types de convertisseurs numrique-analogique sur
le march : les convertisseurs rsistances pondres, et les convertisseurs
rseau R/2R (ces derniers sont prdominants). Il existe galement des
convertisseurs rseaux de condensateurs fonctionnant sur le mme principe
de base que les rseaux rsistances.
Principe de fonctionnement
Si on fait l'opration inverse de la conversion analogique-numrique, chaque
valeur numrique on fait correspondre une et une seule valeur analogique; la
tension analogique de sortie varie par "bonds", et non plus continment comme
dans le signal d'origine. La tension de sortie a une forme d'escalier.
ESME Sudria p.20/72
2003
En pratique, on filtre cette tension pour lisser ces discontinuits et essayer de
se rapprocher au mieux du signal d'origine :
Dfinitions
Rsolution
La rsolution du CNA est la variation de tension de sortie correspondant la
variation d'une unit du nombre binaire en entre. La dfinition est quivalente
celle du CAN.
Plage de conversion
Il y a ici une petite diffrence avec le CAN, la plage de conversion numrique va
de 0 2(N-1), N tant le nombre de bits du convertisseur, et chaque valeur
numrique correspond une unique valeur analogique de sortie. Par rapport
celle du CAN, la plage de conversion s'arrte donc un LSB (bit le moins
significatif) plus tt (sur l'chelle analogique du CAN, ceci correspond la
dernire transition numrique).
Dynamique
La dynamique d'un signal est le rapport entre la tension maxi et la tension mini
que pourra prendre ce signal.
Mise en relation
D'aprs ce qui a t dit sur la plage de conversion, la relation entre le pas de
quantification (1 LSB), la plage de conversion V
MAX
et le nombre de bits du
convertisseur sera lgrement diffrente de l'quation suivante en pratique. La
figure du paragraphe suivant va clairer cette quation :

LSB =
DV
MAX
2
N
ESME Sudria p.21/72
2003
Exemple : CNA 3 bits
Fonction de transfert d'un CNA 3 bits
Cette figure montre la fonction de transfert d'un CNA 3 bits ayant une rsolution
de 1V. On voit clairement ici ce qui a t dit pour la plage de conversion : la
plage s'tend de 0 7V, et non pas 8V comme pour le CAN, car le dernier tat
numrique est "7".
En pratique, pour un CAN suprieur 8 bits, la diffrence avec le rsultat
thorique donn par lquation prcdente est trs faible.
ERREURS DE CONVERSION
Erreur de gain
Le fabricant de convertisseurs Analog Devices dfinit cette erreur ainsi : c'est
l'cart entre la valeur thorique et la valeur relle mesure sur la dernire
transition du convertisseur et exprim en LSB. Cette mesure suppose que
l'ajustage du zro soit parfait.
ESME Sudria p.22/72
2003
Illustration de lerreur de gain.
Erreur d'offset
De mme, le code binaire 0 ne correspond pas forcment une tension
rigoureusement nulle en sortie. Cette tension est la tension de dcalage, ou
d'offset.
Erreur d'offset.
ESME Sudria p.23/72
2003
En pratique, Analog Devices dfinit cette erreur comme tant l'cart entre la
valeur thorique et la valeur relle mesure sur la premire transition du
convertisseur et exprim en LSB. En pratique, pour ajuster un convertisseur, on
rglera d'abord l'offset, et ensuite le gain.
Erreurs de linarit
L'erreur de linarit est due au fait que la rsolution des convertisseurs n'est
pas constante. On distingue deux formes de non-linarit :
- Le non linarit intgrale
La non linarit intgrale (exprime en LSB) est la diffrence maximale
constate sur toute la plage de conversion entre les valeurs thoriques et les
valeurs mesures.
Cette mesure n'a de sens que si le zro et le gain sont correctement rgls. La
fonction est reprsente dans la figure suivante.
Erreur de linarit intgrale.
ESME Sudria p.24/72
2003
- La non linarit diffrentielle
La non linarit diffrentielle concerne la diffrence de tension obtenue lors du
passage au code numrique immdiatement suprieur ou infrieur.
Thoriquement, cette valeur vaut 1 LSB. La non linarit diffrentielle sera la
diffrence entre l'cart mesur et le LSB thorique.
Erreur de linarit diffrentielle.
La valeur donne dans les spcifications des constructeurs est la plus grande
valeur constate sur toute la plage de conversion.
La non linarit diffrentielle est plus gnante que la non linarit intgrale,
surtout dans le cas de mesures comparatives effectues sur une faible partie de
la plage de conversion. En gnral, et pour des causes technologiques, le
maximum de non linarit diffrentielle se trouve la moiti de la pleine chelle
(passage du MSB bit le plus significatif - de 0 1), et ensuite moindre
degr 1/4 et 3/4 de la pleine chelle. Il faut donc rester vigilant lors de
mesures dans ces zones.
ESME Sudria p.25/72
2003
Monotonicit
Ce phnomne est le mme que le prcdent, mais pouss l'extrme : il peut
arriver que la pente de la courbe de conversion change de signe. Pour une
tension analogique de sortie, il nest pas possible d'attribuer un nombre binaire
correspondant : plusieurs valeurs peuvent tre attribues une mme
combinaison logique.
Monotonicit
Temps d'tablissement
Les tages de sortie des CNA sont gnralement des amplificateurs
oprationnels. On a vu que la tension de sortie varie "par bonds" quand le code
binaire d'entre change. De ce fait, l'ampli de sortie va fonctionner en mode
impulsionnel. La stabilisation de la tension de sortie n'est pas immdiate : elle
peut tre du type premier ordre ou oscillatoire amortie (deuxime ordre et plus).
ESME Sudria p.26/72
2003
On appelle temps d'tablissement (setting time en Anglais) le temps mis par la
sortie pour atteindre un certain pourcentage de la tension finale stabilise
lorsque l'entre va varier.
Temps d'tablissement
Prcision du convertisseur
Pour obtenir la prcision globale du convertisseur, on cumule toutes les erreurs
prcdemment cites.
En gnral, ces erreurs sont donnes soit en % de la pleine chelle, soit en
fraction de quantum ( 1/2 LSB par exemple).
Adaptateur de sortie
Conversion [+2,5v ; 0v] => [+5v ; -5v] :
Nous devons adapter le signal de sortie du CNA. Il faut augmenter lamplitude
du signal de [+2,5v ; 0v] [+5v ; -5v] pour alimenter correctement la MCC.
quation raliser :

V
s
= 4V
e
-5
ESME Sudria p.27/72
2003
On utilise nouveau deux AOP en srie. Le premier en tant quamplificateur
inverseur et le second en montage sommateur.
La borne V-, du premier AOP, reoit en entre le signal de sortie du CNA, et
celle du second AOP est connecte la sortie du premier. Les bornes V+ des
deux AOP sont relies la masse.
Le choix des rsistances est fait de telle sorte que :
R
2
= 4 R
1
et
R
3
= R
4
= R
5
Une fois de plus aprs avoir effectu les calculs thoriques nous avons simul
lensemble et voici les rsultats obtenus :
ESME Sudria p.28/72
2003
Nous remarquons que le signal est radapt et lamplitude du signal de sortie a
bien une amplitude comprise entre 5 et +5 volts, comme le signal inject
lentre du module.
Ralisation
Nomenclature
Nb Rfrence Dsignation
1PIC 16F876 Microcontrleur RISC 8 bits
1AD557 Convertisseur Numrique Analogique 8 bits
1MM5452 Contrleur LCD
1vi-502 Afficheur LCD 7 segments - 4 digits
1TL084 AOP jfet (x4 AOP)
1 Support tulipe 28 broches
1 Support tulipe 16 broches (7,5 mm)
2 Support tulipe 40 broches
1 Support tulipe 14 broches (7,5 mm)
6 Support tulipe 8 broches (7,5 mm)
2 Support tulipe barrette de 32 broches
2470 Rsistance
15 k Rsistance
10 10 k Rsistance
320 k Rsistance
150 k Rsistance
215 pF Condensateur
115 pF Condensateur
110 nF Condensateur
147 F Condensateur
1100 F Condensateur
5100 nF Condensateur
1 Quartz 4MHz
1 Interrupteur ON/OFF
4 Bouton poussoir
1 Led verte 3 mm
1 Led rouge 3 mm
15 m Fil rouge (5V)
15 m Fil noir (5V)
15 m Fil vert (5V)
1 Bornier ( IN & OUT coax. / +5v / +12v / -12v / GND )
ESME Sudria p.29/72
2003
Schma de cblage
ESME Sudria p.30/72
2003
Procdures de tests
Pour tester le bon fonctionnement du CAN, on lui injecte un signal quelconque,
puis on lit le rsultat de la conversion en sortie du PIC laide de 8 diodes
places sur chacun des bits du bus de sortie.
Le test du CNA se fait en mme temps que le test du correcteur proportionnel,
quand K vaut 1. Nous injectons en entre un signal sinusodal et nous devons
visualiser sur loscilloscope une sinusode similaire de mme amplitude. Nous
effectuons le mme test avec cette fois-ci K gal 2. Nous devons pouvoir
visualiser une sinusode ayant une amplitude 2 fois plus grande que celle
injecte en entre.
Signaux dentre et de sortie pour Kp=3
ESME Sudria p.31/72
2003
Pour tester laction intgrale du correcteur on injecte un signal carr en entre et
nous devons visualiser un signal triangulaire sur loscilloscope.
Signaux dentre et de sortie pour Ki=1
Pour tester laction drive il faut injecter un signal triangulaire en entre et nous
devons rcuprer en sortie un signal carr.
Signaux dentre et de sortie pour Kd=9
Pour vrifier le bon fonctionnement de lafficheur il suffit dafficher diffrentes
valeurs afin dessayer toutes les possibilits daffichage.
ESME Sudria p.32/72
2003
Montage final
Maquette ralise durant toute la dure du projet.
Recto
Verso
ESME Sudria p.33/72
2003
C PROGRAMMATION
Organisation du programme
Avant de procder llaboration du programme contenu dans le PIC, il est
prfrable dtablir au pralable un algorithme qui dfinisse son principe de
fonctionnement.
Lorganigramme suivant dcrit sommairement lorganisation du programme. Il
modlise leffet dun reset, reprsente la dtection et le traitement des
interruptions, et enfin dcrit la boucle principale ralisant la correction.
Lasservissement se fait en trois phases : lchantillonnage, le calcul du PID et
lmission du rsultat sur le port C.
ESME Sudria p.34/72
2003
La ralisation dun asservissement PID se rsume lapplication de la formule :
u(k) = Kp e(k) + Ki [ u(k-1) + e(k) ] + Kd [ e(k) - e(k-1) ]
Lorganigramme suivant illustre le traitement de la correction.
ESME Sudria p.35/72
2003
Formatage des donnes
La tension du signal dentre du module P.I.D. ralis varie entre -5V et +5V. Il
est donc ncessaire grce un adaptateur dtalonner ce signal entre 0 et 5V
pour linjecter dans le CAN. chaque valeur de tension correspondra une
valeur numrique. Le paragraphe suivant pour but dexpliquer le processus de
formatage des donnes et les correspondances entre les valeurs analogiques et
numriques.
Le CAN chantillonne sur 10 bits un signal initial compris entre -5V et +5V.
e (k) : +5V 1023
-5V 0
Le rsultat de la conversion analogique-numrique est stock dans les registres
ADRESH (bits de poids fort) et ADRESL (bits de poids faible).
Si lon choisit de mettre le bit ADFM = 0 (bit 7 du registre ADCON1), alors on
choisit deffectuer la justification gauche, cest--dire que le registre ADRESH
reoit les 8 bits de poids fort de la conversion, et ADRESL rcupre les 2 bits de
poids faible restants.
On fait abstraction des 2 bits de poids faible (ADRESL) pour faciliter le calcul de
la correction. On obtient donc une conversion sur 8 bits :
e (k) : +5V (ADRESH) : 255
-5V 0
Pour appliquer la formule de correction, on doit recentrer le signal sur 0. On
soustrait donc 127 au registre ADRESH :
e (k) : +5V (ADRESH-127) : 128
-5V -127
=> ADRESH 127 = a . e (k) (avec a = 128/5)
Pour effectuer la correction, on travaille avec [ a . e (k) ] plutot que de travailler
directement avec e (k) car les valeurs des chantillons sont comprises entre
-5V et +5V, et ces valeurs sont trop petites pour avoir une rsolution suffisante.
En effet, on ne peut pas travailler avec des valeurs dcimales.
On utilise donc une valeur proportionnelle e (k) pour faire la correction :
[ a . e (k) ] .
ESME Sudria p.36/72
2003
- Correction avec [ a . e (k) ] :
u(k) = Kp . e (k) + Kd . [e (k) - e (k-1) ] + Ki . [e (k) + u(k-1) ]
e (k) a e (k)
a u(k) = Kp . a e (k) + Kd . [ a e (k) - a e (k-1) ]
+ Ki . [ a e (k) + a u(k-1) ]
On constate quen effectuant la correction avec [ a . e (k) ] , on obtient :
[ a . u(k) ] .
Avec : -127 a . u(k) 128
On radapte le rsultat pour linjecter en sortie du Pic (8 bits).
Pour cela, on ajoute 127 [ a . u(k) ] :
0 a . u(k) + 127 255
[ a u(k) + 127 ] : 255 +5V
0 -5V
ESME Sudria p.37/72
2003
La programmation dun microcontrleur PIC 16F876 se fait en langage
MPASM . Il sagit dun langage assembleur spcifique cr par Microchip. Ce
langage dispose dun jeu de 35 instructions assez peu explicites, do la
ncessit de bien structurer le programme et de le commenter convenablement.
Configuration du PIC :
Cration dune en-tte regroupant les principales
informations du programme :
Celle-ci est facultative, mais elle peut savrer trs utile pour la mise en uvre
du PIC dans un circuit. Elle regroupe des informations essentielles :
- le nom du fichier (celui ci doit tre compil puis inject dans le PIC),
- la liste des fichiers inclure dans le projet pour que la compilation soit
possible (dans notre cas, il sagit du fichier librairie : P16F876.inc ),
- la frquence de loscillateur externe pour laquelle est conu ce programme
(ici : 4 MHz),
- laffectation des ports dentres-sorties pour le cblage du PIC.
;***************************************************************************************
;* *
;* Ralisation d'un asservissement PID *
;* *
;***************************************************************************************
;* *
;* NOM: projet.asm *
;* Date: 23/05/2003 *
;* Auteurs: BRUYERE Philippe - GOMBERT Benjamin - VENCE Eric *
;* Groupe de projet : P205 *
;* *
;***************************************************************************************
;* *
;* Fichiers requis: P16F876.inc *
;* *
;***************************************************************************************
;* *
;* Notes: On utilise un oscillateur 4 MHz *
;* Les 8 bits de sortie sont disponibles aprs correction sur le PORTC *
;* L'affichage des paramtres est transmis par la sortie srie du PORTB *
;* Les boutons poussoir gnrent des interruptions sur les entres *
;* RB4 RB6 du PORTB *
;* *
;***************************************************************************************
ESME Sudria p.38/72
2003
Dclaration du modle de PIC utilis et appel de la librairie
en vigueur :
Directive CONFIG :
La directive CONFIG permet de configurer le compilateur pour que celui-ci
reconnaisse chacun des paramtres de programmation du PIC sans quil ne soit
ncessaire de les prciser chaque fois. Cette directive permet notamment de
dclarer le type doscillateur utilis ainsi que les diffrents modes de protection
utiliss par le PIC et sa mmoire.
Affectations des entres-sorties :
Pour un bon fonctionnement du PIC, il est ncessaire dattribuer chacune de
ses pins un statut dentre ou de sortie afin que le microcontrleur sache sil doit
lire ou crie sur chaque pin. Ces affectations doivent tre faites par rapport aux
fonctions quoffre chaque pin.
Dans notre cas, nous avons besoin dune entre analogique que lon branche
sur lentre RA0 du PORTA. Les 8 bits de sortie sont ceux du PORTC car nous
rservons le PORTB au traitement des interruptions gnres par les bouton-
poussoirs (le PORTB tant le seul port grer les interruptions). Les signaux de
contrle du driver LCD sont disponibles sur deux pins encore libres sur le
PORTB (RB0 et RB1).
Les pins non utilises sont dclares comme des sorties.
LIST p=16F876 ; Dfinition du processeur
#include <p16F876.inc> ; fichier include
__CONFIG _CP_OFF & _DEBUG_OFF & _WRT_ENABLE_OFF & _CPD_OFF & _LVP_OFF &
_BODEN_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC
; _CP_OFF Pas de protection
; _DEBUG_OFF RB6 et RB7 en utilisation normale
; _WRT_ENABLE_OFF Le programme ne peut pas crire dans la flash
; _CPD_OFF Mmoire EEprom dprotge
; _LVP_OFF RB3 en utilisation normale
; _BODEN_OFF Reset tension hors service
; _PWRTE_ON Dmarrage temporis
; _WDT_OFF Watchdog hors service
; _XT_OSC Oscillateur XT
;*********************************************************************************
;* ASSIGNATIONS SYSTEME *
;*********************************************************************************
; DIRECTION DES PORTS I/O
; --------------------------------------
; (1=entre ; 0=sortie)
ESME Sudria p.39/72
2003
Assignations des registres de configuration :
Il est prfrable deffectuer ces assignations au dbut du programme, cela
facilite leur modification et vite de devoir parcourir le programme pour retrouver
ces registres.
Ceux dfinis ci-aprs permettent dactiver et de paramtrer les diffrents
modules dont dispose le PIC (dans le cadre de ce projet, nous utiliserons
uniquement le module de conversion analogique-numrique et le module de
dtection des interruptions).
Ces valeurs seront charges lors de linitialisation par la routine INIT .
Configuration du convertisseur analogiquenumrique :
Le registre ADCON1 permet de choisir le nombre dentres analogiques
ainsi que le type de justification. Nous avons besoin dune seule entre de ce
type do la valeur des bits de configuration du port : PCFGx = 1110. Le
convertisseur intgr dans le PIC effectue une conversion sur 10 bits. Le
rsultat est stock sur 2 octets : ADRESH (octet de poids fort) et
ADRESL (octet de poids faible). Le processeur ayant une architecture RISC
8 bits, il serait inutile, et assez complexe, de conserver et dexploiter ce rsultat
sur 10 bits. Nous faisons donc abstraction des deux bits les moins significatifs. Il
suffit de choisir une justification gauche (ADFM = 0), ainsi les 8 bits de poids
forts de la conversion sont stocks dans le registre ADRESH . Il ne reste
plus qu le lire.
Le registre ADCON0 permet de dfinir la frquence dchantillonnage du
PIC, et de choisir la pin sur laquelle sera effectue la conversion. Loscillateur
utilis tant fix 4MHHz, la frquence dchantillonnage maximum que lon
puisse choisir est de 500KHz (ADCSx = 01). Pour terminer la configuration du
module de conversion analogiquenumrique, il reste dfinir le canal dentre.
Nous choisissons la pin RAO du PORTA qui correspond au canal A/D 0
(CHSx = 000).
DIRPORTA EQU B'00000001' ; Direction PORTA (registre TRISA)
; RA0 : entre analogique
; RA1 : N.C.
; RA2 : N.C.
; RA3 : N.C.
; RA4 : N.C.
; RA5 : N.C.
; on rcupre le rsultat de la conversion A->N
; dans les registres ADRESH (Bank0) et ADRESL (Bank1)
DIRPORTB EQU B'01110000' ; Direction PORTB
; RB0 : sortie CLK srie pour le driver LCD
; RB1 : sortie DATA srie pour le driver LCD
; RB2 : N.C.
; RB3 : N.C.
; RB4 : entre BP [+]
; RB5 : entre BP [-]
; RB6 : entre BP [V]
; RB7 : N.C.
DIRPORTC EQU B'00000000' ; Direction PORTC
; RC0 RC7 : 8 bits du bus de sortie
ESME Sudria p.40/72
2003
Mise en service des interruptions :
Le registre INTCON permet de choisir les interruptions standards que lon
souhaite traiter. Nous disposons de trois bouton-poussoirs branchs sur les pins
RB4 RB6. Il faut donc activer le masque dinterruption RB4/RB7 (RBIE=1) et
le masque dautorisation gnral des interruptions (GIE = 1). Le masque
dautorisation gnral des priphriques (PEIE) est mis 1 pour pouvoir utiliser
le TIMER1 .
; REGISTRE ADCON1 (ANALOGIQUE/DIGITAL)
; -------------------------------------------------------------
ADCON1VAL EQU B'00001110' ; Registre ADCON1 (configuration du port A/D)
; PCFG = 1110 => 1 entre analogique (RA0)
; ADFM = 0 => justification gauche
; bit0 : PCFG0 : Port ConFiGuration control bit0
; bit1 : PCFG1 : Port ConFiGuration control bit1
; bit2 : PCFG2 : Port ConFiGuration control bit2
; bit3 : PCFG3 : Port ConFiGuration control bit3
; bit4 : Non implment
; bit5 : Non implment
; bit6 : Non implment
; bit7 : ADFM : A/D result ForMat select
; REGISTRE ADCON0 (ANALOGIQUE/DIGITAL)
; -------------------------------------------------------------
; ADCS1 | ADCS0 | Diviseur | Frquence Max du quartz
; -----------+----------+-------------+----------------------------------------------------------
; 0 | 0 | Fosc/2 | 1.25 MHz
; 0 | 1 | Fosc/8 | 5 MHz => fe = 500 KHz
; 1 | 0 | Fosc/32 | 20 MHz => fe = 125 KHz
; 1 | 1 | Osc RC | Si > 1 MHz, uniquement en mode "sleep"
; CHS = B'000' => choix du canal A/D 0 (pin RA0)
ADCON0VAL EQU B'01000000' ; Registre ADCON0 (configuration du port A/D)
; bit0 : ADON : A/D ON bit
; bit1 : Non implment
; bit2 : GO/DONE : A/D conversion status bit
; bit3 : CHS0 : analog Channel Select bit0
; bit4 : CHS1 : analog Channel Select bit1
; bit5 : CHS2 : analog Channel Select bit2
; bit6 : ADCS0 : A/D conversion Clock Select bit0
; bit7 : ADCS1 : A/D conversion Clock Select bit1
; REGISTRE INTCON (contrle interruptions standard)
; --------------------------------------------------------------------
INTCONVAL EQU B'11001000'
; bit0 : RBIF : flag interruption RB4/RB7
; bit1 : INTF : flag RB0/Int
; bit2 : T0IF : flag tmr0
; bit3 : RBIE : masque interruption RB4/RB7
; bit4 : INTE : masque interruption RB0/Int
; bit5 : T0IE : masque interruption tmr0
; bit6 : PEIE : masque autorisation gnrale priphriques
; bit7 : GIE : masque autorisation gnrale interruption
ESME Sudria p.41/72
2003
Le TIMER 1 est un module de comptage 16 bits de cycles dhorloge. Il peut
tre coupl sur un oscillateur externe ou bien sur le mme oscillateur que celui
du PIC. Dans notre cas, le timer sera utilis pour faire clignoter lafficheur (pour
mettre en relief le curseur ).
Dans le registre PIE1 , le bit TMR1IE permet sil est mis 1, de traiter
les interruptions engendres par le TIMER 1 .
Le registre T1CON configure le TIMER 1 . Le bit TMR1ON met en
service ce timer et les bits T1CKPSx offrent le choix dun pr-diviseur. En
utilisant loscillateur du PIC et un pr-diviseur gal 8, nous obtenons un
compteur qui gnre une interruption tous les 524288 cycles (soit 8 x 65536 = 8
x 2^16), cest--dire une interruption toutes les 0,5s (avec un oscillateur de
4MHz). Le curseur de notre afficheur clignotera donc avec une priode dune
seconde.
; REGISTRE T1CON (configuration du Timer 1)
; ----------------------------------------------------------
T1CONVAL EQU B'00110001'
; bit0 : TMR1ON : TiMeR 1 ON bit
; bit1 : TMR1CS : TiMeR 1 Clock Source select bit
; bit2 : T1SYNC : Timer 1 external clock input SYNChronisation control bit
; bit3 : T1OSCEN : Timer 1 OSCillator ENable control bit
; bit4 ; T1CKPS0 : Timer 1 oscillator ClocK Prescale Select bit 0
; bit5 : T1CKPS1 : Timer 1 oscillator ClocK Prescale Select bit 1
; bit6 : Inutilis : lu comme 0
; bit7 : Inutilis : lu comme 0
; T1CKPS1 | T1CKPS0 | Valeur du pr-diviseur
; -------------+-------------+------------------------------
; 0 | 0 | 1 -> 65536 cycles (65ms 4MHz)
; 0 | 1 | 2
; 1 | 0 | 4
; 1 | 1 | 8 -> 524288 cycles (0.5s 4MHz)
; REGISTRE PIE1 (contrle interruptions priphriques)
; --------------------------------------------------------------------
PIE1VAL EQU B'00000001'
; bit0 : TMR1IE : masque interruption dbordement tmr1
; bit1 : TMR2IE : masque interruption TMR2 = PR2
; bit2 : CCP1IE : masque interruption CCP1
; bit3 : SSPIE : masque interruption port srie synchrone
; bit4 : TXIE : masque interruption transmission USART
; bit5 : RCIE : masque interruption rception USART
; bit6 : ADIE : masque interruption convertisseur A/D
; bit7 : PSPIE : Toujours 0 sur le PIC 16F876
ESME Sudria p.42/72
2003
Mise en place de Macros :
La dfinition de macros rends le programme plus structur et plus simple
comprendre. Les macros suivantes permettent de slectionner une banque
particulire en positionnant les 2 bits concerns. Il est vident quil nest pas
toujours ncessaire de repositionner les 2 bits. Nanmoins, lutilisation de ces
macros ne ncessite quune ligne de code supplmentaire, et elle limite
fortement les risques derreurs.
Dclaration des constantes :
Pour faciliter la relecture dun programme, il est prfrable dutiliser des
constantes dfinies au pralable dont le nom est plus vocateur quune valeur
quelconque. Ici sont dclares les constantes de chaque caractre retranscrit
sur sept segments.
; Dclaration des codes permettant d'afficher chaque chiffre sur 7 segments :
; -------------------------------------------------------------------------------------------------
UN EQU B'00001100' ; 1
DEUX EQU B'10110110' ; 2 bit0 : Virgule A 1
TROIS EQU B'10011110' ; 3 bit1 : A ==== ====
QUATRE EQU B'11001100' ; 4 bit2 : B F || || B 6 || || 2
CINQ EQU B'11011010' ; 5 bit3 : C || G || || 7 ||
SIX EQU B'11111010' ; 6 bit4 : D ==== ==> ====
SEPT EQU B'01001110' ; 7 bit5 : E E || || C 5 || || 3
HUIT EQU B'11111110' ; 8 bit6 : F || D || || 4 ||
NEUF EQU B'11011110' ; 9 bit7 : G ==== ====
ZERO EQU B'01111110' ; 0
TRAIT EQU B'10000000' ; -
;*********************************************************************************
;* MACROS *
;*********************************************************************************
; Changement de banques
; --------------------------------
BANK0 macro ; passer en banque0
bcf STATUS,RP0
bcf STATUS,RP1
endm
BANK1 macro ; passer en banque1
bsf STATUS,RP0
bcf STATUS,RP1
endm
BANK2 macro ; passer en banque2
bcf STATUS,RP0
bsf STATUS,RP1
endm
BANK3 macro ; passer en banque3
bsf STATUS,RP0
bsf STATUS,RP1
endm
ESME Sudria p.43/72
2003
Allocation de lespace mmoire :
Pour traiter les donnes, il est indispensable dutiliser des variables. En effet,
celles-ci permettent de stocker des valeurs et elles facilitent la comprhension
du programme si leur nom est choisi judicieusement. Chaque variable doit
disposer dun espace mmoire ddi. Il faut dclarer chacune delles dans une
zone mmoire. Le PIC 16F876 dispose de 80 octets de mmoire RAM par
banque et de 16 octets de mmoire RAM en zone commune.
La mmoire en zone commune est accessible depuis nimporte quelle banque.
Nous lutiliserons pour faire les sauvegardes de variables temporaires lors du
traitement des interruptions et pour stocker les valeurs de chaque digit car
celles-ci doivent tre accessibles tout moment.
Le programme sexcute principalement dans la banque 0 (hormis lors des
interruptions), donc la majorit des variables est dclare dans lespace
mmoire de la banque 0.
;****************************************************************************
; VARIABLES ZONE COMMUNE *
;****************************************************************************
; Zone de 16 bytes
; -----------------------
CBLOCK 0x70 ; Dbut de la zone (0x70 0x7F)
w_temp : 1 ; Sauvegarde registre W
status_temp : 1 ; Sauvegarde registre STATUS
digit1 : 1 ; dfinition des 7 segments (+ virgule) du 1er digit
digit2 : 1 ; dfinition des 7 segments (+ virgule) du 2nd digit
digit3 : 1 ; dfinition des 7 segments (+ virgule) du 3me digit
digit4 : 1 ; dfinition des 7 segments (+ virgule) du 4me digit
ENDC ; Fin de la zone
;****************************************************************************
;* DECLARATIONS DES VARIABLES *
;****************************************************************************
; Zone de 80 bytes
; ----------------------- ; Allocation de l'espace mmoire de la bank0 et dclaration des variables
CBLOCK 0x20 ; Dbut de la zone (0x20 0x6F)
menu : 1 ; pointeur de menu
choixParam : 1 ; Variable de choix du paramtre modifier
; u(k) = Kp (k) + Ki [u(k-1)+(k)] + Kd [(k)-(k-1)]
cligno : 1 ; Variable d'tat de clignotement
parametre1 : 1 ; paramtre n1 : Kp
parametre2 : 1 ; paramtre n2 : Ki
parametre3 : 1 ; paramtre n3 : Kd
parametre4 : 1 ; paramtre n4 : Limite d'intgration
cmpt1 : 1 ; compteur n1
cmpt2 : 1 ; compteur n2
resultConv : 1 ; rsultat 8 bits de la conversion Analogique -> Numrique
resultConv2 : 1 ; ancien rsultat 8 bits de la conversion Analogique -> Numrique
result1 : 1 ; rsultat du calcul de la proportionnelle
result2 : 1 ; rsultat du calcul de la drive
result3 : 1 ; rsultat du calcul de l'intgrale
result4 : 1 ; somme de result1 et result2
ESME Sudria p.44/72
2003
Dtection et traitement des interruptions :
Dtection des interruptions :
La routine interruptions contient tous les tests qui permettent daiguiller les
interruptions vers la bonne sous-routine. Tout dabord elle effectue la
sauvegarde des diffrents registres.
w_temp est la sauvegarde du registre de travail W . Ce registre va tre
utilis pour la sauvegarde des autres registres. Cest donc le premier qui doit
tre sauv. Au moment de linterruption, on ne peut pas savoir comment sont
configurs les bits RP0 et RP1, donc on ne sait pas vers quelle banque ils
pointent. De ce fait, il est impratif de sauvegarder W dans la zone de RAM
commune.
status_temp doit tre sauvegard car aprs le traitement des interruptions,
le programme doit reprendre son cours avec le mme statut (notamment dans
la mme banque).
resultPID : 1 ; rsultat du calcul du PID
resultPID2 : 1 ; ancien rsultat du calcul du PID
sourceInt : 1 ; source d'interruption
vartemp : 1 ; variable temporaire
vardigit : 1 ; variable de digit
varparam : 1 ; variable de paramtre
var1 : 1 ; variable n1
var2 : 1 ; variable n2
var3 : 1 ; variable n3
produitH : 1 ; poids fort du rsultat 16 bits de la multiplication 8x8bits
produitL : 1 ; poids faible du rsultat 16 bits de la multiplication 8x8bits
sommeH : 1 ; poids fort du rsultat de l'addition 8 bits (dpassement)
sommeL : 1 ; poids faible du rsultat de l'addition 8 bits
diffH : 1 ; poids fort du rsultat de la soustraction 8 bits
diffL : 1 ; poids faible du rsultat de la soustraction 8 bits
signe : 1 ; bits de signe
resultDep : 1 ; variable de stockage du dpassement des oprations mathmatiques 8 bits
ENDC ; Fin de la zone
;*************************************************************************
;* DEMARRAGE SUR RESET *
;*************************************************************************
org 0x000 ; Adresse de dpart aprs reset
goto INIT ; Initialiser
;*************************************************************************
;* ROUTINE INTERRUPTION *
;*************************************************************************
;sauvegarder les registres
;-------------------------------
org 0x004 ; adresse d'interruption
movwf w_temp ; sauver registre W
swapf STATUS,w ; swap status avec rsultat dans w
movwf status_temp ; sauver status swapp
BANK0 ; passer en banque0
ESME Sudria p.45/72
2003
Pour tester les interruptions engendres par les bouton-poussoirs, il faut avant
tout vrifier que le masque dinterruption sur RB4/7 est activ. Il suffit ensuite de
lire le flag dinterruption RRBIF . Par scurit et pour viter le phnomne
de rebond , des boucles de test du relchement de chaque bouton sont
ajoutes. Si une interruption sur RB4/7 est dtecte, la sous-routine de
traitement de cette interruption INTBP est appele puis le flag dinterruption
est effac.
Pour tester les interruptions gnres par le TIMER1 , il faut vrifier que le
masque dinterruption TMR1IE soit activ (attention, ce registre se trouve
dans la banque 1). Il suffit ensuite de lire le flag dinterruption TMR1IF
(banque 0). Si une interruption sur le timer 1 est dtecte, la sous-routine de
traitement INTTMR est appele puis le flag dinterruption est effac.
Lors de la fin du traitement, STATUS et W sont restaurs tels quils
taient avant linterruption.
; Test et appel des diffrentes interruptions
;-----------------------------------------------------
; Interruption RB4/RB7
INT1 ; ---------------------------
btfsc INTCON,RBIE ; tester si interruption RB4/7 autorise
btfss INTCON,RBIF ; oui, tester si interruption RB4/7 en cours
goto INT2 ; non sauter
call INTBP ; oui, traiter interruption RB4/7
btfsc PORTB,4 ; tester si BP1 [+] appuy
goto $-1 ; oui, attendre
btfsc PORTB,5 ; tester si BP2 [-] appuy
goto $-1 ; oui, attendre
btfsc PORTB,6 ; tester si BP3 [V] appuy
goto $-1 ; oui, attendre
bcf INTCON,RBIF ; effacer flag interruption RB4/7
goto RESTORE ; et fin d'interruption
; Interruption TMR1
INT2 ; -----------------------
bsf STATUS,RP0 ; slectionner banque1
btfss PIE1,TMR1IE ; tester si interruption autorise
goto RESTORE ; non sauter
bcf STATUS,RP0 ; oui, slectionner banque0
btfss PIR1,TMR1IF ; oui, tester si interruption en cours
goto RESTORE ; non sauter
call INTTMR1 ; oui, traiter interruption TMR1
bcf PIR1,TMR1IF ; effacer flag interruption
; Restaurer registres
RESTORE ; -----------------------
swapf status_temp,w ; swap ancien status, rsultat dans w
movwf STATUS ; restaurer status
swapf w_temp,f ; Inversion L et H de l'ancien W sans modifier Z
swapf w_temp,w ; R-inversion de L et H dans W (W restaur sans modifier status)
retfie ; return from interruption
ESME Sudria p.46/72
2003
Traitement des interruptions sur RB4/7 :
Chaque interruption dtecte sur un bouton poussoir a un effet diffrent sur le
programme en fonction du menu en cours dexcution. Le menu en cours est
point par la variable menu . Un test est donc effectu sur cette variable pour
accder au menu point.
Si le menu point est le menu n1, cest--dire le menu de modification du
paramtre Kp, alors le paramtre n1 est :
- incrment si linterruption provient du BP1 [+] (si le paramtre dpasse 9, on
boucle en le remettant 0),
- dcrment si linterruption provient du BP2 [-] (si le paramtre devient
infrieur 0, on boucle en le remettant 9),
- valid si linterruption provient du BP3 [V] , et la variable menu est efface
pour quelle pointe vers le menu n0.
;*************************************************************************
;* INTERRUPTION RB4/RB7 *
;*************************************************************************
INTBP
movf PORTB,w ; Chargement du PORTB
movwf sourceInt ; criture dans la variable "sourceInt"
TESTMENU1
decfsz menu,f ; dcrmenter le pointeur de menu
goto TESTMENU2 ; menu != 0 ?
; MENU 1 : Menu de modification du paramtre n1 : Kp
; ------------------------------------------------------------------------
btfss sourceInt,4 ; bit RB4=1 ?
goto TESTM1
incf parametre1,f ; oui -> interruption sur le PB1 [+] -> on incrmente le paramtre 1
movf parametre1,w
sublw 0x0A
btfsc STATUS,Z ; tester si W = 0
clrf parametre1 ; si parametre1 = 10, on boucle le menu en remettant parametre1 = 0
goto TESTV1
TESTM1
btfss sourceInt,5 ; bit RB5=1 ?
goto TESTV1
movf parametre1,w
btfsc STATUS,Z ; tester si W = 0
movlw 0x0A ; si parametre1 = 0, on boucle le menu en remettant parametre1 = 10
movwf parametre1
decf parametre1,f ; oui -> interruption sur le PB2 [-] -> on dcrmente le paramtre 1
TESTV1
movlw 0x01
btfss sourceInt,6 ; bit RB6=1 ?
goto TESTF1
movlw 0x00 ; oui -> interruption sur le PB3 [V] -> on passe au menu 0
clrf choixParam
TESTF1
movwf menu ; passage au menu en vigueur
movf parametre1,w ; conversion de parametre1 (chiffres) en digit1 (7 segments)
movwf vardigit
call CONVDIGIT
movwf digit1
goto FINMENU
ESME Sudria p.47/72
2003
Si le menu point est le menu n2, cest--dire le menu de modification du
paramtre Ki, alors le paramtre n2 est :
- incrment si linterruption provient du BP1 [+] (si le paramtre dpasse 9, on
boucle en le remettant 0),
- dcrment si linterruption provient du BP2 [-] (si le paramtre devient
infrieur 0, on boucle en le remettant 9),
- valid si linterruption provient du BP3 [V] , et la variable menu est efface
pour quelle pointe vers le menu n0.
TESTMENU2
decfsz menu,f ; dcrmenter le pointeur de menu
goto TESTMENU3 ; menu != 0 ?
; MENU 2 : Menu de modification du paramtre n2 : Ki
; ------------------------------------------------------------------------
btfss sourceInt,4 ; bit RB4=1 ?
goto TESTM2
incf parametre2,f ; oui -> interruption sur le PB1 [+] -> on incrmente le paramtre 2
movf parametre2,w
sublw 0x0A
btfsc STATUS,Z ; tester si W = 0
clrf parametre2 ; si parametre2 = 10, on boucle le menu en remettant parametre2 = 0
goto TESTV2
TESTM2
btfss sourceInt,5 ; bit RB5=1 ?
goto TESTV2
movf parametre2,w
btfsc STATUS,Z ; tester si W = 0
movlw 0x0A ; si parametre2 = 0, on boucle le menu en remettant parametre2 = 10
movwf parametre2
decf parametre2,f ; oui -> interruption sur le PB2 [-] -> on dcrmente le paramtre 2
TESTV2
movlw 0x02
btfss sourceInt,6 ; bit RB6=1 ?
goto TESTF2
movlw 0x00 ; oui -> interruption sur le PB3 [V] -> on passe au menu 0
clrf choixParam
TESTF2
movwf menu ; passage au menu en vigueur
movf parametre2,w ; conversion de parametre2 (chiffres) en digit2 (7 segments)
movwf vardigit
call CONVDIGIT
movwf digit2
goto FINMENU
ESME Sudria p.48/72
2003
Si le menu point est le menu n3, cest--dire le menu de modification du
paramtre Kd, alors le paramtre n3 est :
- incrment si linterruption provient du BP1 [+] (si le paramtre dpasse 9, on
boucle en le remettant 0),
- dcrment si linterruption provient du BP2 [-] (si le paramtre devient
infrieur 0, on boucle en le remettant 9),
- valid si linterruption provient du BP3 [V] , et la variable menu est efface
pour quelle pointe vers le menu n0.
TESTMENU3
decfsz menu,f ; dcrmenter le pointeur de menu
goto TESTMENU4 ; menu != 0 ?
; MENU 3 : Menu de modification du paramtre n3 : Kd
; -------------------------------------------------------------------------
btfss sourceInt,4 ; bit RB4=1 ?
goto TESTM3
incf parametre3,f ; oui -> interruption sur le PB1 [+] -> on incrmente le paramtre 3
movf parametre3,w
sublw 0x0A
btfsc STATUS,Z ; tester si W = 0
clrf parametre3 ; si parametre3 = 10, on boucle le menu en remettant parametre3 = 0
goto TESTV3
TESTM3
btfss sourceInt,5 ; bit RB5=1 ?
goto TESTV3
movf parametre3,w
btfsc STATUS,Z ; tester si W = 0
movlw 0x0A ; si parametre3 = 0, on boucle le menu en remettant parametre3 = 10
movwf parametre3
decf parametre3,f ; oui -> interruption sur le PB2 [-] -> on dcrmente le paramtre 3
TESTV3
movlw 0x03
btfss sourceInt,6 ; bit RB6=1 ?
goto TESTF3
movlw 0x00 ; oui -> interruption sur le PB3 [V] -> on passe au menu 0
clrf choixParam
TESTF3
movwf menu ; passage au menu en vigueur
movf parametre3,w ; conversion de parametre3 (chiffres) en digit3 (7 segments)
movwf vardigit
call CONVDIGIT
movwf digit3
goto FINMENU
ESME Sudria p.49/72
2003
Si le menu point est le menu n4, cest--dire le menu de modification de la
limite dintgration, alors le paramtre n4 est :
- incrment si linterruption provient du BP1 [+] (si le paramtre dpasse 9, on
boucle en le remettant 0),
- dcrment si linterruption provient du BP2 [-] (si le paramtre devient
infrieur 0, on boucle en le remettant 9),
- valid si linterruption provient du BP3 [V] , et la variable menu est efface
pour quelle pointe vers le menu n0.
TESTMENU4
decfsz menu,f ; dcrmenter le pointeur de menu
goto TESTMENU5 ; menu != 0 ?
; MENU 4 : Menu de modification du paramtre n4 : Limite d'intgration
; ----------------------------------------------------------------------------------------------
btfss sourceInt,4 ; bit RB4=1 ?
goto TESTM4
incf parametre4,f ; oui -> interruption sur le PB1 [+] -> on incrmente le paramtre 4
movf parametre4,w
sublw 0x0A
btfsc STATUS,Z ; tester si W = 0
clrf parametre4 ; si parametre4 = 10, on boucle le menu en remettant parametre4 = 0
goto TESTV4
TESTM4
btfss sourceInt,5 ; bit RB5=1 ?
goto TESTV4
movf parametre4,w
btfsc STATUS,Z ; tester si W = 0
movlw 0x0A ; si parametre4 = 0, on boucle le menu en remettant parametre4 = 10
movwf parametre4
decf parametre4,f ; oui -> interruption sur le PB2 [-] -> on dcrmente le paramtre 4
TESTV4
movlw 0x04
btfss sourceInt,6 ; bit RB6=1 ?
goto TESTF4
movlw 0x00 ; oui -> interruption sur le PB3 [V] -> on passe au menu 0
clrf choixParam
TESTF4
movwf menu ; passage au menu en vigueur
movf parametre4,w ; conversion de parametre4 (chiffres) en digit4 (7 segments)
movwf vardigit
call CONVDIGIT
movwf digit4
goto FINMENU
ESME Sudria p.50/72
2003
Si le menu point est le menu n5, cest--dire le menu de choix du paramtre
modifier, alors choixParam est :
- incrment si linterruption provient du BP1 [+] (si le paramtre dpasse 4, on
boucle en le remettant 1),
- dcrment si linterruption provient du BP2 [-] (si le paramtre devient
infrieur 1, on boucle en le remettant 4),
- stock dans la variable menu si linterruption provient du BP3 [V].
TESTMENU5
decfsz menu,f ; dcrmenter le pointeur de menu
goto TESTMENU0 ; menu != 0 ?
; MENU 5 : Menu de choix du paramtre modifier
; -----------------------------------------------------------------
btfss sourceInt,5 ; bit RB5=1 ?
goto TESTM5
incf choixParam,f ; oui -> interruption sur le PB2 [-] -> on incrmente choixParam
movf choixParam,w
sublw 0x05
btfss STATUS,Z ; tester si W = 0
goto TESTV5
movlw 0x01 ; si choixParam = 5, on boucle le menu en remettant choixParam = 1
movwf choixParam
goto TESTV5
TESTM5
btfsc sourceInt,4 ; bit RB4=1 ?
decfsz choixParam,f ; oui -> interruption sur le PB1 [+] -> on dcrmente choixParam
goto TESTV5
movlw 0x04 ; si choixParam = 0, on boucle le menu en remettant choixParam = 4
movwf choixParam
TESTV5
movlw 0x05
btfsc sourceInt,6 ; bit RB6=1 ?
movf choixParam,w ; oui => interruption sur le PB3 [V]
; => on passe au menu de modification du paramtre choisi
movwf menu ; passage au menu en vigueur
goto FINMENU
TESTMENU0
; MENU 0 : Menu de statique : attente d'une interruption
; --------------------------------------------------------------------------
btfss sourceInt,6 ; bit RB6=1 ?
goto FINMENU
movlw 0x05
movwf menu ; passage au choix du paramtre modifier (menu 5)
movlw 0x01
movwf choixParam ; initialisation du pointeur du paramtre modifier
FINMENU
CALL AFFICHAGE ; routine d'affichage des paramtres sur l'afficheur LCD
; rafrachissement de l'afficheur
return ; fin d'interruption RB0/RB4
ESME Sudria p.51/72
2003
Si le menu point est le menu n0, cest--dire le menu statique, alors si
linterruption provient du BP3 [V], la valeur 5 est stocke dans la variable
menu pour quelle pointe vers le menu n5, menu de choix du paramtre
modifier. choixParam est alors initialise 1.
Une fois toutes les possibilits de menus testes, et une fois le menu en cours
trait, le programme appelle la routine AFFICHAGE pour quelle rafrachisse
les valeurs transmises lafficheur LCD.
Fin du traitement des interruptions sur RB4/7.
Traitement des interruptions du TIMER 1 :
Toutes les 0,5s le timer 1 gnre une interruption. A chacune de ces
interruptions, la variable cligno passe alternativement de 1 2. Si
choixParam est diffrent de 0 alors le menu en cours est diffrent du menu
n0 (menu statique). On fait donc clignoter le curseur. Un test du paramtre
point par la variable choixParam est effectu afin de dterminer
lemplacement du curseur. Le digit point par choixParam reste fixe et les
autres digits sont affichs puis effacs alternativement. Le curseur est alors le
seul digit affich en permanence.
TESTMENU0
; MENU 0 : Menu de statique : attente d'une interruption
; ------------------------------------------------------------------------
btfss sourceInt,6 ; bit RB6=1 ?
goto FINMENU
movlw 0x05
movwf menu ; passage au choix du paramtre modifier (menu 5)
movlw 0x01
movwf choixParam ; initialisation du pointeur du paramtre modifier
FINMENU
CALL AFFICHAGE ; routine d'affichage des paramtres sur l'afficheur LCD
; rafrachissement de l'afficheur
return ; fin d'interruption RB4/RB7
;*************************************************************************
;* INTERRUPTION TIMER 1 *
;*************************************************************************
INTTMR1
decfsz cligno,f ; tester la valeur de "cligno"
goto TESTPARAM0 ; cligno != 1
movf choixParam,w ; cligno = 1
movwf varparam
movlw 0x02
movwf cligno ; passage au choix du paramtre modifier (menu 5)
ESME Sudria p.52/72
2003
TESTPARAM1
decfsz varparam,f ; dcrmenter le pointeur de paramtre
goto TESTPARAM2 ; choixParam != 0 ?
movf parametre1,w ; conversion de parametre1 (chiffres) en digit1 (7 segments)
movwf vardigit
call CONVDIGIT
movwf digit1
movlw 0x00
movwf digit2 ; digit2 vide
movwf digit3 ; digit3 vide
movwf digit4 ; digit4 vide
goto FINPARAM
TESTPARAM2
decfsz varparam,f ; dcrmenter le pointeur de paramtre
goto TESTPARAM3 ; choixParam != 0 ?
movf parametre2,w ; conversion de parametre2 (chiffres) en digit2 (7 segments)
movwf vardigit
call CONVDIGIT
movwf digit2
movlw 0x00
movwf digit1 ; digit1 vide
movwf digit3 ; digit3 vide
movwf digit4 ; digit4 vide
goto FINPARAM
TESTPARAM3
decfsz varparam,f ; dcrmenter le pointeur de paramtre
goto TESTPARAM4 ; choixParam != 0 ?
movf parametre3,w ; conversion de parametre3 (chiffres) en digit3 (7 segments)
movwf vardigit
call CONVDIGIT
movwf digit3
movlw 0x00
movwf digit1 ; digit1 vide
movwf digit2 ; digit2 vide
movwf digit4 ; digit4 vide
goto FINPARAM
TESTPARAM4
decfsz varparam,f ; dcrmenter le pointeur de paramtre
goto TESTPARAM0 ; choixParam != 0 ?
movf parametre4,w ; conversion de parametre4 (chiffres) en digit4 (7 segments)
movwf vardigit
call CONVDIGIT
movwf digit4
movlw 0x00
movwf digit1 ; digit1 vide
movwf digit2 ; digit2 vide
movwf digit3 ; digit3 vide
goto FINPARAM
TESTPARAM0
ESME Sudria p.53/72
2003
Une fois toutes les possibilits de paramtres testes, et une fois le paramtre
en cours trait, le programme appelle la routine CONVPARAM . Elle effectue
la conversion de la valeur numrique de chaque paramtre en une valeur code
sur 8 bits (7 segments + 1 virgule). Ensuite, la routine AFFICHAGE rafrachit
les valeurs transmises lafficheur LCD.
Fin du traitement des interruptions sur TMR1.
Initialisations :
Initialisation des ports :
Dans cette partie, tous les registres ncessaires la configuration des ports
sont initialiss avec les valeurs qui leur ont t assignes au dbut du
programme. Ainsi les entres et sorties de chaque port sont dfinies (registres
TRISA , TRISB et TRISC ). Lentre analogique est configure par les
registres ADCON0 et ADCON1 . Les sorties sont mises 0 pour viter
les valeurs alatoires.
call CONVPARAM
FINPARAM
CALL AFFICHAGE ; routine d'affichage des paramtres sur l'afficheur LCD
; rafrachissement de l'afficheur
return ; fin d'interruption TMR1
;*************************************************************************
;* INITIALISATIONS *
;*************************************************************************
INIT
; initialisation PORTS (banques 0 et 1)
; -------------------------------------------------
BANK0 ; slectionner la banque0
clrf PORTA ; Sorties PORTA 0
clrf PORTB ; Sorties PORTB 0
clrf PORTC ; Sorties PORTC 0
movlw ADCON0VAL ; Configuration du mode digital/analogique
movwf ADCON0 ; criture dans le registre de contrle A/D
bsf STATUS,RP0 ; slectionner banque1
movlw ADCON1VAL ; PORTA en mode digital/analogique
movwf ADCON1 ; criture dans le registre de contrle A/D
movlw DIRPORTA ; Direction PORTA
movwf TRISA ; criture dans le registre direction
movlw DIRPORTB ; Direction PORTB
movwf TRISB ; criture dans le registre direction
movlw DIRPORTC ; Direction PORTC
movwf TRISC ; criture dans le registre direction
ESME Sudria p.54/72
2003
Initialisation des registres dinterruptions :
Tout comme les registres de configuration des ports, les registres dinterruptions
doivent tre initialiss avec les valeurs assignes prcdemment. Les registres
INTCON , PIE1 et T1CON sont donc initialiss pour permettre les
interruptions sur les entres RB4/7 et sur le TIMER 1 .
Initialisation des variables :
Lors de chaque mise en marche du circuit, certaines variables doivent tre
imprativement initialises car si elles sont attribues de faon alatoire, elles
peuvent compromettre le bon fonctionnement du programme.
Lorsque les initialisations sont termines, lexcution se poursuit dans le
programme principal. Celui-ci centralise lappel des diffrentes routines, il
coordonne donc les tches qui permettront dobtenir le traitement de
lasservissement. Chacune de ces tches doit tre dfinie au pralable.
; initialisation des registres d'interruptions (banque 1)
; ---------------------------------------------------------------------
movlw INTCONVAL ; charger valeur registre interruption
movwf INTCON ; initialiser interruptions
movlw PIE1VAL ; Initialiser registre
movwf PIE1 ; interruptions priphriques 1
bcf STATUS,RP0 ; passer en banque 0
clrf TMR1L ; effacer timer1, 8 lsb
clrf TMR1H ; effacer timer1, 8 msb
movlw T1CONVAL ; charger valeur registre interruption
movwf T1CON ; initialiser interruptions
; initialisation variables
; -----------------------------
clrf menu ; initialisation de menu pour quil pointe vers le menu gnral
clrf choixParam ; initialisation du de la variable de choix du paramtre modifier
clrf parametre1 ; initialisation du paramtre n1 : Kp
clrf parametre2 ; initialisation du paramtre n2 : Ki
clrf parametre3 ; initialisation du paramtre n3 : Kd
clrf parametre4 ; initialisation du paramtre n4 : Limite d'intgration
movlw 0x02
movwf cligno ; initialisation de la variable d'tat de clignotement
clrf resultConv ; initialisation de la variable de conversion A/N
clrf resultPID2 ; initialisation de la variable de calcul du PID
goto START ; programme principal
ESME Sudria p.55/72
2003
Routines :
La programmation du module dasservissement PID ncessite de nombreuses
oprations. La mise en uvre dun tel programme est assez complexe, il doit
donc tre dcoup en plusieurs modules ayant chacun une tche diffrente
accomplir. Cest le rle des routines qui permettent entre autres de structurer le
programme.
Conversion analogique-numrique :
Cette routine ralise lchantillonnage sur une entre analogique. La conversion
se fait en plusieurs tapes :
- la valeur de lchantillon prcdent est mmorise (car elle est ncessaire au
calcul du PID),
- le convertisseur est activ par la mise 1 de ADON ,
- attente de la fin de lacquisition (le convertisseur intgr au PIC a un temps
dacquisition Tacq = 19,7s),
- la conversion analogique numrique dbute lors de la mise 1 de GO ,
- attente de la fin de la conversion (le convertisseur intgr au PIC a un temps
de conversion Tad = 3,2s),
- lecture de la valeur de lchantillon. Chaque chantillon est stock sur 10 bits
dans la paire de registres ADRESH et ADRESL . La justification tant
faite gauche, et pour des raisons de commodit, on nexploite que les 8 bits
de poids fort que lon trouve dans le registre ADRESH .
;*****************************************************************
;* CONVERSION Analogique -> Numrique *
;*****************************************************************
;* entre : *
;* *
;* sortie : resultConv *
;* *
;*****************************************************************
CONV
movf resultConv,w ; Chargement du rsultat de la conversion prcdente
movwf resultConv2 ; Stockage de l'ancien rsultat de la conversion
; 1 - lancement du convertisseur : ADON = 1
; --------------------------------------------------------
bsf ADCON0,ADON
; 2 - attendre que l'acquisition soit effectue (Tacq = 19.7s)
; -------------------------------------------------------
movlw 0x07 ; nb de boucles
movwf cmpt1 ; initialiser compteur de boucles
LOOPACQ ; (LOOPACQ = 22s pour cmpt1=x07 et osc=4MHz)
decfsz cmpt1,f ; dcrmenter le compteur de boucles
goto LOOPACQ ; if = 0 -> LOOPACQ
ESME Sudria p.56/72
2003
Addition :
La routine ADDI ralise laddition des chiffres stocks dans les variables
var1 et var2 . Laddition est effectue par linstruction addwf , mais
lutilisation de cette routine permet de dtecter les dpassements en
interrogeant le registre STATUS,C . Le rsultat est alors stock dans deux
octets, sommeL contenant les 8 bits de poids faible et sommeH
contenant les ventuels dpassements.
;*****************************************************************
;* ADDITION 8 bits *
;* avec gestion du dpassement *
;*****************************************************************
;* entres : var1 (8 bits) ] variables d'entre non *
;* var2 (8 bits) ] modifies par le programme *
;* *
;* sortie : sommeL (8 bits) *
;* sommeH (8 bits pour le dpassement de capacit) *
;* *
;*****************************************************************
;* var1 + var2 -> [sommeL ; sommeH] *
;*****************************************************************
ADDI
clrf sommeH ; effacer dpassement
movf var1,w ; charger la variable n1 dans w
movwf sommeL ; sauver dans sommeL
movf var2,w ; charger la variable n2 dans w
addwf sommeL,f ; ajouter w et sommeL puis stocker dans somme
btfsc STATUS,C ; tester si bit de dpassement = 1
incfsz sommeH,f ; oui, ajouter au rsultat poids fort
return
; 3 - dmarrer la conversion en positionnant le bit GO du registre ADCON0
; ------------------------------------------------------------------------------------------------
bsf ADCON0,GO
; 4 - attendre que la conversion soit termine (2Tad = 3.2s)
; --------------------------------------------------------
movlw 0x01 ; nb de boucles
movwf cmpt1 ; initialiser compteur de boucles
LOOPAD ; (LOOPAD = 4s pour cmpt1=x01 et osc=4MHz)
decfsz cmpt1,f ; dcrmenter le compteur de boucles
goto LOOPAD ; if = 0 -> LOOPAD
; 5 - Lire le rsultat de la conversion dans ADRESH
; ---------------------------------------------------------------
movf ADRESH,w ; Chargement du registre ADRESH
movwf resultConv ; Stockage des 8 bits du rsultat de la conversion
return
ESME Sudria p.57/72
2003
Soustraction :
La routine SOUSTRAC soustrait la variable var2 la variable var1 .
La soustraction est effectue par linstruction subwf , mais lutilisation de
cette routine permet de grer les rsultats ngatifs qui se traduisent par des
dpassements de capacit que lon dtecte en interrogeant le registre
STATUS,C . Dans le cas dun rsultat ngatif, il faut calculer le complment
vrai pour obtenir un rsultat exploitable. Le rsultat est stock dans loctet
diffL , et le bit signe,0 reoit le bit de signe du rsultat.
Multiplication :
La routine MULTI multiplie var1 et var2 . Le rsultat ncessite donc
16 bits, donc 2 octets produitH et produitL .
Pour illustrer le principe de fonctionnement, voici la ralisation dune
multiplication manuelle. Nous multiplions ici 12 par 13, cest une opration de
4x4 bits avec un rsultat sur 8 bits. Ceci afin de simplifier lexplication.
Le tableau suivant montre que pour programmer une multiplication, il suffit de
multiplier les bits un un en effectuant un dcalage gauche lors du
chargement dun nouveau bit multiplicateur.
;*****************************************************************
;* SOUSTRACTION 8 bits *
;*****************************************************************
;* entres : var1 (8 bits) ] variables d'entre non *
;* var2 (8 bits) ] modifies par le programme *
;* *
;* sorties : diffL (8 bits) *
;* signe,0 bit de signe du rsultat *
;* *
;*****************************************************************
;* var1 - var2 -> (signe) diffL *
;*****************************************************************
SOUSTRAC
bcf signe,0 ; effacer le bit de signe
movf var1,w ; charger la variable n1 dans w
movwf diffL ; sauver dans diffL
movf var2,w ; charger la variable n2 dans w
subwf diffL,f ; soustraire w diffL puis stocker dans diffL
btfss STATUS,C ; tester si bit de dpassement = 0 , le rsultat est donc ngatif
goto COMP ; si rsultat <0 , on cherche le complment 2
return
COMP bsf signe,0 ; stockage du bit de signe ngatif
comf diffL,f ; calcul du complment restreint
incf diffL,f ; calcul du complment vrai (complment 2)
return
ESME Sudria p.58/72
2003
1 1 0 0 12
X 1 1 0 1 13
1 1 0 0 12
0 0 0 0 0 0
1 1 0 0 0 0 48
1 1 0 0 0 0 0 96
1 0 0 1 1 1 0 0 156
Les rsultats intermdiaires sont cumuls dans la variable produitH ,
au fur et mesure du traitement. Le calcul dun produit 8x8 bits comporte
donc 8 tapes intermdiaires qui correspondent au traitement de chaque
bit du multiplicateur.
;*****************************************************************
;* MULTIPLICATION 8 x 8 bits *
;*****************************************************************
;* entres : var1 (8 bits) ] variables d'entre non *
;* var2 (8 bits) ] modifies par le programme *
;* *
;* rsultat sur 16 bits : produitH (8 bits de poids fort) *
;* produitL (8 bits de poids faible) *
;* *
;*****************************************************************
;* var1 * var2 -> [produitH ; produitL] *
;*****************************************************************
MULTI
clrf produitH ; effacer le rsultat poids fort
clrf produitL ; effacer le rsultat poids faible
movlw 0x08 ; pour 8 bits
movwf cmpt1 ; initialiser compteur de boucles
movf var1,w ; charger le multiplicateur n1 dans w
movwf vartemp ; sauver dans vartemp
movf var2,w ; charger le multiplicateur n2 dans w
LOOPMULTI
rrf vartemp,f ; dcaler le multiplicateur vers la droite
btfsc STATUS,C ; tester si bit sorti = 1
addwf produitH,f ; oui, ajouter au rsultat poids fort
rrf produitH,f ; dcaler le rsultat poids fort
rrf produitL,f ; dcaler le rsultat poids faible
decfsz cmpt1,f ; dcrmenter le compteur de boucles
goto LOOPMULTI ; pas fini, bit suivant
return
ESME Sudria p.59/72
2003
Calcul du PID :
La routine PID rsout lquation suivante :
u(k) = Kp e(k) + Ki [ u(k-1) + e(k) ] + Kd [ e(k) - e(k-1) ]
avec : e(k) : rsultat de la conversion A/D (variable resultConv )
e(k-1) : rsultat de la conversion A/D prcdente ( resultConv2 )
u(k-1) : rsultat prcdent du calcul du PID ( resultPID2 )
La valeur des chantillons est code sur 8 bits (registre ADRESH ). Cette
valeur correspond une tension comprise entre 5V et +5V. Il est donc
ncessaire dtalonner les donnes avant de commencer rsoudre lquation.
Ltalonnage est effectu comme nous lavons prcdemment dfini dans la
partie talonnage des donnes . Cela consiste simplement recentrer les
donnes sur 0, cest--dire soustraire 127 la variable dentre.
;*****************************************************************
;* Calcul du PID *
;*****************************************************************
;* entres : resultConv, resultConv2, resultPID2 *
;* parametre1, parametre2, parametre3, parametre4 *
;* signe *
;* *
;* sorties : resultPID *
;* signe, resultPID2, resultConv2 *
;*****************************************************************
;* u(k) = Kp (k) + Ki [u(k-1)+(k)] + Kd [(k)-(k-1)] *
;*****************************************************************
PID ; resultPID = [ parametre1 + parametre2 + parametre3 ] * resultConv
; + parametre2 * resultPID2 - parametre3 * resultConv2
; -1 < parametre1, parametre2, parametre3 < 10
; signe,1 contient le signe de resultConv centr sur 0 = signe de result1
; signe,2 contient le signe de resultConv2 centr sur 0 = signe de result3
; signe,3 contient le signe de resultPID centr sur 0
; signe,4 contient le signe de resultPID2 centr sur 0 = signe de result2
; signe,5 contient le signe de result4
; 1) Recentrer la valeur du signal chantillonn sur 0
; ------------------------------------------------------------------
; -5V < E(k) < +5V => 0 < resultConv < 255
; => -127 < resultConv - 127 < +128
movf resultConv,w ; charger resultConv dans var1
movwf var1
movlw D'127' ; charger '127' dans var2
movwf var2
call SOUSTRAC ; appel de la routine de soustraction
movf diffL,w ; stockage de resultConv recentr sur 0
movwf resultConv
bcf signe,1 ; effacer signe,1
btfsc signe,0 ; stockage du signe du rsultat de la soustraction dans signe,1
bsf signe,1
clrf resultDep ; effacer l'octet de traitement des dpassements
ESME Sudria p.60/72
2003
Une fois ltalonnage effectu, le calcul dbute. Celui-ci est scind en plusieurs
rsultats intermdiaires afin de simplifier le traitement des dpassements. En
effet, chaque rsultat intermdiaire dcoule dune multiplication dont le rsultat
occupe jusqu 16 bits. Ds quil y a un dpassement, on lajoute ou on le
soustrait la variable resultDep en fonction du signe du rsultat sur lequel
apparat ce dpassement. Si la fin du calcul resultDep est diffrent de
zro, il y a un dpassement et le signal devra tre crt pour viter des valeurs
aberrantes.
Le premier rsultat intermdiaire correspond ( Kp + Ki + Kd ) . e(k)
Son bit de signe est stock dans le bit signe,1 .
Le second rsultat intermdiaire correspond Ki . u(k-1)
Son bit de signe est stock dans le bit signe,4 . Sil prsente un
dpassement, resultDep est modifi en consquence.
; 2) Calculer : result1 = [ parametre1 + parametre2 + parametre3 ] * resultConv
; -----------------------------------------------------------------------------------------------------
movf parametre1,w ; charger parametre1 dans var1
movwf var1
movf parametre2,w ; charger parametre2 dans var2
movwf var2
call ADDI ; appel de la routine d'addition
movf sommeL,w ; stocker la somme de parametre1 et parametre2 dans var2
movwf var2
movf parametre3,w ; charger parametre3 dans var1
movwf var1
call ADDI ; appel de la routine d'addition
movf sommeL,w ; stocker la somme des parametre1, 2 et 3 dans var2
movwf var2
movf resultConv,w ; charger resultConv dans var1
movwf var1
call MULTI ; appel de la routine de multiplication
movf produitH,w ; stockage de produitH dans resultDep
movwf resultDep
movf produitL,w ; stockage de produitL dans result1
movwf result1 ; le signe de result1 est donn par signe,1
; 3) Calculer : result2 = parametre2 * resultPID2
; -------------------------------------------------------------
movf resultPID2,w ; charger resultPID2 dans var1
movwf var1
movf parametre2,w ; charger parametre2 dans var2
movwf var2
call MULTI ; appel de la routine de multiplication
btfss produitH,0 ; resultDep est incrment si produitH =! 0
goto SKIPDEP1 ; produitH = 0
btfss signe,4 ; prohuitH > 0
incf resultDep,f ; result2 > 0
btfsc signe,4
decf resultDep,f ; result2 =< 0
SKIPDEP1
movf produitL,w ; stockage de produitL dans result2
movwf result2 ; le signe de result2 est donn par signe,4
ESME Sudria p.61/72
2003
Le troisime rsultat intermdiaire correspond Kd . e(k-1)
Son bit de signe est stock dans le bit signe,2 . Sil prsente un
dpassement, resultDep est modifi en consquence.
Les calculs intermdiaires sont maintenant termins. Il reste tester si leur
dpassement cumul est nul. Dans le cas contraire, il est inutile de poursuivre le
calcul, car le signal doit tre crt sa valeur maximale (soit 255) si
resultDep est positif, ou sa valeur minimale (soit 0) sil est ngatif.
S'il ny a pas de dpassement, ou si ces dpassements sannulent, le calcul de
lquation se poursuit.
; 4) Calculer : result3 = parametre3 * resultConv2
; ----------------------------------------------------------------
movf parametre3,w ; charger parametre3 dans var1
movwf var1
movf resultConv2,w ; charger resultConv2 dans var2
movwf var2
call MULTI ; appel de la routine de multiplication
incf produitH,f
decfsz produitH,f ; tester la valeur de produitH
goto TRAITDEP2 ; prohuitH > 0
goto SKIPDEP2 ; produitH = 0
TRAITDEP2
btfss signe,2
incf resultDep,f ; result3 > 0
btfsc signe,2
decf resultDep,f ; result3 =< 0
SKIPDEP2
movf produitL,w ; stockage de produitL dans result3
movwf result3 ; le signe de result3 est donn par signe,2
incf resultDep,f
decfsz resultDep,f ; tester la valeur de resultDep
goto TRAITDEP3 ; resultDep =! 0
goto SKIPDEP3 ; resultDep = 0
TRAITDEP3
movf resultDep,w ; charger resultDep dans w
btfsc STATUS,Z ; tester si w = 0
goto DEPASSNEG ; resultDep < 0 => on crte le signal sa valeur min : 0
; resultDep > 0 => on crte le signal sa valeur max : 255
movlw D'255' ; il y a dpassement positif => charger '255' dans w
goto SUITECR4
DEPASSNEG
movlw D'0' ; il y a dpassement ngatif => charger '0' dans w
goto SUITECR4
SKIPDEP3
ESME Sudria p.62/72
2003
Les deux premiers rsultats intermdiaires sont additionns en tenant compte
de leur signe respectif. Si leurs signes sont diffrents, alors cest une
soustraction quil faut raliser.
On obtient un quatrime rsultat intermdiaire dont le bit de signe est stock
dans le bit signe,5 .
Pour terminer le calcul, il reste soustraire les deux derniers rsultats
intermdiaires en tenant toujours compte de leur signe. Si leurs signes sont
diffrents cest une addition quil faut raliser.
; 5) Additionner : result4 = result1 + result2
; -------------------------------------------------------
movf result1,w ; charger result1 dans var1
movwf var1
movf result2,w ; charger result2 dans var2
movwf var2
bcf signe,5 ; initialisation du bit de signe de result4
btfss signe,1 ; test sur le signe de result1
goto RCPOSITIF3 ; result1 >= 0
btfss signe,4 ; result1 < 0
goto SIGNDIFF3 ; result2 >= 0 et result1 < 0
bsf signe,5 ; result4 est ngatif
goto SIGNEQU3 ; result2 < 0 et result1 < 0
RCPOSITIF3
btfsc signe,4 ; result1 >= 0
goto SIGNDIFF3 ; result2 < 0 et result1 >= 0
SIGNEQU3 ; result2 >= 0 et result1 >= 0
call ADDI ; appel de la routine d'addition
movf sommeL,w
goto SUITECR3
SIGNDIFF3
btfss signe,1 ; test sur le signe de result1
goto SKIPINV3 ; result1 > 0 et result2 < 0
movf result2,w ; result1 < 0 et result2 > 0
movwf var1 ; permuter result1 et result2 avant de les soustraire
movf result1,w
movwf var2
SKIPINV3
call SOUSTRAC ; appel de la routine de soustraction
movf diffL,w
btfsc signe,0 ; test du signe du rsultat de la soustraction
bsf signe,5 ; result4 est ngatif
SUITECR3
movwf result4 ; le signe de result4 est donn par signe,5
ESME Sudria p.63/72
2003
On obtient le rsultat final resultPID dont le bit de signe est stock dans le
bit signe,3 .
Le calcul du PID est maintenant ralis, cependant cette valeur doit tre
dcentre conformment au formatage des donnes dfini prcdemment.
; 6) Soustraire : resultPID = result4 - result3
; -------------------------------------------------------
movf result4,w ; charger result4 dans var1
movwf var1
movf result3,w ; charger result3 dans var2
movwf var2
bcf signe,3 ; initialisation du bit de signe de resultPID
btfss signe,5 ; test sur le signe de result4
goto RCPOSITIF4 ; result4 >= 0
btfss signe,2 ; result4 < 0
goto SIGNDIFF4 ; result3 >= 0 et result4 < 0
goto SIGNEQU4 ; result3 < 0 et result4 < 0
RCPOSITIF4
btfss signe,2 ; result4 >= 0
goto SIGNEQU4 ; result3 >= 0 et result4 >= 0
SIGNDIFF4 ; result3 < 0 et result4 >= 0
btfsc signe,5 ; test sur le signe de result4 => resultPID est du signe de result4
bsf signe,3 ; resultPID est ngatif
call ADDI ; appel de la routine d'addition
movf sommeL,w
goto SUITECR4
SIGNEQU4
btfss signe,5 ; test du signe de result4
goto SKIPINV4 ; result4 > 0 et result3 > 0
movf result3,w ; result4 < 0 et result3 < 0
movwf var1 ; permuter result3 et result4 avant de les soustraire
movf result4,w
movwf var2
SKIPINV4
call SOUSTRAC ; appel de la routine de soustraction
movf diffL,w
btfsc signe,0 ; test du signe du rsultat de la soustraction
bsf signe,3 ; resultPID est ngatif
SUITECR4
movwf resultPID ; le signe de resultPID est donn par signe,3
ESME Sudria p.64/72
2003
En effet, resultPID doit tre compris entre 0 et 255 pour pouvoir tre
inject sur le PORTC. Il suffit donc dajouter 127 resultPID . Dans le cas
o la valeur de resultPID centre sur 0 est ngative, il faut soustraire
resultPID 127.
; 7) Dcentrer la valeur du signal corrig pour qu'il soit compris entre 0 et 255
; ---------------------------------------------------------------------------------------------------
; -127 < resultPID < +128 => 0 < resultPID + 127 < 255
; => -5V < E(k) < +5V
movf resultConv,w ; mmoriser le rsultat de la conversion centr sur 0
movwf resultConv2
bcf signe,2
btfsc signe,1 ; mmoriser le signe du rsultat de la conversion centr sur 0 dans signe,2
bsf signe,2
movlw D'127' ; charger '127' dans var1
movwf var1
movf resultPID,w ; charger resultPID dans var2
movwf var2
movwf resultPID2 ; mmoriser le rsultat du calcul du PID centr sur 0
btfsc signe,3 ; mmoriser le signe du rsultat du calcul du PID centr sur 0 dans signe,4
goto SOUSPID
bcf signe,4 ; resultPID centr sur 0 est positif
call ADDI ; appel de la routine d'addition
movf sommeL,w
goto FINPID
SOUSPID
bsf signe,4 ; resultPID centr sur 0 est ngatif
call SOUSTRAC ; appel de la routine de soustraction
movf diffL,w
FINPID
movwf resultPID ; stockage de resultPID compris entre 0 et 255
return
ESME Sudria p.65/72
2003
Conversion de chiffres en digits :
La routine CONVDIGIT ralise la conversion de la variable vardigit en un
code 8 bits. Ce code reprsente laffichage sur sept segments du chiffre
contenu dans vardigit .
Cette routine permet donc dobtenir la reprsentation sur sept segments (plus
une virgule) dune valeur comprise entre 0 et 9. Dans le cas dune valeur
errone qui ne se trouverait pas dans cet encadrement, la routine retourne le
code dun digit reprsentant un trait .
Ainsi, si lon visualise un trait sur lun des digits de lafficheur LCD, cela indique
une erreur.
;*****************************************************************
;* CONVERSION Chiffres -> Digits *
;*****************************************************************
;* entre : vardigit *
;* *
;* sortie : w *
;*****************************************************************
CONVDIGIT
btfss STATUS,Z ; tester si W = 0
goto DIGITUN
movlw ZERO
goto FINCONV
DIGITUN
decfsz vardigit,f ; dcrmenter le chiffre traiter
goto DIGITDEUX
movlw UN ; var1 = 0 ?
goto FINCONV
DIGITDEUX
decfsz vardigit,f ; dcrmenter le chiffre traiter
goto DIGITTROIS
movlw DEUX ; var1 = 0 ?
goto FINCONV
DIGITTROIS
decfsz vardigit,f ; dcrmenter le chiffre traiter
goto DIGITQUATRE
movlw TROIS ; var1 = 0 ?
goto FINCONV
DIGITQUATRE
decfsz vardigit,f ; dcrmenter le chiffre traiter
goto DIGITCINQ
movlw QUATRE ; var1 = 0 ?
goto FINCONV
DIGITCINQ
decfsz vardigit,f ; dcrmenter le chiffre traiter
goto DIGITSIX
movlw CINQ ; var1 = 0 ?
goto FINCONV
ESME Sudria p.66/72
2003
DIGITSIX
decfsz vardigit,f ; dcrmenter le chiffre traiter
goto DIGITSEPT
movlw SIX ; var1 = 0 ?
goto FINCONV
DIGITSEPT
decfsz vardigit,f ; dcrmenter le chiffre traiter
goto DIGITHUIT
movlw SEPT ; var1 = 0 ?
goto FINCONV
DIGITHUIT
decfsz vardigit,f ; dcrmenter le chiffre traiter
goto DIGITNEUF
movlw HUIT ; var1 = 0 ?
goto FINCONV
DIGITNEUF
decfsz vardigit,f ; dcrmenter le chiffre traiter
goto DIGITERROR
movlw NEUF ; var1 = 0 ?
goto FINCONV
DIGITERROR
movlw TRAIT
FINCONV
return
ESME Sudria p.67/72
2003
Conversion des paramtres en digits :
La routine CONVPARAM ralise la conversion de lensemble des quatre
paramtres que lon doit visualiser sur lafficheur.
Cette routine fait appel la prcdente pour ractualiser la valeur de chaque
paramtre sur lcran LCD.
;*****************************************************************
;* CONVERSION des paramtres en digits *
;*****************************************************************
;* entres : parametre1, parametre2, parametre3, parametre4 *
;* *
;* sorties : digit1, digit2, digit3, digit4 *
;* *
;*****************************************************************
CONVPARAM
movf parametre1,w ; conversion de parametre1 (chiffres) en digit1 (7 segments)
movwf vardigit
call CONVDIGIT
movwf digit1
movf parametre2,w ; conversion de parametre2 (chiffres) en digit2 (7 segments)
movwf vardigit
call CONVDIGIT
movwf digit2
movf parametre3,w ; conversion de parametre3 (chiffres) en digit3 (7 segments)
movwf vardigit
call CONVDIGIT
movwf digit3
movf parametre4,w ; conversion de parametre4 (chiffres) en digit4 (7 segments)
movwf vardigit
call CONVDIGIT
movwf digit4
return
ESME Sudria p.68/72
2003
Affichage des paramtres par une transmission srie :
La routine AFFICHAGE gnre deux signaux synchroniss qui permettent
dtablir un transfert de donnes srie du PIC vers le contrleur LCD.
Un signal Data est mis sur la pin RB1 du PORTB et le signal dhorloge
correspondant est disponible sur la pin RB0 .
Pour mettre jour lafficheur, le driver LCD doit recevoir un paquet de 36 bits
synchronis par un signal dhorloge.
Les 36 bits envoys sont organiss de la faon suivante :
- le dbut de lenvoi est signal par un bit de start (les instructions nop
ninfluencent pas le programme, elles ont pour seul but de crer un retard pour
permettre le temps dtablissement des signaux)
- les 4 octets correspondant au code des quatre digits (variables digit1
digit4 ) sont envoys les uns aprs les autres. La transmission se fait du bit
le moins significatif au bit le plus significatif.
;*****************************************************************
;* AFFICHAGE (transmission srie des donnes) *
;*****************************************************************
;* entres : digit1, digit2, digit3, digit4 *
;* *
;* sortie : *
;* *
;*****************************************************************
AFFICHAGE
bcf PORTB,1 ; Mise 0 du signal DATA
nop
bsf PORTB,0 ; Mise 1 du signal CLOCK
nop
bcf PORTB,0 ; Mise 0 du signal CLOCK
nop
bsf PORTB,1 ; Mise 1 du signal DATA
nop
bsf PORTB,0 ; Mise 1 du signal CLOCK
movf digit4,w ; charger le 1er octet envoyer
call AFFDIGIT ; Appel de la routine de transmission d'un mot de 8 bits
movf digit3,w ; charger le 2me octet envoyer
call AFFDIGIT ; Appel de la routine de transmission d'un mot de 8 bits
movf digit2,w ; charger le 3me octet envoyer
call AFFDIGIT ; Appel de la routine de transmission d'un mot de 8 bits
movf digit1,w ; charger le 4me octet envoyer
call AFFDIGIT ; Appel de la routine de transmission d'un mot de 8 bits
ESME Sudria p.69/72
2003
- il faut transfrer un paquet de 36 bits pour que le driver puisse exploiter ce
signal. Jusquici, nous avons envoy un bit de start et quatre octets, soit 33
bits. Il faut donc ajouter deux bits vides et un bit de fin pour terminer la
transmission.
Transmission srie dun octet :
La sous-routine AFFDIGIT est intgre dans la routine AFFICHAGE .
Elle gnre un signal Data et un signal dhorloge synchroniss permettant
de transmettre un octet.
movlw B'00000100' ; charger les bits permettants de complter la srie de 36 bits transmis
movwf vartemp ; stocker l'octet transmettre dans vartemp
movlw 0x03 ; 3 boucles pour transmettre les 3 bits manquants
movwf cmpt1 ; initialiser compteur de boucles
LOOPAFF2
rrf vartemp,f ; dcaler vers la droite
bcf PORTB,0 ; Mise 0 du signal CLOCK
btfsc STATUS,C ; tester le bit de dpassement C
bsf PORTB,1 ; C=1 -> Mise 1 du signal DATA
btfss STATUS,C ; tester le bit de dpassement C
bcf PORTB,1 ; C=0 -> Mise 0 du signal DATA
nop
bsf PORTB,0 ; Mise 1 du signal CLOCK
decfsz cmpt1,f ; dcrmenter le compteur de boucles
goto LOOPAFF2 ; si = 0 -> LOOPAFF2
bcf PORTB,1 ; Mise 0 du signal DATA
bcf PORTB,0 ; Mise 0 du signal CLOCK
return
AFFDIGIT
movwf vartemp ; stocker l'octet transmettre dans vartemp
movlw 0x08 ; 8 boucles pour afficher un octet (1 mot de 8 bits)
movwf cmpt1 ; initialiser compteur de boucles
LOOPAFF1
rrf vartemp,f ; dcaler vers la droite
bcf PORTB,0 ; Mise 0 du signal CLOCK
btfsc STATUS,C ; tester le bit de dpassement C
bsf PORTB,1 ; C=1 -> Mise 1 du signal DATA
btfss STATUS,C ; tester le bit de dpassement C
bcf PORTB,1 ; C=0 -> Mise 0 du signal DATA
nop
bsf PORTB,0 ; Mise 1 du signal CLOCK
decfsz cmpt1,f ; dcrmenter le compteur de boucles
goto LOOPAFF1 ; si = 0 -> LOOPAFF1
return
ESME Sudria p.70/72
2003
Programme principal :
Le programme principal centralise les appels des diffrentes routines quil est
ncessaire dexcuter pour raliser lasservissement.
Lors du dmarrage, le programme commence par une phase dinitialisation de
lafficheur et du convertisseur analogique-numrique :
- les paramtres sont convertis et cods sur sept segments,
- la valeur de chaque digit est transmise au contrleur LCD via une liaison
srie,
- une premire acquisition et une conversion du signal dentre analogique
sont effectues (il est indispensable de donner une valeur e(k-1) avant
de commencer le calcul du PID).
Ensuite, une boucle infinie effectue en permanence la correction voulue et la
restitue sur le PORTC. Cette correction se fait en plusieurs tapes :
- acquisition et conversion analogique numrique dun chantillon,
- calcul du PID,
- stockage du rsultat sur le PORTC.
;*********************************************************************************
;* PROGRAMME PRINCIPAL *
;*********************************************************************************
START
org 0x300
CALL CONVPARAM ; routine de conversion des paramtres (chiffres) en digits (7segments)
CALL AFFICHAGE ; routine d'affichage des paramtres sur l'afficheur LCD (initialisation)
CALL CONV ; routine d'acquisition et de conversion du signal d'entre analogique
; (une premire acquisition est ncessaire
; avant de pouvoir calculer le PID)
LOOP
CALL CONV ; routine d'acquisition et de conversion du signal d'entre analogique
CALL PID ; routine de calcul du PID
movf resultPID,w ; Chargement du rsultat du calcul du PID
movwf PORTC ; Ecriture sur le PORTC des 8 bits du rsultat du calcul du PID
goto LOOP
end
ESME Sudria p.71/72
2003
D SYNTHSE
Au cours de cette tude les diffrentes parties qui composent un module
dasservissement P.I.D. dune MCC ont t tudies. savoir :
- La programmation du P.I.D.
- Les conversions analogique-numrique et numrique-analogique.
- Les adaptateurs de tensions.
- La gestion des boutons-poussoirs.
- Laffichage, sur un cran LCD 4 digits, des paramtres de correction du
P.I.D. par lintermdiaire dun driver LCD.
Nous pouvons qualifier ce projet de pluridisciplinaire. En effet, nous avons
travaill dans diffrents domaines tels que : llectronique analogique,
llectronique numrique, lautomatique et linformatique pour la programmation
du P.I.D.
En dehors de laspect technique, ce projet nous a permis de nous rendre
compte de limportance de la gestion du temps et de la rpartition des tches au
sein du groupe.
Amliorations envisages
Nous envisageons une amlioration de ce module en y ajoutant :
- Un filtre en sortie du CNA pour obtenir un signal de sortie plus stable.
- La gestion de la limite dintgration.
ESME Sudria p.72/72
2003
E SOURCES
- Datasheets des composants suivants :
16F876 (PIC)
TL084 (AOP)
AD557 (CNA)
MM5452 (driver LCD)
VI502 (afficheur LCD)
- Projet de premire anne : enregistreur numrique (par BRUYERE Philippe
GOMBERT Benjamin
VENCE Eric)
- Programmation 16f876 par Bigonoff
- www.abcelectronique.com
- kudelsko.free.fr
- fribotte.free.fr/bdtech/PidSurPic/PidSurPic1.html
- perso.wanadoo.fr/yves.heilig/ElecRob/page1.htm
REMERCIEMENTS
Nous tenons remercier M. Touseau et M. At Abderrahim pour leur aide, leurs
conseils, leur disponibilit et lencadrement quils nous ont accord tout au long
de ce projet.
Nous remercions galement Mr Deleau pour son soutien logistique.

You might also like